From 76a34b8aabc315163482965b2617a3771c9fb914 Mon Sep 17 00:00:00 2001 From: Sinity Date: Mon, 10 Aug 2026 12:42:34 +0200 Subject: [PATCH] chore(beads): close satisfied merged WIP proofs --- .beads/issues.jsonl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index b0623a2865..05eb1bf9a7 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -686,7 +686,7 @@ {"_type":"issue","id":"polylogue-sru.2","title":"Characterize ambiguous bucket: wordless continuation vs prose-without-markers","description":"Split next-turn-is-tool-call (wordless continuation) from prose-lacking-ack-markers; state counts for both. Opus-4-7 74% ambiguous vs deepseek 17% is likely turn-structure variance, not behavior — this split disambiguates.","design":"Implementation home: the claim-vs-evidence classifier in devtools (devtools/ module behind `devtools workspace claim-vs-evidence`; tests tests/unit/devtools/test_claim_vs_evidence.py). Wordless-continuation detection: for each failure's paired next assistant message, check whether its blocks contain tool_use and no text block with \u003eN chars before the first tool_use — that is 'wordless continuation'; prose without matched ack markers stays 'ambiguous-prose'. Emit both as classification_reason variants (field already exists) and add the two counts to the report summary + by_model/by_tool cuts. Regen: `devtools workspace claim-vs-evidence --limit 5000 --out-dir .agent/demos/claim-vs-evidence --json`. Acceptance: report shows ambiguous split into wordless_continuation vs prose_no_marker with counts; per-model ambiguous variance (opus-4-7 74% vs deepseek 17%) re-examined after the split.","notes":"2026-07-03 Codex WIP: unit implementation for ambiguous split passes focused tests, but live regeneration with --limit 5000 became too slow and had to be killed twice. First attempt used correlated subqueries for next-message block shape; second used set-based CTE; third used chunked second query after sampled rows, but the full command still exceeded 90s on active archive and ignored SIGINT while inside SQLite. Do not close or commit this slice until the live regeneration path is profiled/fixed. Dirty files currently show the WIP implementation: devtools/claim_vs_evidence.py and tests/unit/devtools/test_claim_vs_evidence.py. Last passing focused proof: python -m py_compile + ruff check + devtools test tests/unit/devtools/test_claim_vs_evidence.py -\u003e 3 passed.","status":"closed","priority":1,"issue_type":"task","assignee":"Sinity","owner":"ezo.dev@gmail.com","created_at":"2026-07-03T04:31:28Z","created_by":"Sinity","updated_at":"2026-07-31T22:35:43Z","started_at":"2026-07-03T07:09:21Z","closed_at":"2026-07-03T07:45:10Z","close_reason":"Completed: claim-vs-evidence now splits ambiguous follow-ups into wordless tool continuations and prose-without-marker buckets, reports the counts in JSON/README summaries, and regenerates the current demo on the active archive. Focused tests pass; live regen/check completed.","labels":["area:substrate","campaign"],"dependencies":[{"issue_id":"polylogue-sru.2","depends_on_id":"polylogue-sru","type":"parent-child","created_at":"2026-07-03T06:31:27Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":1,"comment_count":0} {"_type":"issue","id":"polylogue-sru.3","title":"Benign-recovery vs consequential-silence split by handler kind","description":"Read failures are ~94% silent but 'tried another path' is usually benign; Bash/test failures are the consequential class. Scope the headline to consequential handler kinds or add an explicit split — credibility depends on not inflating with trivial recoveries.","design":"Handler kind is already available on the paired failure row (actions lane exposes handler/tool). Define the consequential set explicitly in code (Bash/test/build/write-class handlers) and the benign-recovery set (Read/Glob/Grep-class 'tried another path'), emit split headline rows: silent-proceed among consequential vs among all. Keep the mapping a named constant with a rationale comment so reviewers can argue with it. Report both; never let the headline mix classes silently. Same regen/tests as the other methodology children.","status":"closed","priority":1,"issue_type":"task","assignee":"Sinity","owner":"ezo.dev@gmail.com","created_at":"2026-07-03T04:31:28Z","created_by":"Sinity","updated_at":"2026-07-31T22:35:43Z","started_at":"2026-07-03T07:55:37Z","closed_at":"2026-07-03T07:58:08Z","close_reason":"Completed: claim-vs-evidence now reports a first-class handler-class split separating consequential shell/edit/write-class tool failures from benign read/search/path-discovery failures and other tools. The regenerated active-archive artifact shows consequential=4,177 failures with 921 silent-proceed (22.0% lower bound), benign_recovery=633 with 166 silent-proceed (26.2%), and other=190 with 92 silent-proceed (48.4%). Focused tests and demo shelf checks passed.","labels":["area:substrate","campaign"],"dependencies":[{"issue_id":"polylogue-sru.3","depends_on_id":"polylogue-sru","type":"parent-child","created_at":"2026-07-03T06:31:28Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":1,"comment_count":0} {"_type":"issue","id":"polylogue-sru.1","title":"Expose action-unit outcome fields + followup_class as product capability","description":"Capabilities-may-not-be-silos gate for the campaign: the facts the report needs must become composable query capability. After this, the whole report is `actions where is_error:true | group by session.origin, followup_class | count` and every future cut (model/tool/repo/time) is free.","design":"1) is_error/exit_code are normalized at parse time (sources/parsers/base_models.py:74-75) but ActionQueryRowPayload (surfaces/payloads.py:~1298) carries neither — add as filterable/groupable action-unit fields. 2) Add derived followup_class (acknowledged|silent_proceed|wordless_continuation|ambiguous) + followup_message_ref computed in the source-derived lowering (no cache tables). 3) Reduce devtools workspace claim-vs-evidence to a render preset over these query strings, or retire it. Touchpoint chain: stage parser -\u003e AST to_payload -\u003e executor -\u003e metadata.py aggregate_group_fields -\u003e shell_completion_values.py -\u003e devtools render openapi + cli-output-schemas + cli-reference. Line refs pre-07-03; re-locate.","acceptance_criteria":"Fixture session with known unacknowledged failure fires via pure query strings; report README numbers reproducible from the printed queries.","notes":"Completed: action-unit outcome follow-up classification is now shared query capability. is_error/exit_code were already wired; this slice added source-derived followup_class and followup_message_ref over existing actions/messages/blocks, exposed followup_class as filterable/groupable action metadata, added action row payload fields, routed root CLI terminal-unit aggregate expressions before session-selector compilation, and moved the report classifier from scripts into polylogue.archive.actions.followup. Reproduction/query forms are now printed in .agent/demos/claim-vs-evidence/PUBLIC_REPRODUCTION.md: actions where is_error:true | group by followup_class | count; actions where followup_class:silent_proceed. Verification: focused DSL/report/CLI tests passed; active demo packet regenerated over archive root /home/sinity/.local/share/polylogue schema v23 with 41,886 structured failures and 5,000 inspected; devtools verify --quick passed run 20260703T092510Z-quick-718233-46e8b587.","status":"closed","priority":1,"issue_type":"feature","assignee":"Sinity","owner":"ezo.dev@gmail.com","created_at":"2026-07-03T04:31:27Z","created_by":"Sinity","updated_at":"2026-07-03T09:25:36Z","started_at":"2026-07-03T09:05:37Z","closed_at":"2026-07-03T09:25:36Z","close_reason":"Completed","labels":["area:query","area:substrate","campaign"],"dependencies":[{"issue_id":"polylogue-sru.1","depends_on_id":"polylogue-sru","type":"parent-child","created_at":"2026-07-03T06:31:26Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"polylogue-cybpg","title":"docs: publish recovered architecture and readiness packets","description":"Publish the recovered architecture, decision, and Bead-readiness packets into the current documentation surface so their evidence and sequencing are discoverable from master.","design":"Carry the three recovered documents onto current master, index each through devtools/docs_surface.py and docs/README.md, and preserve their references to live Beads without claiming the underlying implementation work is complete.","acceptance_criteria":"1. The readiness, content-identity/lineage, and decision-adjudication packets exist on current master. 2. Each packet is indexed in devtools/docs_surface.py and docs/README.md. 3. render all --check, devtools verify --quick, and focused documentation checks pass. 4. The packet text does not claim its referenced implementation Beads are closed.","status":"open","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-08-10T08:05:41Z","created_by":"Sinity","updated_at":"2026-08-10T08:05:41Z","labels":["area:docs","area:planning","lane:reindex"],"dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"polylogue-cybpg","title":"docs: publish recovered architecture and readiness packets","description":"Publish the recovered architecture, decision, and Bead-readiness packets into the current documentation surface so their evidence and sequencing are discoverable from master.","design":"Carry the three recovered documents onto current master, index each through devtools/docs_surface.py and docs/README.md, and preserve their references to live Beads without claiming the underlying implementation work is complete.","acceptance_criteria":"1. The readiness, content-identity/lineage, and decision-adjudication packets exist on current master. 2. Each packet is indexed in devtools/docs_surface.py and docs/README.md. 3. render all --check, devtools verify --quick, and focused documentation checks pass. 4. The packet text does not claim its referenced implementation Beads are closed.","status":"closed","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-08-10T08:05:41Z","created_by":"Sinity","updated_at":"2026-08-10T09:49:53Z","closed_at":"2026-08-10T09:49:53Z","close_reason":"Satisfied by merged PR #3914 (c75a5e2c4). The three recovered architecture/readiness packets are on master, indexed in docs surfaces, and the exact-head focused documentation check plus quick verification passed; packet text preserves referenced implementation work as open.","labels":["area:docs","area:planning","lane:reindex"],"dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-k617z","title":"Reuse compatible Voyage 4 vectors across model changes","description":"Voyage documents that voyage-4, voyage-4-lite, and voyage-4-large share an embedding space, but Polylogue's current per-message input hash and recipe identity include the literal model name. Changing the active model therefore requeues existing messages even when stored vectors are provider-compatible. Add an explicit Voyage 4 compatibility-family identity or equivalent fallback so a model switch can reuse existing vectors while new material uses the selected model, with real archive tests covering query and document vectors across the switch.","acceptance_criteria":"A configured switch within the Voyage 4 shared family does not requeue unchanged existing messages; existing voyage-4 vectors remain searchable with voyage-4-lite or voyage-4-large queries; new messages use the configured model; non-compatible model or dimension changes retain reindex behavior.","status":"open","priority":2,"issue_type":"feature","owner":"ezo.dev@gmail.com","created_at":"2026-08-06T11:19:13Z","created_by":"Sinity","updated_at":"2026-08-06T11:19:13Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-6olqi","title":"Drop dead otlp_spans table (source.db, durable tier): zero writer since #3665, zero reader","design":"Found while executing polylogue-yp5p (2026-08-03): otlp_spans in source.db (durable tier) has zero writer since PR #3665 removed the OTLP receiver, and zero reader anywhere. docs/schema.md already flags it as 'pending an explicit migration decision'. Unlike the derived-tier tables dropped in yp5p, this is a DURABLE tier table -- dropping it needs this repo's copy-forward/consent gate for destructive durable-tier changes (explicit backup-manifest verification), not a benign-DDL/SEMANTIC_REPARSE derived-tier delta. Verify still dead against current source before acting, then add a numbered additive... actually destructive migration under polylogue/storage/sqlite/migrations/source/ following the durable-tier schema regime.","status":"open","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-08-03T22:10:04Z","created_by":"Sinity","updated_at":"2026-08-03T22:10:04Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-d7wt0","title":"Audit whether storage/repair.py (7.3K lines) should collapse into write-path invariants post-raw-authority-convergence","description":"Operator question 2026-08-03: \"'repair' machinery still exists? I thought\nrepair was supposed to be wiped out, purged, replaced by elegant invariants.\nWe don't want repairing things, we want them to not be broken, by\nconstruction. Invariants.\"\n\npolylogue/storage/repair.py is 7,349 lines and actively imported by the\nmaintenance target catalog (CLEANUP_TARGETS/SAFE_REPAIR_TARGETS), blob repair,\nsession-insight repair assessment, and message-type backfill -- it is not\ndead code, it is a large, live subsystem.\n\nThis is in direct tension with the automagic-invariants operating principle\n(persistent memory, 2026-07-19 sharpening): \"if Polylogue can maintain a\ncondition fully automatically, it generally should... there is NO\nbreak-glass tier. Once the automatic path maintains an invariant, the\nredundant manual surface is DELETED, not demoted to escape-hatch status.\"\nThe precedent already applied once: `ops maintenance rebuild-index` was\ndeleted (not kept as a manual escape hatch) once polylogue-gd6v proved\ndaemon bulk routing equivalent.\n\nThe reindex campaign's own Phase A (raw-authority convergence: lb39z/hjpx/\nlkrc/yla8) is, in a real sense, ALSO repair machinery -- a\nRawAuthorityReconciler that classifies and fixes up bad raw-authority state\nafter the fact, rather than a write-path invariant that prevents the bad\nstate from ever existing. Whether that's the right shape long-term, or\nwhether it should collapse into stronger write-path guarantees once the\ncurrent convergence work proves out what \"healthy\" state actually looks\nlike, is a real design question this session did not have time to resolve.\n\nScope for this bead: once Phase A of the reindex campaign closes (raw\nauthority converged, r9xsj/yla8/lkrc closed), audit repair.py's actual call\nsites and ask, function by function: (1) is this repairing a state that a\nwrite-path invariant could prevent from occurring at all -- if so, design\nthe invariant and delete the repair function; (2) is this repairing genuine\nexternal-world drift (files moved/deleted on disk, upstream export re-run)\nthat no write-path invariant CAN prevent -- if so, it's legitimate\ndiagnostic/recovery machinery and should stay, but be honestly labeled as\nsuch rather than lumped in with (1); (3) is this dead weight already\nsuperseded by the raw-authority reconciler's own logic -- if so, delete.\n\nDo not attempt this audit until Phase A of\n.agent/scratch/2026-08-03-reindex-campaign-full-plan.md closes -- doing it\nearlier means auditing against a moving target (the reconciler that would\nreplace repair.py's logic is itself still being built).","notes":"\nSUPERSEDED: this exact audit already exists and is far more developed -- polylogue-6kur (\"Cull the repair surface: 10k lines of manual repair against 2.7k of convergence\") has a measured per-target analysis (live archive, frozen 2026-07-30) of all 22 public repair.py entrypoints, already classifying several as \"structurally impossible -- delete\". t46's own dispatch-wave-plan (2026-08-03) already schedules a Wave-1 lane (L5 \"repair-safe-cull\") to execute 6kur items (1)+(3-parity-proof) against storage/repair.py directly. Closing this bead as a duplicate; see 6kur for the real audit and its live per-target findings. One thing this bead's own investigation adds that's worth folding into 6kur's notes: polylogue/storage/raw_reconciler.py's own module docstring explicitly states repair.py's actuators remain the execution layer underneath the reconciler (\"Historical incident actuators remain implementation strategies in polylogue.storage.repair; they do not get to define separate public notions of plan identity, evidence, or readiness\") -- so the raw-authority convergence work (lkrc/hjpx/lb39z/yla8, Phase A of the reindex campaign) is itself a LIVE CONSUMER of repair.py's actuators, not a bystander. Any 6kur/L5 cull that removes or reshapes an actuator repair.py exposes must coordinate with whichever of lkrc/hjpx/lb39z/yla8 is live at the time -- same file, two initiatives, real collision risk if both touch it in the same window without sequencing.","status":"closed","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-08-03T14:54:16Z","created_by":"Sinity","updated_at":"2026-08-03T15:00:56Z","closed_at":"2026-08-03T15:00:56Z","dependencies":[{"issue_id":"polylogue-d7wt0","depends_on_id":"polylogue-lkrc","type":"blocks","created_at":"2026-08-03T16:54:57Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} @@ -1150,7 +1150,7 @@ {"_type":"issue","id":"polylogue-y6tb","title":"Configure a default per-test timeout so a single hung test fails with a stack, not a burned step budget","description":"pytest-timeout is a dependency annotated \"per-test hang guard; fail fast with a stack instead of burning the CI job ceiling\" (pyproject.toml:74) but no timeout is configured in [tool.pytest.ini_options] - the guard is inert except where a test opts in. The only backstops are harness-level: 45-min overall and 10-min output-stall (devtools/verify.py:192-193), so one hung test can burn the entire step budget and produces no per-test stack. A default per-test timeout converts a hang into a named failing nodeid with a traceback.\n","design":"Set a default timeout (~120s) and timeout_method in ini_options; verify interaction with pytest-asyncio (asyncio_mode=auto) - thread method is the safe default since signal method breaks under xdist workers. Mark-based overrides for slow/scale_*/benchmark/load_sensitive/chaos lanes (timeout(0) or higher values on the marker definitions). Confirm the full two-lane --all run stays green (no test legitimately exceeds the default outside the marked lanes); document in TESTING.md.\n","acceptance_criteria":"ini_options sets timeout + method; marked lanes carry documented overrides; devtools verify --all two-lane run green; a demonstration hang (temporary test with time.sleep beyond the limit) fails with a per-test stack within the timeout. VERIFY: --all run summary + demonstration output in notes.","notes":"Priority correction 2026-07-15: promoted to P2 during the mandate-wide inversion audit. This is a present correctness, safety, source-trust, or verification-integrity failure with a concrete production path; promotion does not itself admit or claim the work.","status":"closed","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-07-08T17:32:30Z","created_by":"Sinity","updated_at":"2026-07-31T22:35:43Z","closed_at":"2026-07-27T07:01:15Z","close_reason":"Bead's premise was already stale by the time it was worked: pyproject.toml's [tool.pytest.ini_options] has had timeout=120 (timeout_method=signal) since PR #2932 (2026-07-16), predating this bead. The only real residual was a stale doc comment in devtools/pytest_timeout_overrides.toml still claiming a '300-second timeout default' that was never true of the configured value - fixed via PR #3307. devtools verify pytest-timeout-overrides already existed and passes (7 explicit overrides, 0 violations), confirming the override escape-hatch mechanism this bead also asked about was already in place.","labels":["area:test","horizon:frontier"],"dependencies":[{"issue_id":"polylogue-y6tb","depends_on_id":"polylogue-88jp","type":"parent-child","created_at":"2026-07-13T07:05:29Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-y6tb","depends_on_id":"polylogue-b054.1.1","type":"relates-to","created_at":"2026-07-16T06:40:28Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-e6ja","title":"Close the zero-tests-pre-merge hole: bounded per-PR test lane or local-verify attestation (operator decision)","description":"Operator DELIBERATELY removed the 45-min full-suite job from the per-PR path (ci.yml:44-49, ~18 min wait not worth it) - that decision stands and this bead does not propose reverting it. But the combined state means a PR can merge with zero tests executed anywhere: per-PR CI has no test job, the pre-push hook runs verify --quick (no pytest), and even that is skipped when .cache/last-verify-head matches HEAD. The post-merge net catches regressions only after they land (the 2026-07-05 drift was repaired days later in PR #2556). Question to adjudicate: is a BOUNDED middle tier worth its cost, or is a local-attestation signal enough?\n","design":"Options for operator decision: (A) changed-package heuristic job: map changed paths to tests/unit/\u003cpackage\u003e subsets, hard 10-minute timeout, non-required check at first (observability before gate); simple, no testmon-state transfer. (B) testmon-affected job: restore testmon DB artifact from the last master run and run affected-only; highest fidelity, but testmon state transfer across runners is fragile and the local forkserver deadlock (polylogue-27rb) argues against trusting testmon in CI yet. (C) attestation-only: pre-push hook records the verify tier+head into the push (e.g. commit trailer or PR body check), and a CI check verifies the attestation exists - zero CI compute, makes \"tests were run locally\" legible instead of assumed. Recommendation: C now (cheap, honest), A later if post-merge regressions recur; B rejected until 27rb lands. Whatever is chosen, document the skip/miss semantics in ci.yml comments next to the existing decision comment.\n","acceptance_criteria":"Operator decision recorded on this bead (option A/B/C or explicit wontfix); the chosen mechanism demonstrated on one sample PR within its stated budget; ci.yml comment block updated to describe the resulting gate semantics. VERIFY: sample PR link + check output in notes.","notes":"[RATIFIED 2026-07-08, decision brief .agent/reports/decision-brief-2026-07-08.md] DECIDED: option C (attestation) now — pre-push hook records verify tier + head; CI check makes local-test claims legible. Escalation PRE-COMMITTED: two post-merge regressions within 30 days triggers option A (changed-package job, 10-min cap, non-required initially). Option B rejected until polylogue-27rb lands. This bead is now execution-ready: implement C.\nEVIDENCE 2026-07-13: tonight was this bead's question at maximum width — GitHub Actions account-locked, so ~44 PRs merged on local gates only (devtools verify --quick + focused tests + review-fleet evidence + conductor spot-checks). It WORKED (one red-master window, fixed forward within the hour), which is evidence FOR the local-verify attestation option: the conductor pattern (rebase -\u003e quick gate -\u003e focused selection -\u003e merge) is a de facto attestation protocol. Adjudicate with tonight's merge log as the dataset; polylogue-of39 (post-billing CI re-verification) will measure what the local gates missed, closing the loop on the decision.\nPriority correction 2026-07-15: promoted P3 to P2 during invariant review. The bead covers a current single-writer, resource-containment, durable-lifecycle, verification-gate, or interactive-latency contract with concrete evidence; promotion does not automatically admit it to the active execution set.\nVerification (group2 sweep, 2026-07-30): LIVE. Ratified decision was option C (pre-push attestation + CI check of local-verify claims). grep -rn attestation .github/workflows/*.yml and pre-push hook return nothing; git log --grep attestation shows no matching commit. The decided mechanism was never implemented.","status":"open","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-07-08T17:31:48Z","created_by":"Sinity","updated_at":"2026-07-31T22:35:43Z","labels":["area:devloop","area:test","decision","horizon:frontier"],"dependencies":[{"issue_id":"polylogue-e6ja","depends_on_id":"polylogue-27rb","type":"relates-to","created_at":"2026-07-31T14:40:08Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-e6ja","depends_on_id":"polylogue-88jp","type":"parent-child","created_at":"2026-07-15T19:13:20Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-e6ja","depends_on_id":"polylogue-ct3r2","type":"relates-to","created_at":"2026-08-03T07:01:14Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-d45p","title":"Maintain an evidence-backed verification failure ledger","description":"Managed verification already persists structured run artifacts, but failure knowledge still fragments into flake folklore, one-off clean-baseline beads, timeout notes, environment-poisoning incidents, and silent known-red expectations. The same node may be flaky at one environment fingerprint, deterministically broken across commits, or invalid because a worktree used another checkout environment. Without one durable observation ledger, every red requires re-derivation and every accepted red erodes the gate.","design":"Build a VerificationFailureRecord/ledger from VerifyRun artifacts. Identity includes test/check id, git head and dirty state, environment/harness fingerprint, selected dependency graph, runtime/resource evidence, first/last observation, and retained artifact refs. Classification is evidence-derived and revisable: deterministic regression, flake, timeout/resource, environment contamination, tool/infrastructure failure, expected transition, or unknown. Disposition carries owning capability/Bead, quarantine or baseline authority, expiry, and required next proof. Same-head outcome variance is flake evidence, not proof by itself; persistent failure across clean heads is regression evidence; mixed-checkout fingerprints remain contamination. Verify diagnostics consume the ledger, but never auto-retry or silently convert failure to success. Existing risk records in 88jp consume this ledger as one evidence adapter.","acceptance_criteria":"1. A machine-readable ledger records every observed failing test/check with stable identity, git/dirty/environment/harness/dependency fingerprints, first/last seen, outcomes, runtime/resource data, artifact refs, classification confidence, owner/Bead, disposition, and expiry. 2. Existing VerifyRun history yields candidates for deterministic regression, same-head variance, timeout/resource, mixed-checkout environment contamination, infrastructure failure, and unknown without conflating them. 3. The known Python 3.11 concurrency flake, mixed-checkout phantom failures, and polylogue-p5li six-node clean-baseline cohort classify distinctly with cited evidence. 4. Verify failure diagnostics annotate ledger matches and unexplained reds; a quarantine/baseline exception requires authority, Bead, scope, and expiry, and expiry fails the policy gate. 5. No automatic retry or broad quarantine turns a red green; a deterministic open regression remains red or explicitly policy-blocked until its owning repair lands. 6. Removing environment identity, same-head history, expiry, or artifact evidence makes mutation-sensitive classification tests fail; focused devtools tests and verification-manifest gates pass.","notes":"LOOP INSTANCE 2026-07-13: the flake ledger is rxdo.11-family — watch: VerifyRun artifacts (3,727 run dirs); measure: per-test failure/pass history with env fingerprints; propose: quarantine candidates with bead refs + expiry (v8dz marker is the actuator); judge: operator or calibrated agent. Tonight adds material: the 9-failure phantom on the embeddings-hygiene branch (mixed-checkout .venv artifact, resolved on re-run) is exactly the flaky-vs-broken classification this ledger would have answered in seconds.\nInvariant reformulation 2026-07-15: generalizes the flake-only ledger into the single verification-failure evidence adapter. polylogue-p5li is the first deterministic-baseline consumer; polylogue-wple supplies environment-poisoning detection evidence.","status":"open","priority":2,"issue_type":"feature","owner":"ezo.dev@gmail.com","created_at":"2026-07-08T17:31:45Z","created_by":"Sinity","updated_at":"2026-07-31T22:35:43Z","metadata":{"frontier":"active","frontier_program_ref":"polylogue-88jp"},"labels":["area:devloop","area:test","horizon:frontier"],"dependencies":[{"issue_id":"polylogue-d45p","depends_on_id":"polylogue-88jp","type":"parent-child","created_at":"2026-07-13T07:05:29Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-d45p","depends_on_id":"polylogue-9e5.11","type":"relates-to","created_at":"2026-07-31T14:40:08Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-d45p","depends_on_id":"polylogue-wple","type":"relates-to","created_at":"2026-07-15T21:35:15Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"polylogue-hjwr","title":"Deterministic-rebuild differential lane: full rebuild vs incremental convergence must agree","description":"Derived tiers are rebuild-from-source by design, but nothing asserts the two properties that make that trustworthy: (1) DETERMINISM - two full rebuilds of the same source.db produce logically identical index content; (2) INCREMENTAL-VS-FULL EQUIVALENCE - the daemon converger refresh path and a from-scratch rebuild agree. Both are live risks, not hypotheticals: a7xr.2 shows converger and repair disagree on session_profile staleness for NULL-sort-key sessions, and f2qv.5 shows session_model_usage/session_provider_usage_events are written at ingest but absent from convergence refresh entirely (no self-heal). This differential is also the gate that makes blue-green rebuilds (b5l) safe to trust and the rebuild-safety scenario (1xc.8) checkable.\n","design":"A devtools lab lane: seed a scratch archive from the fixture/demo corpus; path A = full derived rebuild (ops reset --index + reingest equivalent, in-process); path B = incremental ingest + convergence stages (+ targeted refresh after mutations: re-ingest one session, delete one). Dump logical projections of every derived table as ordered SELECTs excluding a documented allowlist of volatile columns (materialization timestamps, run ids, generation counters), then structurally diff A vs B, and A vs A-rerun for determinism. Failures print per-table row-level diffs. Demo-corpus tier runs per lane invocation; scale_medium tier reserved for --lab/nightly. Anchors: storage/insights/session/rebuild.py (rebuild chokepoint), daemon/convergence_stages.py (refresh lanes), archive_tiers DDL for table census so new derived tables are auto-included (fail if a derived table is neither diffed nor allowlisted - prevents silent scope decay).\n","acceptance_criteria":"Lane runnable via devtools lab; auto-census requires every derived table to be diffed or explicitly allowlisted; a seeded divergence of the a7xr.2 class is demonstrably caught; run against current master either green or with each divergence filed as its own bead and referenced from this one. VERIFY: the lab lane command recorded in notes, run twice (determinism) on the demo corpus.","notes":"THIRD COMPARAND 2026-07-13: the differential lane now has three paths that must agree, not two — full rebuild vs incremental convergence vs FAST-FORWARD (devtools/index_fast_forward.py, deployed and used on the live archive tonight; #2804/#2805 + p5r4 sampling). The fast-forward equivalence-sampling machinery is reusable as this lane's comparison engine.\nTHIRD COMPARAND 2026-07-13: three paths must now agree, not two — full rebuild vs incremental convergence vs FAST-FORWARD (devtools/index_fast_forward.py, deployed on the live archive tonight; #2804/#2805 + p5r4 sampling). The fast-forward equivalence-sampling machinery is reusable as this lane's comparison engine.\n[Verification sweep 2026-07-31, bead-landing-check group5] Verdict: LIVE. No landing note; only scope clarification (third comparand: fast-forward path) added 2026-07-13; differential lane itself not built.\n2026-08-03: the differential idea lands better as a metamorphic PROPERTY on synthetic corpora (incremental==bulk in the hermetic convergence-property loop bead) than as a live-archive lane - consider closing into that bead once it lands; the live-archive variant survives only as the one-time 0x7nh canary differ around the actual reindex.","status":"open","priority":2,"issue_type":"feature","owner":"ezo.dev@gmail.com","created_at":"2026-07-08T17:30:17Z","created_by":"Sinity","updated_at":"2026-08-03T07:09:14Z","labels":["area:daemon","area:storage","area:test","horizon:frontier"],"dependencies":[{"issue_id":"polylogue-hjwr","depends_on_id":"polylogue-1xc.8","type":"relates-to","created_at":"2026-07-31T14:40:08Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-hjwr","depends_on_id":"polylogue-a7xr.2","type":"relates-to","created_at":"2026-07-31T14:40:08Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-hjwr","depends_on_id":"polylogue-b5l","type":"parent-child","created_at":"2026-07-15T01:23:34Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-hjwr","depends_on_id":"polylogue-f2qv.5","type":"relates-to","created_at":"2026-07-31T14:40:08Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":1,"comment_count":0} +{"_type":"issue","id":"polylogue-hjwr","title":"Deterministic-rebuild differential lane: full rebuild vs incremental convergence must agree","description":"Derived tiers are rebuild-from-source by design, but nothing asserts the two properties that make that trustworthy: (1) DETERMINISM - two full rebuilds of the same source.db produce logically identical index content; (2) INCREMENTAL-VS-FULL EQUIVALENCE - the daemon converger refresh path and a from-scratch rebuild agree. Both are live risks, not hypotheticals: a7xr.2 shows converger and repair disagree on session_profile staleness for NULL-sort-key sessions, and f2qv.5 shows session_model_usage/session_provider_usage_events are written at ingest but absent from convergence refresh entirely (no self-heal). This differential is also the gate that makes blue-green rebuilds (b5l) safe to trust and the rebuild-safety scenario (1xc.8) checkable.\n","design":"A devtools lab lane: seed a scratch archive from the fixture/demo corpus; path A = full derived rebuild (ops reset --index + reingest equivalent, in-process); path B = incremental ingest + convergence stages (+ targeted refresh after mutations: re-ingest one session, delete one). Dump logical projections of every derived table as ordered SELECTs excluding a documented allowlist of volatile columns (materialization timestamps, run ids, generation counters), then structurally diff A vs B, and A vs A-rerun for determinism. Failures print per-table row-level diffs. Demo-corpus tier runs per lane invocation; scale_medium tier reserved for --lab/nightly. Anchors: storage/insights/session/rebuild.py (rebuild chokepoint), daemon/convergence_stages.py (refresh lanes), archive_tiers DDL for table census so new derived tables are auto-included (fail if a derived table is neither diffed nor allowlisted - prevents silent scope decay).\n","acceptance_criteria":"Lane runnable via devtools lab; auto-census requires every derived table to be diffed or explicitly allowlisted; a seeded divergence of the a7xr.2 class is demonstrably caught; run against current master either green or with each divergence filed as its own bead and referenced from this one. VERIFY: the lab lane command recorded in notes, run twice (determinism) on the demo corpus.","notes":"THIRD COMPARAND 2026-07-13: the differential lane now has three paths that must agree, not two — full rebuild vs incremental convergence vs FAST-FORWARD (devtools/index_fast_forward.py, deployed and used on the live archive tonight; #2804/#2805 + p5r4 sampling). The fast-forward equivalence-sampling machinery is reusable as this lane's comparison engine.\nTHIRD COMPARAND 2026-07-13: three paths must now agree, not two — full rebuild vs incremental convergence vs FAST-FORWARD (devtools/index_fast_forward.py, deployed on the live archive tonight; #2804/#2805 + p5r4 sampling). The fast-forward equivalence-sampling machinery is reusable as this lane's comparison engine.\n[Verification sweep 2026-07-31, bead-landing-check group5] Verdict: LIVE. No landing note; only scope clarification (third comparand: fast-forward path) added 2026-07-13; differential lane itself not built.\n2026-08-03: the differential idea lands better as a metamorphic PROPERTY on synthetic corpora (incremental==bulk in the hermetic convergence-property loop bead) than as a live-archive lane - consider closing into that bead once it lands; the live-archive variant survives only as the one-time 0x7nh canary differ around the actual reindex.","status":"closed","priority":2,"issue_type":"feature","owner":"ezo.dev@gmail.com","created_at":"2026-07-08T17:30:17Z","created_by":"Sinity","updated_at":"2026-08-10T10:41:21Z","closed_at":"2026-08-10T10:41:21Z","close_reason":"Satisfied by merged PR #3915 (cb0de952a): deterministic rebuild/incremental differential proof passed across 58 tables with zero uncovered; exact-head focused and quick verification passed.","labels":["area:daemon","area:storage","area:test","horizon:frontier"],"dependencies":[{"issue_id":"polylogue-hjwr","depends_on_id":"polylogue-1xc.8","type":"relates-to","created_at":"2026-07-31T14:40:08Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-hjwr","depends_on_id":"polylogue-a7xr.2","type":"relates-to","created_at":"2026-07-31T14:40:08Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-hjwr","depends_on_id":"polylogue-b5l","type":"parent-child","created_at":"2026-07-15T01:23:34Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-hjwr","depends_on_id":"polylogue-f2qv.5","type":"relates-to","created_at":"2026-07-31T14:40:08Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":1,"comment_count":0} {"_type":"issue","id":"polylogue-g9f2","title":"Hypothesis stateful model of the write path: replace/merge/lineage/variant interleavings","description":"tests/unit/storage/test_repository_state_machine.py (Hypothesis RuleBasedStateMachine) covers save / re-save / delete / query consistency only. The riskiest write-path semantics have zero model-based coverage: full-replace prefix extraction (spawned-fresh vs prefix-sharing, archive_tiers/write.py:_extract_prefix_tail), merge_append, the stale-replace guard (incoming updated_at \u003c stored skips write), variant_index regeneration branches, and session_links resolution/quarantine. The lineage bugs found live (4ts.4/4ts.6 aggregate double-count and composition truncation, a7xr.2 staleness disagreement) are exactly the interleaving class that example tests miss and a state machine catches. Methodology sibling of polylogue-yeq (metamorphic/chaos/ref-walk lanes); substrate owner is the polylogue-4ts epic.\n","design":"Extend the existing state machine or add a lineage-focused one over a scratch split-file archive. Operations (Hypothesis rules): ingest-parent; ingest-child-replaying-parent-prefix (generate the replayed prefix from the model, k\u003e=0 shared messages); re-ingest-with-edit (content-hash change forces full-replace); merge_append; stale-replace attempt (older updated_at, expect skip); delete-parent (dangling branch point). Model tracks logical transcripts per session. Invariants checked after every op: (1) get_messages(child) equals model composition; (2) prefix-sharing children store only the divergent tail physically (physical vs logical message counts); (3) branch_point_message_id resolves, or composition degrades to the documented over-truncate behavior, never over-extend; (4) session_links rows stay in legal TopologyEdgeStatus states; (5) FTS docsize parity with stored blocks. Keep runtime bounded via hypothesis profile settings (existing default/ci/verify profiles in tests/conftest.py:212-251). Seeded regression corpus for every found bug per tests/infra conventions.\n","acceptance_criteria":"State machine exercises all six operation classes and the five invariants; runs inside the default suite within hypothesis-profile budgets (seconds, not minutes); any divergence found is either fixed in the owning substrate bead or reproduced+filed with a seed; the known 4ts.6 over-truncate behavior is encoded as a documented invariant. VERIFY: devtools test tests/unit/storage/test_repository_state_machine.py (or the new module) green under HYPOTHESIS_PROFILE=default and =ci.","status":"closed","priority":2,"issue_type":"feature","owner":"ezo.dev@gmail.com","created_at":"2026-07-08T17:30:14Z","created_by":"Sinity","updated_at":"2026-07-12T23:30:07Z","closed_at":"2026-07-12T23:30:07Z","close_reason":"PR #2798 merged: Hypothesis stateful property test for write-path interleavings — 6 operation classes, 5 invariants, no production divergence found","labels":["area:storage","area:test","horizon:frontier"],"dependencies":[{"issue_id":"polylogue-g9f2","depends_on_id":"polylogue-4ts","type":"relates-to","created_at":"2026-07-31T14:40:08Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-g9f2","depends_on_id":"polylogue-yeq","type":"relates-to","created_at":"2026-07-31T14:40:08Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-27rb","title":"Testmon+xdist D-state deadlock: root-cause + stall detection keyed on test-event progress, not output bytes","description":"Two confirmed hangs on 2026-07-08 (bd memory devtools-verify-testmon-forkserver-deadlock): the default `devtools verify` testmon step (-n 4 xdist) stalls with all 4 workers in D-state at ~8-10% CPU for 30+ minutes. The stall detector (devtools/verify.py:577) fires only on OUTPUT silence; the xdist master keeps emitting, so it never fires and the 45-min ceiling (verify.py:192) is the only backstop. Worse, the progress ledger hardcodes idle_s=0.0 on every output event (verify.py:607), so monitoring actively lies during the hang. Consequence: the standing operator guidance is \"never run bare devtools verify\", which erodes the local pre-merge net at exactly the time per-PR CI runs no tests (ci.yml:48-49). The heartbeat already samples worker /proc state, cpu_pct, and the latest pytest event nodeid (verify.py:616-632) - all the ingredients for honest stall detection are collected but unused.\n","design":"(a) Reproduce under controlled conditions: testmon --testmon-forceselect -n 4 after a multi-file change; when hung, capture py-spy dump / /proc/\u003cpid\u003e/stack of D-state workers. Suspects: testmon sqlite (testmondata) contention under xdist, tmpfs basetemp IO, or forkserver+coverage interaction. Record the postmortem in bead notes even if not fully root-caused. (b) Event-ledger stall detection: terminate (existing rc-124 path, verify.py:678-692) when no NEW pytest event (tests/infra events ledger consumed at verify.py:628) arrives within the stall window AND worker processes show D/S state with ~0 CPU; keep output-silence detection as the secondary trigger. (c) Write honest idle_s: time since last EVENT (not last output write) on all progress-file writes, including the event=output branch. (d) Surface the termination diagnosis (state summary, last event nodeid) in VerifyRun + current-run.json so postmortems do not require live observation. Interacting beads: none tracked previously; memory devtools-verify-testmon-forkserver-deadlock is the evidence trail.\n","acceptance_criteria":"Repro-or-postmortem artifact recorded in bead notes; a synthetic hang (test sleeping forever while the master keeps emitting output) is detected and killed within the stall window by the new detector; idle_s in .cache/verify/current-pytest-progress.json reflects event staleness during an active run; VERIFY: devtools test tests/unit/devtools -k \"verify and (stall or progress or heartbeat)\" plus a manual synthetic-hang demonstration logged in notes.","status":"closed","priority":2,"issue_type":"bug","assignee":"Sinity","owner":"ezo.dev@gmail.com","created_at":"2026-07-08T17:29:36Z","created_by":"Sinity","updated_at":"2026-07-31T22:35:43Z","started_at":"2026-07-08T18:46:50Z","closed_at":"2026-07-08T18:47:08Z","close_reason":"Fixed devtools/verify.py:_run_pytest_with_heartbeat to key stall detection off test-event progress (devtools/pytest_progress_plugin.py events, cross-worker via latest_event_from_paths), not just raw output bytes. Root cause confirmed: the xdist master keeps emitting its own output/heartbeat chatter while every worker is D-state-wedged, so the old output-silence-only check never fires -- the 45-minute ceiling was the only real backstop.\n\nAdded a parallel progress-staleness signal: last_progress_marker tracks the latest test events own updated_at timestamp; last_progress_at is the local monotonic time that marker was last observed to change. The stall check fires on EITHER output silence (existing) OR progress silence (new), gated behind seen_any_progress_event. Fixed the idle_s=0.0 hardcode: idle_s now consistently reports progress-event staleness.\n\nNew regression test (test_pytest_run_terminates_on_progress_stall_despite_flowing_output) reproduces the exact confirmed hang shape.\n\nVerify: devtools test tests/unit/devtools/test_verify.py -k \"progress_stall or output_stall\" (2 passed); devtools test tests/unit/devtools/test_verify.py (60 passed); devtools verify --quick green. Merged as PR #2581.\n\n(Re-closed: an earlier close of this bead was reverted by a concurrent bd import race in this shared-checkout session -- see memory concurrent-agent-same-checkout-collision.)","labels":["area:devloop","area:test","horizon:frontier"],"dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-2seq","title":"Fix epoch-fallback windowing in work-event/phase insight queries","description":"Discovered in the polylogue-srjq sort_key_ms audit (.agent/reports/sort-key-ms-coalesce-audit-2026-07-08.md): polylogue/storage/sqlite/archive_tiers/archive.py list_session_work_event_insights (lines 1216,1219,1231) and list_session_phase_insights (1279,1282,1294) both use COALESCE(we.started_at_ms/sp.started_at_ms, s.sort_key_ms) in since_ms/until_ms WHERE-range filters and in DESC ORDER BY with LIMIT/OFFSET pagination -- reachable through api/archive.py -\u003e daemon/http.py -\u003e the session_work_events/session_phases MCP tools. No trailing literal 0, but SQLite treats NULL as smallest in ORDER BY DESC and NULL fails \u003e=/\u003c= comparisons, giving the same practical injury as an epoch fallback: a timeless work event/phase silently fails since/until filters and is pushed to the bottom of paginated results.","acceptance_criteria":"Timeless work events/phases are not silently excluded by since_ms/until_ms filters and not silently pushed off paginated DESC-ordered results. Regression test proving a work event/phase with NULL started_at_ms/ended_at_ms and NULL session sort_key_ms still appears in an unfiltered listing and is not falsely excluded by since/until. Verify: devtools test -k \"work_event or session_phase\" in tests/unit/storage.","status":"closed","priority":2,"issue_type":"bug","assignee":"Sinity","owner":"ezo.dev@gmail.com","created_at":"2026-07-08T16:05:36Z","created_by":"Sinity","updated_at":"2026-07-08T17:30:48Z","started_at":"2026-07-08T17:25:58Z","closed_at":"2026-07-08T17:30:48Z","close_reason":"Fixed both list_session_work_event_insights and list_session_phase_insights in polylogue/storage/sqlite/archive_tiers/archive.py: their since_ms/until_ms window predicates filtered on plain COALESCE(row.started_at_ms, session.sort_key_ms) \u003e= ? / \u003c= ? with no NULL guard. When neither the work-event/phase row nor its session carries a reliable timestamp, that COALESCE evaluates to SQL NULL, and NULL \u003e= ?/\u003c= ? is never true under NULL propagation -- the row silently vanished from any since/until-windowed query, indistinguishable from genuinely falling outside the requested range. Wrapped both comparisons as \"(COALESCE(...) IS NULL OR COALESCE(...) \u003e= ?)\" (and \u003c=), matching the polylogue-z29t/polylogue-rvtu fix pattern: an unknown time is not evidence a row falls outside the window.\n\n3 new regression tests (tests/unit/storage/test_work_event_phase_time_window.py): a timeless work-event/phase (no created_at_ms/updated_at_ms on the session) is included under BOTH since_ms and until_ms filters; a sanity check confirms an ordinary out-of-range timestamped work-event is still correctly excluded (fix does not disturb real exclusion).\n\nAlso fixed while re-running the archive.py self-audit test after these edits shifted line numbers again (ruff reformatting the new NULL-guard clauses): updated 6 stale _AUDITED_SITES line-number entries in tests/unit/storage/test_no_string_interpolated_sql.py (net +18 line shift from the new code inserted above those functions).\n\nScope note: usage_timeline (polylogue-rvtu, merged #2575) and the query CLI unit engine (polylogue-z29t, merged #2576) already fixed the analogous pattern elsewhere; public search ranking/since-filter (polylogue-s5mm) remains open as a separate sibling bead.\n\nVerify: devtools test tests/unit/storage/test_work_event_phase_time_window.py tests/unit/storage/test_no_string_interpolated_sql.py tests/unit/api/test_facade_contracts.py -k \"work_event or phase\" (9 passed); devtools verify --quick green.","dependencies":[{"issue_id":"polylogue-2seq","depends_on_id":"polylogue-srjq","type":"discovered-from","created_at":"2026-07-08T18:06:32Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} @@ -1180,7 +1180,7 @@ {"_type":"issue","id":"polylogue-t46.5","title":"Route CLI transcript/dialogue file export through substrate read+render; delete streaming_markdown SQL path","design":"cli/read_views/streaming_markdown.py forks the whole read path for `read --view transcript/dialogue --to file` markdown exports: its own read-only index.db connection, ref resolution (_resolve_session_id), prefix-sharing lineage gating in raw SQL (_has_prefix_sharing_edge), _table_exists, and the message+block keyset join + block filtering -- duplicating api get_session/get_messages_paginated/read_archive_session_envelope + rendering/core_markdown + rendering/blocks. It deliberately bails (returns False) on prefix-sharing sessions, so forked/resumed session file exports silently diverge. Fix: expose a streaming/iterator markdown render over the substrate read (add an iter/stream method on the facade or reuse get_messages_paginated) so standard.py:85/:119 use the same composition+block-filtering as the non-streaming path; delete streaming_markdown.py's SQL. Keep the no-buffering benefit by streaming from the paginated substrate read.","acceptance_criteria":"streaming_markdown.py raw-SQL read helpers are deleted; transcript/dialogue --to file markdown for a prefix-sharing (forked/resumed) session composes the full lineage identically to stdout output (test compares file export bytes vs the substrate transcript for a forked session); block filtering (reasoning/prose) matches the substrate projection; devtools verify green.","notes":"[Delivery upgrade 2026-07-07T00:05:00Z] Release=C-read-evidence-contract; lane=read-contracts; readiness=B-local-inspection-needed; proof=CLI/daemon/MCP/Python/web query parity suite and content-hash citation drift fixture. Original readiness=B-local-inspection-needed.\n[Prework packet 2026-07-07] Static execution packet (anchors, mechanism, plan, tests, verification): .agent/handoffs/polylogue-gpt-pro-2026-07-07/prework-v2/task_packets/043_polylogue_t46_5.md (depth: anchored-contract-prework; urgency: T1-critical-path-correctness). Generated from master @ 8a975a40 2026-07-06 — verify source anchors before coding; line numbers are snapshot-relative.","status":"closed","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-07-04T21:26:25Z","created_by":"Sinity","updated_at":"2026-07-31T22:35:43Z","closed_at":"2026-07-14T23:38:09Z","close_reason":"Superseded by polylogue-4p1: sole read execution plus resumable RenderSpec delivery explicitly requires prefix-sharing transcript/dialogue file exports to use substrate composition and removes the raw-SQL path.","labels":["area:surface","delivery:C-read-evidence-contract","horizon:frontier","lane:read-contracts","refactor"],"dependencies":[{"issue_id":"polylogue-t46.5","depends_on_id":"polylogue-4p1","type":"relates-to","created_at":"2026-07-15T01:31:59Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-t46.5","depends_on_id":"polylogue-t46","type":"parent-child","created_at":"2026-07-04T23:26:25Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-t46.4","title":"Delegate daemon session-similarity KNN to SqliteVecProvider.query_by_session","design":"daemon/similarity.py re-implements session-seeded vector ranking (raw MATCH/k SQL over message_embeddings, per-session best-distance aggregation, matched-message count, L2-\u003ecosine in _l2_to_cosine_similarity:217) that storage/search_providers/sqlite_vec_queries.py:143 SqliteVecProvider.query_by_session already does -- the substrate file even comments that the daemon's _PER_MESSAGE_K mirrors it. Fix: build_similar_payload (http.py:3158) should call the facade/vec-provider session-similarity method and only project the payload; delete the daemon KNN/aggregation/L2-\u003ecosine copy. If the daemon needs a per-session rollup the provider does not expose, add it to the provider (substrate), not the surface.","acceptance_criteria":"daemon _knn_for_embedding/_aggregate_hits/_l2_to_cosine_similarity are deleted; /api/similar ranking equals SqliteVecProvider.query_by_session ordering for a seed session (parity test); the sqlite_vec_queries comment about mirroring _PER_MESSAGE_K is removed because there is no longer a mirror; devtools verify green.","notes":"[Delivery upgrade 2026-07-07T00:05:00Z] Release=C-read-evidence-contract; lane=read-contracts; readiness=B-local-inspection-needed; proof=CLI/daemon/MCP/Python/web query parity suite and content-hash citation drift fixture. Original readiness=B-local-inspection-needed.\n[Prework packet 2026-07-07] Static execution packet (anchors, mechanism, plan, tests, verification): .agent/handoffs/polylogue-gpt-pro-2026-07-07/prework-v2/task_packets/042_polylogue_t46_4.md (depth: anchored-contract-prework; urgency: T1-critical-path-correctness). Generated from master @ 8a975a40 2026-07-06 — verify source anchors before coding; line numbers are snapshot-relative.","status":"closed","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-07-04T21:26:21Z","created_by":"Sinity","updated_at":"2026-08-03T19:37:20Z","closed_at":"2026-08-03T19:37:20Z","close_reason":"Implemented by merged PR #3678: delegated daemon similarity ranking to SqliteVecProvider.query_by_session with real HTTP parity coverage.","labels":["area:surface","delivery:C-read-evidence-contract","horizon:frontier","lane:read-contracts","refactor"],"dependencies":[{"issue_id":"polylogue-t46.4","depends_on_id":"polylogue-t46","type":"parent-child","created_at":"2026-07-04T23:26:21Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-1xc.10","title":"Design spike: express session insights + aggregates as declared derived views over a single refresh engine","design":"Longer-horizon refactor the operator gestured at ('insights as declared derived views'). Today per-session (profiles, latency, work_events, phases, runs, observed_events, context_snapshots) and cross-session (threads, session_tag_rollups, provider_day aggregates) refresh logic is hand-woven across rebuild.py (~1600 lines), aggregates.py, threads.py, and the convergence stage. Evaluate whether these can be declared as a registry of derived-view specs (source rows -\u003e materialized table, per-session vs grouped scope, materializer version) driven by one incremental refresh engine that automatically computes the affected scope on write and the global scope on version bump. Goal: collapse the bespoke incremental-vs-full branching and make adding an insight a declaration rather than editing five files. This is a spike/ADR, NOT a commitment to rewrite - measure whether the abstraction pays for itself against the current working code. Cross-reference insights/registry.py (already a partial registry).","acceptance_criteria":"1) An ADR under docs/ (or thoughtspace) that inventories every current insight table, classifies per-session vs cross-session scope and its affected-scope function, and proposes (or explicitly rejects) a declared-derived-view registry with a single refresh engine. 2) Includes a migration sketch and a cost/benefit call vs leaving rebuild.py as-is. 3) If accepted, spawns implementation child beads; if rejected, records why so it is not re-litigated. No production code change in this bead.","notes":"[Delivery upgrade 2026-07-07T00:05:00Z] Release=B-storage-rebuild-bytes; lane=storage-rebuild-scale; readiness=D-horizon-ready; proof=large-corpus rebuild probe, blue-green generation swap proof, WAL/resource envelope report. Original readiness=D-horizon-ready.","status":"closed","priority":2,"issue_type":"feature","owner":"ezo.dev@gmail.com","created_at":"2026-07-04T21:22:49Z","created_by":"Sinity","updated_at":"2026-07-13T04:04:37Z","closed_at":"2026-07-13T04:04:37Z","labels":["area:storage","delivery:B-storage-rebuild-bytes","lane:storage-rebuild-scale"],"dependencies":[{"issue_id":"polylogue-1xc.10","depends_on_id":"polylogue-1xc","type":"parent-child","created_at":"2026-07-04T23:22:48Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-1xc.10","depends_on_id":"polylogue-5wp","type":"supersedes","created_at":"2026-07-13T06:04:36Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"polylogue-1xc.8","title":"Schema rebuild-safety scenario","design":"scenario-coverage.yaml gap 'schema-rebuild-safety' orphaned on gh#590. A scenario proving derived-tier rebuild (index/embeddings) from durable source/user evidence is lossless and idempotent, and durable-tier additive migration preserves user.db assertions. Ties 1xc.7 scale-regression lane + z7rv migration framework.","acceptance_criteria":"A rebuild-safety scenario resets a derived tier and rebuilds from source, asserting byte/row parity + no user.db loss; a durable additive migration round-trips behind the backup gate. Verify: the scenario under devtools lab lanes.","notes":"[Delivery upgrade 2026-07-07T00:05:00Z] Release=B-storage-rebuild-bytes; lane=storage-rebuild-scale; readiness=B-local-inspection-needed; proof=large-corpus rebuild probe, blue-green generation swap proof, WAL/resource envelope report. Original readiness=B-local-inspection-needed.\n[Prework packet 2026-07-07] Static execution packet (anchors, mechanism, plan, tests, verification): .agent/handoffs/polylogue-gpt-pro-2026-07-07/prework-v2/task_packets/089_polylogue_1xc_8.md (depth: anchored-contract-prework; urgency: T1-critical-path-correctness). Generated from master @ 8a975a40 2026-07-06 — verify source anchors before coding; line numbers are snapshot-relative.\n2026-07-15 hierarchy repair: rebuild-safety is the proof slice of the derived-tier transition protocol b5l. Scale-hardening 1xc remains related and supplies corpus/resource conditions, but no longer counts the same scenario as a second child.","status":"open","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-07-04T21:17:28Z","created_by":"Sinity","updated_at":"2026-07-31T22:35:46Z","labels":["area:audit","area:storage","delivery:B-storage-rebuild-bytes","horizon:frontier","lane:storage-rebuild-scale"],"dependencies":[{"issue_id":"polylogue-1xc.8","depends_on_id":"polylogue-1xc","type":"relates-to","created_at":"2026-07-15T20:48:45Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-1xc.8","depends_on_id":"polylogue-b5l","type":"parent-child","created_at":"2026-07-15T19:19:12Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":2,"comment_count":0} +{"_type":"issue","id":"polylogue-1xc.8","title":"Schema rebuild-safety scenario","design":"scenario-coverage.yaml gap 'schema-rebuild-safety' orphaned on gh#590. A scenario proving derived-tier rebuild (index/embeddings) from durable source/user evidence is lossless and idempotent, and durable-tier additive migration preserves user.db assertions. Ties 1xc.7 scale-regression lane + z7rv migration framework.","acceptance_criteria":"A rebuild-safety scenario resets a derived tier and rebuilds from source, asserting byte/row parity + no user.db loss; a durable additive migration round-trips behind the backup gate. Verify: the scenario under devtools lab lanes.","notes":"[Delivery upgrade 2026-07-07T00:05:00Z] Release=B-storage-rebuild-bytes; lane=storage-rebuild-scale; readiness=B-local-inspection-needed; proof=large-corpus rebuild probe, blue-green generation swap proof, WAL/resource envelope report. Original readiness=B-local-inspection-needed.\n[Prework packet 2026-07-07] Static execution packet (anchors, mechanism, plan, tests, verification): .agent/handoffs/polylogue-gpt-pro-2026-07-07/prework-v2/task_packets/089_polylogue_1xc_8.md (depth: anchored-contract-prework; urgency: T1-critical-path-correctness). Generated from master @ 8a975a40 2026-07-06 — verify source anchors before coding; line numbers are snapshot-relative.\n2026-07-15 hierarchy repair: rebuild-safety is the proof slice of the derived-tier transition protocol b5l. Scale-hardening 1xc remains related and supplies corpus/resource conditions, but no longer counts the same scenario as a second child.","status":"closed","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-07-04T21:17:28Z","created_by":"Sinity","updated_at":"2026-08-10T10:41:21Z","closed_at":"2026-08-10T10:41:21Z","close_reason":"Satisfied by merged PR #3915 (cb0de952a): exact-head rebuild-safety and rebuild-differential lab passed; 7 focused tests and all 24 quick checks passed.","labels":["area:audit","area:storage","delivery:B-storage-rebuild-bytes","horizon:frontier","lane:storage-rebuild-scale"],"dependencies":[{"issue_id":"polylogue-1xc.8","depends_on_id":"polylogue-1xc","type":"relates-to","created_at":"2026-07-15T20:48:45Z","created_by":"Sinity","metadata":"{}"},{"issue_id":"polylogue-1xc.8","depends_on_id":"polylogue-b5l","type":"parent-child","created_at":"2026-07-15T19:19:12Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":2,"comment_count":0} {"_type":"issue","id":"polylogue-3tl.13","title":"Reconcile schema-versioning docs + retire superseded execution-plan.md","design":"architecture-spine.md:34-37 lists 'in-place upgrade chains' as Rejected with no durable-additive carve-out, contradicting the shipped migrations and internals.md's own two-regime text (internals.md:284-289 is internally inconsistent). docs/execution-plan.md is fully superseded (dropped #1807 umbrella; every issue re-encoded as a bead) yet README.md:14 still calls it 'current sequencing plan'. Fix the spine section, reconcile internals.md, retire execution-plan.md with a pointer to Beads, and repoint README:14.","acceptance_criteria":"architecture-spine + internals schema-versioning sections describe the two-regime model consistently; execution-plan.md is archived/removed and no doc calls it current; README points at Beads. Verify: render docs-surface --check + grep 'execution-plan' docs README.","notes":"[Delivery upgrade 2026-07-07T00:05:00Z] Release=L-external-legibility; lane=docs-demos-launch; readiness=B-local-inspection-needed; proof=one-command demo log, claims-ledger coverage report, install matrix, cold-reader proof. Original readiness=B-local-inspection-needed.\n[Prework packet 2026-07-07] Static execution packet (anchors, mechanism, plan, tests, verification): .agent/handoffs/polylogue-gpt-pro-2026-07-07/prework-v2/task_packets/127_polylogue_3tl_13.md (depth: anchored-contract-prework; urgency: T2-foundation-before-feature-proof). Generated from master @ 8a975a40 2026-07-06 — verify source anchors before coding; line numbers are snapshot-relative.","status":"closed","priority":2,"issue_type":"task","assignee":"Sinity","owner":"ezo.dev@gmail.com","created_at":"2026-07-04T19:47:58Z","created_by":"Sinity","updated_at":"2026-07-08T19:28:11Z","started_at":"2026-07-08T19:28:10Z","closed_at":"2026-07-08T19:28:11Z","close_reason":"Both AC halves verified. (1) Schema-versioning docs: docs/architecture-spine.md and docs/internals.md already state the same two-regime model (durable tiers = additive numbered migrations + backup manifest; derived tiers = rebuild/blue-green-replace) consistently — no drift found, no changes needed. (2) execution-plan.md retirement: PR #2582 (other session, merged ad84b6bce) purged MK2/MK3 packs and rewrote docs/design/README.md to beads-first doctrine, but left docs/execution-plan.md itself in place. PR #2583 (merged a30869d17) finished the retirement: deleted docs/execution-plan.md, removed it from both independent hardcoded title lists (devtools/docs_surface.py README_DOC_TITLES and devtools/render_docs_surface.py build_docs_readme() orientation table — two separate lists, both needed the fix), added a Beads pointer to the generated README section, refreshed the stale Design Direction doc-surface description, and flipped docs/architecture.md wording to past-tense retired. Verified: devtools render all --check (0 out of sync), devtools test tests/unit/devtools/test_render_docs_surface.py (2 passed), mypy clean, ruff clean, devtools verify --quick (13/13 green).","labels":["area:legibility","delivery:L-external-legibility","lane:docs-demos-launch"],"dependencies":[{"issue_id":"polylogue-3tl.13","depends_on_id":"polylogue-3tl","type":"parent-child","created_at":"2026-07-04T21:47:57Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-8jg9.2","title":"Validate blob-GC age-gate safety across the acquire-to-commit race","design":"v7e0 deliberately removed the never-populated pending_blob_refs lease mechanism and documented MIN_AGE_S as the sole acquire-to-commit defense. Test the actual model, not retired rows: freeze time around blob creation, GC planning, source/blob_refs commit, and orphan collection across both maintenance GC and doctor repair. Measure the real blob-write-to-reference-commit window for a slow/streamed ingest. If that window can reach MIN_AGE_S, the test must expose the unsafe interleaving and the implementation must add a reservation spanning write-to-commit or derive a justified larger gate; it may not paper over the race with a synthetic short ingest.","acceptance_criteria":"A provider-shaped ingest writes a blob before its durable reference. GC/doctor before MIN_AGE_S never select it; once its reference commits, it survives beyond the gate; an unreferenced blob older than the gate is reclaimed. A deterministic frozen-clock interleaving exercises both sides of the boundary without sleeping. A measured slow/streamed ingest receipt states the maximum observed write-to-reference window and safety margin; if the window reaches the gate, a durable reservation or revised evidence-backed gate lands before closure. Repo/docs/tests contain no pending_blob_refs, lease-row, sweep_orphaned_blob_leases, or ORPHAN_LEASE_MAX_AGE_S premise. Verify focused blob GC/repair/concurrency tests and the baseline nodes owned by w9wt.","notes":"[Delivery upgrade 2026-07-07T00:05:00Z] Release=B-storage-rebuild-bytes; lane=blob-integrity; readiness=B-local-inspection-needed; proof=leased-blob race fixture, blob-reference resolver report, SHA-256 restore/compression proof. Original readiness=B-local-inspection-needed.\n[Prework packet 2026-07-07] Static execution packet (anchors, mechanism, plan, tests, verification): .agent/handoffs/polylogue-gpt-pro-2026-07-07/prework-v2/task_packets/005_polylogue_8jg9_2.md (depth: anchored-contract-prework; urgency: T0-stop-the-line-or-P1). Generated from master @ 8a975a40 2026-07-06 — verify source anchors before coding; line numbers are snapshot-relative.\n2026-07-10 reconciliation: v7e0 chose and received operator consent for lease removal because production never populated the table; the old AC was therefore impossible and misleading. This rewrite preserves the underlying race proof while targeting the remaining age-gate mechanism. Execute in the w9wt baseline-restoration branch because three repair tests and the blob-GC CLI snapshot currently encode the retired eligibility/lease semantics.\n2026-07-10 baseline slice complete: repair fixtures now use FrozenClock and age both referenced and orphan candidates beyond MIN_AGE_S, proving the planner reclaims eligible orphans while preserving durable references; CLI expectation no longer asserts the retired lease counter. Focused baseline nodes pass and clock-hygiene gate is green. Residual before this bead can close: measure a real slow/streamed blob-write-to-reference-commit window and record its margin against MIN_AGE_S; add a durable reservation or revise the gate if the observed window can reach it.\n2026-07-10 measured stop-the-line result: lease-free MIN_AGE_S is unsafe. Real-path FrozenClock harness (devtools test tests/unit/pipeline/test_acquisition_blob_gc_age_gate.py) streams two ChatGPT-shaped files; the second advances logical time by 61s while iter_source_raw_stream prefetches. Real run_blob_gc_report deletes the first final blob before raw persistence (deleted_count=1, generation_written=true), then the backend commits both raw refs, leaving a durable reference to a missing blob. Runtime 3.21s, no sleep/large allocation. Static trace explains the unbounded window: 128-item source drain plus raw/reference bulk commit every 500/source completion.\n\nRequired fix is now evidence-selected: additive source-v4 blob_publication_reservations, committed before final blob-path visibility through a source-aware injected BlobStore publication hook; raw_sessions/blob_refs insertion consumes the reservation atomically. GC/doctor must hold the source write lock across reservation/reference recheck and unlink. No TTL expiry: crash-left blob+reservation+no-ref is explicit acquisition debt; absent-blob or already-referenced reservations can reconcile. Acquisition batching must move after streaming so its outer transaction cannot block reservation commits. Implement independently from w9wt/live-v30, with migration backup-manifest proof and crash-window/concurrency tests.\n2026-07-10 independent-review rejection and repair. Exact repro artifact: /realm/tmp/blob-reservation-audit-repros.md. Ten findings: (1) daemon browser-only startup queried a pre-v4/absent receipt table; (2) pure source/parser iterators inferred source.db from blob_root and broke three source-law nodes; (3) blob_hash primary-key ownership let one same-hash publisher consume another; (4) reconciliation cleared a missing-path receipt while its publisher was paused before final-path publication; (5) backup omitted reservation-only bytes and verified only file count; (6) source-replacement maintenance published through an uninstrumented BlobStore and GC could delete the bytes before its ref commit; (7) successful index-only attachments stranded receipt debt; (8) per-blob reserve/open/commit/close cost measured 3.5793s/200 tiny blobs, 474.77x plain and ~318s projected at 17,788 artifacts; (9) GC took BEGIN IMMEDIATE before full enumeration, so even dry-run blocked publishers; (10) the callback/hash-keyed design lacked archive-owned batching, exact receipt propagation, writer-exclusion proof, and an inspect/confirmed-abandon debt surface. Repair shape implemented on the feature branch: source-v4 rows are keyed by per-publication UUID and hash-indexed; substrate-neutral BlobStore prepares private bytes while ArchiveBlobPublisher performs batch prepare -\u003e one reserve-many commit -\u003e publish-many; exact receipts flow into source commits and post-index attachment commits; pure source/parser defaults remain archive-independent; acquisition/live/direct/repair writers share archive-owned publication; reconciliation retains ambiguity unless given archive-wide writer exclusion; GC enumerates outside its bounded destructive lock and dry-run is read-only; backup excludes publishers, copies referenced+reserved bytes, and verifies an exact hash/size inventory; operator inspection and --yes abandonment are explicit. Audit-focused receipt at head before Bead-only commit: devtools test selected 106 nodes, 106 passed in 91.37s (run 20260710T130807Z-focused-test-1102231-ef6baec0). Bead remains in progress pending baseline rebase, broad gate, review, PR, deployment backup/migration proof, and live-safe rollout.\n2026-07-10 source-v4 rereview batch: (1) production ingest-batch inline attachments still called write_parsed_session_to_archive without preacquired blobs, reopening final-path publication before index commit; repaired by threading an archive-scoped ArchiveBlobPublisher through the real drain/write route and consuming exact receipt IDs only after ArchiveWriteGateway commits. (2) raw-backed maintenance skipped the publisher when the target hash already existed, so dedup publication had no receipt; repaired by publishing every candidate while preserving written_blobs/bytes as new-byte counters. (3) backup, maintenance CLI, doctor repair, and integrity defaults split blob authority between \u003carchive_root\u003e/blob and the process-global blob_store_root; repaired around the canonical sibling archive root and tests now reject the legacy root. (4) destructive GC entered BEGIN IMMEDIATE before scanning arbitrarily many referenced/reserved candidates; repaired by read-only planning outside the lock and a \u003c=max_batch final recheck/unlink shortlist under the source write lock. Added anti-vacuity coverage for the real ingest route, existing-hash dedup, referenced-heavy GC, and reconciliation clearing missing/referenced receipts only under a valid writer-exclusion token. Static verification: Ruff clean and strict MyPy clean across all 12 touched files. Managed focused tests intentionally pending parent release of the live-rebuild exclusion.\n2026-07-10 managed focused verification after source-v4 rereview: receipt/GC/production-ingest group passed 13/13 single-process in 30.18s (run 20260710T134029Z-focused-test-1130519-2f0b1289). Archive-root/integrity/doctor/backup/CLI group passed 40/40 single-process in 50.96s (run 20260710T134307Z-focused-test-1132981-1b92f29e). The first run exposed two harness mismatches (source.db opened as index v30; concurrency pause occurred during read-only planning) and the second exposed doctor fixtures still seeding the retired global blob root; exact failing nodes were corrected and passed before each full-group rerun. Host stayed at zero memory PSI with ~15-16 GiB available. No broad/default verify, rebase, push, PR, or live rollout was attempted.\n2026-07-10 second cold-audit rejection, five verified gaps. (1) source_acquisition_components.read_plain_source_file and _stream_preserved_zip_entry compute/observe publication IDs but omit blob_publication_receipt_id from RawSessionData, so plain/Hermes/grouped/fallback/browser acquisition commits references without consuming receipts; split ZIP and Drive already propagate correctly. (2) direct parse/re-ingest routes in archive_ingest/source_parsing construct plain BlobStore instances in sequential/process workers for grouped and Hermes capture, exposing final paths before ArchiveStore can reserve them. (3) supported archive-root override still diverges because blob_store_root resolves data_home/blob; watcher, validation workers, provenance reads, paths reports, and reset can target a different corpus than archive_root/blob. (4) exported write_parsed_session_to_archive delegates inline attachment bytes to _write_attachments/_acquire_attachment_blob and a global plain store when no preacquired map is supplied, bypassing archive publication ownership. (5) full-evidence backup inventories only source.db references/reservations even when index.db is included, so index-only attachment bytes are omitted and restore verification does not resolve attachment refs against copied inventory. Repairs must preserve split-ZIP/Drive and explicit pure-source overrides, add real-route GC interleavings, reject low-level inline fallback, and prove full-evidence index attachment restore parity. Bead remains in progress.\n2026-07-10 second cold-audit repairs and final focused evidence. Five rejected gaps were repaired without widening the architecture: acquisition records now retain exact publication receipt IDs; direct grouped/Hermes re-ingest workers use archive-owned batched publication; the configured archive root owns the default blob store across watcher/validation/provenance/reset surfaces; low-level archive writes reject inline attachment bytes unless the caller preacquired them; and full-evidence backup/restore inventories index-only attachment hashes. Real lifecycle interleavings passed 2/2; grouped/split-ZIP/Drive source laws passed 8/8; archive-ingest batching passed 8/8; cross-surface archive-root override passed 1/1; validation plus live-ingest root selection passed 14/14; low-level attachment/debt nodes passed 6/6; focused backup nodes passed 4/4 and full backup module passed 14/14. The final acquisition/browser cross-route sweep passed 10/10 single-process in 24.94s (run 20260710T140843Z-focused-test-1150817-a0eaf931); its browser node separately passed 1/1 after aligning the assertion with the archive-owned blob root (run 20260710T140742Z-focused-test-1149950-73f0ed4c). A preceding 11-node sweep passed 9 and exposed two failures: the source-v4-owned browser assertion still read the retired process-global root and was corrected in 5aeb37a94; test_demo_fixture_world_converges_into_deterministic_archive failed at its old fixture context-policy expectation. The demo failure is inherited unchanged from origin/master: git diff against origin/master is empty for user_write.py, scenarios/corpus.py, and the scenario test, while 37t.15 now coerces non-user fixture assertions to candidate/promotion-required policy. It is already owned and repaired on the separate w9wt baseline branch, so no unrelated production or scenario change was folded into source-v4. Static Ruff and strict MyPy remained green on touched modules. No broad/default verify, rebase, push, PR, migration rollout, or live archive mutation was attempted; the bead remains in progress for parent integration, broad gate, review, deployment backup/migration proof, and live-safe rollout.\n2026-07-10 process-pool publication proof closes the final rereview residual. Commit 5c04aec87 exercises parse_sources_archive with POLYLOGUE_INGEST_PARSE_WORKERS=2 through the real ProcessPoolExecutor and _parse_source_path_worker; no synthetic archive or toy backend is used. The worker is paused inside real BlobStore.publish_many, after ArchiveBlobPublisher has committed its source-v4 receipt but before final-path visibility: source.db contains exactly the reservation while the blob path, raw_sessions, and blob_refs are absent. After publication, the main ArchiveStore source write is paused: the final path exists, the receipt remains, raw refs remain absent, and aged destructive GC reports deleted_count=0/skipped_reserved=1. After the real durable source transaction, raw_sessions and blob_refs resolve the hash, the exact receipt is gone, and final GC reports the blob referenced. The test is mutation-sensitive to plain worker publication, publish-before-reserve ordering, early receipt consumption, and receipt leakage. Focused node passed 1/1 single-process in 5.58s (run 20260710T142052Z-focused-test-1158065-52152616); Ruff and strict MyPy passed on the test file. The harness asserts the current Linux default fork context because that is how this production route inherits the phase probe; a future executor-context change must deliberately re-establish this proof.\n2026-07-10 live closure proof: PR #2660 merged as a0ef2fa8d479a0168db36fe09f3752de6311b26e after focused receipt/GC/source-route suites, quick 13/13, broad seed-testmon 13,321 passed/1 skipped, and an independent no-P0-P2 review. All archive writers were stopped; /realm/inbox/polylogue-backups/polylogue-archive-20260710T162633Z restored/integrity-checked source/user/embeddings and exactly inventoried 21,457 blobs (44,748,652,907 bytes), operator receipt SHA-256 e4770e283302d779206282249789727fdd84c7189f0779cae4315a402cf3f480. Source migrated exactly v3-\u003ev4 in 1.49s/83.5 MiB/zero swap; source integrity=ok, all tier versions 4/30/1/4/1, receipts=0. Merged runtime invocation 276fa7bbef7345ccb16ddb3db529cbf4 reports ready API/watcher/capture/storage, 2,672,652/2,672,652 FTS rows, catch-up 1/1 with zero failures, current Codex session indexed, zero convergence debt, and zero host memory PSI. Installed-package attestation/cutover remains s8q/6rvt; enforceable content-bound backup receipts remain 8jg9.5 and do not reopen the publication-race AC.","status":"closed","priority":2,"issue_type":"task","assignee":"Sinity","owner":"ezo.dev@gmail.com","created_at":"2026-07-04T19:47:56Z","created_by":"Sinity","updated_at":"2026-07-31T22:35:43Z","started_at":"2026-07-10T11:23:18Z","closed_at":"2026-07-10T16:49:44Z","close_reason":"Merged source-v4 publication receipts and proved the real archive rollout under writer exclusion: exact restore/integrity backup evidence, one-step v3-\u003ev4 migration, source integrity, zero receipt/debt rows, live current-session append, ready daemon/capture/watcher/search, and broad/adversarial test evidence. Deployment attestation and enforced backup receipts remain separately tracked.","labels":["area:ops","area:storage","delivery:B-storage-rebuild-bytes","lane:blob-integrity","spine"],"dependencies":[{"issue_id":"polylogue-8jg9.2","depends_on_id":"polylogue-8jg9","type":"parent-child","created_at":"2026-07-04T21:47:55Z","created_by":"Sinity","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"polylogue-9e5.17","title":"Adopt manifest-declared coverage gaps as tracked beads (retire gh#590 umbrella)","design":"scenario-coverage.yaml + test-quality-coverage.yaml declare 9 coverage_gaps all owned by external gh#590 with 0 beads — the anonymous-debt anti-pattern the doctrine forbids. Split into tracked beads (storage-correctness, performance, security-privacy, distribution, schema-rebuild-safety, flakiness, mock-depth, fuzz-ci, per-module-coverage) and rewrite the manifest owner strings to the bead ids.","acceptance_criteria":"Each of the 9 gaps maps to a bead id in the manifest; no manifest gap cites only a GH issue. Verify: devtools verify manifests + grep the yaml for issue:590.","status":"closed","priority":2,"issue_type":"task","owner":"ezo.dev@gmail.com","created_at":"2026-07-04T19:47:55Z","created_by":"Sinity","updated_at":"2026-07-04T21:17:32Z","closed_at":"2026-07-04T21:17:32Z","close_reason":"Adoption complete: the 9 manifest coverage-gaps now each own a bead (storage/perf/rebuild/flakiness/mock/per-module as new 9e5 children; security-\u003ekwsb, distribution-\u003e3tl.7, fuzz-ci-\u003e9e5.18) and scenario-coverage.yaml + test-quality-coverage.yaml reference bead owners instead of gh#590. The anonymous debt is retired; implementing each scenario/measure is the tracked residual.","labels":["area:audit"],"dependencies":[{"issue_id":"polylogue-9e5.17","depends_on_id":"polylogue-9e5","type":"parent-child","created_at":"2026-07-04T21:47:54Z","created_by":"Sinity","metadata":"{}"}],"comments":[{"id":"019f2f03-4b88-7b8b-968d-564efaabe65a","issue_id":"polylogue-9e5.17","author":"Sinity","text":"Correction: the 9 coverage-gaps are now BEADED (9e5.19-22 + 20d.16 + 1xc.8 new; security-\u003ekwsb, distribution-\u003e3tl.7, fuzz-ci-\u003e9e5.18) — the anonymous-debt anti-pattern is retired. The manifest-owner REWRITE (issue:590 -\u003e bead:) was reverted because the strict manifest schema forbids a `bead:` key; that rewrite is now tracked as a schema-extension task so the manifest can cite beads once the validator supports it.","created_at":"2026-07-04T21:22:53Z"}],"dependency_count":0,"dependent_count":0,"comment_count":1}