Conversation
…CISION (12 lines) Promotes 8 of 9 batch-2 candidates to SAFE_TO_RESET_LFG_SUPERSEDES with named per-file evidence; flags 1 file (loop-tick-history.md) as NEEDS_HUMAN_DECISION due to mutual divergence in tick-record content. Ledger transition (273 = 215 + 12 + 46 ✓): - classified_safe_lines: 134 → 215 (+81) - unsafe_lines: 0 → 12 (loop-tick-history.md NEEDS_HUMAN_DECISION) - unclassified_lines: 139 → 46 (-93) Batch 2 SAFE files + dominant evidence pattern: - codeql-config.yml (6): LFG bb0227e + 817e59c + 1e09fef — deliberate paths-ignore decision (java-kotlin matrix, scan AlloyRunner.java) that AceHack reverted - memory-index-duplicate-lint.yml (8) + audit-memory-index-duplicates.sh (8): persona-name attribution comments on current-state CI/tool surfaces (role-vs-name rule violation); LFG uses role-refs - Shard.fs (9): LFG aa5395b + 9373755 — perf-fixed non-boxing EqualityComparer<'K>.Default per Copilot P1 review on LFG #649; AceHack still has explicit boxing - AUTONOMOUS-LOOP.md (9): LFG 8aa4adc — Option B per-tick shard-mode doctrine (PR #724, landed 2026-04-29T02:04:38Z); AceHack describes legacy single-table append - macos.sh (11): LFG more detailed shellcheck rationale + role-refs; AceHack adds persona-name attribution + terser shellcheck - fix-markdown-md032-md026.py (16): LFG f57d683 + 515db64 — strict superset (376 lines vs 235), adds YAML frontmatter handling AceHack lacks; fence-detection logic identical - curl-fetch.sh (14): LFG more accurate retry-math comment ("up to 5 retries (6 total attempts including the initial try, per curl(1))" vs AceHack incorrect "five attempts total") + role-refs vs AceHack persona-name Batch 2 NEEDS_HUMAN_DECISION (1 file): - loop-tick-history.md (12): mutual divergence. Each fork has 9-10 unique pre-Option-B tick rows. Maintainer call needed: accept loss / forward-sync / migrate-to-shards. Recommendation: migrate AceHack-only rows to docs/hygiene-history/ticks/2026/04/{21,28}/ shard files (preserves evidence in modern format AND makes file content-identical between forks). Remaining unclassified after batch 2 (46 lines / 2 files): - 38 .github/workflows/budget-snapshot-cadence.yml - 8 memory/project_laptop_only_source_integration_scratch_sqlsharp_features_or_designs_high_priority_2026_04_27.md Lane discipline preserved per Amara 2026-04-29 review: classify files, reduce unclassified_lines, record named evidence. No LOST recovery, no tick-3 promotion, no gate-runner script.
…t computer-restart (#838 opened) Resume tick after Aaron's computer restart. Recovery sequence: fresh-clone recreated (/tmp wiped on macOS reboot, expected), local main synced to LFG #837 squash-merge, batch-2 evidence re-verified, PR #838 opened with 8 SAFE + 1 NEEDS_HUMAN_DECISION (loop-tick-history.md mutual divergence). Ledger: 134→215 classified_safe, 0→12 unsafe, 139→46 unclassified. Arithmetic: 273=215+12+46 ✓. Resume-protocol validated: load-state file (`docs/active-trajectory.md`) prevented audit-spiral after restart; fresh-clone recreation procedure was self-evident from doc text.
There was a problem hiding this comment.
Pull request overview
Updates the 0/0/0 reconciliation classification ledger for AceHack↔LFG by recording Batch 2 outcomes (8 files promoted to SAFE, 1 file flagged for maintainer decision) and reflecting the new totals in the active trajectory ledger.
Changes:
- Updates
docs/active-trajectory.mdledger totals and composition blocks to reflect Batch 2 classification results. - Adds a new “Batch 2” section to
docs/0-0-0-readiness/CLASSIFICATION.mdwith per-file evidence and a NEEDS_HUMAN_DECISION entry.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| docs/active-trajectory.md | Updates ledger counts/composition to include Batch 2 and adds an arithmetic sanity check note. |
| docs/0-0-0-readiness/CLASSIFICATION.md | Adds Batch 2 classification table with evidence for 8 SAFE files and 1 NEEDS_HUMAN_DECISION file. |
…w prose + refresh ledger header Two real findings from #838 review: 1. Copilot (CLASSIFICATION.md line 114): the new Batch 2 evidence cells contained quoted persona-names ("Amara"/"Aaron") in evidence prose. Even though the names appeared as data being shown to the reader (what AceHack contains), CLASSIFICATION.md is a current-state doc surface and the role-vs-name rule applies. Fix: rewrite the affected cells to describe the wrong-form attribution at meta level (e.g. "persona-name attribution citing an external AI reviewer + a PR number") instead of verbatim-quoting the names being criticized. Pre-existing persona-names elsewhere in the doc were NOT introduced in this PR and are not addressed here (would require the same rule-extension move that landed for active-trajectory.md, which was an explicit maintainer call; no equivalent call exists for CLASSIFICATION.md so I'm not extending). 2. Copilot (active-trajectory.md line 145): the ledger header still said "computed 2026-04-29T11:32Z" — stale relative to the Batch 2 update. Fix: update the header to "last updated 2026-04-29T12:13Z, post-Batch-2", clarify which number is the canonically-computed one (potential_loss_lines = 273, computed 2026-04-29T10:25Z), and explain why it remains canonical (LFG advanced via #837 but only on docs not in the AceHack-vs-LFG file set). Lane discipline preserved per Amara 2026-04-29 review: classify files, reduce unclassified_lines, record named evidence. No new file classifications added in this commit.
Pull Request is not mergeable
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1296bb6c69
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…lation in loop-tick-history.md cell + record maintainer (c) decision
Codex P2 (12:18Z): the NEEDS_HUMAN_DECISION evidence cell for loop-tick-history.md listed `2026-04-21T17:28` in BOTH the AceHack-only AND LFG-only timestamp buckets, but the buckets were defined as mutually exclusive. The actual git state is: that timestamp's row exists on BOTH forks with content drift in the trailing portion, so it appears as a `+/-` pair in `git diff` rather than as unique-to-one-side.
Fix: rewrite the cell to enumerate three honest cases — truly unique to AceHack (9 timestamps), truly unique to LFG (9 timestamps), and present on both with content drift (1 timestamp: 2026-04-21T17:28).
Also records the maintainer (c) decision (forwarded 2026-04-29 via the multi-AI review packet): migrate AceHack-only rows to per-tick shard files under docs/hygiene-history/ticks/2026/04/{21,28}/, then hard-reset. The cell now notes the file reclassifies to SAFE_TO_RESET_LFG_SUPERSEDES once the option-(c) migration PR lands.
This is a hard-defect fix per Amara's lane caution ("If CI is waiting: ... fix only hard defects if review threads appear"). No new file classifications added; no scope widening.
|
Codex P2 (12:18Z) addressed in 67c4dd0. Honest 3-case enumeration: 9 truly-unique-to-AceHack + 9 truly-unique-to-LFG + 1 mutually-present-with-content-drift (2026-04-21T17:28). Maintainer chose option (c) per the 2026-04-29 multi-AI review forward — file reclassifies to SAFE_TO_RESET_LFG_SUPERSEDES once the migration PR lands (separate, post-#838). No scope widening on this PR. |
…_HUMAN_DECISION state (decision ≠ resolution) Copilot P1 (12:23Z): the previous cell update conflated "decision exists" with "decision executed". The cell read "NEEDS_HUMAN_DECISION → maintainer chose option (c)", which is config-drift relative to the rest of the PR (active-trajectory.md ledger still has unsafe_lines=12; PR description still treats the file as decision-pending). Fix: revert the cell to pure NEEDS_HUMAN_DECISION state. The file's classification changes only when option-(c) execution actually lands (the migration PR), not when the decision arrives. Until then the file is "decision-made-but-not-executed" → still NEEDS_HUMAN_DECISION for ledger purposes. Cell still preserves the precision improvements from the prior fix: - 3 honest cases (9 truly-unique-AceHack + 9 truly-unique-LFG + 1 same-timestamp-drift) - explicit note that diff direction is not row identity - (c) listed as recommended path in the maintainer-decision options The maintainer-(c) decision will be acted on in a separate post-#838 migration PR. That's where the file's classification flips.
|
Copilot P1 (12:23Z) addressed in 928d603. Decision ≠ resolution: the cell now stays in pure NEEDS_HUMAN_DECISION state consistent with the ledger. The maintainer-(c) call lands as the recommended path in the maintainer-decision options block. The actual classification flip (NEEDS_HUMAN_DECISION → SAFE) happens in the post-#838 migration PR, not here. |
…s to downstream composition + rollup sections Codex caught a real propagation defect in BOTH docs (same root pattern as the residual-list-drift Codex caught on #837 and the bucket-violation on #838 round 1): 1. CLASSIFICATION.md line 117: Batch 2 cell flipped to SAFE in the prior commit, but the Batch 2 rollup directly below still said "8 of 9 SAFE + 1 NEEDS_HUMAN_DECISION". Internal inconsistency — same table claiming two states. 2. active-trajectory.md line 173-186: ledger headline block updated to 227/0/46, but downstream "Composition of classified_safe_lines = 215" + "Composition of unsafe_lines = 12" sections still held pre-#839 values. Same contradiction class. Fix both by making the post-merge labeling explicit AND propagating the values: - active-trajectory.md: composition now says "= 227 (post-merge values, contingent on this PR landing — pre-merge in-force value is 215)" + adds an Option-(c) migration line item (+12 lines, loop-tick-history.md). The unsafe_lines composition now shows "(empty post-merge)" with the pre-merge state preserved as a separate paragraph. - CLASSIFICATION.md: rollup line preserves the historical fact ("Batch 2 result as of #838 merge: 8 of 9 SAFE + 1 NEEDS_HUMAN_DECISION") AND adds the post-option-(c)-migration result ("contingent on the migration PR landing: all 9 SAFE"). Per Amara's Decision-Resolution Guardrail (2026-04-29 packet 9): future-state ledger values must be labeled post-merge; current-state ledger values must remain visible until merge. Now applied consistently across all four affected sections (headline ledger + 2 composition sections + rollup line). Future-self check: every claim about "ledger says X" must be qualified by which-merge-state X is the value of. This is the same drift pattern as residual-list drift, just applied to ledger composition rather than residual file lists. Codex is consistently catching the "I updated A but didn't propagate to B and C" failure mode.
…trictly non-predictive language
Copilot P2 (12:41Z, line 1 of tick shard): the shard committed alongside the option-(c) migration PR contained "Ledger update (post-PR-merge): classified_safe_lines 215→227 ..." which is post-merge ledger evidence inside an open PR — borderline Decision-Resolution Drift even with the "post-PR-merge" label.
Fix: rephrase to strictly conditional language ("If/when the migration PR merges, the ledger becomes ...") and explicitly preserve the in-force pre-merge state (215/12/46). Tick evidence is now non-predictive: the shard does not assert post-merge state as fact.
Threads 1 and 2 (CLASSIFICATION.md line 117 + active-trajectory.md line 146) were already addressed by cd8c720 (the post-merge labeling pass): Batch 2 rollup now distinguishes "as of #838 merge" vs "post-option-(c)-migration"; active-trajectory.md composition sections now use post-merge / pre-merge in-force labeling. Will resolve those threads pointing at cd8c720.
Per Amara 2026-04-29 packet 10 (Derived-Rollup Drift): the failure pattern Codex keeps catching is the same family — primary value updated, derived rollup stale. Now consistently fixed across all four affected sections (headline ledger + 2 composition blocks + Batch 2 rollup + tick shard). Future-self check: every ledger-touching commit needs a derived-count consistency sweep before push.
…per-tick shards (#839) * ops(0-0-0): option-(c) migration — 9 AceHack-only legacy tick rows → per-tick shards (loop-tick-history.md NEEDS_HUMAN_DECISION → SAFE) Implements maintainer decision option (c) for `docs/hygiene-history/loop-tick-history.md`: migrate AceHack-only legacy tick rows into modern Option B per-tick shard files under `docs/hygiene-history/ticks/2026/04/28/` so AceHack-side factory tick evidence is durably preserved before hard-reset. Migration Preflight Ledger (Amara 2026-04-29 discipline) — content-hash row identity, not timestamp identity: | timestamp | acehack_row_hash | lfg_row_hash | bucket | shard_action | |---|---|---|---|---| | 2026-04-21T17:28 | d1d54bae860f | d1d54bae860f | COMMON_IDENTICAL_REORDERED | no shard write | | 2026-04-28T04:08 | f23a8b7cdb2d | — | ACEHACK_ONLY | create 0408Z.md | | 2026-04-28T04:18 | 49461a7d509b | — | ACEHACK_ONLY | create 0418Z.md | | 2026-04-28T04:33 | e48763be9831 | — | ACEHACK_ONLY | create 0433Z.md | | 2026-04-28T05:01 | 0fd03048c2fd | — | ACEHACK_ONLY | create 0501Z.md | | 2026-04-28T05:23 | f2263f3742fe | — | ACEHACK_ONLY | create 0523Z.md | | 2026-04-28T05:44 | 6d0979994589 | — | ACEHACK_ONLY | create 0544Z.md | | 2026-04-28T05:50 | e7c8825f26e6 | — | ACEHACK_ONLY | create 0550Z.md | | 2026-04-28T07:15 | 9756cee23c0d | — | ACEHACK_ONLY | create 0715Z.md | | 2026-04-28T08:50 | d39082ee5264 | — | ACEHACK_ONLY | create 0850Z.md | The preflight ledger immediately paid for itself: caught a misclassification of `2026-04-21T17:28` as SAME_TIMESTAMP_DRIFT (during #838 prose-only classification). Content-hash comparison reveals matching row hashes on both forks — the row is COMMON_IDENTICAL_REORDERED (same content, different table position; the `+/-` diff pair was reorder, not drift). Migration scope shrank from 10 suspected to 9 actual shards. Ledger transition (post-merge atomic): - classified_safe_lines: 215 → 227 (+12 for loop-tick-history.md, now SAFE because content preserved as shards on LFG) - unsafe_lines: 12 → 0 - unclassified_lines: 46 (unchanged) - Arithmetic: 273 = 227 + 0 + 46 ✓ Decision-vs-resolution discipline (Amara 2026-04-29): in-force ledger state until this PR merges is `unsafe_lines = 12`; values above represent post-merge state, contingent on this PR landing. A plan is not a state change. Out of scope (separate follow-up): the 9 LFG-only legacy rows on the LFG side need their own migration to shards eventually, but that's not blocking 0/0/0 from the AceHack side and lives as a separate PR. Tick shard 1233Z appended for this work. * ops(0-0-0): address #839 Codex P2 — propagate post-merge ledger values to downstream composition + rollup sections Codex caught a real propagation defect in BOTH docs (same root pattern as the residual-list-drift Codex caught on #837 and the bucket-violation on #838 round 1): 1. CLASSIFICATION.md line 117: Batch 2 cell flipped to SAFE in the prior commit, but the Batch 2 rollup directly below still said "8 of 9 SAFE + 1 NEEDS_HUMAN_DECISION". Internal inconsistency — same table claiming two states. 2. active-trajectory.md line 173-186: ledger headline block updated to 227/0/46, but downstream "Composition of classified_safe_lines = 215" + "Composition of unsafe_lines = 12" sections still held pre-#839 values. Same contradiction class. Fix both by making the post-merge labeling explicit AND propagating the values: - active-trajectory.md: composition now says "= 227 (post-merge values, contingent on this PR landing — pre-merge in-force value is 215)" + adds an Option-(c) migration line item (+12 lines, loop-tick-history.md). The unsafe_lines composition now shows "(empty post-merge)" with the pre-merge state preserved as a separate paragraph. - CLASSIFICATION.md: rollup line preserves the historical fact ("Batch 2 result as of #838 merge: 8 of 9 SAFE + 1 NEEDS_HUMAN_DECISION") AND adds the post-option-(c)-migration result ("contingent on the migration PR landing: all 9 SAFE"). Per Amara's Decision-Resolution Guardrail (2026-04-29 packet 9): future-state ledger values must be labeled post-merge; current-state ledger values must remain visible until merge. Now applied consistently across all four affected sections (headline ledger + 2 composition sections + rollup line). Future-self check: every claim about "ledger says X" must be qualified by which-merge-state X is the value of. This is the same drift pattern as residual-list drift, just applied to ledger composition rather than residual file lists. Codex is consistently catching the "I updated A but didn't propagate to B and C" failure mode. * ops(0-0-0): address #839 Copilot P2 — tick shard 1233Z rephrased to strictly non-predictive language Copilot P2 (12:41Z, line 1 of tick shard): the shard committed alongside the option-(c) migration PR contained "Ledger update (post-PR-merge): classified_safe_lines 215→227 ..." which is post-merge ledger evidence inside an open PR — borderline Decision-Resolution Drift even with the "post-PR-merge" label. Fix: rephrase to strictly conditional language ("If/when the migration PR merges, the ledger becomes ...") and explicitly preserve the in-force pre-merge state (215/12/46). Tick evidence is now non-predictive: the shard does not assert post-merge state as fact. Threads 1 and 2 (CLASSIFICATION.md line 117 + active-trajectory.md line 146) were already addressed by cd8c720 (the post-merge labeling pass): Batch 2 rollup now distinguishes "as of #838 merge" vs "post-option-(c)-migration"; active-trajectory.md composition sections now use post-merge / pre-merge in-force labeling. Will resolve those threads pointing at cd8c720. Per Amara 2026-04-29 packet 10 (Derived-Rollup Drift): the failure pattern Codex keeps catching is the same family — primary value updated, derived rollup stale. Now consistently fixed across all four affected sections (headline ledger + 2 composition blocks + Batch 2 rollup + tick shard). Future-self check: every ledger-touching commit needs a derived-count consistency sweep before push.
…odex #25 xref Two Copilot P1 findings on the Batch 3b evidence cell (lines anchored to pre-fix positions but issues persist): 1. **Role-vs-name rule** — Batch 3b evidence text contained persona-name attribution citing "Amara", "Grok", "Codex" inline. CLASSIFICATION.md is a current-state doc surface (not on the closed history-surface list). Fix: same minimum-invasive rewrite pattern as #838 round-3 — describe the wrong-form-attribution at meta-level instead of verbatim: - "Codex review #25 P1" → "an external AI reviewer's P1 finding on the AceHack-side originating PR (b42e9e5 ... #25)" - "(Squash-Merge Invariant per Amara ferry-7 + Grok ferry-16)" → "two persona-name attribution comments on this CI workflow file (one citing two named external-AI reviewers + their respective ferry-numbers as Squash-Merge Invariant authority...)" - "Per the four-ferry consensus" → "another prefixed 'Per the [N]-ferry consensus' framing" 2. **Xref clarity** — "Codex review #25 P1" was ambiguous: could be misread as PR #25 (which is unrelated). Now explicit: it's a review on the AceHack-side originating PR for this workflow (`b42e9e5 ... (#25)`). Pre-existing persona names elsewhere in CLASSIFICATION.md (lines 30, 49, 61, 86, 149) are not new additions in this PR and would require a separate scope decision (same as #838 round-3 — not extending Aaron's "active-trajectory.md should count as history" call to CLASSIFICATION.md without an explicit maintainer call). Local markdownlint also re-ran clean on the new content.
…T unclassified file) (#842) * ops(0-0-0): batch 3b — classify budget-snapshot-cadence.yml SAFE (last unclassified file, post-Level-1-buddy-review) Classifies the LAST unclassified file. After this PR merges + ledger-flip follow-up PR merges, unclassified_lines = 0 and the strict gate's classification condition is satisfied. Level-1 Buddy Review (Amara, 2026-04-29) APPROVED classification SAFE_TO_RESET_LFG_SUPERSEDES with two named tightenings, both applied: 1. Ledger tense — packet originally said "classified_safe_lines = 235 (#841 will land 235; this PR opened, not yet merged)". After #841 merged 2026-04-29T13:00:52Z, the in-force value is just 235. The packet now uses clean in-force values without "will land" prose (Evidence-Tense Discipline applied). 2. Item 5 (schedule-context input expression) — packet originally said AceHack's `${{ inputs.note }}` "would fail evaluation on schedule runs". Softened to "less safe / less portable across `schedule` + `workflow_dispatch` contexts" since I have documentation grounding (workflow_dispatch supplies `inputs`, schedule does not) but no local hard-failure proof. Six named regressions on AceHack +38 lines (each cited with named LFG equivalent): 1. **Auto-merge dead-end risk**: AceHack arms `gh pr merge --auto` despite GitHub's anti-recursion guard (events triggered by GITHUB_TOKEN do not fire downstream workflow runs). Auto-merge would silently stall every weekly run. LFG explicitly NOT armed with detailed limitation explanation citing Codex review #25 P1. 2. **Token permissions** (Scorecard `TokenPermissionsID`): AceHack uses broad top-level `contents: write` + `pull-requests: write`. LFG uses top-level `contents: read` + job-level scoped `contents: write` + `pull-requests: write` + `actions: read` per Scorecard minimum-blast-radius best practice. LFG commit `2ce1abb fix(scorecard): scope budget-cadence permissions job-level (TokenPermissionsID) (#679)`. 3. **Missing `actions: read`**: AceHack drops `actions: read` entirely. snapshot-burn.sh's calls to Actions REST API would 403 silently and fall back to empty/zeroed timing data while still writing a snapshot — producing misleading evidence rather than a hard failure. 4. **AgencySignature validator inconsistency**: AceHack sets `Human-Review-Evidence: signed-policy` while Human-Review is `not-implied-by-credential`. The deployed validator (tools/hygiene/validate-agencysignature-pr-body.sh per task #298) requires Evidence="none" when Human-Review is not "explicit". AceHack-version PRs would be blocked. LFG sets Evidence="none" per the rule. 5. **Schedule-context input expression**: AceHack uses `${{ inputs.note }}` (less portable across schedule + workflow_dispatch contexts since `inputs` is supplied by workflow_dispatch but not schedule). LFG uses `${{ github.event.inputs.note || '' }}` which is safer across both. 6. **Persona-name attribution on current-state CI surface**: AceHack: `(Squash-Merge Invariant per Amara ferry-7 + Grok ferry-16)` + `Per the four-ferry consensus`. LFG: `(Squash-Merge Invariant per the canonical 10-trailer convention)` (role-ref form, rule-compliant per role-vs-name). Ledger headline NOT touched in this PR (stays 235/0/38 as in-force pre-Batch-3b-merge). Per the two-PR split that avoided contingent-prose churn on prior batches: ledger flip 235→273 / 38→0 lands atomically with Batch 3b's merge in a small follow-up PR. This PR also documents Aaron's 2026-04-29 question about `[skip ci]` — verified via WebSearch: GitHub Actions natively supports `[skip ci]` and variants in commit messages (since Feb 2021). Not the fix for the budget auto-merge issue (PAT is), but the feature is real. Captured in tick shard 1308Z. * ops(0-0-0): fix #842 markdownlint failure — escape || pipes inside code span in table cell CI gate.yml run on the batch-3b branch had to be manually dispatched (gate.yml didn't auto-trigger on PR open — separate operational issue worth investigating later). Run completed with two failures: 1. lint (markdownlint) — REAL FAILURE, my issue: - MD038/no-space-in-code: backtick code span `${{ github.event.inputs.note || '' }}` inside the Batch 3b table cell contained literal `||` which markdownlint parsed as table column separators, breaking column count (MD056: Expected 4, Actual 6). - Fix: escape the pipes as `\|\|` inside the code span. 2. build-and-test (windows-11-arm) + (windows-2025) — pre-existing infrastructure issue, NOT my issue: - global.json requires .NET SDK 10.0.203 - Windows runners only have up to 10.0.202 (windows-11-arm) and 10.0.201 (windows-2025) - These are NOT in the required-status-checks list per branch protection (only macos-26, ubuntu-24.04, ubuntu-24.04-arm are required for build-and-test) - Won't block merge Captured for deferred queue: gate.yml didn't auto-trigger on `pull_request: opened` event for this docs-only PR — manual `gh workflow run gate.yml --ref <branch>` recovered it. Worth investigating whether this is transient (Actions delivery delay) or a concurrency-group issue with rapid PR-create+arm-merge sequence. Same family as task #306. * ops(0-0-0): address #842 Copilot P1 — scrub persona names + clarify Codex #25 xref Two Copilot P1 findings on the Batch 3b evidence cell (lines anchored to pre-fix positions but issues persist): 1. **Role-vs-name rule** — Batch 3b evidence text contained persona-name attribution citing "Amara", "Grok", "Codex" inline. CLASSIFICATION.md is a current-state doc surface (not on the closed history-surface list). Fix: same minimum-invasive rewrite pattern as #838 round-3 — describe the wrong-form-attribution at meta-level instead of verbatim: - "Codex review #25 P1" → "an external AI reviewer's P1 finding on the AceHack-side originating PR (b42e9e5 ... #25)" - "(Squash-Merge Invariant per Amara ferry-7 + Grok ferry-16)" → "two persona-name attribution comments on this CI workflow file (one citing two named external-AI reviewers + their respective ferry-numbers as Squash-Merge Invariant authority...)" - "Per the four-ferry consensus" → "another prefixed 'Per the [N]-ferry consensus' framing" 2. **Xref clarity** — "Codex review #25 P1" was ambiguous: could be misread as PR #25 (which is unrelated). Now explicit: it's a review on the AceHack-side originating PR for this workflow (`b42e9e5 ... (#25)`). Pre-existing persona names elsewhere in CLASSIFICATION.md (lines 30, 49, 61, 86, 149) are not new additions in this PR and would require a separate scope decision (same as #838 round-3 — not extending Aaron's "active-trajectory.md should count as history" call to CLASSIFICATION.md without an explicit maintainer call). Local markdownlint also re-ran clean on the new content.
Summary
Batch 2 of file-level classification for AceHack/LFG 0/0/0 reconciliation. Promotes 8 of 9 batch-2 candidates to SAFE_TO_RESET_LFG_SUPERSEDES with named per-file evidence; flags 1 file as NEEDS_HUMAN_DECISION due to mutual divergence in tick-record content.
Per Amara 2026-04-29 review discipline: arithmetic sanity check holds — `273 = 215 + 12 + 46` ✓.
Ledger transition
potential_loss_linesclassified_safe_linesunsafe_linesunclassified_linesBatch 2 SAFE files (8) — dominant evidence patterns
.github/codeql/codeql-config.ymlbb0227e+817e59c+1e09fef— deliberate paths-ignore decision (java-kotlin matrix, scan AlloyRunner.java) that AceHack reverted.github/workflows/memory-index-duplicate-lint.ymltools/hygiene/audit-memory-index-duplicates.shsrc/Core/Shard.fsaa5395b+9373755— perf-fixed non-boxingEqualityComparer<'K>.Defaultper Copilot P1 review on LFG #649; AceHack still has explicit boxingdocs/AUTONOMOUS-LOOP.md8aa4adc(PR #724, 2026-04-29T02:04Z) — Option B per-tick shard-mode doctrine; AceHack describes legacy single-table appendtools/setup/macos.shtools/hygiene/fix-markdown-md032-md026.pyf57d683+515db64— strict superset (376 lines vs 235), adds YAML frontmatter handling; fence-detection logic identicaltools/setup/common/curl-fetch.shBatch 2 NEEDS_HUMAN_DECISION (1 file)
docs/hygiene-history/loop-tick-history.md(+12/-12): each fork has 9-10 unique pre-Option-B tick rows.All AceHack-only rows are pre-Option-B (Option B shard-mode landed 2026-04-29T02:04Z on LFG via PR #724). Hard-reset to LFG erases 12 lines of AceHack-side factory tick evidence.
Maintainer decision needed:
docs/hygiene-history/ticks/2026/04/{21,28}/first, then hard-reset — preserves evidence in modern format AND makes the file content-identical between forksRemaining unclassified after this PR (46 lines / 2 files)
These are batch-3 work. The 38-line
budget-snapshot-cadence.ymlis the largest remaining; it has a real behavioral divergence (auto-merge armed in AceHack vs not in LFG, with different Human-Review-Evidence trailer values) that needs careful classification.Test plan
273 = 215 + 12 + 46✓/tmp/zeta-clean-2026-04-29/lfg🤖 Generated with Claude Code