Skip to content

ops(0-0-0): batch 2 — 8 files SAFE (81 lines) + 1 NEEDS_HUMAN_DECISION (12 lines)#838

Merged
AceHack merged 5 commits intomainfrom
classify-heuristic-files-batch-2-2026-04-29
Apr 29, 2026
Merged

ops(0-0-0): batch 2 — 8 files SAFE (81 lines) + 1 NEEDS_HUMAN_DECISION (12 lines)#838
AceHack merged 5 commits intomainfrom
classify-heuristic-files-batch-2-2026-04-29

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented Apr 29, 2026

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

Metric Before #837 merge After this PR
potential_loss_lines 273 273 (unchanged)
classified_safe_lines 134 215 (+81)
unsafe_lines 0 12 (1 file NEEDS_HUMAN_DECISION)
unclassified_lines 139 46 (−93, 2 files remain)

Batch 2 SAFE files (8) — dominant evidence patterns

File +/- Why SAFE
.github/codeql/codeql-config.yml 6/13 LFG bb0227e + 817e59c + 1e09fef — deliberate paths-ignore decision (java-kotlin matrix, scan AlloyRunner.java) that AceHack reverted
.github/workflows/memory-index-duplicate-lint.yml 8/5 Persona-name attribution on current-state CI surface (role-vs-name violation); LFG uses role-refs
tools/hygiene/audit-memory-index-duplicates.sh 8/7 Same pattern — persona-name attribution on tool script; LFG uses role-refs
src/Core/Shard.fs 9/12 LFG aa5395b + 9373755 — perf-fixed non-boxing EqualityComparer<'K>.Default per Copilot P1 review on LFG #649; AceHack still has explicit boxing
docs/AUTONOMOUS-LOOP.md 9/18 LFG 8aa4adc (PR #724, 2026-04-29T02:04Z) — Option B per-tick shard-mode doctrine; AceHack describes legacy single-table append
tools/setup/macos.sh 11/16 LFG more detailed shellcheck rationale + role-refs; AceHack adds persona-name + terser shellcheck
tools/hygiene/fix-markdown-md032-md026.py 16/157 LFG f57d683 + 515db64 — strict superset (376 lines vs 235), adds YAML frontmatter handling; fence-detection logic identical
tools/setup/common/curl-fetch.sh 14/44 LFG more accurate retry-math comment ("6 total attempts including initial try, per curl(1)" vs AceHack incorrect "five attempts total") + role-refs

Batch 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.

  • AceHack-only: 2026-04-21T17:28, 2026-04-28T04:08/04:18/04:33/05:01/05:23/05:44/05:50/07:15/08:50
  • LFG-only: 2026-04-21T17:28, 2026-04-27T23:58, 2026-04-28T14:43/17:47/19:41/19:50, 2026-04-29T00:34/00:53/00:58/01:00

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:

  • (a) accept the loss (tick-record only; work-products reachable from PR/commit history)
  • (b) forward-sync AceHack-only rows to LFG before hard-reset
  • (c) (recommended) migrate AceHack-only rows to per-tick shard files under docs/hygiene-history/ticks/2026/04/{21,28}/ first, then hard-reset — preserves evidence in modern format AND makes the file content-identical between forks

Remaining unclassified after this PR (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

These are batch-3 work. The 38-line budget-snapshot-cadence.yml is 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

  • Arithmetic sanity check: 273 = 215 + 12 + 46
  • Each Batch 2 SAFE entry cites named AceHack content + named LFG equivalent + named reason (per strict bucket rule)
  • Per-file diff verified post-restart against fresh clone at /tmp/zeta-clean-2026-04-29/lfg
  • Lane discipline preserved per Amara 2026-04-29 review
  • CI green
  • Codex / Copilot reviews resolved if any threads land

🤖 Generated with Claude Code

…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.
Copilot AI review requested due to automatic review settings April 29, 2026 12:07
@AceHack AceHack enabled auto-merge (squash) April 29, 2026 12:07
…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.
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.md ledger totals and composition blocks to reflect Batch 2 classification results.
  • Adds a new “Batch 2” section to docs/0-0-0-readiness/CLASSIFICATION.md with 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.

Comment thread docs/0-0-0-readiness/CLASSIFICATION.md Outdated
Comment thread docs/active-trajectory.md
…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.
auto-merge was automatically disabled April 29, 2026 12:15

Pull Request is not mergeable

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread docs/0-0-0-readiness/CLASSIFICATION.md Outdated
…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.
@AceHack
Copy link
Copy Markdown
Member Author

AceHack commented Apr 29, 2026

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.

Copilot AI review requested due to automatic review settings April 29, 2026 12:20
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

Comment thread docs/0-0-0-readiness/CLASSIFICATION.md Outdated
…_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.
@AceHack
Copy link
Copy Markdown
Member Author

AceHack commented Apr 29, 2026

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.

@AceHack AceHack merged commit a28ca2d into main Apr 29, 2026
20 checks passed
@AceHack AceHack deleted the classify-heuristic-files-batch-2-2026-04-29 branch April 29, 2026 12:28
AceHack added a commit that referenced this pull request Apr 29, 2026
…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.
AceHack added a commit that referenced this pull request Apr 29, 2026
…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.
AceHack added a commit that referenced this pull request Apr 29, 2026
…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.
AceHack added a commit that referenced this pull request Apr 29, 2026
…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.
AceHack added a commit that referenced this pull request Apr 29, 2026
…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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants