From 2557be096b141467d33239f5f129cf3aec8edbc5 Mon Sep 17 00:00:00 2001 From: "ang-fleet-workers[bot]" <333956806+ang-fleet-workers[bot]@users.noreply.github.com> Date: Sun, 27 Sep 2026 00:49:51 -0700 Subject: [PATCH] docs(audit): t_f29230a1 flip 8 DROP rows to KEEP per Ace 2026-09-27 ruling Rows: nopr:4ed79b6dad, #109, #932, #562 (+#589 follows), nopr:36134d8944, nopr:051c2076e1, #22 (apollo@daemonarchy.local only; nopr:40a6040932 stays DROP). Applied via lead/post_ruling_2026_09_27.py on lead/rows.json, re-rendered with lead/render.py (unmodified rows.json re-renders byte-identical before the flip). Totals by script: KEEP 664->672, DROP 161->153, 1116 rows. Adds FINAL.md 'Post-ruling flips (2026-09-27)' subsection and a ROLLUP note. --- docs/plans/fork-pr-audit/FINAL.md | 51 ++++++++++--- docs/plans/fork-pr-audit/ROLLUP.md | 31 ++++---- .../lead/post_ruling_2026_09_27.py | 75 +++++++++++++++++++ docs/plans/fork-pr-audit/lead/rows.json | 32 ++++---- 4 files changed, 148 insertions(+), 41 deletions(-) create mode 100644 docs/plans/fork-pr-audit/lead/post_ruling_2026_09_27.py diff --git a/docs/plans/fork-pr-audit/FINAL.md b/docs/plans/fork-pr-audit/FINAL.md index 1040cf5390cf9..a183fe1315eaf 100644 --- a/docs/plans/fork-pr-audit/FINAL.md +++ b/docs/plans/fork-pr-audit/FINAL.md @@ -73,7 +73,7 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | #560 | gateway | boot-resume turns spawned for sessions with nothing to resume — orig: PR body | RED (read-only: has_resumable_work 0 hits upstream; _resume_pending_candidates keys only on the resume_pending flag) | none | 183 in 2026-05-10..2026-09-25 (PHASE=boot_resume_skipped — shared literal with #761) | 539 loc, 1 cf (3) | KEEP | — | KEEP | — | — | | #840 | gateway | .restart_failure_counts read-modify-write was not atomic across processes — orig: PR body | RED (read-only: _increment_restart_failure_counts@up/gateway/run_shutdown.py:1326 has no lock — _restart_failure_counts_lock/_rmw 0 hits) | none | n/a | 530 loc, 1 cf (3) | UPSTREAM | — | UPSTREAM | audit/gateway/upstream-840 | t_aef6e498 | | #716 | gateway | Discord native slash commands delivered the gateway reply twice — orig: PR body | read-only: _deliver_inline_command_reply 0 hits upstream; upstream adapter refactored 6e5b084b8b — not verified whether the double-delivery… | unverified | n/a (no literal) | 508 loc, 1 cf (2) | KEEP | keep-unproven | DROP — LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | — | t_9b7aa38f | -| #562 | gateway | kanban wake minted a phantom session for an identity-less sub — orig: PR body | RED (resolve_wake_participant 0 hits upstream) | none | n/a | 495 loc, 1 cf (1) | KEEP | keep-unproven | DROP — LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | — | t_7ea0fe09 | +| #562 | gateway | kanban wake minted a phantom session for an identity-less sub — orig: PR body | RED (resolve_wake_participant 0 hits upstream) | none | n/a | 495 loc, 1 cf (1) | KEEP | keep-unproven | KEEP — ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): structural base of merged #566/#568/#682 (resolve_wake_participant / _live_chat_participants); git revert conflicts, and #682 records a field-observed phantom session this path preve… | — | t_7ea0fe09 | | #170 | gateway | shared inactivity watchdog polling (refactor) — orig: commit body (refactor) | read-only: InactivityDiagnostic/InactivityWaitResult 0 hits upstream; upstream session_stall.py + run_watchers.py own inactivity differently | upstream refactor path (run_watchers.py) | 0 (1 literal) | 494 loc, 2 cf (3) | KEEP | keep-unproven | DROP — LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | — | t_7e96948d | | #801 | gateway | dispatched resumes were not charged against the per-session cap; cap lost across rollbacks — orig: PR body (#761 follow-up) | n/a (fork auto_resume.py) | n/a | 0 (4 literals = failure paths) | 476 loc, 1 cf (3) | KEEP | keep-unproven | KEEP — LEAD: KEEP-by-unit: follows a measured restart/resume head (#295 1,190 / #289 1,410 / #761 183 / #790 151 / #904 455 / #937 132 fires). | — | — | | #598 | gateway | model route change notices were dropped when the status send failed — orig: PR body | RED-partial (2/5 symbols upstream; _warn_route_drop 0) | partial | n/a | 470 loc, 3 cf (3) | KEEP | keep-unproven | KEEP — LEAD: route-announce family; registry entries 23/24 (upstream-intended) + model.announce_recovery live in 13 configs. KEEP-by-registry; UPSTREAM with the family. | — | — | @@ -149,7 +149,7 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | #751 | gateway | Discord chat-type resolution for session-key migration ran serially (311 lookups) — orig: PR body | n/a (fork #659 migration) | n/a | n/a | 161 loc, 1 cf (3) | KEEP | keep-unproven | KEEP — LEAD: KEEP-by-unit with #659. | — | — | | nopr:6e862490c8 | gateway | fork/upstream reconciliation for slice-5 CI reds — orig: commit body (merge reconciliation) | n/a (sync artifact) | n/a | n/a | 159 loc, 3 cf (3) | KEEP | keep-unproven | DROP — LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | — | t_ced45483 | | #1031 | gateway | persisted route lookup on the event loop — orig: t_a… card (subject) | n/a (persisted route lookup is fork #315 code) | n/a | n/a | 155 loc, 2 cf (3) | KEEP | keep-unproven | DROP — LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | — | t_a00223ec | -| #589 | gateway | kanban creator-stamp shape rule duplicated — orig: PR body | n/a (fork kanban wake routing) | n/a | n/a | 153 loc, 2 cf (2) | KEEP | keep-unproven | DROP — LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | — | t_5d546222 | +| #589 | gateway | kanban creator-stamp shape rule duplicated — orig: PR body | n/a (fork kanban wake routing) | n/a | n/a | 153 loc, 2 cf (2) | KEEP | keep-unproven | KEEP — ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): follows #562: #589 only single-sources the creator-stamp rule of the #562/#568 stack (slice worker caveat). Branch audit/gateway/revert-589 (c2c77036a7) must not merge. (slice card t… | — | t_5d546222 | | #691 | gateway | reset banners ignored durable chat pins — orig: PR body | n/a (chat pins are fork #659) | n/a | 0 (1 literal) | 149 loc, 2 cf (3) | KEEP | keep-unproven | KEEP — LEAD: KEEP-by-unit with #659. | — | — | | #19 | gateway | plugin slash commands lacked the originating channel in session context — orig: PR body | read-only: not confirmed upstream (absorb 20%); upstream session_context.py binds platform/chat but plugin-command path not traced | unverified | n/a | 149 loc, 1 cf (3) | KEEP | keep-unproven | DROP — LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | — | t_a27860dc | | #687 | gateway | refused async-delegation completions and shutdown claims were dropped — orig: PR body (#683 follow-up) | n/a (fork JSON completion-outbox ack, #683) | n/a | n/a (no literal) | 149 loc, 3 cf (3) | KEEP | keep-unproven | DROP — LEAD: follows #683. | — | t_5a801b2c | @@ -171,7 +171,7 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | #460 | gateway | resume_pending not cleared for sessions that finished during a timed-out drain — orig: PR body | read-only: absorb 33%; not confirmed upstream clears on late finish | unverified | n/a | 86 loc, 1 cf (3) | KEEP | keep-unproven | KEEP — LEAD: drain-budget unit (#738 SUPERSEDED, #861 UPSTREAM). KEEP until the unit converges onto #861; teardown timings are in gateway-exit-diag.log (23 drain/budget lines), not the audited logs. | — | — | | #53 | gateway | credential-resolution errors not classified as auth failures — orig: PR body | read-only: absorb 27%; agent/turn_finalizer.py classifier not confirmed upstream | unverified | n/a | 84 loc, 2 cf (3) | KEEP | keep-unproven | DROP — LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | — | t_d40bffa3 | | #230 | gateway | native slash events in Discord threads lacked parent_chat_id — orig: PR body | GREEN (read-only: up/plugins/platforms/discord/adapter.py:4674-4675 slash path passes guild_id/parent_chat_id 'exactly as on_message') | upstream Discord plugin slash source | n/a | 83 loc, 1 cf (2) | SUPERSEDED-BY-UPSTREAM | stands | SUPERSEDED-BY-UPSTREAM | — | — | -| nopr:4ed79b6dad | gateway | Telegram network-reconnect ladder not configurable — orig: commit body | RED (read-only: upstream hardcodes MAX_NETWORK_RETRIES = 10 @up/plugins/platforms/telegram/adapter.py:2111; fork carries network_retry_max/… | none | n/a | 81 loc, 0 cf (0) | KEEP | keep-unproven | DROP — LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | — | t_2e862bc6 | +| nopr:4ed79b6dad | gateway | Telegram network-reconnect ladder not configurable — orig: commit body | RED (read-only: upstream hardcodes MAX_NETWORK_RETRIES = 10 @up/plugins/platforms/telegram/adapter.py:2111; fork carries network_retry_max/… | none | n/a | 81 loc, 0 cf (0) | KEEP | keep-unproven | KEEP — ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): the root config and 12 profile configs (13) set telegram network_retry_max: 20 / network_retry_max_delay: 120 and fork/main passes them to the adapter; a revert silently drops every … | — | t_2e862bc6 | | #357 | gateway | desktop runtime footer shipped as message text instead of metadata — orig: PR body | RED for tui_gateway/server.py footer seam (fork footer metadata not upstream) | none | n/a | 78 loc, 1 cf (3) | KEEP | keep-unproven | KEEP — LEAD: footer family; registry entry 22 (upstream PR #80661 outstanding) + display.runtime_footer enabled with fork fields provider_model/reasoning/context_full (~/.hermes/config.yaml:342-350) -> renders on every reply. | — | — | | #935 | gateway | stderr log handler attached directly to root: a WARNING on the Discord heartbeat path became a synchronous disk write and a 10s loop block — orig: 2026-09-23 Apollo freeze story piece 6 (30 ack_stale… | RED (read-only: up/gateway/run.py:5221-5225 _stderr_handler = logging.StreamHandler(_safe_stderr()); root.addHandler — not routed through h… | none | n/a (no literal) | 77 loc, 1 cf (3) | UPSTREAM | — | UPSTREAM | audit/gateway/upstream-935 | t_e3cc317e | | #404 | gateway | manual /compress Model line showed config r: instead of session-truthful effort — orig: PR body | n/a (fork granular compress lines, #173) | n/a | n/a | 77 loc, 2 cf (3) | KEEP | keep-unproven | KEEP — LEAD: compaction-announce family; registry entry 3 + announce_on_hygiene: true (config.yaml:215); "Context compacted" 217 fires (nopr:2870fd4994). | — | — | @@ -241,7 +241,7 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | #177 | agent | Stats block ran for every compress() incl. no-ops, spamming APPROX_ATTRIBUTION/TAG_MISSING for announces that never render. — orig: PR #177 body: measured 2026-07-02 in apollo agent.log. | RED (read-only): upstream emits only the start status — _announce_compression_start@../up/agent/conversation_compression.py:4006 (COMPACTIO… | none | TAG_MISSING 2 / APPROX_ATTRIBUTION 3 in 54 rotated gateway/agent logs (~/.hermes/logs + profiles/*/logs); main gateway.log.1 starts 2026-09… | 492 loc, 1 cf (3) | KEEP | — | KEEP | — | — | | #37 | agent | Deny-by-default side-effect lockout on the budget grace turn (Guard D-core). — orig: PR #37 (2258d375d9). | RED (read-only): upstream has the grace call (_budget_grace_call@../up/agent/agent_init.py:562, conversation_loop.py:1595, turn_iteration_p… | none | 0 measured: the refusal is delivered to the model as a role=tool result (grace_block_result@fork/agent/budget_grace_gate.py:94, text 'the i… | 492 loc, 3 cf (3) | DROP | needs-lead → DROP (with tool_gate edit) | DROP — LEAD: 0 grace-turn denials in 555,617 turn_tool_calls (06-11..09-25). DROP, but the revert must cut the grace branch out of agent/fork_ext/tool_gate.py (registry 11) and regenerate tests/golden/tool_gate (7 grace cases). | — | t_0973b125 | | #610 | agent | Split surrogates in tool-input JSON deltas broke the Anthropic SDK accumulator. — orig: PR #610. | GREEN-equivalent (read-only): ../up/agent/anthropic_adapter.py:709 malformed fine-grained tool-JSON stream retry (#107830) + sanitization a… | upstream #107830 | see #63 (5) | 491 loc, 2 cf (3) | SUPERSEDED-BY-UPSTREAM | stands | SUPERSEDED-BY-UPSTREAM | — | — | -| #109 | agent | Residual A-floor exhaustive partition for the in-turn announce after #106. — orig: PR #109 body: 3 of 5 LCM compactions still degraded after #106. | n/a — code already gone from fork origin/main: _engine_in_context_sanitize/_partition_pre_by_comp_kept/_read_engine_b_partition absent (dos… | none | n/a (dead) | 487 loc, 1 cf (3) | DROP | stands | DROP | — | t_6b6df0eb | +| #109 | agent | Residual A-floor exhaustive partition for the in-turn announce after #106. — orig: PR #109 body: 3 of 5 LCM compactions still degraded after #106. | n/a — code already gone from fork origin/main: _engine_in_context_sanitize/_partition_pre_by_comp_kept/_read_engine_b_partition absent (dos… | none | n/a (dead) | 487 loc, 1 cf (3) | DROP | stands | KEEP — ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): #164 renamed the A-floor to _signature_partition, not removed it; live on origin/main (compaction_stats.py:959-982), fired 6x in prod logs 09-19..25, and #106 (KEEP) depends on it. (… | — | t_6b6df0eb | | nopr:02a357eaf5 | agent | Announce formatter/emitter core (snippet extractor, engine-aware formatter, deduped emitter). — orig: commit 02a357eaf5 (2026-06-20), tasks 1-3 of the compaction-announce plan. | RED (read-only): upstream emits only the start status — _announce_compression_start@../up/agent/conversation_compression.py:4006 (COMPACTIO… | none | 'Context compacted' 217, granular block ('Removed from live context'/'Replacement cost') 213, 'engine: lcm' 219 in 54 rotated gateway/agent… | 479 loc, 1 cf (3) | KEEP | — | KEEP | — | — | | #101 | agent | Hygiene stats conflated two 'kept' populations; announce silently degraded on real hygiene compactions. — orig: PR #101 body: live 2026-06-22. | RED (read-only): upstream emits only the start status — _announce_compression_start@../up/agent/conversation_compression.py:4006 (COMPACTIO… | none | COMPACTION_STATS_RECONCILE_FAILED 1 in 54 rotated gateway/agent logs (~/.hermes/logs + profiles/*/logs); main gateway.log.1 starts 2026-09-… | 478 loc, 0 cf (0) | KEEP | — | KEEP | — | — | | #1010 | agent | Billed HTTP-200s the loop rejects were missing from turn totals (I4 class 2). — orig: PR #1010. | RED (see #978) | none | not separately counted (rejected-but-billed rows fold into turn totals) | 471 loc, 2 cf (3) | KEEP | keep-unproven | KEEP — LEAD measured: KEEP-by-dependency: KEEP rows build on it: #913 | — | — | @@ -603,7 +603,7 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | #115 | hermes_cli | fix(backup): exclude swiftui-docs (Apple IP) from backup zip (#115) — Adds `swiftui-docs` to `_EXCLUDED_DIRS` in `hermes_cli/backup.py` so Apple's Xcode `AdditionalDocumentation` can never enter the … | read-only: upstream backup has no swiftui-docs exclusion | none | 0 distinctive log/event hits [window: log files 2026-05-10..2026-09-25 (1741 files; agent/gateway logs only 2026-07-29..2026-09-25); kanban… | 40 loc, 2 cf (2) | KEEP | — | KEEP | — | — | | #491 | hermes_cli | fix(kanban): respawn guard fail-closed forever on a JSON-quoted PR URL (#491) — A worker posts its handback as JSON: ```json "pr": "https://github.com/o/r/pull/3", ``` `_RESPAWN_GUARD_PR_URL_RE` capt… | read-only: fork-only kanban path (fork kanban_db.py diverged from upstream's split modules) | none | DB/config: 26,889 respawn_guarded events [window: log files 2026-05-10..2026-09-25 (1741 files; agent/gateway logs only 2026-07-29..2026-09… | 39 loc, 2 cf (2) | KEEP | — | KEEP | — | — | | #593 | hermes_cli | fix(cli): hide numeric failover lanes in `hermes model`, the third picker surface (#593) — `hermes model` (hermes_cli/main.py) was the only provider picker that applied no lane filter. It rendered 69… | read-only: upstream has no failover-lane filter | none | 0 distinctive log/event hits [window: log files 2026-05-10..2026-09-25 (1741 files; agent/gateway logs only 2026-07-29..2026-09-25); kanban… | 30 loc, 1 cf (1) | KEEP | — | KEEP | — | — | -| nopr:36134d8944 | hermes_cli | fix(model): route bare gpt-5.5 to Codex OAuth — Ace expects '/model gpt-5.5' to mean the subscription-backed OpenAI Codex route, not OpenAI API or an aggregator slug. Add a built-in direct alias for … | read-only: upstream has no bare gpt-5.5 alias | none | 0 distinctive log/event hits [window: log files 2026-05-10..2026-09-25 (1741 files; agent/gateway logs only 2026-07-29..2026-09-25); kanban… | 29 loc, 1 cf (2) | DROP | stands | DROP | audit/hermes_cli/revert-36134d8944 | t_b865b149 | +| nopr:36134d8944 | hermes_cli | fix(model): route bare gpt-5.5 to Codex OAuth — Ace expects '/model gpt-5.5' to mean the subscription-backed OpenAI Codex route, not OpenAI API or an aggregator slug. Add a built-in direct alias for … | read-only: upstream has no bare gpt-5.5 alias | none | 0 distinctive log/event hits [window: log files 2026-05-10..2026-09-25 (1741 files; agent/gateway logs only 2026-07-29..2026-09-25); kanban… | 29 loc, 1 cf (2) | DROP | stands | KEEP — ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): PR #1200 (the revert) went CI-red: af43fd64ff test_cron_auto_model relies on the gpt-5.5 -> openai-codex alias (4 failures). Close #1200 unmerged; branch audit/hermes_cli/revert-3613… | audit/hermes_cli/revert-36134d8944 | t_b865b149 | | nopr:9c6214b9c5 | hermes_cli | fix: parse openai-codex slash model switches — — orig: PR body via REST (merged direct commit); shas 9c6214b9c5 | GREEN by read: typed provider/model routing@hermes_cli/model_switch.py:926-934 (#45006) | none found by -S (behavior present by read) | 0 distinctive log/event hits [window: log files 2026-05-10..2026-09-25 (1741 files; agent/gateway logs only 2026-07-29..2026-09-25); kanban… | 27 loc, 2 cf (2) | SUPERSEDED-BY-UPSTREAM | overturned → KEEP | KEEP — adversary overturned: parse_model_input("openai-codex/gpt-6-sol", "claude-bpr") on ../up -> ("claude-bpr", "openai-codex/gpt-6-sol"); on fork -> ("openai-codex", "gpt-6-sol"); colon form handled on both; fleet worker spawns pass -m provider/model (#374: 322 l… | — | — | | nopr:ca61765850 | hermes_cli | fix(backup): bound _safe_copy_db so a live 1GB+ DB can't deadlock the full backup — The full `hermes backup -o` deadlocked for 12.5h on a Mac Studio whose live gateway holds a 1.46GB state.db in WAL … | GREEN by read: _safe_copy_db(src, dst, *, timeout_seconds=10.0)@hermes_cli/backup_sqlite.py:31 with busy_deadline progress callback (:57) | none found by -S (deadline present by read) | 0 distinctive log/event hits [window: log files 2026-05-10..2026-09-25 (1741 files; agent/gateway logs only 2026-07-29..2026-09-25); kanban… | 27 loc, 1 cf (2) | SUPERSEDED-BY-UPSTREAM | stands | SUPERSEDED-BY-UPSTREAM | — | — | | #33 | hermes_cli | fix(browser): add --remote-allow-origins to CDP debug launch for Chrome 111+ (#33) — Chrome/Chromium **111+** rejects CDP WebSocket handshakes with **HTTP 403** unless the connecting origin is explic… | RED by read: launch args@hermes_cli/browser_connect.py:765 lack --remote-allow-origins | none | 0 distinctive log/event hits [window: log files 2026-05-10..2026-09-25 (1741 files; agent/gateway logs only 2026-07-29..2026-09-25); kanban… | 25 loc, 0 cf (0) | UNRESOLVED | — | UNRESOLVED | — | — | @@ -645,7 +645,7 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | #219 | plugins | Rerank-score recall relevance gate (L2) + dynamic gap (L3). — orig: PR #219 body. | read-only: fork-only (upstream rerank is platform-only, no gate). | none | 2 log lines; mem0.json prefetch_rerank_gate enabled=true (L2 live), prefetch_rerank_gap enabled=false (L3 OFF) | 262 loc, 1 cf (1) | KEEP | — | KEEP | — | — | | #465 | plugins | Active-context assembly dropped tool rows but never merged the adjacent bare assistant rows left behind — strict-alternation violation every downstream load had to repair. — orig: PR #465 body. | RED by read: _merge_adjacent* = 0 hits in lcmup; engine.py:6010 _assemble_context has no adjacent-assistant merge. Our upstream PR #467 ('m… | none (PR #467 open) | 0 log lines (silent normalization on every assembly) | 238 loc, 0 cf (0) | KEEP | — | KEEP | — | — | | #434 | plugins | Route 6 Path.home()/'.hermes' bypass sites through get_hermes_home() (hermeticity). — orig: PR #434 body (2026-07-26). | GREEN by read for the class: upstream e7d9e07dbc (2026-09-12) 'HERMES_HOME resolves through get_hermes_home everywhere; no ~/.hermes fallba… | e7d9e07dbc | n/a (path resolution; fork test tests/hermes_cli/test_kanban_worker_hermeticity_anchor.py gone from the fork tree) | 233 loc, 1 cf (2) | SUPERSEDED-BY-UPSTREAM | overturned → KEEP | KEEP — adversary overturned: 8521235b11 --stat: all 6 sites are fork-only files (hermes_cli/kanban_db.py fork parts, plugins/blackbox/routing.py:70, plugins/context_engine/lcm/diagnostics.py:52, lcm/engine.py, mem0/live_e2e_capture.py, telegram adapter); upstream e7… | — | — | -| nopr:051c2076e1 | plugins | msg_fts_* triggers existed by name but referenced the dropped `content` column after the content->search_content rename; name-only health check reported healthy while every INSERT aborted. — orig: Co… | GREEN by absence: search_content does not exist in lcmup (0 hits, never did per git log -S), so this drift class cannot occur upstream. lcm… | db_bootstrap.py:2280 normalized-trigger compare (generic; n… | 0 log lines in the window (repair path; the drifted DBs were fixed in June) | 228 loc, 0 cf (0) | KEEP | keep-unproven | DROP — LEAD: repair path for DBs that drifted in June, all repaired; 0 fires since. New DBs are created with the correct schema. | — | t_c335830a | +| nopr:051c2076e1 | plugins | msg_fts_* triggers existed by name but referenced the dropped `content` column after the content->search_content rename; name-only health check reported healthy while every INSERT aborted. — orig: Co… | GREEN by absence: search_content does not exist in lcmup (0 hits, never did per git log -S), so this drift class cannot occur upstream. lcm… | db_bootstrap.py:2280 normalized-trigger compare (generic; n… | 0 log lines in the window (repair path; the drifted DBs were fixed in June) | 228 loc, 0 cf (0) | KEEP | keep-unproven | KEEP — ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): a full revert corrupts FTS (probe on a copy of shopper lcm.db: "database disk image is malformed"); the commit's drop-then-recreate-on-missing keeps trigger order correct, so reverti… | — | t_c335830a | | #1053 | plugins | Per-session reads (get_session_tail, load_session_page, ...) returned soft-hidden superseded replay copies, so re-bind reconcile matched against hidden rows. — orig: PR #1053 body, card t_9cdad21b (2… | GREEN by absence: superseded_by = 0 hits in lcmup (upstream prevents the duplicate write, ledger DD-2), so there are no hidden rows to leak. | reconcile.py (DD-2 prevention design) | landed 2026-09-25, 0 log literal hits (too new; read path is silent) | 227 loc, 0 cf (0) | KEEP | — | KEEP | — | — | | #903 | plugins | Regression layer for the boot-scan class (a plan-level test that fails on any full-table scan during MessageStore init) + a loud signal when engine load stalls every turn. — orig: PR #903 body (two A… | read-only: lcmup has no init-cost contract test; upstream's _init_db still contains an unconditional full-table UPDATE (store.py:454) so th… | none | 0 log lines (test layer + a stall signal that has not tripped in the window) | 224 loc, 0 cf (0) | KEEP | keep-unproven | KEEP — LEAD: regression guard for two measured Apollo freezes 2026-09-22 (#887/#902); tests + one stall signal, 0 conflict files. | — | — | | #171 | plugins | Reuse mem0 background executors instead of creating a ThreadPoolExecutor per call. — orig: PR #171 body (2026-07-04). | GREEN by read (structural): upstream mem0/__init__.py has 0 ThreadPoolExecutor hits — background work goes through agent.memory_provider.sp… | 2e779d11a0 + memory_manager _sync_executor | 0 log lines (silent) | 224 loc, 2 cf (2) | SUPERSEDED-BY-UPSTREAM | overturned → KEEP (until mem0 re-base) | KEEP — adversary overturned: fork mem0/__init__.py:20,56-60 _DaemonThreadPoolExecutor, :636,:1640-1651 prefetch executor lifecycle; dependent #824 f2b051b926 graded KEEP | — | — | @@ -814,7 +814,7 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | #780 | scripts+misc | 5 FleetReview P1s on the OOB confab-notice consumer (agent/confab_notice.py + TUI/desktop render) — orig: PR body: ## Why this is a new PR (the card said not to open one) The card `t_3c012aba` instru… | n/a (fleet-only) (confab_notice is fork-only; 9 fork files import it) | none | not countable: the consumer emits no log marker; only evidence of use is Ace's 2026-09-21 01:45 Discord message 'Confab-OOB lane live on al… | 1681 loc, 4 cf (3) | UNRESOLVED | — | UNRESOLVED | — | — | | #612 | scripts+misc | recovered July design docs + loop-starvation certify harness — orig: PR body: Stash-triage recovery (closeout loose end, 2026-08-19). `stash@{5}` from 2026-07-06 held the only copy of the dashboard-p… | n/a (fleet-only) | none | scripts/certify/dashboard_loop_certify.py: 0 callers in repo/cron/launchd/hooks [log window 2026-06-02..2026-09-25 (86 agent/gateway/errors… | 1636 loc, 0 cf (0) | DROP | needs-lead → cross-tranche (gateway #616) | KEEP — LEAD: scripts/certify/dashboard_loop_certify.py is named by dashboard-eventloop-starvation-triage as THE hardened harness and is co-owned by gateway #616. KEEP; revert-oneshot-probes must be rebuilt without it. | audit/scripts_misc/revert-oneshot-probes | — | | #748 | scripts+misc | round-6 poller findings on #736 (status loss, stale artifacts, shutdown budget) — orig: PR body: Follow-up to #736 (squash-merged at 07:46Z). FleetReview's round-6 record on head `111527dd21` escalat… | as #736 | none | as #736 — workflow disabled since 2026-09-19 [log window 2026-06-02..2026-09-25 (86 agent/gateway/errors logs, ~/.hermes/logs + profiles/*/… | 1625 loc, 1 cf (1) | DROP | stands | DROP | audit/scripts_misc/revert-ci-review-comment | t_2820954b | -| #932 | scripts+misc | CI overflow Phase-0 read-only capability preflight + baseline receipt — orig: PR body: Implements read-only Phase-0 preflight with named PASS/BLOCK/UNVERIFIABLE checks, fixture contracts, live receip… | n/a (fleet-only) | none | 0 callers: ci_overflow_acceptance.py is referenced only by its own test (fork .github/scripts grep); receipts/preflight.json has no reader;… | 1601 loc, 0 cf (0) | DROP | stands | DROP | audit/scripts_misc/revert-ci-overflow-phase0 | t_7bc9ce6e | +| #932 | scripts+misc | CI overflow Phase-0 read-only capability preflight + baseline receipt — orig: PR body: Implements read-only Phase-0 preflight with named PASS/BLOCK/UNVERIFIABLE checks, fixture contracts, live receip… | n/a (fleet-only) | none | 0 callers: ci_overflow_acceptance.py is referenced only by its own test (fork .github/scripts grep); receipts/preflight.json has no reader;… | 1601 loc, 0 cf (0) | DROP | stands | KEEP — ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): #954 (merged after the audit) imports ci_overflow_acceptance from ci_overflow_integration.py:30; the rebased revert fails with ModuleNotFoundError (reproduced). Branch audit/scripts_… | audit/scripts_misc/revert-ci-overflow-phase0 | t_7bc9ce6e | | #439 | scripts+misc | parity evidence data: .parity-state.json (257 acks) + gates.jsonl + FORKDELTA-REVIEW.md — orig: PR body: Worktree salvage: the #420 parity merge shipped the code but the evidence ledger stayed local.… | n/a (fleet-only) | none | KEEP-as-data — reader: hermes_parity state.py (STATE_FILE='.parity-state.json') and gates.py (appends gates.jsonl); last written by the 08-… | 1504 loc, 0 cf (0) | KEEP | — | KEEP | — | — | | #194 | scripts+misc | dashboard process-isolation phase-0 spike (compute_host + measurement) — orig: PR body: Phase 0 of docs/desktop/2026-07-04-dashboard-process-isolation-PRD.md (v1.5 CONVERGED, 9 review passes). Config… | GREEN: upstream carries tui_gateway/compute_host.py | 7d27a31ce7 feat(dashboard): isolate turns in compute host (… | compute_host: 0 log hits in window; scripts/compute_host_phase0_spike.py has 0 callers | 1418 loc, 4 cf (3) | SUPERSEDED-BY-UPSTREAM | stands | SUPERSEDED-BY-UPSTREAM | audit/scripts_misc/revert-oneshot-probes | — | | #957 | scripts+misc | merge-group candidates were not checked for fleet/attribution status — orig: PR body: Merge-group-only job checks every queued PR head in the candidate against its fleet/attribution commit status. Fa… | n/a (fleet-only) | none | attribution-merge-group.yml active: 124 runs since 08-26 (93 success / 7 failure), latest 2026-09-25T13:28Z [log window 2026-06-02..2026-09… | 1351 loc, 0 cf (0) | KEEP | — | KEEP | — | — | @@ -919,7 +919,7 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | nopr:a0a5e8a083 | scripts+misc | ruff encoding fix on the staged runtime-parity-check.py — orig: commit body: fix(lint): explicit encoding on runtime-parity-check lockfile open (ruff blocking) fork/main's ruff config flags open() in… | n/a (fleet-only) | none | as 2f33571c20 — staging/ has no reader [log window 2026-06-02..2026-09-25 (86 agent/gateway/errors logs, ~/.hermes/logs + profiles/*/logs)] | 2 loc, 0 cf (0) | DROP | stands | DROP | audit/scripts_misc/revert-staging | t_f9da2f6b | | nopr:40a6040932 | scripts+misc | map upstream contributors talmax1124/janrenz in AUTHOR_MAP — orig: commit subject: fix(ci): map new upstream contributors in AUTHOR_MAP (talmax1124, janrenz) | GREEN-irrelevant: upstream maps neither (release.py 0, contributors/emails 0) and its check only covers new PR commits | none | 0: those authors' commits (last 2026-06-30/07-01) are already past; parity syncs are excluded rows [log window 2026-06-02..2026-09-25 (86 a… | 2 loc, 1 cf (2) | DROP | stands | DROP | audit/scripts_misc/revert-author-map-stale | t_bf92f846 | | nopr:aae6a302db | scripts+misc | ruff PLW1514 encoding fix in A5-A testless detection — orig: commit body: fix(lint): explicit encoding on read_text in A5-A testless detection (ruff blocking) | n/a (fleet-only) (A5-A guard is fork-only) | none | scripts/run_tests_parallel.py is invoked by tests.yml (matrix generation + per-slice run via run_tests.sh) on every CI run; fork CI: ci.yam… | 2 loc, 1 cf (3) | KEEP | — | KEEP | — | — | -| #22 | scripts+misc | apollo@daemonarchy.local unmapped in AUTHOR_MAP — orig: PR body: Adds `apollo@daemonarchy.local` → `Kyzcreig` to `AUTHOR_MAP` in `scripts/release.py`. **Why:** The Contributor Attribution Check fails… | n/a (fleet-only) | none | 0: last origin/main commit by apollo@daemonarchy.local is 2026-06-30; contributor-check only inspects new PR commits [log window 2026-06-02… | 1 loc, 1 cf (2) | DROP | stands | DROP | audit/scripts_misc/revert-author-map-stale | t_8ff394b6 | +| #22 | scripts+misc | apollo@daemonarchy.local unmapped in AUTHOR_MAP — orig: PR body: Adds `apollo@daemonarchy.local` → `Kyzcreig` to `AUTHOR_MAP` in `scripts/release.py`. **Why:** The Contributor Attribution Check fails… | n/a (fleet-only) | none | 0: last origin/main commit by apollo@daemonarchy.local is 2026-06-30; contributor-check only inspects new PR commits [log window 2026-06-02… | 1 loc, 1 cf (2) | DROP | stands | KEEP — ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): apollo@daemonarchy.local entry only: not stale, Apollo committed under it on 2026-09-22 and PR #872's attribution check passed only via this mapping. The 2 nopr:40a6040932 lines stay… | audit/scripts_misc/revert-author-map-stale | t_8ff394b6 | | #847 | scripts+misc | (empty diff — no content survives) — orig: PR body: Closes the FleetReview P1 that argus independently reproduced on #832's head (card `t_13445a80`, round-4 finding 2). #83 | n/a | none | n/a (0 loc) [log window 2026-06-02..2026-09-25 (86 agent/gateway/errors logs, ~/.hermes/logs + profiles/*/logs)] | 0 loc, 0 cf (0) | DROP | stands | DROP | — | t_e5a26e95 | | #805 | scripts+misc | (empty diff — no content survives) — orig: PR body: ## What `rich_sent_store.record()` is a read-modify-write of one JSON file finished by `os.replace` — the same shape th | n/a | none | n/a (0 loc) [log window 2026-06-02..2026-09-25 (86 agent/gateway/errors logs, ~/.hermes/logs + profiles/*/logs)] | 0 loc, 0 cf (0) | DROP | stands | DROP | — | t_c0b956e0 | | #66 | auto | test(run_agent): split monolithic test_run_agent.py to fix CI shard timeout (#66) | | | | 13318 loc, 4 cf (3) | (auto) | n/a | SUPERSEDED-BY-UPSTREAM — auto: follows nopr:d97b1070f7 (agent) by path; same fate. | — | — | @@ -1172,10 +1172,8 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | #772 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | | #694 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | | #683 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: guard success path is silent, 0 failure-literal fires 2026-05-10..09-25; no measurement found. INCIDENT-BACKED (PR body: replay after boots) - the slice card must first check upstream async delegation for the replay (52 delegations in state.db) and convert to UPSTREAM if RED. 1,387 loc / 5 conflict files. | -| #589 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | | #582 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | | #581 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | -| #562 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | | #527 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | | #493 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | | #453 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | @@ -1210,7 +1208,6 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | nopr:ec4b3176ff | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | | #716 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | | #69 | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | -| nopr:4ed79b6dad | gateway | KEEP | keep-unproven → KEEP-UNPROVEN | DROP | LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured "still needed" is not a KEEP). | | #980 | hermes_cli | KEEP | keep-unproven → KEEP | UPSTREAM | LEAD: fired once in 5 months (1 real "/model name:" line); generic parse fix -> offer upstream, drop ours on merge. | | #802 | hermes_cli | DROP | overturned → KEEP | KEEP | adversary overturned: ~/.hermes/plugins/fallback_chain_pool_source/__init__.py:245-247 imports+calls register_chain_source (card t_fb31680e); upstream PR NousResearch#118012 OPEN | | #492 | hermes_cli | KEEP | keep-unproven → KEEP | DROP | LEAD: no fleet Anthropic-wire model id contains a dot; guarded rewrite has no live input. | @@ -1237,7 +1234,6 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar | #44 | plugins | DROP | overturned → KEEP | KEEP | adversary overturned: plugins/blackbox/card.py:124-150 _tokens_out_line (introduced by 930d367238) feeds card.py:208 render_card, which /cost uses via commands.py:56-59 _render_card -> card.render; store.py:394 cites _tokens_out_line as a contract; blackbox is fork-identity by ruling | | #509 | plugins | KEEP | keep-unproven → KEEP | DROP | LEAD: no-op compaction class not observed in 201 "compression done" lines; 3-sync conflict on agent/turn_context.py. | | #107 | plugins | SUPERSEDED-BY-UPSTREAM | needs-lead → KEEP (split per ledger DD-2) | KEEP | LEAD: ledger DD-2 wins: keep the timestamp-provenance columns (977,334 superseded_by rows in lcm.db read by the fork filter). Split-then-drop of the dedup column is a follow-up authored change, not a revert. | -| nopr:051c2076e1 | plugins | KEEP | keep-unproven → KEEP | DROP | LEAD: repair path for DBs that drifted in June, all repaired; 0 fires since. New DBs are created with the correct schema. | | #149 | plugins | SUPERSEDED-BY-UPSTREAM | overturned → KEEP | KEEP | adversary overturned: fork plugins/kanban/dashboard/dist/index.js 'Scheduled' x2 vs upstream 0; upstream hermes_cli/kanban_db.py:103 HAS status 'scheduled' but its dashboard has no column; fork dashboard ships dist only (no src) | | #434 | plugins | SUPERSEDED-BY-UPSTREAM | overturned → KEEP | KEEP | adversary overturned: 8521235b11 --stat: all 6 sites are fork-only files (hermes_cli/kanban_db.py fork parts, plugins/blackbox/routing.py:70, plugins/context_engine/lcm/diagnostics.py:52, lcm/engine.py, mem0/live_e2e_capture.py, telegram adapter); upstream e7d9e07dbc cannot touch fork-only code | | #407 | plugins | KEEP | keep-unproven → KEEP | DROP | LEAD: staging half is off (staging_mode=false); transient gate 0 own lines. | @@ -1306,3 +1302,34 @@ Inputs: auditor branches `audit//verdicts` (latest, incl. post-adversar Action for t_cbdab1dc: pass `status="unknown"` in the reconciler's `mark_job_run` call (upstream already has the `status` parameter), and carry #532's `hermes cron` display of `unknown` plus its test in the same PR. Verdict counts are unchanged (the row was UPSTREAM before and after this ruling). If #521 is ever dropped from the upstream set, #532 becomes DROP with it. + +### Post-ruling flips (2026-09-27) + +Ace ruled 2026-09-27 00:39 PT (Discord msg 1553672387516440636, review page calm-ember-1f75.docs.ace) on the 15 blocked +audit slices. Docs card t_f29230a1. Applied by `lead/post_ruling_2026_09_27.py` (edits `lead/rows.json`, idempotent, +asserts each row was DROP) and re-rendered with `lead/render.py`; the table rows above carry the evidence inline. + +**DROP → KEEP (premise falsified by the slice worker):** + +| key | tranche | slice card | measured evidence | +|---|---|---|---| +| nopr:4ed79b6dad | gateway | t_2e862bc6 | 13 configs (root + 12 profiles) set telegram `network_retry_max: 20` / `network_retry_max_delay: 120`; fork/main passes them to the adapter. A revert silently drops every profile to upstream's hardcoded 10 retries / 60s. | +| #109 | agent | t_6b6df0eb | Renamed by #164 to `_signature_partition`, not removed; live on origin/main (compaction_stats.py:959-982), 6 fires 09-19..25; #106 (KEEP) depends on it. | +| #932 | scripts+misc | t_7bc9ce6e | #954 (merged after the audit) imports `ci_overflow_acceptance` (ci_overflow_integration.py:30); the rebased revert fails with ModuleNotFoundError (reproduced). `audit/scripts_misc/revert-ci-overflow-phase0` is now VOID. | +| #562 | gateway | t_7ea0fe09 | Structural base of merged #566/#568/#682 (`resolve_wake_participant` / `_live_chat_participants`); `git revert` conflicts; #682 records a field-observed phantom session this path prevents. | +| #589 | gateway | t_5d546222 | Follows #562 (card body: "#589 row follows"): #589 only single-sources the creator-stamp rule of the #562/#568 stack; the slice worker's own caveat said it becomes KEEP if #562 is kept. `audit/gateway/revert-589` (c2c77036a7, no PR opened) must not merge. | +| nopr:36134d8944 | hermes_cli | t_b865b149 | Revert PR #1200 went CI-red: af43fd64ff `test_cron_auto_model` relies on the gpt-5.5 → openai-codex alias (4 failures). #1200 closes unmerged; `audit/hermes_cli/revert-36134d8944` is now VOID. | +| nopr:051c2076e1 | plugins | t_c335830a | A full revert corrupts FTS (probe on a copy of shopper lcm.db: "database disk image is malformed"); the commit's drop-then-recreate-on-missing keeps trigger order correct, so a revert would ship the drifted trigger spec to new DBs. | +| #22 | scripts+misc | t_8ff394b6 | `apollo@daemonarchy.local` entry only: Apollo committed under it on 2026-09-22 and PR #872's attribution check passed only via this mapping. The 2 nopr:40a6040932 AUTHOR_MAP lines stay DROP (`audit/scripts_misc/revert-author-map-stale` @4053ee9081). | + +**Confirmed as ruled (no row change):** #129 DROP (t_d72c6944). UPSTREAM GO on nopr:dc4245ab4c, the #920/#933/#1017 bundle, +#602 (stays UPSTREAM pending the re-verdict against upstream retention, t_8745d8fe) and #209 (re-port onto upstream #58144). + +**Counts (by script, `lead/rows.json`):** KEEP 664 → 672, DROP 161 → 153; UPSTREAM 93, SUPERSEDED-BY-UPSTREAM 174, +UNRESOLVED 24 unchanged; 1,116 rows. Eight rows flipped, not seven: the ruling lists seven slices, and #589 follows #562. +Per tranche: gateway KEEP 92 → 95 / DROP 42 → 39; agent 117 → 118 / 18 → 17; hermes_cli 133 → 134 / 8 → 7; +plugins 68 → 69 / 5 → 4; scripts+misc 76 → 78 / 32 → 30. ROLLUP.md is re-rendered to match. + +Side effect of the re-render: #562, #589, nopr:4ed79b6dad and nopr:051c2076e1 no longer appear in the Conflicts table. +`render.py` lists a KEEP-UNPROVEN row there only when FINAL differs from the auditor verdict, and all four auditors said KEEP. +This subsection records the change. diff --git a/docs/plans/fork-pr-audit/ROLLUP.md b/docs/plans/fork-pr-audit/ROLLUP.md index dab465f435ca1..224cf3018d149 100644 --- a/docs/plans/fork-pr-audit/ROLLUP.md +++ b/docs/plans/fork-pr-audit/ROLLUP.md @@ -4,20 +4,20 @@ | tranche | KEEP | UPSTREAM | SUPERSEDED-BY-UPSTREAM | DROP | UNRESOLVED | total | |---|---|---|---|---|---|---| -| gateway | 92 | 19 | 26 | 42 | 2 | 181 | -| agent | 117 | 20 | 85 | 18 | 0 | 240 | -| hermes_cli | 133 | 4 | 16 | 8 | 16 | 177 | -| plugins | 68 | 7 | 4 | 5 | 0 | 84 | +| gateway | 95 | 19 | 26 | 39 | 2 | 181 | +| agent | 118 | 20 | 85 | 17 | 0 | 240 | +| hermes_cli | 134 | 4 | 16 | 7 | 16 | 177 | +| plugins | 69 | 7 | 4 | 4 | 0 | 84 | | cron+tools | 44 | 37 | 21 | 9 | 0 | 111 | -| scripts+misc | 76 | 1 | 3 | 32 | 5 | 117 | +| scripts+misc | 78 | 1 | 3 | 30 | 5 | 117 | | auto | 134 | 5 | 17 | 10 | 1 | 167 | | auto-cherry-pick | 0 | 0 | 2 | 0 | 0 | 2 | | auto-desktop-retired | 0 | 0 | 0 | 37 | 0 | 37 | -| **all** | **664** | **93** | **174** | **161** | **24** | **1116** | +| **all** | **672** | **93** | **174** | **153** | **24** | **1116** | ## 2. Fork lines that DROP / SUPERSEDED would delete -Census `loc` (add+del of the original PR, an upper bound — later rows edit the same lines): DROP 53,897, SUPERSEDED-BY-UPSTREAM 88,161, UPSTREAM (deleted once merged upstream) 30,313, KEEP 334,962, UNRESOLVED 7,867; all rows 515,200. +Census `loc` (add+del of the original PR, an upper bound — later rows edit the same lines): DROP 50,822, SUPERSEDED-BY-UPSTREAM 88,161, UPSTREAM (deleted once merged upstream) 30,313, KEEP 338,037, UNRESOLVED 7,867; all rows 515,200. Real `git diff --shortstat ` of every revert branch on origin (lead run 2026-09-25): @@ -39,13 +39,13 @@ Real `git diff --shortstat ` of every revert branch on orig | `audit/gateway/revert-129` | 2 files changed, 349 deletions(-) | LIVE | | `audit/gateway/revert-229` | 5 files changed, 2 insertions(+), 1127 deletions(-) | LIVE | | `audit/gateway/revert-49-undo` | 56 files changed, 307 insertions(+), 4979 deletions(-) | LIVE | -| `audit/hermes_cli/revert-36134d8944` | 2 files changed, 3 insertions(+), 26 deletions(-) | LIVE | +| `audit/hermes_cli/revert-36134d8944` | 2 files changed, 3 insertions(+), 26 deletions(-) | VOID (rows now KEEP×1) | | `audit/hermes_cli/revert-619` | 2 files changed, 83 deletions(-) | LIVE | | `audit/hermes_cli/revert-712` | 4 files changed, 296 deletions(-) | LIVE | | `audit/hermes_cli/revert-760` | 2 files changed, 97 deletions(-) | LIVE | | `audit/hermes_cli/revert-802` | 3 files changed, 7 insertions(+), 711 deletions(-) | VOID (rows now KEEP×1) | | `audit/scripts_misc/revert-author-map-stale` | 1 file changed, 3 deletions(-) | LIVE | -| `audit/scripts_misc/revert-ci-overflow-phase0` | 4 files changed, 1602 deletions(-) | LIVE | +| `audit/scripts_misc/revert-ci-overflow-phase0` | 4 files changed, 1602 deletions(-) | VOID (rows now KEEP×1) | | `audit/scripts_misc/revert-ci-review-comment` | 4 files changed, 87 insertions(+), 4230 deletions(-) | LIVE | | `audit/scripts_misc/revert-desktop-update-test` | 2 files changed, 14 insertions(+), 36 deletions(-) | LIVE | | `audit/scripts_misc/revert-greptile` | 1 file changed, 6 deletions(-) | LIVE | @@ -155,7 +155,7 @@ Census `conflict_files` is file-level (the PR touches a file named in a sync led | RESOLUTION-LEDGER-20260807.md | 117 | 85 | 13 | | RESOLUTION-LEDGER-2026-08-29.md | 123 | 84 | 14 | -Row view: 238/795 ledger-touching rows are DROP/SUPERSEDED; they hold 551/1,727 (32%) of all row×conflict-file incidences. Freed files (all ledgers, deduped): 31 — apps/desktop/src/lib/reasoning-effort.ts, hermes_cli/tools_config.py, locales/ar.yaml, scripts/install.sh, scripts/iso-certify.py, tests/agent/test_compaction_threshold_reresolve.py, tests/agent/test_fallback_announce.py, tests/agent/test_i18n.py, tests/agent/test_redact.py, tests/cron/test_lifecycle_guard_heredoc_data.py, tests/gateway/test_config_env_bridge_authority.py, tests/gateway/test_cron_session_contextvar.py, tests/gateway/test_no_gateway_session_env_writes.py, tests/hermes_cli/test_model_switch_custom_providers.py, tests/hermes_cli/test_web_server.py, tests/run_agent/test_partial_stream_finish_reason.py, tests/run_agent/test_run_agent.py, tests/run_agent/test_run_agent_conversation.py, tests/test_code_skew.py, tests/test_web_server.py, tests/tools/test_cron_subagent_session.py, tests/tools/test_mcp_tool.py, tests/tui_gateway/test_compute_host_phase1.py, tests/tui_gateway/test_iso_certify_seam.py, tui_gateway/compute_host.py, tui_gateway/host_supervisor.py, tui_gateway/methods_session.py, tui_gateway/synthetic_turn.py, web/src/lib/gatewayClient.test.ts, web/src/lib/gatewayClient.ts, website/docs/user-guide/features/browser.md. The god files (gateway/run.py, agent/*helpers, hermes_state.py, cron/scheduler.py) stay conflicted: KEEP rows still touch them, so the win there is fewer hunks, not fewer files. +Row view: 233/795 ledger-touching rows are DROP/SUPERSEDED; they hold 545/1,727 (32%) of all row×conflict-file incidences. Freed files (all ledgers, deduped): 31 — apps/desktop/src/lib/reasoning-effort.ts, hermes_cli/tools_config.py, locales/ar.yaml, scripts/install.sh, scripts/iso-certify.py, tests/agent/test_compaction_threshold_reresolve.py, tests/agent/test_fallback_announce.py, tests/agent/test_i18n.py, tests/agent/test_redact.py, tests/cron/test_lifecycle_guard_heredoc_data.py, tests/gateway/test_config_env_bridge_authority.py, tests/gateway/test_cron_session_contextvar.py, tests/gateway/test_no_gateway_session_env_writes.py, tests/hermes_cli/test_model_switch_custom_providers.py, tests/hermes_cli/test_web_server.py, tests/run_agent/test_partial_stream_finish_reason.py, tests/run_agent/test_run_agent.py, tests/run_agent/test_run_agent_conversation.py, tests/test_code_skew.py, tests/test_web_server.py, tests/tools/test_cron_subagent_session.py, tests/tools/test_mcp_tool.py, tests/tui_gateway/test_compute_host_phase1.py, tests/tui_gateway/test_iso_certify_seam.py, tui_gateway/compute_host.py, tui_gateway/host_supervisor.py, tui_gateway/methods_session.py, tui_gateway/synthetic_turn.py, web/src/lib/gatewayClient.test.ts, web/src/lib/gatewayClient.ts, website/docs/user-guide/features/browser.md. The god files (gateway/run.py, agent/*helpers, hermes_state.py, cron/scheduler.py) stay conflicted: KEEP rows still touch them, so the win there is fewer hunks, not fewer files. ## 5. D2b registry write-backs owed (docs/sync/fork-features.json) @@ -170,11 +170,11 @@ Row view: 238/795 ledger-touching rows are DROP/SUPERSEDED; they hold 551/1,727 ## 6. The three answers Ace asked for -**What still provides value.** 664 rows (334,962 loc) KEEP on a measurement: the restart/resume/admission family (boot_resume_scheduled 1,190, dropbox_resume 1,410, turn_slot_acquire 2,208, restart_notice 455 fires), blackbox cost accounting (19k–47k turns/api-calls priced), relay-lane headers/pricing (16,913 bpx/bpr calls/7d), the footer and route/compaction announce families (registry 3/22/23/24, live config), Discord restart backfill (425 re-injected messages), cron fallback/pins (17 opt-in jobs, 521-job stores). Plus 93 UPSTREAM rows that are needed AND generic — value that should stop being ours. +**What still provides value.** 672 rows (338,037 loc) KEEP on a measurement: the restart/resume/admission family (boot_resume_scheduled 1,190, dropbox_resume 1,410, turn_slot_acquire 2,208, restart_notice 455 fires), blackbox cost accounting (19k–47k turns/api-calls priced), relay-lane headers/pricing (16,913 bpx/bpr calls/7d), the footer and route/compaction announce families (registry 3/22/23/24, live config), Discord restart backfill (425 re-injected messages), cron fallback/pins (17 opt-in jobs, 521-job stores). Plus 93 UPSTREAM rows that are needed AND generic — value that should stop being ours. -**What solves problems that no longer exist.** 174 rows are fixed upstream (take theirs at the next sync) and 161 rows DROP: never fired in the window, dormant surfaces (desktop D9 ×37, gemini/yunwu lanes, MoA/send_message tools dormant since July, /undo 2 uses, /merge 0), one-shot June LCM campaign harnesses, and a write-only reaction journal. 24 rows stay UNRESOLVED (silent guards with no log/DB signal — need a canary, not a guess). +**What solves problems that no longer exist.** 174 rows are fixed upstream (take theirs at the next sync) and 153 rows DROP: never fired in the window, dormant surfaces (desktop D9 ×37, gemini/yunwu lanes, MoA/send_message tools dormant since July, /undo 2 uses, /merge 0), one-shot June LCM campaign harnesses, and a write-only reaction journal. 24 rows stay UNRESOLVED (silent guards with no log/DB signal — need a canary, not a guess). -**What the maintenance burden actually is (measured).** 515,200 fork lines across 1,116 rows; 795 rows sit on files named in the sync ledgers and 458 on files that conflicted in all three syncs. DROP+SUPERSEDED rows carry 551 of 1,727 (32%) row×conflict-file incidences and 142,058 census loc; but only 31 ledger files are fully freed because KEEP rows still sit on the god files. The real reduction comes in two steps: (1) this audit's DROP/SUPERSEDED (fewer hunks per sync), (2) landing the UPSTREAM rows + registry 22/23/24, which is what empties gateway/run.py of fork hunks. +**What the maintenance burden actually is (measured).** 515,200 fork lines across 1,116 rows; 795 rows sit on files named in the sync ledgers and 458 on files that conflicted in all three syncs. DROP+SUPERSEDED rows carry 545 of 1,727 (32%) row×conflict-file incidences and 138,983 census loc; but only 31 ledger files are fully freed because KEEP rows still sit on the god files. The real reduction comes in two steps: (1) this audit's DROP/SUPERSEDED (fewer hunks per sync), (2) landing the UPSTREAM rows + registry 22/23/24, which is what empties gateway/run.py of fork hunks. ## 7. Open prerequisites before the sync takes upstream @@ -217,3 +217,8 @@ tranches; #695 merge-queue flake not reproduced), auto ×1 (nopr:08fc3aff65 foll Post-handoff ruling: #532 stays UPSTREAM and folds into t_cbdab1dc (#521). The DROP proposal from t_552fce3d was rejected (see FINAL.md "Post-handoff lead rulings"). Counts are unchanged. + +Post-ruling flips (Ace, 2026-09-27, card t_f29230a1): 8 DROP rows → KEEP (#562, #589, nopr:4ed79b6dad, #109, #932, +nopr:36134d8944, nopr:051c2076e1, #22). §1/§2/§4/§6 above are re-rendered: KEEP 672, DROP 153. The §9 card arithmetic +records what was created at handoff (254 rows); after the flips, 246 rows are DROP/UPSTREAM. The 8 flipped rows' slice +cards were closed by the ruling. Details are in FINAL.md "Post-ruling flips (2026-09-27)". diff --git a/docs/plans/fork-pr-audit/lead/post_ruling_2026_09_27.py b/docs/plans/fork-pr-audit/lead/post_ruling_2026_09_27.py new file mode 100644 index 0000000000000..ba8047e3c99da --- /dev/null +++ b/docs/plans/fork-pr-audit/lead/post_ruling_2026_09_27.py @@ -0,0 +1,75 @@ +"""Ace ruling 2026-09-27 00:39 PT (msg 1553672387516440636, review page calm-ember-1f75.docs.ace), card t_f29230a1. + +Flips DROP rows to KEEP in lead/rows.json where the slice worker falsified the DROP premise. Idempotent: +a row already flipped is left alone; a row in any other state aborts. Prints verdict totals before/after. +Re-render FINAL.md / ROLLUP.md with lead/render.py afterwards. +""" +import collections, json, os, sys + +L = os.path.dirname(os.path.abspath(__file__)) + '/' +TAG = 'ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): ' +FLIPS = { + 'nopr:4ed79b6dad': ('t_2e862bc6', 'the root config and 12 profile configs (13) set telegram network_retry_max: 20 / ' + 'network_retry_max_delay: 120 and fork/main passes them to the adapter; a revert silently drops every ' + 'profile to upstream\'s hardcoded 10 retries / 60s cap.'), + '#109': ('t_6b6df0eb', '#164 renamed the A-floor to _signature_partition, not removed it; live on origin/main ' + '(compaction_stats.py:959-982), fired 6x in prod logs 09-19..25, and #106 (KEEP) depends on it.'), + '#932': ('t_7bc9ce6e', '#954 (merged after the audit) imports ci_overflow_acceptance from ci_overflow_integration.py:30; ' + 'the rebased revert fails with ModuleNotFoundError (reproduced). Branch audit/scripts_misc/revert-ci-overflow-phase0 ' + 'must not merge.'), + '#562': ('t_7ea0fe09', 'structural base of merged #566/#568/#682 (resolve_wake_participant / _live_chat_participants); ' + 'git revert conflicts, and #682 records a field-observed phantom session this path prevents.'), + '#589': ('t_5d546222', 'follows #562: #589 only single-sources the creator-stamp rule of the #562/#568 stack (slice worker ' + 'caveat). Branch audit/gateway/revert-589 (c2c77036a7) must not merge.'), + 'nopr:36134d8944': ('t_b865b149', 'PR #1200 (the revert) went CI-red: af43fd64ff test_cron_auto_model relies on the ' + 'gpt-5.5 -> openai-codex alias (4 failures). Close #1200 unmerged; branch ' + 'audit/hermes_cli/revert-36134d8944 must not merge.'), + 'nopr:051c2076e1': ('t_c335830a', 'a full revert corrupts FTS (probe on a copy of shopper lcm.db: "database disk image is ' + 'malformed"); the commit\'s drop-then-recreate-on-missing keeps trigger order correct, so reverting ' + 'would ship the drifted trigger spec to new DBs.'), + '#22': ('t_8ff394b6', 'apollo@daemonarchy.local entry only: not stale, Apollo committed under it on 2026-09-22 and PR #872\'s ' + 'attribution check passed only via this mapping. The 2 nopr:40a6040932 lines stay DROP on ' + 'audit/scripts_misc/revert-author-map-stale @4053ee9081.'), +} + + +def _scalar(line): + try: + return json.loads('{' + line.strip().rstrip(',') + '}') + except ValueError: + return None + + +def write_preserving(rows): + """Dump rows.json but keep every old line whose decoded value is unchanged. + + rows.json carries hand escapes (e.g. a JSON \\u003a that keeps a gitleaks generic-api-key rule quiet); + a plain json.dump would decode them. + """ + old = open(L + 'rows.json', encoding='utf-8').read().split('\n') + new = json.dumps(rows, indent=1, default=str).split('\n') + assert len(old) == len(new), (len(old), len(new)) + out = [o if o == n or (_scalar(o) is not None and _scalar(o) == _scalar(n)) else n for o, n in zip(old, new)] + open(L + 'rows.json', 'w', encoding='utf-8').write('\n'.join(out)) + + +def main(): + rows = json.load(open(L + 'rows.json', encoding='utf-8')) + before = collections.Counter(v['final'] for v in rows.values()) + for k, (card, ev) in FLIPS.items(): + v = rows[k] + why = TAG + ev + f' (slice card {card})' + if v['final'] == 'KEEP' and v['why'] == why: + continue + assert v['final'] == 'DROP', (k, v['final']) + v['final'], v['why'] = 'KEEP', why + write_preserving(rows) + after = collections.Counter(v['final'] for v in rows.values()) + assert sum(after.values()) == 1116 + print('before', dict(before)) + print('after ', dict(after)) + print('flipped', len(FLIPS), 'KEEP', before['KEEP'], '->', after['KEEP'], 'DROP', before['DROP'], '->', after['DROP']) + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/docs/plans/fork-pr-audit/lead/rows.json b/docs/plans/fork-pr-audit/lead/rows.json index 41faa5e0d4f97..ac08e175a8e00 100644 --- a/docs/plans/fork-pr-audit/lead/rows.json +++ b/docs/plans/fork-pr-audit/lead/rows.json @@ -6453,8 +6453,8 @@ "auditor": "DROP", "adv": "stands", "adv_new": null, - "final": "DROP", - "why": "adversary: stands", + "final": "KEEP", + "why": "ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): #164 renamed the A-floor to _signature_partition, not removed it; live on origin/main (compaction_stats.py:959-982), fired 6x in prod logs 09-19..25, and #106 (KEEP) depends on it. (slice card t_6b6df0eb)", "x": { "branch": null, "evidence": { @@ -16158,8 +16158,8 @@ "auditor": "KEEP", "adv": "keep-unproven", "adv_new": "KEEP-UNPROVEN", - "final": "DROP", - "why": "LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured \"still needed\" is not a KEEP).", + "final": "KEEP", + "why": "ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): follows #562: #589 only single-sources the creator-stamp rule of the #562/#568 stack (slice worker caveat). Branch audit/gateway/revert-589 (c2c77036a7) must not merge. (slice card t_5d546222)", "x": { "verdict": "KEEP", "problem": "kanban creator-stamp shape rule duplicated", @@ -16291,8 +16291,8 @@ "auditor": "KEEP", "adv": "keep-unproven", "adv_new": "KEEP-UNPROVEN", - "final": "DROP", - "why": "LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured \"still needed\" is not a KEEP).", + "final": "KEEP", + "why": "ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): structural base of merged #566/#568/#682 (resolve_wake_participant / _live_chat_participants); git revert conflicts, and #682 records a field-observed phantom session this path prevents. (slice card t_7ea0fe09)", "x": { "verdict": "KEEP", "problem": "kanban wake minted a phantom session for an identity-less sub", @@ -20536,8 +20536,8 @@ "auditor": "KEEP", "adv": "keep-unproven", "adv_new": "KEEP-UNPROVEN", - "final": "DROP", - "why": "LEAD: KEEP-UNPROVEN with no positive fire count, no executed upstream RED, no live knob/consumer/registry entry found in the row evidence -> DROP per rule (unmeasured \"still needed\" is not a KEEP).", + "final": "KEEP", + "why": "ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): the root config and 12 profile configs (13) set telegram network_retry_max: 20 / network_retry_max_delay: 120 and fork/main passes them to the adapter; a revert silently drops every profile to upstream's hardcoded 10 retries / 60s cap. (slice card t_2e862bc6)", "x": { "verdict": "KEEP", "problem": "Telegram network-reconnect ladder not configurable", @@ -27705,8 +27705,8 @@ "auditor": "DROP", "adv": "stands", "adv_new": "DROP", - "final": "DROP", - "why": "adversary: stands", + "final": "KEEP", + "why": "ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): PR #1200 (the revert) went CI-red: af43fd64ff test_cron_auto_model relies on the gpt-5.5 -> openai-codex alias (4 failures). Close #1200 unmerged; branch audit/hermes_cli/revert-36134d8944 must not merge. (slice card t_b865b149)", "x": { "verdict": "DROP", "problem": "fix(model): route bare gpt-5.5 to Codex OAuth \u2014 Ace expects '/model gpt-5.5' to mean the subscription-backed OpenAI Codex route, not OpenAI API or an aggregator slug. Add a built-in direct alias for bare 'gpt-5.5' -> provider 'openai-codex', model 'gpt-5.5', while preserving explicit '/model openai-api:gpt-5.5' for the API rou", @@ -30412,8 +30412,8 @@ "auditor": "DROP", "adv": "stands", "adv_new": null, - "final": "DROP", - "why": "adversary: stands", + "final": "KEEP", + "why": "ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): #954 (merged after the audit) imports ci_overflow_acceptance from ci_overflow_integration.py:30; the rebased revert fails with ModuleNotFoundError (reproduced). Branch audit/scripts_misc/revert-ci-overflow-phase0 must not merge. (slice card t_7bc9ce6e)", "x": { "branch": "audit/scripts_misc/revert-ci-overflow-phase0", "evidence": { @@ -33261,8 +33261,8 @@ "auditor": "KEEP", "adv": "keep-unproven", "adv_new": "KEEP", - "final": "DROP", - "why": "LEAD: repair path for DBs that drifted in June, all repaired; 0 fires since. New DBs are created with the correct schema.", + "final": "KEEP", + "why": "ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): a full revert corrupts FTS (probe on a copy of shopper lcm.db: \"database disk image is malformed\"); the commit's drop-then-recreate-on-missing keeps trigger order correct, so reverting would ship the drifted trigger spec to new DBs. (slice card t_c335830a)", "x": { "verdict": "KEEP", "problem": "msg_fts_* triggers existed by name but referenced the dropped `content` column after the content->search_content rename; name-only health check reported healthy while every INSERT aborted.", @@ -37434,8 +37434,8 @@ "auditor": "DROP", "adv": "stands", "adv_new": null, - "final": "DROP", - "why": "adversary: stands", + "final": "KEEP", + "why": "ACE RULING 2026-09-27 (DROP -> KEEP, premise falsified by the slice worker): apollo@daemonarchy.local entry only: not stale, Apollo committed under it on 2026-09-22 and PR #872's attribution check passed only via this mapping. The 2 nopr:40a6040932 lines stay DROP on audit/scripts_misc/revert-author-map-stale @4053ee9081. (slice card t_8ff394b6)", "x": { "branch": "audit/scripts_misc/revert-author-map-stale", "evidence": {