Skip to content

Phase 3 (audit) of #3282 — closing state-access inventory + contract statement for infra/github-backup #3283

Open

Description

@dezren39

Phase 3 (closing audit) of design #3282 — "a mirror is what it can prove" (design doc: files/designs/code-github-backup-mirror-contract.md in the keep-the-four-repos-healthy goal workspace). Filed by the design architect, pass 29 (2026-10-31). Gated on Phases 1–2 of the design (Phase 1 = #3238 + #3233; Phase 2 = #3250 + #3219 + #3270 + #3257) and on its own phase siblings #3240 + #3229 landing the ghb_common state helpers and plan retention it audits against.

Scope

  1. Closing inventory. Grep infra/github-backup/bin/ for every remaining bare json.load on a generated-state file and every open(..., "w") / json.dump write to one (plan.json, state.json, MANIFEST.json, clone-status.jsonl appends excluded — append-only logs are not in the torn-write class). Disposition each hit: migrated to the ghb_common helpers from github-backup(state): plan.json, state.json and MANIFEST.json are written non-atomically and loaded with bare json.load — one torn write wedges the daily fetch, the drainer and manifest regeneration #3240, or deliberately local with the reason recorded in this issue. The inventory is complete only when a fresh grep returns no undispositioned hits.
  2. Named dispositions required: (a) FAMILIES.md and the reconcile-YYYY-MM-DD.md report — markdown written non-atomically; expected disposition is migrate via the same atomic-write helper (a torn FAMILIES.md feeds cold-export decisions), or a recorded reason if not; (b) drain_queue.py's per-repo plan.json re-read inside its fetch loop (a bare load and an O(events) re-read — disposition: route through the tolerant loader; restructuring the loop is in scope only if triage judges it trivial); (c) the Worker (worker/src/index.js) — expected disposition: out of scope with reason (KV is the store; the laptop half's ack discipline is Phase 2's github-backup(drain): webhook events are acked even when the fetch failed or the mirror is missing — freshness signal silently dropped #3219), recorded so the boundary is explicit.
  3. Contract statement. Write the design's seven rules, in operator language, into infra/github-backup/README.md (system contract section) and cross-reference from docs/RUNBOOK.md where the DR procedures consume MANIFEST.json — the docs are the system's system-of-record per github-backup: estate mirror system (laptop mirrors + dedicated App + Worker webhooks + weekly sweep) #3215.
  4. Evidence on the umbrella. Post the completion evidence (inventory result, contract location, phase closure list) as a comment on github-backup: estate mirror system (laptop mirrors + dedicated App + Worker webhooks + weekly sweep) #3215.

Acceptance criteria

  • The grep inventory exists in this issue's closing comment with a disposition for every hit; a re-run grep finds no undispositioned bare load/write on generated state in infra/github-backup/bin/.
  • FAMILIES.md / reconcile-report, the drainer plan re-read, and the Worker boundary each carry an explicit disposition (migrated, or out-of-scope/local with reason).
  • README.md states the seven-rule contract and RUNBOOK.md cross-references it from the DR section.
  • Evidence comment posted on github-backup: estate mirror system (laptop mirrors + dedicated App + Worker webhooks + weekly sweep) #3215 naming this design and its phase closures.
  • This audit does not re-open the decisions recorded on the design issue (validity = resolvability; four destination states; recorded outcomes; ack-on-ok; 3-consecutive-day streak; atomic state via ghb_common; plan retention) — a genuine blocker is flagged on the design issue instead.

Activity

  1. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Design-architect pass 29 (2026-10-31) — agent note: this issue is Phase 3's closing audit for design #3282 ("a mirror is what it can prove"), filed this pass as a sub-issue of #3282 (verified in #3282's sub_issues list: 3219, 3229, 3233, 3238, 3240, 3250, 3257, 3270, 3283), labelled source/design-architect + status/blocked, with a triage packet enqueued to repo-health-code-pilot as task 4835 (verified by dedupe re-read: queue=repo-health-code-pilot, last_error=null; already claimed by the fleet at verification time). It is GATED on Phases 1–2 of #3282 (Phase 1 = #3238 + #3233; Phase 2 = #3250 + #3219 + #3270 + #3257) and on its phase siblings #3240 (atomic state helpers) + #3229 (plan retention) — triage should record the gating and keep status/blocked until they land; do not start the inventory early. Design doc: files/designs/code-github-backup-mirror-contract.md in the keep-the-four-repos-healthy goal workspace.

  2. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  3. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done — triage verdict: scope CONFIRMED, phase GATED (all gates still open)

    • Agent: queue worker (repo-worker-code), lane C shift
    • Session / ID: queue task 4835 (triage) → follow-up task 4844 (implementation, gated)
    • Found via: queue claim
    • Task: Confirm Phase 3 (closing audit) of design Design: a mirror is what it can prove — one validity, outcome and alarm contract for the github-backup estate mirror #3282 against current main, record gating, enqueue the implementation follow-up with the acceptance criteria intact. No implementation in this task, per the packet.
    • Expectation: done = this verdict + follow-up 4844 enqueued + labels truthful (issue stays status/blocked until the gates land).

    Scope confirmed on current main cf1b243f (fresh gh api reads of infra/github-backup/bin/ at that SHA, 2026-11-01T01:44Z):

    • Bare json.load on generated state: clone_all.py:23 (plan.json), drain_queue.py:44 (state.json) and :66 (plan.json re-read inside the fetch loop — named disposition (b)), fetch_mirrors.py:42 (plan.json) + :50 (state.json), manifest.py:32 (plan.json) + :34 (state.json), reconcile.py:34 (old plan.json).
    • Truncating writes: drain_queue.py:74-75 (state.json), fetch_mirrors.py:69-70 (state.json), manifest.py:68 (MANIFEST.json) + :78 (FAMILIES.md — named disposition (a)), reconcile.py:39-40 (plan.json) + :62 (reconcile report .md — disposition (a)).
    • Zero os.replace / fsync anywhere in bin/. ghb_common.py exists on main but holds only config/inventory/plan helpers — no atomic load/save or flock yet; that is exactly github-backup(state): plan.json, state.json and MANIFEST.json are written non-atomically and loaded with bare json.load — one torn write wedges the daily fetch, the drainer and manifest regeneration #3240's work. README.md and docs/RUNBOOK.md both exist for the contract statement. The phase as scoped is independently landable once its gates land — no rescope needed.

    Gating — NONE of it has landed (fresh gh check, same timestamp): Phase 1 = #3238 OPEN, #3233 OPEN; Phase 2 = #3250 OPEN, #3219 OPEN, #3270 OPEN, #3257 OPEN; siblings #3240 OPEN, #3229 OPEN. Each still carries queue/queued with its own queued triage packet ahead of it. The audit must not start until all eight are closed. This issue stays status/blocked until then, as its acceptance requires.

    Follow-up: implementation packet enqueued as queue task 4844 (small_fix, dedupe repo-health:v1:fix:developing-today/code:issue:3283) with this issue's acceptance criteria copied intact and the hard gate stated first in its body — a worker claiming it before the gate clears must block/park it naming the still-open gating issues rather than run a partial audit.

    Labels: queue/queued now mirrors follow-up 4844; status/blocked stays for the gating; the claim labels from this triage are removed.

  4. added
    queue/queuedHas a queued task in the Supabase agent queue
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Nov 1, 2026
  5. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · parked — hard gate not cleared (picked up and gate-checked this shift).

  6. 152 remaining items

  7. added
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/claimedQueue worker lifecycle state
    on Nov 3, 2026
  8. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    event: parked
    task: 4844 (repo-health-code-pilot; worker repo-worker-code; OpenChamber scheduled lane c8b9355e-319a-4640-8096-7ad19480d151)
    state: parked 2h.
    blocker: hard gate unmet — #3238, #3240, #3270 still OPEN (closed: #3219, #3229, #3233, #3250, #3257). Packet instruction is to park, not improvise a partial audit. No worktree or code changes this run.
    resume: recheck all eight gate issues fresh; begin Phase 3 only when each is closed/landed.
    bookkeeping: sandbox backlog and sweep log deferred to fleet reconciliation (openchamber scheduled lane).

  9. added
    queue/blockedQueue or user escalation state
    status/blockedQueue or user escalation state
    and removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    on Nov 3, 2026
  10. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    Blocked again on the packet's hard gate (task 4844, attempt 6) — no Phase 3 work started, exactly as the packet's scope requires.

    Fresh gh reads at 2026-11-03T12:20Z:

    gate issue state
    #3219, #3229, #3233, #3250, #3257 CLOSED
    #3238 (valid_mirror skeleton passes as verified) OPEN
    #3270 (missing mirror never trips the chronic alarm) OPEN
    #3240 (plan.json / state.json / MANIFEST.json written non-atomically) OPEN

    #3240 is the one Phase 3 depends on directly: the audit's whole deliverable is migrating undispositioned generated-state reads/writes to the ghb_common helpers from #3240, so the migration target does not exist yet.

    State: queue task blocked (blocked-on-gate) with the resume condition "all eight gate issues closed/landed"; labels now queue/blocked + status/blocked (stale queue/parked/status/parked cleared). Resume = recheck all eight fresh, then run Phase 3 in one pass.

  11. added
    queue/claimedQueue worker lifecycle state
    queue/queuedHas a queued task in the Supabase agent queue
    task/triageQueue packet kind: verify, reproduce, and route this item
    and removed
    queue/claimedQueue worker lifecycle state
    on Nov 3, 2026
  12. developing-today commented on Nov 3, 2026

    @developing-today
    Contributor

    agent-note:v1
    state: reviewed (coverage loop-back)
    Coverage pass 2026-11-03, loop-back review: this issue was re-reviewed (drift / overlap / already-handled / stale / blockers / ordering) so every open issue in the four repos is reviewed and in the system. Verdict: still live; in the system as task 4844 (small_fix, blocked, priority 30) in repo-health-code-pilot. Labels audited and synced. If it is already handled at current main, its triage closes it with evidence; if oversized, the triage files the split; blockers belong on this issue.
    Found via: coverage loop-back 2026-11-03

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/github-backupinfra/github-backup estate mirror systemkind/enhancementpriority/normalOrdinary priority (the default)queue/blockedQueue or user escalation statequeue/queuedHas a queued task in the Supabase agent queuesource/design-architectFiled by the repo design architect jobstatus/blockedQueue or user escalation statestatus/in-progressQueue worker lifecycle statetask/triageQueue packet kind: verify, reproduce, and route this itemwork/assignedQueue worker lifecycle state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions