English Articles Developer Productivity

When an Ephemeral SQLite Registry Disappeared, Our AI Development Stalled

When an Ephemeral SQLite Registry Disappeared, Our AI Development Stalled

There is no confirmed evidence that the SQLite database itself was corrupted. On October 10, 2026, An AI assistant coordinating software development tasks, lost access to its operational SQLite registry in a cloud execution environment. A second issue made the incident harder to diagnose: some ordinary inspection commands could initialize a new, empty database when the original file was missing.

Then a safety mechanism meant to prevent duplicate work expanded into a portfolio-wide halt. One execution had an uncertain outcome, and the system could not safely distinguish conflicting tasks from unrelated ones. The case is less about whether SQLite is a good database and more about how an autonomous development system detects lost state, preserves execution evidence, and recovers without duplicating side effects.

This article reconstructs the incident from source code, dated operational records, and the resulting implementation reviews. The platform event that changed the file surface remains unknown. A missing database file is not proof of on-disk corruption or deletion.

1. The timeline: 32 tasks visible, then only 8 reconstructed

AI assistant incident timeline: 32 tasks accessible at 11:03, prior SQLite file inaccessible around 11:06, task inspection could initialize a new empty database at 11:07, and eight minimal task records reconstructed by 11:39 JST.
Figure 1. What the operational records establish. They do not prove that SQLite data pages were corrupted.

11:00–11:03 JST, October 10: The registry held 32 task records and was accessible. This is the last verified healthy snapshot, not evidence that the same file remained available afterward.

Approximately 11:06: The timestamps and contents of the cloud workspace changed together. Several previously observed working files were missing. This supports a change in the runtime file surface, but does not establish why the change occurred.

11:07: Looking up a known task failed, and the task list was empty. The newly observed SQLite file had a creation time around the inspection itself.

11:26–11:39: The operator reconstructed first one, then eight minimal task entries using durable GitHub evidence, and activated a global execution pause to avoid duplicate work whose outcome could not be established.

Eight reconstructed entries did not mean that the prior 32 task lifecycles, execution attempts, dependencies, and approvals had been restored. Nor was there evidence that the project's GitHub issues, pull requests, or application data had suffered the same loss.

2. The hidden failure: a read command that could write

At the incident revision, regular CLI operations such as task show and task list instantiated the registry object. Its constructor created the parent directory and initialized SQLite. If the original database path no longer existed, the inspection path could therefore create an empty database.

task show / task list
      |
      v
Create Registry instance
      |
      v
Create directory + initialize SQLite
      |
      v
Missing file may become a new empty DB

Python's default sqlite3.connect() behavior creates a database if the path does not exist. SQLite also provides open modes that fail instead of creating a missing file. Monitoring and recovery tools should use non-creating, explicitly read-only access when testing the identity and health of an existing database.

The system did have a separate read-only Supervisor inspection route. The problem was that not every routine inspection path had the same protection. An integrity check passing on the newly created file demonstrates that file's structural consistency. It cannot prove that historical operational records have been recovered.

3. Why one uncertain execution stopped unrelated work

In AI-assisted development, a GitHub commit alone cannot tell you whether another agent is currently editing the same code or running an external operation. A safe coordinator needs an execution identity, resource scope, current worker evidence, and a reliable terminal outcome.

One outstanding comparison run had insufficient terminal evidence: the final process identity, exit status, and cleanup could not all be verified. Restarting that run blindly would risk a duplicate writer or conflicting changes. Quarantining that execution was justified.

The problem was the scope of the quarantine. The global pause blocked new registry-mediated execution even for work that might have been independently proven non-conflicting. GitHub-only read-only reviews did continue around 12:36–12:41 JST, but the Owner still reported new development execution blocked at 12:52.

The safer design separates three cases: A is the unknown previous execution, C touches resources that may overlap with A, and B is demonstrably independent. A and C remain on hold. B can be considered for normal execution only after fresh ownership, resource, worker, and approval checks.

This is not an instruction to bypass a production pause. A task-level eligibility decision is not an authorization to launch a worker.

4. A four-layer root-cause analysis

  • Symptom: The operational task inventory appeared empty, and a safe handoff was no longer possible.
  • Immediate mechanism: The previous cloud file surface became inaccessible; a regular CLI read path could create a fresh SQLite file.
  • Systemic weaknesses: Ephemeral task state had not been fully backed by durable execution receipts, while the global safety stop could not discriminate unrelated work.
  • Unknowns: The platform trigger, the physical fate of the original database, and the exact termination of certain external work.

Describing all four layers as “SQLite corruption” would lead to the wrong fix. Repairing a database file cannot, by itself, improve worker-liveness evidence or the precision of execution quarantine.

5. Would replacing SQLite with GitHub solve it?

The team already used GitHub as the durable source of truth for decisions, source changes, issues, and reviews. SQLite served as a transient execution registry. After the incident, the operating direction shifted toward deriving the current task portfolio from fresh GitHub and actual worker evidence, rather than restoring all 32 historical registry rows as a prerequisite for unrelated progress.

That approach removes an unnecessary single point of dependency for task discovery. It does not automatically create a distributed execution lock. A GitHub issue label or assignee update is not an atomic lease on an external AI process. GitHub Actions concurrency regulates GitHub Actions jobs; it cannot automatically stop an arbitrary cloud or local coding worker.

A credible GitHub-first design therefore needs a single accountable owner, current canonical issue/PR bindings, explicit worker handoffs, preflight checks for conflicting resources, and conservative treatment of uncertain executions. Where true parallel execution is essential, the locking mechanism must govern the actual executors—not just the dashboard showing their intended state.

6. What changed, and what was still unproven

On October 10, a scoped-recovery code change passed source-level review and synthetic tests before being merged. On October 11, a small GitHub-evidence reducer was also merged. Both changes were meaningful, but neither a merged pull request nor a green unit suite proves an operational cutover.

As of the October 11 records, the evidence-based reducer had passed limited, conservative shadow evaluation, not a verified unattended end-to-end run that discovers work, starts a qualified worker, validates a result, and records completion without human intervention. Separately, cloud-to-desktop workspace creation and write-side safety denials remained possible blockers. Simply deleting SQLite would not resolve them.

The useful distinction is between implemented logic, deployed control-plane behavior, and demonstrated autonomous execution. Each requires different evidence.

7. A practical recovery checklist for agent operators

  1. Make reads non-creating. Inspect file existence, expected path, and runtime identity without modifying the database. Fail closed when the original file is absent.
  2. Keep durable work history separate. Store canonical tasks, accepted changes, and approvals outside an ephemeral executor filesystem.
  3. Capture execution receipts. Record the task, worker, resource scope, start, terminal result, and exact source revision. Do not substitute a dashboard snapshot for live process evidence.
  4. Quarantine uncertainty precisely. Hold the unknown task and overlapping resources. Continue genuinely independent work only after proving it is independent and satisfying all other gates.
  5. Prove recovery at the right level. Unit tests, source merge, runtime rollout, a real worker attempt, and verified results are distinct milestones.

The broader lesson: autonomous development is only as reliable as its failure detection and recovery boundaries. Progress reports are helpful; reproducible receipts and a demonstrably safe path back to real work matter more.

Evidence cutoff: October 11, 2026 (JST). Counts and times come from the project's incident records. Internal and private operational details have been omitted. Public technical references: Python sqlite3, SQLite open flags, and GitHub Actions concurrency.

日本語版はこちら / Read in Japanese

-English Articles, Developer Productivity