Skip to content

ci(codeql): treat Java like every other managed runtime — add java-kotlin matrix + scan AlloyRunner.java#662

Merged
AceHack merged 3 commits intomainfrom
fix/codeql-honestly-include-java-2026-04-28
Apr 28, 2026
Merged

ci(codeql): treat Java like every other managed runtime — add java-kotlin matrix + scan AlloyRunner.java#662
AceHack merged 3 commits intomainfrom
fix/codeql-honestly-include-java-2026-04-28

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented Apr 28, 2026

Summary

  • Add java-kotlin to the analyze matrix in .github/workflows/codeql.yml (was dropped on the wrong assumption "no Java/Kotlin source"; tools/alloy/AlloyRunner.java is first-party).
  • Remove tools/alloy/** from .github/codeql/codeql-config.yml paths-ignore so the new java-kotlin leg actually scans AlloyRunner.java.
  • Update the codeql.yml header doc + path-gate *.java matcher to reflect the honest state.

Mechanism (EVIDENCE-BASED)

Umbrella CodeQL check on LFG #661 — verbatim from gh api .../check-runs/73401083160 --jq .output.summary:

Warning: Code scanning cannot determine the alerts introduced by this pull request, because 1 configuration present on refs/heads/main was not found:

Actions workflow (codeql.yml)

  • /language:java-kotlin

The code_quality:severity=all ruleset rule reads umbrella NEUTRAL as "results pending" and blocks the PR. Adding the matrix cell + removing the paths-ignore makes the workflow honestly represent the Java dependency.

Java is already managed

Surface State
.mise.toml:24 java = "26" (round-34 migration off brew/apt)
tools/setup/manifests/apt Comment notes round-34 migration
tools/setup/manifests/brew Comment notes round-34 migration
tools/setup/common/verifiers.sh Asserts command -v java for Alloy
tools/setup/common/mise.sh Runs mise install reading .mise.toml
.github/workflows/codeql.yml (before this PR) Disowned the dependency

This PR closes the disownment.

Why both edits compose

paths-ignore wins over paths on overlap. With tools/alloy/** in the ignore list, adding java-kotlin to the matrix would be cosmetic (cell exists, extractor finds zero sources, uploads empty SARIF). Aaron's framing was "we use it and we act like we don't" — that requires both edits.

Test plan

  • Workflow run on this PR completes
  • Analyze (java-kotlin) leg appears in the matrix and SUCCEEDS
  • Umbrella CodeQL check transitions from NEUTRAL → SUCCESS
  • PR's code_quality:severity=all ruleset gate clears (results no longer "pending")
  • Any AlloyRunner.java findings (if any) surface as code-scanning alerts in Security tab

Composes with

  • memory/feedback_codeql_umbrella_neutral_vs_per_language_detection_pattern_aaron_2026_04_28.md (detection pattern)
  • memory/feedback_speculation_leads_investigation_not_defines_root_cause_aaron_2026_04_28.md (the EVIDENCE-BASED labeling discipline this PR exemplifies)

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings April 28, 2026 14:42
AceHack added a commit that referenced this pull request Apr 28, 2026
…-history row

Aaron 2026-04-28T14:48Z: "i'm a big fan of kotlin we should prefere
jvm languages in this order kotlin, scala, java backlog this any any
updates that fall out"

Lands in three places:

1. docs/backlog/P3/B-0075-... — P3 row with the preference, trigger
   conditions, known fallout (AlloyRunner.java grandfathered until
   non-trivial rewrite), and acceptance criteria.
2. .github/workflows/codeql.yml — comment on the java-kotlin matrix
   cell points future-Otto at B-0075 so the preference is visible
   at the surface where new JVM code is most likely to surface.
3. docs/hygiene-history/loop-tick-history.md — first row in two days,
   covering today's full session arc (speculation discipline +
   EVIDENCE-BASED labeling + LFG #661 mechanism + PR #662 + this
   preference). Includes time-math evidence: 30-minute speculation
   loop vs 30-second primary-source query — the discipline pays
   back in iteration-cost reduction.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 28, 2026
…rce mechanism

EVIDENCE-BASED resolution of the earlier "Open question (deferred)"
section. The org-level-inheritance / paths-ignore / ingestion-flag
suspects were all speculation; the actual mechanism (verbatim from
the umbrella check's details URL) is a workflow-matrix-vs-main-
analyses mismatch caused by the `codeql.yml` matrix dropping
java-kotlin while main carried java-kotlin analyses from default-
setup + our path-gate.

Replaces the deferred-investigation framing with the resolved
mechanism + the structural fix (PR #662) + the deeper cause
("runtime dependencies must be honestly declared on every surface
that touches them"). AceHack-vs-LFG asymmetry now flagged as
SPECULATION (likely sampling artifact, not structural difference)
with the disconfirming-query named.

Closes the loop on the speculation rule the same memory was
co-authored to teach.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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: 577a5354be

ℹ️ 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 .github/workflows/codeql.yml
AceHack added a commit that referenced this pull request Apr 28, 2026
…ttern PR #662 fixed for Java

EVIDENCE-BASED audit immediately after PR #662:

  find . -type f \( -name "*.py" -o -name "*.ts" \) \
    -not -path "*/node_modules/*" -not -path "*/.git/*" \
    -not -path "*/.claude/worktrees/*" \
    -not -path "*/references/upstreams/*" \
    -not -path "*/bench/*" 2>/dev/null

returns 4 first-party files: 2 .py (tools/hygiene/) + 2 .ts
(eslint.config.ts, tools/invariant-substrates/tally.ts).

Both runtimes are managed in .mise.toml (python = "3.14",
bun = "1.3" for TypeScript); neither is in the codeql.yml
analyze matrix. Per CURRENT-aaron.md §28 dependency-honesty
discipline, this is the same disowned-runtime pattern Aaron
just made me fix for Java — applied to Python and TypeScript.

Filed P2 (not P0/P1: tooling-only files, no production-path
exposure today; not P3: pattern matches active discipline,
discovered fresh from a primary-source query).

Acceptance: extend the analyze matrix with python +
javascript-typescript cells, audit codeql-config.yml for
masking effects, surface any findings on the 4 first-party
files.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@AceHack AceHack enabled auto-merge (squash) April 28, 2026 15:44
AceHack added a commit that referenced this pull request Apr 28, 2026
…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>
AceHack added a commit that referenced this pull request Apr 28, 2026
…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>
AceHack and others added 3 commits April 28, 2026 12:19
…tlin matrix + scan tools/alloy/AlloyRunner.java

EVIDENCE-BASED: the codeql.yml workflow dropped the java-kotlin matrix
cell based on the wrong assumption "no Java/Kotlin source." Empirical
state: tools/alloy/AlloyRunner.java is first-party Java (a headless
JVM driver that runs Alloy specs from .NET), and the OpenJDK runtime
is already a managed dependency pinned via .mise.toml + installed by
tools/setup/install.sh on dev laptops, devcontainers, and CI runners.

Evidence:
- find . -name '*.java' → tools/alloy/AlloyRunner.java (first-party)
- .mise.toml:24 → java = "26" (round-34 migration off brew/apt)
- tools/setup/manifests/{apt,brew} comments confirm round-34 migration
- tools/setup/common/verifiers.sh requires `command -v java`
- gh api .../check-runs/73401083160 → umbrella `CodeQL` NEUTRAL with
  "1 configuration present on `refs/heads/main` was not found:
  codeql.yml /language:java-kotlin" — the ruleset rule
  `code_quality:severity=all` reads umbrella NEUTRAL as "results
  pending" and gates LFG PRs (LFG #661 today)

Changes:
- .github/workflows/codeql.yml: add `java-kotlin` matrix cell with
  `build-mode: none` (single-file, no Maven/Gradle); update header
  doc to reflect honest state; add `*.java` to path-gate code-changed
  patterns
- .github/codeql/codeql-config.yml: remove `tools/alloy/**` from
  paths-ignore so the java-kotlin extractor actually scans
  AlloyRunner.java (otherwise the matrix cell finds zero sources
  and uploads empty SARIF — would satisfy the umbrella check but
  still pretend we don't use Java for security purposes)

Why both edits compose: paths-ignore wins over paths on overlap; with
tools/alloy/** in the ignore list, adding java-kotlin to the matrix
would be cosmetic. The honest representation Aaron asked for ("we use
it and we act like we don't") requires both.

Composes with:
- memory/feedback_codeql_umbrella_neutral_vs_per_language_detection_pattern_aaron_2026_04_28.md
- memory/feedback_speculation_leads_investigation_not_defines_root_cause_aaron_2026_04_28.md

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…-history row

Aaron 2026-04-28T14:48Z: "i'm a big fan of kotlin we should prefere
jvm languages in this order kotlin, scala, java backlog this any any
updates that fall out"

Lands in three places:

1. docs/backlog/P3/B-0075-... — P3 row with the preference, trigger
   conditions, known fallout (AlloyRunner.java grandfathered until
   non-trivial rewrite), and acceptance criteria.
2. .github/workflows/codeql.yml — comment on the java-kotlin matrix
   cell points future-Otto at B-0075 so the preference is visible
   at the surface where new JVM code is most likely to surface.
3. docs/hygiene-history/loop-tick-history.md — first row in two days,
   covering today's full session arc (speculation discipline +
   EVIDENCE-BASED labeling + LFG #661 mechanism + PR #662 + this
   preference). Includes time-math evidence: 30-minute speculation
   loop vs 30-second primary-source query — the discipline pays
   back in iteration-cost reduction.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ttern PR #662 fixed for Java

EVIDENCE-BASED audit immediately after PR #662:

  find . -type f \( -name "*.py" -o -name "*.ts" \) \
    -not -path "*/node_modules/*" -not -path "*/.git/*" \
    -not -path "*/.claude/worktrees/*" \
    -not -path "*/references/upstreams/*" \
    -not -path "*/bench/*" 2>/dev/null

returns 4 first-party files: 2 .py (tools/hygiene/) + 2 .ts
(eslint.config.ts, tools/invariant-substrates/tally.ts).

Both runtimes are managed in .mise.toml (python = "3.14",
bun = "1.3" for TypeScript); neither is in the codeql.yml
analyze matrix. Per CURRENT-aaron.md §28 dependency-honesty
discipline, this is the same disowned-runtime pattern Aaron
just made me fix for Java — applied to Python and TypeScript.

Filed P2 (not P0/P1: tooling-only files, no production-path
exposure today; not P3: pattern matches active discipline,
discovered fresh from a primary-source query).

Acceptance: extend the analyze matrix with python +
javascript-typescript cells, audit codeql-config.yml for
masking effects, surface any findings on the 4 first-party
files.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@AceHack AceHack force-pushed the fix/codeql-honestly-include-java-2026-04-28 branch from e2bf24f to a304663 Compare April 28, 2026 16:19
AceHack added a commit that referenced this pull request Apr 28, 2026
…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>
AceHack added a commit that referenced this pull request Apr 28, 2026
…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>
AceHack added a commit that referenced this pull request Apr 28, 2026
… safety) — Otto+Grok cross-verified (#663)

* sync(acehack→lfg): forward-port 63 AceHack-only files to LFG main (pre-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>

* sync(acehack→lfg): paired-edit MEMORY.md + markdownlint-cli2 carve-out 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>

* fix(memory-index): dedup MEMORY.md by link target — clear all 14 duplicates

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>

* backlog(B-0077/B-0078/B-0079): defer Codex review findings on PR #663 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>

* backlog(B-0079): add 5th audit-script item — Codex P2 on --max=0 acceptance

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>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
@AceHack AceHack merged commit bb0227e into main Apr 28, 2026
25 checks passed
@AceHack AceHack deleted the fix/codeql-honestly-include-java-2026-04-28 branch April 28, 2026 16:22
AceHack added a commit that referenced this pull request Apr 28, 2026
…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>
AceHack added a commit that referenced this pull request Apr 28, 2026
…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>
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: a3046637f1

ℹ️ 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 .github/workflows/codeql.yml
AceHack added a commit that referenced this pull request Apr 28, 2026
…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>
AceHack added a commit that referenced this pull request Apr 28, 2026
…a — Codex P2 on PR #662 (#667)

Codex P2 on PR #662 (post-merge): the codeql.yml path-gate's case
statement matches *.java but not *.kt or *.scala. Per B-0075 JVM
language preference (Kotlin > Scala > Java), when a .kt or .scala
file lands the path-gate would NOT trigger analyze, silently skipping
security scanning on new JVM code.

Fix: extend the case to *.java|*.kt|*.kts|*.scala|*.sc and rename
the comment from "Java surface" to "JVM surface."

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 28, 2026
…solved-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>
AceHack added a commit that referenced this pull request Apr 28, 2026
…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>
AceHack added a commit that referenced this pull request Apr 28, 2026
…7Z autonomous-loop ticks (#674)

* tick-history: 2026-04-27T23:58Z + 2026-04-28T14:43Z + 2026-04-28T17:47Z autonomous-loop ticks

Three-row consolidated tick-history append covering:

- 2026-04-27T23:58:00Z — #651 + #654 LFG merge + EAT PR #72 on AceHack
  (rescued from local commit 318d19f which never landed via PR before
  hard-reset to origin/main lost it; the 23:58Z row was 38KB substantive
  content about manufactured-patience anti-pattern + branch-protection
  two-surface read + agent-authority delegation tier-distinction).

- 2026-04-28T14:43:00Z — Aaron 'bullshit answer' call → speculation-vs-
  evidence discipline landed durably + LFG #661 NEUTRAL umbrella
  mechanism diagnosed primary-source-grounded + PR #662 opened to
  honestly include Java in CodeQL surface. (This row was on origin/main
  already from earlier in the session; preserved as-is.)

- 2026-04-28T17:47:49Z — three-PR landing-arc tick (#671 #672 #673)
  closing destruction-revert gap + landing MS Learn threading-lineage
  upgrade with primary-source-verified Lock worked example.

EVIDENCE-BASED:
- 23:58Z row recovery: VERIFIED via 'git show 318d19f -- docs/hygiene-
  history/loop-tick-history.md' showing the lost diff content.
- Conflict resolution: VERIFIED chronological order (27th 23:58 → 28th
  14:43 → 28th 17:47).

Cron 'ff34da97' armed (every-minute autonomous-loop heartbeat).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(tick-history): MD056 — drop trailing empty cell on rescued 23:58Z row

The 23:58Z row rescued from local commit 318d19f had a trailing `| |`
(extra empty 7th cell vs the 6-cell format). Markdownlint MD056 caught
it on PR #674. This is likely why 318d19f never landed via PR —
same lint failure when originally pushed.

Fix: drop one trailing pipe so the row has exactly 6 cells matching
the rest of the table.

EVIDENCE-BASED: VERIFIED via gh api jobs/73443618657/logs showing
exact MD056 error 'Expected: 6; Actual: 7; Too many cells'.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 28, 2026
…-28) (#675)

* tick-history: 2026-04-27T23:58Z + 2026-04-28T14:43Z + 2026-04-28T17:47Z autonomous-loop ticks

Three-row consolidated tick-history append covering:

- 2026-04-27T23:58:00Z — #651 + #654 LFG merge + EAT PR #72 on AceHack
  (rescued from local commit 318d19f which never landed via PR before
  hard-reset to origin/main lost it; the 23:58Z row was 38KB substantive
  content about manufactured-patience anti-pattern + branch-protection
  two-surface read + agent-authority delegation tier-distinction).

- 2026-04-28T14:43:00Z — Aaron 'bullshit answer' call → speculation-vs-
  evidence discipline landed durably + LFG #661 NEUTRAL umbrella
  mechanism diagnosed primary-source-grounded + PR #662 opened to
  honestly include Java in CodeQL surface. (This row was on origin/main
  already from earlier in the session; preserved as-is.)

- 2026-04-28T17:47:49Z — three-PR landing-arc tick (#671 #672 #673)
  closing destruction-revert gap + landing MS Learn threading-lineage
  upgrade with primary-source-verified Lock worked example.

EVIDENCE-BASED:
- 23:58Z row recovery: VERIFIED via 'git show 318d19f -- docs/hygiene-
  history/loop-tick-history.md' showing the lost diff content.
- Conflict resolution: VERIFIED chronological order (27th 23:58 → 28th
  14:43 → 28th 17:47).

Cron 'ff34da97' armed (every-minute autonomous-loop heartbeat).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(tick-history): MD056 — drop trailing empty cell on rescued 23:58Z row

The 23:58Z row rescued from local commit 318d19f had a trailing `| |`
(extra empty 7th cell vs the 6-cell format). Markdownlint MD056 caught
it on PR #674. This is likely why 318d19f never landed via PR —
same lint failure when originally pushed.

Fix: drop one trailing pipe so the row has exactly 6 cells matching
the rest of the table.

EVIDENCE-BASED: VERIFIED via gh api jobs/73443618657/logs showing
exact MD056 error 'Expected: 6; Actual: 7; Too many cells'.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* memory(pull-queue): scope-broadening + recurrence note (Aaron 2026-04-28T18:05Z)

Aaron's correction this turn extends the pull-queue rule:

- The pull-queue is broader than 'open PR review threads' — includes
  stale fork-PR queue, open issues, BACKLOG.md rows, recent CI runs,
  external signals (peer-CLI, Amara ferries), TodoWrite tasks.
- The framing 'no new push-signal' IS the failure-mode language;
  replace with 'pulled queue: <findings>' or 'pulled queue: nothing
  to act on'.
- 'In the future too' — future-Otto MUST inherit this. The rule lives
  durably in this file via the MEMORY.md index.

Concrete pull this tick (which I had been missing) found:
- PR #659 with 49 unresolved threads
- PR #661 BLOCKED/MERGEABLE with 0 threads (low-hanging)
- 5 P1 issues open on LFG
- Multiple in-progress TodoWrite tasks

EVIDENCE-BASED:
- VERIFIED — gh api graphql query against PR #659 returned 50 threads,
  49 unresolved.
- VERIFIED — gh issue list returned 5 open P1 issues (#78-#82).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* memory(index): bump paired-edit marker for PR #675 (Codex paired-edit lint fix)

Paired-edit lint requires MEMORY.md to be modified IN THE SAME PR as
any memory/*.md change. PR #675 modified the pull-queue feedback memory
but the prior paired-edit marker (from PR #671) wasn't itself modified
in this PR, so the same-commit-or-same-PR pairing failed.

Fix: bump the marker to reference PR #675. The MEMORY.md file is now
modified in this PR per the lint requirement.

EVIDENCE-BASED: VERIFIED via gh api jobs/73446862296/logs showing exact
lint message 'memory/MEMORY.md NOT updated alongside the memory changes
above'.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(pr-675): include P3 + replace ellipsis with runnable gh commands (Copilot P1+P2)

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
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