Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1f96369ab9
ℹ️ 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".
There was a problem hiding this comment.
Pull request overview
Forward-ports a set of AceHack-only “substrate preservation” files into LFG as a prerequisite for a safe AceHack→LFG hard reset, adding shared install/peer-call/hygiene tooling plus a large batch of memory/research/backlog artifacts.
Changes:
- Adds install helper
tools/setup/common/curl-fetch.shto centralize curl retry semantics (file-output vs stream). - Adds peer-call wrappers for Gemini and Codex plus a
tools/peer-call/README documenting usage. - Adds hygiene tooling + CI workflow to detect duplicate
memory/MEMORY.mdlink targets, along with many new memory/research/backlog documents.
Reviewed changes
Copilot reviewed 63 out of 63 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tools/setup/common/curl-fetch.sh | New shared curl fetch helpers with differentiated retry semantics by output mode. |
| tools/peer-call/gemini.sh | New peer-call wrapper around gemini -p with shared flag surface (--file, --context-cmd, etc.). |
| tools/peer-call/codex.sh | New peer-call wrapper around codex exec / codex review with read-only sandboxing in exec mode. |
| tools/peer-call/README.md | Documentation for peer-call scripts, flags, preamble conventions, and security notes. |
| tools/hygiene/audit-memory-index-duplicates.sh | New audit script to detect duplicate .md link targets in a MEMORY.md-style index. |
| memory/project_multi_harness_named_agents_assigned_clis_models_aaron_2026_04_26.md | Project memory capturing multi-harness routing-table vision and rationale. |
| memory/feedback_workflow_dispatch_overwrites_latest_byname_check_runs_branch_protection_caveat_2026_04_28.md | Feedback memory documenting workflow_dispatch check-run overwrite semantics and preferred rerun recovery. |
| memory/feedback_transient_ci_external_infra_only_test_failures_are_bugs_not_flakes_2026_04_28.md | Feedback memory clarifying “external-infra failure” vs “test failure” vocabulary discipline. |
| memory/feedback_structural_fix_beats_process_discipline_velocity_multiplier_aaron_2026_04_28.md | Feedback memory emphasizing structural fixes over process discipline for recurring failure classes. |
| memory/feedback_self_check_trigger_after_n_idle_loops_routine_discipline_for_current_otto_and_future_wakes_2026_04_27.md | Feedback memory defining a self-check trigger after repeated idle loops. |
| memory/feedback_self_check_calibration_after_long_idle_vary_work_dont_degenerate_status_check_2026_04_27.md | Feedback memory refining self-check thresholds and “vary the work” guidance during long waits. |
| memory/feedback_search_internet_when_self_fixing_autonomous_agent_design_is_new_aaron_2026_04_28.md | Feedback memory generalizing “search first” to self-fixing/autonomous-loop design work. |
| memory/feedback_otto_owns_git_github_settings_acehack_lfg_org_admin_personal_account_admin_authority_extension_2026_04_27.md | Feedback memory recording delegated authority scope for git/GitHub settings with guardrails. |
| memory/feedback_otto_275_forever_manufactured_patience_live_lock_9th_pattern_2026_04_26.md | Feedback memory describing the manufactured-patience live-lock failure mode and counterweights. |
| memory/feedback_orphan_role_ref_after_name_stripping_aaron_2026_04_28.md | Feedback memory on avoiding “orphan” role-refs after name-stripping edits. |
| memory/feedback_no_trailing_questions_aaron_stop_asking_what_to_do_2026_04_28.md | Feedback memory discouraging permission-asking trailing questions; prefer autonomous next-step statements. |
| memory/feedback_manufactured_patience_vs_real_dependency_wait_otto_distinction_2026_04_26.md | Feedback memory splitting “manufactured patience” from real-dependency waiting with a 3-question check. |
| memory/feedback_kiro_cli_added_to_agent_roster_aaron_2026_04_28.md | Reference memory adding kiro-cli to the harness roster. |
| memory/feedback_double_check_superseded_classifications_2nd_agent_otto_347_2026_04_26.md | Feedback memory requiring 2nd-agent/2nd-CLI verification before “superseded” discard decisions. |
| memory/feedback_codeql_umbrella_neutral_vs_per_language_detection_pattern_aaron_2026_04_28.md | Feedback memory documenting CodeQL umbrella NEUTRAL vs per-language SUCCESS detection pattern. |
| memory/feedback_claude_md_cadenced_reread_for_long_running_sessions_2026_04_28.md | Feedback memory introducing cadenced CLAUDE.md re-reads for long-running sessions. |
| memory/feedback_bulk_resolve_is_not_answer_recurring_pattern_aaron_2026_04_28.md | Feedback memory formalizing “bulk resolve is not an answer” and requiring concrete tracking on deferrals. |
| docs/research/memory-md-harness-contract-2026-04-28.md | Research report on MEMORY.md harness behavior, caps, and implications for index vs marker strategy. |
| docs/research/live-lock-five-class-taxonomy-otto-352-2026-04-26.md | Research taxonomy doc splitting live-lock-like failure modes and defining detection/mitigation anchors. |
| docs/backlog/P2/B-0074-pr-72-punch-list-stale-item-sweep-spec-consistency-2026-04-28.md | Backlog item tracking PR-derived spec-consistency/punch-list cleanup work. |
| docs/backlog/P2/B-0072-memory-md-index-entry-length-normalization-copilot-pr-72-2026-04-28.md | Backlog item to normalize MEMORY.md index line lengths per memory/README guidance. |
| docs/backlog/P2/B-0071-rename-otto-275-forever-out-of-live-lock-class-codex-pr-17-2026-04-28.md | Backlog item to rename/reclassify the Otto-275-FOREVER memory file naming/taxonomy. |
| docs/backlog/P2/B-0070-orphan-role-ref-detector-lint-aaron-2026-04-28.md | Backlog item proposing a lint to detect orphan role-refs on current-state/code surfaces. |
| docs/backlog/P2/B-0069-heredoc-patterns-encode-into-commit-message-shape-skill-aaron-2026-04-28.md | Backlog item to encode heredoc patterns into commit-message-shape skill substrate. |
| docs/backlog/P2/B-0068-local-ai-trajectory-forge-ollama-direct-integration-aaron-2026-04-28.md | Backlog umbrella item for local-AI trajectory via Forge/Ollama/direct integration. |
| docs/backlog/P1/B-0067-cadenced-git-hotspot-detection-aaron-2026-04-28.md | Backlog item for a cadenced detector to identify git hotspot files. |
| docs/backlog/P1/B-0066-memory-md-marker-vs-index-harness-verify-q1-automemory-aaron-2026-04-28.md | Backlog item tracking MEMORY.md marker vs auto-index path with harness verification phases. |
| docs/backlog/P1/B-0065-peer-call-kiro-and-self-cold-boot-self-test-aaron-2026-04-28.md | Backlog item for expanding peer-call scripts to kiro + self-call for cold-boot verification. |
| docs/backlog/P1/B-0064-github-playwright-integration-agent-changes-ui-features-aaron-2026-04-28.md | Backlog item for GitHub UI automation via Playwright with guardrails and feature-diff cadence. |
| docs/backlog/P1/B-0063-streamed-installer-download-to-temp-checksum-pattern-codex-p0-pr-75.md | Backlog item describing the structural fix for streamed installers: download-to-temp + verify + exec. |
| docs/backlog/P1/B-0061-finish-monolith-to-per-row-migration-no-residue-aaron-2026-04-28.md | Backlog item for completing BACKLOG monolith→per-row migration without residue. |
| docs/backlog/P1/B-0060-human-lineage-external-anchor-backfill-all-substrate-beacon-safe.md | Backlog item for external-anchor/prior-art backfill across substrate concepts. |
| docs/backlog/P0/B-0073-lfg-csharp-code-scanning-cleanup-13-alerts-blocking-ruleset-2026-04-28.md | P0 backlog item for clearing code scanning alerts blocking LFG rulesets. |
| docs/backlog/P0/B-0062-wallet-v0-build-out-spec-logic-punch-list-from-pr-72-deferrals.md | P0 punch list aggregating deferred PR review concerns into concrete tracked work. |
| .github/workflows/memory-index-duplicate-lint.yml | New workflow enforcing duplicate-link linting for memory/MEMORY.md. |
…t for verbatim ferries Two CI failures on PR #663 caused by the pure-additive scope: 1. memory/MEMORY.md paired-edit + duplicate-link checks failed: 24 memory files added without index entries pointing at them. Fix: merge AceHack-only index entries (23 unique) into LFG's MEMORY.md while preserving LFG-only entries (7: block-on-Aaron, Windows CI peer-mode trajectory, CI cadence split, etc.). Set diff confirmed via Python script — order preserved, no LFG entries dropped. 2. lint (markdownlint) failed on 3 docs/research/2026-04-26-*.md + 2026-04-28-zeta-equals-heaven-on-earth*.md files (MD027 multiple spaces after blockquote, MD032 lists not surrounded by blank lines). These files are verbatim courier-ferry preservations (per Otto-227 signal-in-signal-out discipline — reformatting would alter ferry content). AceHack already broadened the markdownlint-cli2 carve-out to exempt `docs/research/2026-*-*.md` from these rules; LFG was still on the older Amara-only pattern. Fix: pull AceHack's broader carve-out config. Both edits are within the spirit of the pure-additive forward-sync: they're the index/config that point at or accommodate the 63 already-added files. Without them, the paired-edit + lint rules correctly block merge. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…icates The duplicate-link-targets workflow check on PR #663 was failing because: 1. My initial merge created 3 new duplicates where the same memory file had entries on both AceHack and LFG with slightly different surrounding text. Set-diff by exact-line match missed them; need target-based dedup keyed on the .md filename inside `](...)`. 2. LFG's MEMORY.md already had ~11 pre-existing duplicates using non-bold bullet syntax (`- [Title](file.md)` rather than `- [**Title**](file.md)`). The duplicate-link workflow only fires on PRs that touch memory/MEMORY.md, so the pre-existing dups had been silent — surfaced now because this PR touches it. EVIDENCE-BASED audit: Before: 649 bullets, 635 unique targets, 14 duplicates After: 640 bullets, 635 unique targets, 0 duplicates `tools/hygiene/audit-memory-index-duplicates.sh --enforce` clean. Strategy: keep the FIRST occurrence (newest-first ordering invariant per the audit script's expectation), drop later duplicates. Both `**bold**` and bare-bullet forms covered. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b2d0f05312
ℹ️ 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".
…to canonical-source fixes on AceHack Three backlog rows for Codex P0/P1/P2 findings surfaced during the PR #663 forward-sync review. Per the forward-sync-preserves-canonical-content principle, fixes land on AceHack first and re-sync to LFG. - B-0077: curl-fetch.sh — P0 docstring pipe-to-shell examples + P1 inaccurate commentary about install paths - B-0078: markdownlint carve-out narrowing — Codex P1 suggests `docs/research/2026-*-verbatim-*.md` instead of broader pattern - B-0079: audit-agencysignature-main-tip.sh hardening — 4 Codex P1/P2 findings (multi-trailer matching, classify error propagation, BSD date parser, --since validation) All 7 review threads on PR #663 reply-and-resolved with pointers to these backlog rows. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ull (Aaron 2026-04-28) Aaron's binding correction at 2026-04-28T16:05Z after my 5-tick stretch of "no new signal" closes on PRs #662/#663/#665. EVIDENCE-BASED audit on his "self check" prompt revealed 9 unresolved review threads that had been posted during my supposed-no-signal window — I was closing ticks without pulling. The rule (Aaron verbatim): "signals don't just arrive, you have to go get them" + "except for my typing in this environment" + "that's your only real signal that's pushed to you". The model: in autonomous-loop mode there is exactly ONE push channel (Aaron's direct typing). Everything else — CI state, review threads, PR mergeability, cron firings, peer-CLI replies, GitHub workflow runs — are PULL signals requiring active query. Closing a tick with "no new signal" without first pulling mergeStateStatus + reviewThreads + ci-checks is wrong by construction. Composes with the speculation rule (same family — don't state things you haven't verified), Otto-355 (BLOCKED-investigate-threads first), and the manufactured-patience class (which "no new signal" tick-closes are the textual signature of). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 509d5f7885
ℹ️ 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".
…ptance PR #663 received a 5th Codex finding on tools/hygiene/audit- agencysignature-main-tip.sh after the initial backlog row landed: 5. P2 (line 143): --max validator accepts 0 even though script says it must be a positive integer. `git log --max-count=0` produces an empty commit list that exits with PASS — silent no-audit. Bundled into B-0079 with the existing 4 items (validation + multi-trailer + BSD date + classify error propagation). Reply on PR #663 thread points at B-0079. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 68 out of 68 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (6)
tools/setup/common/curl-fetch.sh:1
- The docstring includes runnable pipe-to-shell and command-substitution-to-shell examples. Even though this is “just comments”, these patterns are commonly copied into real call sites and materially weaken supply-chain safety. Consider replacing the examples with the download-to-temp + (size/checksum when available) + execute pattern, or explicitly mark pipe-to-shell examples as forbidden/deprecated without providing a runnable snippet.
tools/setup/common/curl-fetch.sh:1 --retry-all-errorswill also retry on clearly non-transient failures surfaced via-f(for example, consistent 4xx responses), introducing avoidable install latency and repeated traffic against upstreams. If the goal is “absorb transient infra blips,” consider constraining retries (for example via curling only transient classes, adding a bounded--retry-max-time, or documenting why retrying all error classes is acceptable for your specific upstreams).
tools/hygiene/audit-memory-index-duplicates.sh:1- The header documents only exit codes 0 and 2, but the script also uses exit code 64 for usage/argument/target errors. Please update the “Exit codes” section to include 64 (and what it means) so callers/CI can interpret failures correctly.
tools/hygiene/audit-memory-index-duplicates.sh:1 - The header documents only exit codes 0 and 2, but the script also uses exit code 64 for usage/argument/target errors. Please update the “Exit codes” section to include 64 (and what it means) so callers/CI can interpret failures correctly.
tools/hygiene/audit-memory-index-duplicates.sh:1 - The header documents only exit codes 0 and 2, but the script also uses exit code 64 for usage/argument/target errors. Please update the “Exit codes” section to include 64 (and what it means) so callers/CI can interpret failures correctly.
tools/hygiene/audit-memory-index-duplicates.sh:1 - The header documents only exit codes 0 and 2, but the script also uses exit code 64 for usage/argument/target errors. Please update the “Exit codes” section to include 64 (and what it means) so callers/CI can interpret failures correctly.
…e-hard-reset safety)
EVIDENCE-BASED scope: 63 files exist on AceHack main but not on LFG
main. Hard-resetting AceHack to LFG main (the 0/0/0 protocol final
step) would destroy this content unless forward-synced first.
Cross-verified by Otto + Grok (Otto-347 second-CLI discipline) on
2026-04-28T15:05Z; both independently classified the 63 files as
substrate-load-bearing and the hard-reset as UNSAFE without this
sync.
File breakdown:
- 24 memory/feedback_*.md — today's discipline substrate (Otto-355 /
Otto-356 / Otto-359 / codeql-umbrella detection / bulk-resolve /
manufactured-patience / kiro-cli / no-trailing-questions / mirror-
beacon language / etc.)
- 13 docs/research/*.md — Amara ferries 9-12, EAT packet, wallet-
experiment v0 spec, live-lock five-class taxonomy, memory-md
harness contract, Zeta-equals-heaven-on-earth writeup, action-mode
classification, three-agent-consensus + parser-is-witness
- 9 docs/backlog/{P0,P1,P2}/B-006*-007*.md — wallet v0 punch list,
LFG csharp Code Scanning cleanup, human-lineage external-anchor
backfill, monolith-to-per-row migration, streamed-installer
pattern, GitHub Playwright integration, peer-call kiro + cold-boot,
memory-md marker vs index harness, cadenced git hotspot detection,
local-AI ollama, heredoc patterns, orphan role-ref detector,
Otto-275-FOREVER rename, MEMORY.md index entry length, PR #72
punch-list sweep
- 1 docs/DECISIONS/2026-04-26-sync-drain-plan-acehack-lfg-roundtrip-
option-c.md — the ADR documenting this very protocol
- 4 tools/peer-call/* — README + codex.sh + gemini.sh (sibling of
the existing grok.sh on LFG); rounds out the multi-harness peer-
call set per task #303
- 2 tools/hygiene/audit-*.sh — AgencySignature main-tip auditor +
memory-index duplicate auditor
- 2 .github/workflows/{budget-snapshot-cadence,memory-index-
duplicate-lint}.yml — scheduled CI cadence (task #297) +
duplicate-index linter
- 1 tools/setup/common/curl-fetch.sh — install hardening helper
- And 7 more memory/research files in similar categories
Composes with:
- The cross-verified Otto+Grok finding 2026-04-28T15:05Z
- PR #662 (the codeql java-honesty fix; this PR forwards #662's
base-content, but #662's edit lands separately)
- Aaron's 0-divergence invariant — this PR is the prerequisite
for the AceHack-main hard-reset that closes the protocol round
- task #284 (the prior AceHack→LFG forward-sync option-c work)
Post-merge double-check: dispatch a different peer-CLI (codex this
time) to re-run `git diff acehack/main..origin/main --diff-filter=D`
on freshly-fetched refs and confirm the AceHack-only set is empty
(modulo files newly landed on AceHack between this PR and the
double-check).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…t for verbatim ferries Two CI failures on PR #663 caused by the pure-additive scope: 1. memory/MEMORY.md paired-edit + duplicate-link checks failed: 24 memory files added without index entries pointing at them. Fix: merge AceHack-only index entries (23 unique) into LFG's MEMORY.md while preserving LFG-only entries (7: block-on-Aaron, Windows CI peer-mode trajectory, CI cadence split, etc.). Set diff confirmed via Python script — order preserved, no LFG entries dropped. 2. lint (markdownlint) failed on 3 docs/research/2026-04-26-*.md + 2026-04-28-zeta-equals-heaven-on-earth*.md files (MD027 multiple spaces after blockquote, MD032 lists not surrounded by blank lines). These files are verbatim courier-ferry preservations (per Otto-227 signal-in-signal-out discipline — reformatting would alter ferry content). AceHack already broadened the markdownlint-cli2 carve-out to exempt `docs/research/2026-*-*.md` from these rules; LFG was still on the older Amara-only pattern. Fix: pull AceHack's broader carve-out config. Both edits are within the spirit of the pure-additive forward-sync: they're the index/config that point at or accommodate the 63 already-added files. Without them, the paired-edit + lint rules correctly block merge. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…icates The duplicate-link-targets workflow check on PR #663 was failing because: 1. My initial merge created 3 new duplicates where the same memory file had entries on both AceHack and LFG with slightly different surrounding text. Set-diff by exact-line match missed them; need target-based dedup keyed on the .md filename inside `](...)`. 2. LFG's MEMORY.md already had ~11 pre-existing duplicates using non-bold bullet syntax (`- [Title](file.md)` rather than `- [**Title**](file.md)`). The duplicate-link workflow only fires on PRs that touch memory/MEMORY.md, so the pre-existing dups had been silent — surfaced now because this PR touches it. EVIDENCE-BASED audit: Before: 649 bullets, 635 unique targets, 14 duplicates After: 640 bullets, 635 unique targets, 0 duplicates `tools/hygiene/audit-memory-index-duplicates.sh --enforce` clean. Strategy: keep the FIRST occurrence (newest-first ordering invariant per the audit script's expectation), drop later duplicates. Both `**bold**` and bare-bullet forms covered. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…to canonical-source fixes on AceHack Three backlog rows for Codex P0/P1/P2 findings surfaced during the PR #663 forward-sync review. Per the forward-sync-preserves-canonical-content principle, fixes land on AceHack first and re-sync to LFG. - B-0077: curl-fetch.sh — P0 docstring pipe-to-shell examples + P1 inaccurate commentary about install paths - B-0078: markdownlint carve-out narrowing — Codex P1 suggests `docs/research/2026-*-verbatim-*.md` instead of broader pattern - B-0079: audit-agencysignature-main-tip.sh hardening — 4 Codex P1/P2 findings (multi-trailer matching, classify error propagation, BSD date parser, --since validation) All 7 review threads on PR #663 reply-and-resolved with pointers to these backlog rows. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ptance PR #663 received a 5th Codex finding on tools/hygiene/audit- agencysignature-main-tip.sh after the initial backlog row landed: 5. P2 (line 143): --max validator accepts 0 even though script says it must be a positive integer. `git log --max-count=0` produces an empty commit list that exits with PASS — silent no-audit. Bundled into B-0079 with the existing 4 items (validation + multi-trailer + BSD date + classify error propagation). Reply on PR #663 thread points at B-0079. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
8e77c8a to
54f53a2
Compare
…CE-BASED labeling + CURRENT-aaron §§26-28 EVIDENCE-BASED: Aaron's binding correction after my LFG #661 "bullshit answer" 2026-04-28T13:30Z + extension at 14:42Z mandating EVIDENCE-BASED vs SPECULATION labeling on every root-cause statement. Three landings in this PR: 1. memory/feedback_speculation_leads_investigation_not_defines_root_cause_aaron_2026_04_28.md — captures the rule, Aaron's verbatim corrections, the discipline- going-forward checklist, the mandatory labeling section with worked examples (good vs bad), and the time-math evidence (~58 min speculation cycles vs 30-second primary-source query — the discipline pays back ~100x in iteration cost reduction). 2. memory/CURRENT-aaron.md sections 26-28: - §26 Speculation discipline (the rule + mandatory labeling) - §27 JVM language preference Kotlin > Scala > Java per B-0075 - §28 Dependency honesty — managed runtimes (.mise.toml-pinned) get treated like every other surface (CodeQL matrix, install path, workflow comments). The disowned-runtime pattern (Java pretended-not-to-exist while installed via mise) was the root structural cause of LFG #661. 3. memory/MEMORY.md index entry for the new speculation memory. Composes with PR #662 (codeql java-honesty fix — the action this substrate informs) and PR #663 (forward-sync 63 files — already contains the original codeql-umbrella detection memory; the resolved-mechanism update lands in a follow-up after #663 merges). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ull (Aaron 2026-04-28) Aaron's binding correction at 2026-04-28T16:05Z after my 5-tick stretch of "no new signal" closes on PRs #662/#663/#665. EVIDENCE-BASED audit on his "self check" prompt revealed 9 unresolved review threads that had been posted during my supposed-no-signal window — I was closing ticks without pulling. The rule (Aaron verbatim): "signals don't just arrive, you have to go get them" + "except for my typing in this environment" + "that's your only real signal that's pushed to you". The model: in autonomous-loop mode there is exactly ONE push channel (Aaron's direct typing). Everything else — CI state, review threads, PR mergeability, cron firings, peer-CLI replies, GitHub workflow runs — are PULL signals requiring active query. Closing a tick with "no new signal" without first pulling mergeStateStatus + reviewThreads + ci-checks is wrong by construction. Composes with the speculation rule (same family — don't state things you haven't verified), Otto-355 (BLOCKED-investigate-threads first), and the manufactured-patience class (which "no new signal" tick-closes are the textual signature of). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…CE-BASED labeling + CURRENT-aaron §§26-28 EVIDENCE-BASED: Aaron's binding correction after my LFG #661 "bullshit answer" 2026-04-28T13:30Z + extension at 14:42Z mandating EVIDENCE-BASED vs SPECULATION labeling on every root-cause statement. Three landings in this PR: 1. memory/feedback_speculation_leads_investigation_not_defines_root_cause_aaron_2026_04_28.md — captures the rule, Aaron's verbatim corrections, the discipline- going-forward checklist, the mandatory labeling section with worked examples (good vs bad), and the time-math evidence (~58 min speculation cycles vs 30-second primary-source query — the discipline pays back ~100x in iteration cost reduction). 2. memory/CURRENT-aaron.md sections 26-28: - §26 Speculation discipline (the rule + mandatory labeling) - §27 JVM language preference Kotlin > Scala > Java per B-0075 - §28 Dependency honesty — managed runtimes (.mise.toml-pinned) get treated like every other surface (CodeQL matrix, install path, workflow comments). The disowned-runtime pattern (Java pretended-not-to-exist while installed via mise) was the root structural cause of LFG #661. 3. memory/MEMORY.md index entry for the new speculation memory. Composes with PR #662 (codeql java-honesty fix — the action this substrate informs) and PR #663 (forward-sync 63 files — already contains the original codeql-umbrella detection memory; the resolved-mechanism update lands in a follow-up after #663 merges). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ull (Aaron 2026-04-28) Aaron's binding correction at 2026-04-28T16:05Z after my 5-tick stretch of "no new signal" closes on PRs #662/#663/#665. EVIDENCE-BASED audit on his "self check" prompt revealed 9 unresolved review threads that had been posted during my supposed-no-signal window — I was closing ticks without pulling. The rule (Aaron verbatim): "signals don't just arrive, you have to go get them" + "except for my typing in this environment" + "that's your only real signal that's pushed to you". The model: in autonomous-loop mode there is exactly ONE push channel (Aaron's direct typing). Everything else — CI state, review threads, PR mergeability, cron firings, peer-CLI replies, GitHub workflow runs — are PULL signals requiring active query. Closing a tick with "no new signal" without first pulling mergeStateStatus + reviewThreads + ci-checks is wrong by construction. Composes with the speculation rule (same family — don't state things you haven't verified), Otto-355 (BLOCKED-investigate-threads first), and the manufactured-patience class (which "no new signal" tick-closes are the textual signature of). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…labeling + CURRENT-aaron §§26-28 (#665) * substrate(speculation-discipline): primary-source-first rule + EVIDENCE-BASED labeling + CURRENT-aaron §§26-28 EVIDENCE-BASED: Aaron's binding correction after my LFG #661 "bullshit answer" 2026-04-28T13:30Z + extension at 14:42Z mandating EVIDENCE-BASED vs SPECULATION labeling on every root-cause statement. Three landings in this PR: 1. memory/feedback_speculation_leads_investigation_not_defines_root_cause_aaron_2026_04_28.md — captures the rule, Aaron's verbatim corrections, the discipline- going-forward checklist, the mandatory labeling section with worked examples (good vs bad), and the time-math evidence (~58 min speculation cycles vs 30-second primary-source query — the discipline pays back ~100x in iteration cost reduction). 2. memory/CURRENT-aaron.md sections 26-28: - §26 Speculation discipline (the rule + mandatory labeling) - §27 JVM language preference Kotlin > Scala > Java per B-0075 - §28 Dependency honesty — managed runtimes (.mise.toml-pinned) get treated like every other surface (CodeQL matrix, install path, workflow comments). The disowned-runtime pattern (Java pretended-not-to-exist while installed via mise) was the root structural cause of LFG #661. 3. memory/MEMORY.md index entry for the new speculation memory. Composes with PR #662 (codeql java-honesty fix — the action this substrate informs) and PR #663 (forward-sync 63 files — already contains the original codeql-umbrella detection memory; the resolved-mechanism update lands in a follow-up after #663 merges). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * substrate: only "pushed" signal is Aaron typing; everything else is pull (Aaron 2026-04-28) Aaron's binding correction at 2026-04-28T16:05Z after my 5-tick stretch of "no new signal" closes on PRs #662/#663/#665. EVIDENCE-BASED audit on his "self check" prompt revealed 9 unresolved review threads that had been posted during my supposed-no-signal window — I was closing ticks without pulling. The rule (Aaron verbatim): "signals don't just arrive, you have to go get them" + "except for my typing in this environment" + "that's your only real signal that's pushed to you". The model: in autonomous-loop mode there is exactly ONE push channel (Aaron's direct typing). Everything else — CI state, review threads, PR mergeability, cron firings, peer-CLI replies, GitHub workflow runs — are PULL signals requiring active query. Closing a tick with "no new signal" without first pulling mergeStateStatus + reviewThreads + ci-checks is wrong by construction. Composes with the speculation rule (same family — don't state things you haven't verified), Otto-355 (BLOCKED-investigate-threads first), and the manufactured-patience class (which "no new signal" tick-closes are the textual signature of). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…odex P2 follow-up) (#668) * substrate(memory-cross-refs): fix Otto-352→Otto-358 ref + apply resolved-mechanism to codeql-detection memory Two follow-up fixes from Codex P2 review on PR #665 (post-merge): 1. memory/feedback_speculation_leads_investigation_not_defines_root_cause_aaron_2026_04_28.md — composes-with referenced `feedback_otto_352_live_lock_term_split_three_distinct_classes_2026_04_26.md` which doesn't exist on main. The same content lives at `feedback_otto_358_live_lock_too_broad_catch_all_narrow_to_cs_standard_concurrent_state_thrashing_2026_04_27.md` (Aaron's correction renamed the live-lock-narrowing memo; both the speculation memo and Otto-358 reference the missing 352 file per repo grep). Updated the cross-ref to point at the existing file. 2. memory/feedback_codeql_umbrella_neutral_vs_per_language_detection_pattern_aaron_2026_04_28.md — replaces the speculative "Open question (deferred)" section with the EVIDENCE-BASED resolved-mechanism from primary-source query (umbrella check's own details URL: "1 configuration present on refs/heads/main was not found: codeql.yml /language:java-kotlin"). Originally a deferred follow-up after PR #663 merged; now applied. Includes the structural fix landed via PR #662 (merged 2026-04-28T16:22:42Z) for full mechanism + remediation trail. Composes with PR #663 (codeql-detection memory original landing) + PR #665 (speculation rule original landing) + PR #662 (the structural fix). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(memory-index): update codeql-detection entry — paired-edit for resolved-mechanism modification The memory-paired-edit CI check requires MEMORY.md be touched when memory/* changes, even for modifications (not just additions). My PR #668 modified two memory files without touching MEMORY.md. Updated the codeql-detection entry to mark the mechanism as RESOLVED 2026-04-28T14:32Z with pointer to PR #662 for the structural fix. The speculation-rule entry doesn't change since its content didn't materially change (just a cross-ref fix to Otto-358). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…hard-reset content alignment) Second forward-sync round following PR #663 (which handled the 63 AceHack-only ADD-class files). This PR handles 69 of the 87 M-class (modified) files where AceHack has the newer content per timestamp audit. EVIDENCE-BASED audit (2026-04-28T17:13Z): - 87 modified files differ between forks - 69 are AceHack-newer (this PR forwards them) - 18 are LFG-newer (excluded — they include this session's PR work: memory/MEMORY.md, codeql.yml, gate.yml, CURRENT-aaron.md, curl-fetch.sh, etc. LFG is canonical for these.) Effect: closes the destruction-revert gap before hard-reset of AceHack main to LFG main. After this lands: - 0 D-class (already cleared by PR #663) - 14 A-class (LFG-only files; hard-reset would add them to AceHack) - ~18 M-class remaining (LFG-newer; hard-reset is correct direction) That makes hard-reset content-safe (no AceHack-newer content destroyed; LFG-only files added; LFG-newer modifications carried forward). Diff: 69 files / 881 insertions / 314 deletions. Pure forward-port of AceHack file content; no semantic merge required since the direction-of-truth is established by timestamp + the LFG-newer exclusion list. Composes with: - PR #663 (the 63-file pure-additive forward-sync — this PR's predecessor) - task #284 (AceHack→LFG→AceHack option-c roundtrip plan) - Aaron's 0-divergence invariant goal Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…hard-reset content alignment) Second forward-sync round following PR #663 (which handled the 63 AceHack-only ADD-class files). This PR handles 69 of the 87 M-class (modified) files where AceHack has the newer content per timestamp audit. EVIDENCE-BASED audit (2026-04-28T17:13Z): - 87 modified files differ between forks - 69 are AceHack-newer (this PR forwards them) - 18 are LFG-newer (excluded — they include this session's PR work: memory/MEMORY.md, codeql.yml, gate.yml, CURRENT-aaron.md, curl-fetch.sh, etc. LFG is canonical for these.) Effect: closes the destruction-revert gap before hard-reset of AceHack main to LFG main. After this lands: - 0 D-class (already cleared by PR #663) - 14 A-class (LFG-only files; hard-reset would add them to AceHack) - ~18 M-class remaining (LFG-newer; hard-reset is correct direction) That makes hard-reset content-safe (no AceHack-newer content destroyed; LFG-only files added; LFG-newer modifications carried forward). Diff: 69 files / 881 insertions / 314 deletions. Pure forward-port of AceHack file content; no semantic merge required since the direction-of-truth is established by timestamp + the LFG-newer exclusion list. Composes with: - PR #663 (the 63-file pure-additive forward-sync — this PR's predecessor) - task #284 (AceHack→LFG→AceHack option-c roundtrip plan) - Aaron's 0-divergence invariant goal Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…hard-reset round 2) (#671) * sync(acehack→lfg): forward-port 69 AceHack-newer modified files (pre-hard-reset content alignment) Second forward-sync round following PR #663 (which handled the 63 AceHack-only ADD-class files). This PR handles 69 of the 87 M-class (modified) files where AceHack has the newer content per timestamp audit. EVIDENCE-BASED audit (2026-04-28T17:13Z): - 87 modified files differ between forks - 69 are AceHack-newer (this PR forwards them) - 18 are LFG-newer (excluded — they include this session's PR work: memory/MEMORY.md, codeql.yml, gate.yml, CURRENT-aaron.md, curl-fetch.sh, etc. LFG is canonical for these.) Effect: closes the destruction-revert gap before hard-reset of AceHack main to LFG main. After this lands: - 0 D-class (already cleared by PR #663) - 14 A-class (LFG-only files; hard-reset would add them to AceHack) - ~18 M-class remaining (LFG-newer; hard-reset is correct direction) That makes hard-reset content-safe (no AceHack-newer content destroyed; LFG-only files added; LFG-newer modifications carried forward). Diff: 69 files / 881 insertions / 314 deletions. Pure forward-port of AceHack file content; no semantic merge required since the direction-of-truth is established by timestamp + the LFG-newer exclusion list. Composes with: - PR #663 (the 63-file pure-additive forward-sync — this PR's predecessor) - task #284 (AceHack→LFG→AceHack option-c roundtrip plan) - Aaron's 0-divergence invariant goal Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(memory-index): re-add paired-edit marker post-rebase Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(pr-671): rename sister memory file + restore validate-script comments Three thread-cluster fixes addressing 6 of 7 unresolved review threads on PR #671 (per Otto-355 BLOCKED-investigate-threads-first discipline): 1. **P0 file rename: user_sister_elisabeth.md → user_sister_elizabeth.md** AceHack PR #73 ("fix: spell sister's name correctly") landed the reference updates on LFG via squash-merge 81a4650, but the underlying file rename was lost in the squash. Result: 11+ memory files + CLAUDE.md reference `user_sister_elizabeth.md` but only `user_sister_elisabeth.md` exists on LFG main. Resolves 4 P0 threads (#1, #3, #4, #7 — copilot + chatgpt-codex on ROUND-HISTORY.md, user_wavelength_equals_lifespan, CLAUDE.md x2). Verification: AceHack /memory has user_sister_elizabeth.md; LFG /memory had user_sister_elisabeth.md. After this commit, LFG matches AceHack. Also updates MEMORY.md line 579 — index entry pointed at the old file name AND used "Elisabeth" in the link text. 2. **P2 stray-character cleanup in validate-agencysignature-pr-body.sh line 5**: "instrument set#" → "instrument set" (the `#` was a residue from the persona-attribution strip in commit e015298). Resolves thread #2 (copilot P2). 3. **P2 incomplete spec citation at line 202**: "(Task: none fallback per )" → "(Task: none fallback)" — same provenance as fix #2; the "per Amara ferry-7's no-task rule" text was stripped but the empty parenthetical was left. Resolves thread #5 (copilot P2). Deferred threads: - Thread #6 (P1 GLOSSARY persona-name attribution "Amara/ChatGPT" in provenance section) — Stale-content-deferral class per feedback_pr_thread_resolution_class_taxonomy_2026_04_28.md. The pattern is pre-existing across docs/GLOSSARY.md provenance entries; rewriting in this forward-sync PR widens scope from "port AceHack content" to "edit content". Filing as B-0082 follow-up. EVIDENCE-BASED labels: - File state divergence: VERIFIED via gh api repos/{Lucent-Financial- Group,AceHack}/Zeta/contents/memory comparison. - Reference dangling: VERIFIED via grep -r "user_sister_eli" memory/. - Squash-merge rename loss: SPECULATION (commit 81a4650 message says "57 in-repo references" not "renamed file"; consistent with rename loss but no direct evidence of intent at squash time). Composes with: - Otto-355 BLOCKED-investigate-threads-first - feedback_pr_thread_resolution_class_taxonomy_2026_04_28.md (Real-fix class for #1-3, Stale-content-deferral for #4) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(pr-671): rename second lost-rename file (trust_guarded_with_elizabeth_vigilance) Same root cause as the previous commit: AceHack PR #73's squash-merge to LFG (commit 81a4650) preserved content references to elizabeth-spelled file names but lost the underlying file rename for two files. The first commit handled user_sister_*; this commit handles feedback_trust_guarded_with_*. Verified via git mv (rename detected at 100% similarity) + grep audit: all _elizabeth_-spelled file references are now satisfied; no dangling links remain after the two renames. EVIDENCE-BASED: - VERIFIED: 5 files (project_factory_as_wellness_dao.md, feedback_agent_sent_email_identity_and_recipient_ux.md, user_orch_or_microtubule_consciousness_thread.md, ROUND-HISTORY.md line 1797) reference feedback_trust_guarded_with_elizabeth_vigilance.md (with z) — but only feedback_trust_guarded_with_elisabeth_vigilance.md (with s) existed pre-rename. - VERIFIED post-rename: dangling-link grep returns zero hits. - VERIFIED: AceHack /memory has the z-spelled version; this commit reconciles LFG with AceHack. Composes with previous commit 6580e96 (user_sister rename + validate script fixes). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * backlog: file B-0082 — GLOSSARY persona-attribution → role-ref conversion (PR #671 deferral) Copilot P1 on PR #671 flagged "Amara/ChatGPT" persona-name attribution in docs/GLOSSARY.md provenance section. Per Otto-279 + AGENT-BEST-PRACTICES, behavioural docs use role-refs; persona names belong on history surfaces. Deferred from PR #671 inline fix because: - PR #671 is a forward-sync (port AceHack content as-is) - The "Amara/ChatGPT" pattern is pre-existing on AceHack - Rewriting widens scope from "port" to "edit during port" - Stale-content-deferral class per the thread-resolution taxonomy The B-0082 row provides two fix paths (inline rewrite vs move-and-link to docs/research/) and recommends a sweep across the whole GLOSSARY, not just the one entry. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(pr-671): regex-injection hardening in validate script + MEMORY.md marker accuracy Two thread-fixes from Copilot's re-review on the latest force-push: 1. **P1 regex injection in validate-agencysignature-pr-body.sh line 101** `grep -nE "^${last_trailer_key}:"` treated `last_trailer_key` as ERE. While `git interpret-trailers` normalizes keys, the input PR body is untrusted; a malformed/adversarial trailer key could break matching. Fixed by switching to `awk -v k="${last_trailer_key}:" 'index($0, k) == 1'` which does literal-prefix matching with no regex semantics. Also preserves the line-number-output shape (`NR` instead of grep's `n:`). 2. **P2 MEMORY.md paired-edit marker said "(66 AceHack-newer files)"** The count was stale (file count fluctuated as fixes landed; PR title says 69 but PR currently shows 70 changedFiles including this fix). Replaced the number with descriptive text "(AceHack-newer modified files)" to avoid future drift. EVIDENCE-BASED labels: - Regex injection feasibility: VERIFIED via grep manpage + shellcheck rules (regex metacharacters in unquoted variable expansion). - File-count drift: VERIFIED via `gh pr view 671 --json changedFiles` showing 70 vs marker's 66. Defers (filed B-0082): - Threads #1, #3, #7, #9 — persona-name attribution in current-state docs. B-0082 covers the GLOSSARY case; the FACTORY-HYGIENE + CLAUDE.md instances will fold into the same sweep. Acknowledges (stale phantom-blockers from Copilot): - Threads #2, #10 — claim user_sister_elizabeth.md / trust_guarded files don't exist; verified they DO exist on remote post-rename (commits 6580e96 + ae1ef63). Copilot is reviewing against stale diff context; threads will resolve on resolveReviewThread call. - Threads #5, #8 — claim line-5/202 still mangled; verified fixed in commit 6580e96. Same stale-diff-context pattern. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(pr-671): case-insensitive trailer-key match in validate script (Codex P2) Codex P2 thread on validate-agencysignature-pr-body.sh line 103: the awk literal-prefix match introduced earlier today (`index($0, k) == 1`) preserved the regex-injection fix but inherited the original code's case-sensitivity bug. Trailer keys are RFC-822 case-insensitive — git interpret-trailers normalizes on parse, but the stripped input may carry the original case, so a parsed-key-derived prefix match would miss when the underlying line uses a different case fold. Fix: wrap both sides of the prefix match in tolower(). Keeps the literal-prefix (no regex semantics) AND honours case-insensitive trailer-key matching. EVIDENCE-BASED: VERIFIED via RFC-822 trailer-key spec; bug exists in both the original grep -nE and my awk replacement. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Summary
Forward-ports the 63 files that exist on AceHack main but not on LFG main. This is the prerequisite for the AceHack main hard-reset to LFG main — without this PR, that hard-reset destroys substantive content.
Cross-verified safety check (Otto-347)
Otto + Grok independently audited the 63-file set 2026-04-28T15:05Z. Both classified it as substrate-load-bearing (24 memory + 13 research + 9 backlog + 1 ADR + 4 peer-call + 2 hygiene + 2 workflow + remainder). Both concluded: hard-reset UNSAFE without forward-sync first. Aaron approved the forward-sync after the cross-verify.
Categorization
memory/feedback_*.mddocs/research/*.mddocs/backlog/{P0,P1,P2}/*.mddocs/DECISIONS/*.mdtools/peer-call/*tools/hygiene/*.sh.github/workflows/*.ymltools/setup/*.shScope what this PR is NOT
Test plan
git diff acehack/main..origin/main --diff-filter=Don freshly-fetched refs and confirms the AceHack-only set is now empty (modulo files newly landed on AceHack between this PR and the double-check)🤖 Generated with Claude Code