Skip to content

chore(sdlc): adopt the SDLC loop (verify receipt, gates, stage workflows on codex) — closes #349 - #350

Merged
kevintseng merged 8 commits into
mainfrom
chore/sdlc-loop
Sep 13, 2026
Merged

kevintseng merged 8 commits into
mainfrom
chore/sdlc-loop

Conversation

@kevintseng

@kevintseng kevintseng commented Sep 13, 2026

Copy link
Copy Markdown
Contributor

Summary

Installs the SDLC loop from the sdlc-loop skill pack: one npm run verify whose green result is a receipt bound to the git tree hash, Claude Code project hooks that refuse to end a session, commit or push without it, an SDLC verify CI job that reruns the same steps, and the stage workflows (intent → spec → plan → build → review → release receipt → monitor) with the model provider set to codex (sdlc/config.jsonagent.provider). Closes #349.

Type of change

  • Build / CI / chore

Docs synced (project doc-sync rule — CLAUDE.md)

  • CHANGELOG.md updated for this change (under [Unreleased] or current [X.Y.Z] section) — not a user-facing change; no entry
  • CLAUDE.md: "Verifying your work" section, working-notes bullet; docs/sdlc/LOOP.md, REVIEW.md, intent/, docs/specs/, docs/plans/ READMEs and templates added
  • memesh doctor reports Overall: PASS — run by npm run verify (packaged smoke) on this tree

Verification

[verify] ok build (4s)
[verify] ok release-gates (25s)
[verify] ok unit (191s)
[verify] ok packaged (11s)
[verify] ok dashboard-e2e (30s)
[verify] tree 4d23980cf1eed23fc2a0b1fbeab612638b69dc36 (full)
[verify] GREEN. Receipt for tree 4d23980cf1ee written to .verify/receipt.json.

Receipt: .verify/receipt.json for tree 4d23980cf1eed23fc2a0b1fbeab612638b69dc36 (compare with the [verify] tree line of the SDLC verify check on this PR).

  • npm run typecheck clean (inside verify:release, step 2 of verify)
  • npm run build clean (step 1 of verify; regenerates the tracked dist/, tree re-baselined)
  • node scripts/run-tests-isolated.mjs passing (step 3 of verify, exit 0)
  • npm run sdlc:test exit 0 — 59 pass, 0 fail (receipt, hooks, git-native gates, state machine, provider layer, smoke command)
  • Spec stage trial, claude-sonnet-5 (51 turns, $2.24) and codex (7 min, ChatGPT subscription): both produce docs/specs/observation-forget-survives-stop.md passing checkArtifact, no other file changed (see the comment below)
  • Release smoke command: qa:post-release --version 4.9.4 --skip-machine PASS against the registry through scripts/sdlc/smoke-public.mjs (exit 0)

Test plan

  • npm run sdlc:test → 55 pass
  • npm run verify → ends with [verify] GREEN. Receipt for tree <hash> written to .verify/receipt.json.; npm run verify:receiptfresh
  • In a Claude Code session in this repo: edit a source file, try git commit → blocked until npm run verify is green
  • node scripts/sdlc/next-stage.mjs --human → nothing pending (the intent is status: draft)
  • After merge: bash scripts/sdlc/bootstrap.sh (OPENAI_API_KEY or CODEX_AUTH_JSON, SDLC_GITHUB_TOKEN, branch protection incl. SDLC verify, labels), then flip intent/observation-forget-survives-stop.md to status: accepted

Known limitations / follow-ups

  • Bootstrap done for CODEX_AUTH_JSON, SDLC_GITHUB_TOKEN and the labels; branch protection still lacks SDLC verify and enforce_admins (rerun bash scripts/sdlc/bootstrap.sh, step 3 now offers the update).
  • main is red on check-version-coherence (4.10.0 declared, no tag); the monitor's ci_failure_rate_main band will show it until the release is finished.
  • The git hooks install on npm install (prepare) after merge; git commit --no-verify skips them, as it skips any git hook, and CI plus branch protection remain the gate that cannot be skipped.
  • gemini is wired as a provider but has not been run anywhere (agent.mjs says so); codex and claude ran the spec stage end to end, and codex reviews this PR from CI.
  • With SDLC_GITHUB_TOKEN owned by the maintainer, branch protection stays at 0 approvals (a person cannot approve their own PR); bootstrap prints the consequence. A separate machine account for the token enables 1 approval + code-owner review.
  • Local dated plan notes under docs/plans/ stay ignored by the new rule and untouched.

Coverage (one row per changed file — REVIEW.md)

Surface QA Review Simplification
.claude/agents/journey-verifier.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
.claude/hooks/hooks.test.mjs (added) npm run sdlc:test exit=0 (59 pass, 0 fail) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.claude/hooks/lib.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.claude/hooks/pre-bash-gate.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.claude/hooks/protect-verify-dir.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.claude/hooks/session-start.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.claude/hooks/stop-receipt.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.claude/sdlc/PR_TEMPLATE.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
.claude/sdlc/prompts/build.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
.claude/sdlc/prompts/diagnose.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
.claude/sdlc/prompts/plan.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
.claude/sdlc/prompts/review.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
.claude/sdlc/prompts/spec.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
.claude/settings.json (added) hooks spawned by npm run sdlc:test exactly as Claude Code spawns them (59 pass) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
.github/pull_request_template.md (modified) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
.github/workflows/ci.yml (modified) yaml.safe_load exit=0; the SDLC verify job runs on this PR (see checks) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.github/workflows/sdlc-evals.yml (added) python3 -c 'yaml.safe_load' exit=0; node scripts/sdlc/agent.mjs --check exit=1 without a secret (::error), exit=0 with one; not run on CI yet (needs the bootstrap secrets) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.github/workflows/sdlc-loop.yml (added) python3 -c 'yaml.safe_load' exit=0; node scripts/sdlc/agent.mjs --check exit=1 without a secret (::error), exit=0 with one; not run on CI yet (needs the bootstrap secrets) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.github/workflows/sdlc-monitor.yml (added) python3 -c 'yaml.safe_load' exit=0; node scripts/sdlc/agent.mjs --check exit=1 without a secret (::error), exit=0 with one; not run on CI yet (needs the bootstrap secrets) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.github/workflows/sdlc-release.yml (added) python3 -c 'yaml.safe_load' exit=0; node scripts/sdlc/agent.mjs --check exit=1 without a secret (::error), exit=0 with one; not run on CI yet (needs the bootstrap secrets) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.github/workflows/sdlc-review.yml (added) python3 -c 'yaml.safe_load' exit=0; node scripts/sdlc/agent.mjs --check exit=1 without a secret (::error), exit=0 with one; not run on CI yet (needs the bootstrap secrets) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.gitignore (modified) git check-ignore on 13 paths: the four .claude/ loop paths and docs/plans/<slug>.md tracked; settings.local.json, other agents, dated plans, _archive*, .verify/, .sdlc-run/ ignored fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
.nvmrc (added) node -v 22 matches ci.yml legs; workflows use node-version-file fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
CLAUDE.md (modified) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
REVIEW.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
docs/plans/README.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
docs/plans/TEMPLATE.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
docs/sdlc/LOOP.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
docs/specs/README.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
docs/specs/TEMPLATE.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
evals/README.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
evals/cases/no-plan-no-build.json (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
evals/cases/verify-before-done.json (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
evals/checks/consulted-receipt.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
evals/checks/mentions-plan-proof.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
evals/lib.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
evals/run.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
intent/README.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
intent/TEMPLATE.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
intent/observation-forget-survives-stop.md (added) npm run verify:release exit=0 (check-doc-claims: no dangling paths); read in full fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
package.json (modified) npm run sdlc:test exit=0; npm run verify exit=0 (scripts resolve) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
scripts/audit/baseline.json (modified) node scripts/audit/verification-audit.mjs exit=0 (9 hits triaged, 5 re-keyed) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template
scripts/qa/post-release.mjs (modified) node scripts/sdlc/smoke-public.mjs --sha ed091744 --version 4.9.4 exit=0 (qa:post-release --skip-machine PASS against the registry) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/agent.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/agent.test.mjs (added) npm run sdlc:test exit=0 (59 pass, 0 fail) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/bootstrap.sh (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/cli.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/git-gate.mjs (added) npm run sdlc:test exit=0 (git-gate.test.mjs: a real git commit refused without a receipt and with a partial index, allowed with a matching receipt; foreign hook not overwritten); npm run prepare in an unpacked package dir exit=0 with the skip line fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/git-gate.test.mjs (added) npm run sdlc:test exit=0 (59 pass, 0 fail) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/git-hooks/pre-commit (added) npm run sdlc:test exit=0 (git-gate.test.mjs: a real git commit refused without a receipt and with a partial index, allowed with a matching receipt; foreign hook not overwritten); npm run prepare in an unpacked package dir exit=0 with the skip line fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/git-hooks/pre-push (added) npm run sdlc:test exit=0 (git-gate.test.mjs: a real git commit refused without a receipt and with a partial index, allowed with a matching receipt; foreign hook not overwritten); npm run prepare in an unpacked package dir exit=0 with the skip line fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/host.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/install-git-hooks.mjs (added) npm run sdlc:test exit=0 (git-gate.test.mjs: a real git commit refused without a receipt and with a partial index, allowed with a matching receipt; foreign hook not overwritten); npm run prepare in an unpacked package dir exit=0 with the skip line fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/lib.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/lib.test.mjs (added) npm run sdlc:test exit=0 (59 pass, 0 fail) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/monitor.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/monitor.test.mjs (added) npm run sdlc:test exit=0 (59 pass, 0 fail) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/next-stage.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/next-stage.test.mjs (added) npm run sdlc:test exit=0 (59 pass, 0 fail) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/review.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/run-stage.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/run-stage.test.mjs (added) npm run sdlc:test exit=0 (59 pass, 0 fail) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/smoke-public.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/sdlc/smoke-public.test.mjs (added) npm run sdlc:test exit=0 (59 pass, 0 fail) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/verify-receipt.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/verify.mjs (added) npm run sdlc:test exit=0 (59 pass); node scripts/verify.mjs exit=0 fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
scripts/verify.test.mjs (added) npm run sdlc:test exit=0 (59 pass, 0 fail) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges second commit: dead agentEnv/claudeArgs removed, duplicated Coverage section and gitignore block removed; templates are copies of ~/Developer/Projects/sdlc-loop and are not edited per project
sdlc/config.json (added) node scripts/verify.mjs exit=0 used it; node scripts/sdlc/next-stage.mjs --human exit=0; run-stage --dry-run exit=0 (codex exec, workspace-write) fresh-eyes review by claude-opus-5 (18 findings, closed in the second commit) and the codex review matrix on this PR (Bugs finding on the commit gate closed in the sixth commit; both Compliance findings answered by this body); KT merges —: Markdown/JSON, nothing to simplify beyond the template

Comment thread scripts/sdlc/monitor.mjs Dismissed
Comment thread scripts/sdlc/smoke-public.mjs Dismissed
@kevintseng

Copy link
Copy Markdown
Contributor Author

Spec-stage trial with codex (provider in sdlc/config.json)

Run on a scratch worktree of this branch (c68526a) with the intent flipped to status: accepted, exactly the command run-stage.mjs --dry-run prints:

codex exec --ephemeral --color never --json --ignore-user-config -o .sdlc-run/spec-trial.last-message.md -s workspace-write "<spec prompt, 1934 chars>"
  • exit 0; 7 minutes wall clock; 18 shell commands (reads only), 1 file change
  • docs/specs/observation-forget-survives-stop.md: 245 lines, frontmatter status: draft / intent: / generated_by: sdlc-loop, all nine template sections; checkArtifact(...,["draft"]) → OK
  • git status: only that file added (the intent edit was the trial's own flip)
  • usage reported by codex: input 3,352,688 (3,219,328 cached), output 8,605, reasoning 1,149; ChatGPT subscription login, no API billing

Same intent, provider claude (claude-sonnet-5): 51 turns, 12.5 minutes, $2.24, 247 lines, same checks green. Both artifacts are in the session record; neither is committed here because the intent stays status: draft until the owner accepts it.

@github-actions

Copy link
Copy Markdown

Review matrix: Security / (root) (codex:default)

FAIL — Review blocked; no security verdict established.

Review matrix: Security / (root)

Security

No findings established. Both file-read attempts exited with code 1 before returning content:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

The Verification section, REVIEW.md, constraint documents, and changed files could not be read. MeMesh was also unavailable. This is an environment failure, not evidence of a request defect. Rerun this cell with working repository access.

Files read: 0 / unknown total touched by the diff.

Files read in this cell: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / (root) (codex:default)

FAIL — review blocked; no conclusion about the changes.

Review matrix: Bugs / (root)

Bugs

No findings established. File reads failed before execution with exit code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

Consequently, I could not read the Verification section, REVIEW.md, constraints, diff, or changed files. MeMesh was also unavailable. Rerun this cell with working repository read access.

Files read: 0 / unknown total touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / (root) (codex:default)

FAIL — review blocked; no PR compliance verdict established.

Review matrix: Compliance / (root)

Compliance

No findings established. Both attempts to read .sdlc-run/review-350.diff exited with code 1 before returning content:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

No alternative local Read tool was available. Consequently, I could not inspect REVIEW.md, the Verification section, receipt/CI tree agreement, Coverage table, constraint documents, or changed root files. MeMesh was also unavailable.

This cell requires rerunning with working repository read access.

Files read: 0 / unknown total files touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / .claude (codex:default)

FAIL

Review matrix: Bugs / .claude

Bugs

Review blocked; no code findings established. Every file-read attempt exited with code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

I could not read the diff, Verification section, REVIEW.md, or changed .claude/ files. MeMesh was also unavailable. This is an execution failure, not evidence of a PR defect; this cell requires a rerun with working repository access.

Files read: 0 / unknown total files touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Security / .claude (codex:default)

FAIL — review blocked; no verdict on the request’s security.

Review matrix: Security / .claude

Security

No findings established. Repository reads failed with exit code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

Consequently, I could not read the Verification section, REVIEW.md, constraint documents, or changed files. This is an environment failure, not a finding against the request. MeMesh was also unavailable.

Files read: 0 / unknown total touched by the diff.

Files read in this cell: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / .claude (codex:default)

FAIL

Review matrix: Compliance / .claude

Compliance

Review blocked; no PR findings established. Both file-read attempts exited with code 1 before returning content:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

Consequently, I could not read REVIEW.md, the request’s Verification section, the diff, or the changed files. Verification receipts, CI tree agreement, and Coverage completeness remain unassessed. This is an execution-environment failure, not evidence of a PR defect. MeMesh was also unavailable.

Files read: 0 / unknown total touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / .github (codex:default)

FAIL — review blocked; no code verdict.

Review matrix: Bugs / .github

Bugs

No findings established. File reads failed before execution with exit code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

Consequently, I could not read the request’s Verification section, REVIEW.md, the diff, or changed files. MeMesh was also unavailable. This cell requires a rerun with working repository access.

Files read: 0 / unknown total files touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Security / .github (codex:default)

FAIL

Review matrix: Security / .github

Security

Review blocked; no source findings established. Repository reads failed with exit code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

I could not read the request’s Verification section, REVIEW.md, constraint documents, diff, or changed files. No security approval is supported. MeMesh was also unavailable.

Files read: 0 / unknown total touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / .github (codex:default)

FAIL — Review blocked; no verdict on the request’s compliance.

Review matrix: Compliance / .github

Compliance

No findings could be established. Repository reads failed with exit code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

The diff, Verification section, REVIEW.md, constraint documents, and changed .github/ files were inaccessible. Verification receipts and Coverage remain unchecked. MeMesh was also unavailable.

Files read: 0 / unknown total touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / docs (codex:default)

FAIL

Review matrix: Bugs / docs

Bugs

Review blocked; no findings established. Both attempts to read .sdlc-run/review-350.diff exited with code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

No available Read tool or repository resource provided an alternative. I could not inspect the Verification section, REVIEW.md, constraints, or changed documents. MeMesh was also unavailable.

This status indicates an incomplete review, not a demonstrated defect. Rerun this cell with working repository read access.

Files read: 0 / unknown total touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Security / docs (codex:default)

FAIL

Review matrix: Security / docs

Security

Review blocked; no findings established. Both file-read attempts exited with code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

The diff, Verification section, REVIEW.md, and changed documents could not be read. This is an execution failure, not evidence of a security defect. MeMesh was also unavailable.

Files read: 0 / unknown total touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / docs (codex:default)

FAIL — Review blocked; no PR compliance verdict established.

Review matrix: Compliance / docs

Compliance

No findings established. Both attempts to read .sdlc-run/review-350.diff failed before execution with exit code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

Consequently, I could not read the Verification section, REVIEW.md, the constraint documents, or changed files. Verification receipts and Coverage remain unchecked. MeMesh was also unavailable.

Restore repository read access and rerun this cell.

Files read: 0 / unknown total touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / evals (codex:default)

FAIL — review blocked; no verdict on the code.

Review matrix: Bugs / evals

Bugs

No findings established. Repository reads failed before execution with exit code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

Consequently, REVIEW.md, the request’s Verification section, the diff, and changed files could not be inspected. MeMesh was also unavailable. Rerun this cell with working filesystem access.

Files read: 0 / unknown files touched by the diff.

Files read in this cell: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Security / evals (codex:default)

FAIL — review blocked; no code verdict.

Review matrix: Security / evals

Security

No findings could be established. Repository reads failed with exit code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

Consequently, REVIEW.md, the request’s Verification section, the diff, and changed evals/ files could not be inspected. MeMesh was also unavailable. This cell requires rerunning with working repository access.

Files read: 0 / unknown total files touched by the diff.

Files in this cell read: none.

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / evals (codex:default)

FAIL

Review matrix: Compliance / evals

Compliance

Review blocked; no repository findings established. Both file-read attempts exited with code 1:

bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted

I could not read REVIEW.md, the diff’s Verification section, the constraint documents, or changed evals/ files. Verification receipts and Coverage remain unassessed. MeMesh was also unavailable.

Files read: 0 / unknown total touched by the diff.

Files read in this cell: none.

"Done" in this repository now comes from the toolchain, not from the
agent's report. `npm run verify` runs build, verify:release, the isolated
suite, the packaged smoke and the dashboard e2e in order and, on green,
writes .verify/receipt.json bound to the git tree hash; any later edit
makes it stale. Claude Code project hooks (.claude/settings.json,
.claude/hooks/) refuse to end a session, commit or push without a fresh
receipt for the exact tree, refuse 20+ source lines on a branch with no
docs/plans/<slug>.md, and refuse any hand-written .verify/. ci.yml gains
an "SDLC verify" job that reruns the same steps and logs the tree hash
so a quoted receipt can be compared with what CI saw.

The stage workflows chain the artifacts: merging an accepted
intent/<slug>.md produces docs/specs/<slug>.md as a PR (sdlc-loop.yml),
merging that produces docs/plans/<slug>.md, merging that runs the build
stage on sdlc/<slug>; sdlc-review.yml reviews with a different model
than the implementer; sdlc-release.yml files a receipt after a release;
sdlc-monitor.yml bands the CI failure rate on main. All project values
live in sdlc/config.json; the scripts, hooks and prompts come from the
sdlc-loop skill pack and are generic.

memesh-specific: .gitignore stops ignoring all of .claude/ (four loop
paths are tracked, everything else stays local) and docs/plans/ (dated
scratch plans and the archive stay ignored); no public origin, so the
release receipt runs qa:post-release against the registry, which gains
--skip-machine (the runner is not an owner machine; reported NOT RUN);
nine verification-audit hits triaged in scripts/audit/baseline.json;
.nvmrc for the workflows; the PR template gets the Coverage table
REVIEW.md reads; intent/observation-forget-survives-stop.md is the first
intent, left as a draft (issue #346).

Not automated here: the model credential, SDLC_GITHUB_TOKEN, branch
protection and labels (scripts/sdlc/bootstrap.sh, owner-run).

Refs #349

[Verified-By: node scripts/verify.mjs exit=0, GREEN, receipt for tree 8e1d57c; npm run sdlc:test exit=0, 45 pass / 0 fail; node scripts/audit/verification-audit.mjs exit=0]
The model provider is now sdlc/config.json agent.provider (codex here;
claude and gemini are the other choices), built by scripts/sdlc/agent.mjs:
run-stage, review and the evals ask it for the command and read back
text, usage and tool calls in one shape. Workflows install the configured
CLI and check its credential by name; the review workflow runs
scripts/sdlc/review.mjs on any provider (one job, or a directory x pass
matrix) instead of a Claude-only action; bootstrap prompts for the
matching secret (OPENAI_API_KEY or the ChatGPT login file).

Fixes from the fresh-eyes review of the first commit: the evals step lost
node's exit code to tee (pipefail); the build stage could merge its own
request (allowlist narrowed, merged-request check after the run,
bootstrap explains the 0-vs-1 approval choice and reads the required
checks from sdlc/config.json ci.requiredChecks); actions pinned to commit
SHAs; @claude never runs fork code and fork PRs get a notice instead of a
red check; hooks fail closed on a malformed payload; the build step is
marked `regenerates` so the tracked dist/ no longer makes every first
receipt stale; another project's names removed from the templates;
monitor hourly with its artifact only on a breach; review prompt treats
diff text as data; stale doc paths corrected.

Refs #349

[Verified-By: node scripts/verify.mjs exit=0, GREEN, receipt for tree e816642; npm run sdlc:test exit=0, 55 pass / 0 fail; node scripts/audit/verification-audit.mjs exit=0]
The organization allows only GitHub-owned or its own actions, pinned to a
full commit SHA; CI and SDLC review failed at startup on the first push
(unpinned upload-artifact in ci.yml, anthropics/claude-code-action in
the review workflow). The @claude fix loop now lives in its own template
file, which this repository does not carry (provider is codex); the
review workflow uses GitHub-owned actions only.

Refs #349

[Verified-By: node scripts/verify.mjs exit=0, GREEN, receipt for tree 6a80cc1; npm run sdlc:test exit=0, 55 pass / 0 fail; node scripts/audit/verification-audit.mjs exit=0]
…stale runs, codex sandbox on runners

From the first real bootstrap and review runs on this PR:

- bootstrap step 1 skipped when a person typed "ChatGPT subscription"
  instead of the keyword; it now maps a number, the keyword or plain
  words and re-asks otherwise. Step 3 only printed an existing branch
  protection; it now diffs it against sdlc/config.json (required checks,
  admins) and offers the update.
- sdlc-review.yml: a new push cancels the review in flight (each matrix
  cell is a model run).
- agent.mjs: codex's Linux sandbox failed on the Ubuntu 24.04 runner
  ("bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted"), so
  every review cell reported FAIL with 0 files read; the install step
  now relaxes kernel.apparmor_restrict_unprivileged_userns on CI Linux
  and logs the outcome either way.
- baseline.json re-keyed for the moved lines.

Refs #349
…eipt

On a pull_request event GitHub checks out a merge commit; its tree
differs from the head's whenever main moved since the branch was cut, and
the receipt comparison REVIEW.md asks for then fails for no reason (first
run of #350 logged 326d37d while the local receipt was 6a80cc1). Strict
status checks still require the branch to be up to date before merging.

Refs #349

[Verified-By: node scripts/verify.mjs exit=0, GREEN, receipt for tree 7d63d9a (and 0763054 for the rebased tree before this commit); npm run sdlc:test exit=0, 55 pass / 0 fail]
The receipt and plan gates lived only in the Claude Code hook, so codex
or a person at a shell could commit and push without a receipt and be
caught only by CI. The decisions now live in scripts/sdlc/lib.mjs
(commitGate, pushGate), shared by the Claude Code hook and by
scripts/sdlc/git-gate.mjs, which the git hooks in scripts/sdlc/git-hooks/
call. scripts/sdlc/install-git-hooks.mjs copies them into the clone
(never over a hook it did not write, unless --force); package.json's
`prepare` runs it on every install, guarded so an unpacked tarball or a
machine without the file gets a skip line instead of a failure. On a CI
runner the gate lets the loop's own commits through and says so;
`git commit --no-verify` remains git's escape hatch, and the CI verify
job plus branch protection remain the gate nothing skips.

Refs #349

[Verified-By: node scripts/verify.mjs exit=0, GREEN, receipt for tree 89ee4ba; npm run sdlc:test exit=0, 59 pass / 0 fail (a real git commit refused without a receipt and allowed with one); node scripts/audit/verification-audit.mjs exit=0; npm run prepare in an unpacked package dir exit=0]
@github-actions

Copy link
Copy Markdown

Review matrix: Security / (root) (codex:default)

FAIL

Review matrix: Security / (root)

Security

  • Important — package.json:79, scripts/sdlc/install-git-hooks.mjs:26: Installation can introduce automatic code execution across unrelated repositories. The new prepare script runs the installer during npm install. Its destination follows core.hooksPath, which can name a shared global directory; it does not enforce clone-local installation. Read-only probe:

    $ git -c core.hooksPath=/tmp/review-shared-hooks rev-parse --git-path hooks
    /tmp/review-shared-hooks
    

    Exit code: 0. The installer copies executable hooks into that destination when the names are unused. Both hooks then execute scripts/sdlc/git-gate.mjs from whichever repository receives a commit or push. Consequently, after installing MeMesh, an unrelated untrusted repository can supply that path and obtain code execution during ordinary Git operations. Restrict automatic installation to this clone’s Git directory; require explicit opt-in for shared hook destinations.

Read in full: 9/68 changed files, including 5/5 root-cell files. Additional files: scripts/sdlc/install-git-hooks.mjs, scripts/sdlc/git-gate.mjs, scripts/sdlc/git-hooks/pre-commit, scripts/sdlc/git-hooks/pre-push.

Files read in this cell:

  • .gitignore
  • .nvmrc
  • CLAUDE.md
  • REVIEW.md
  • package.json

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / (root) (codex:default)

FAIL

Review matrix: Bugs / (root)

Bugs

  • [Bugs] Important — scripts/sdlc/lib.mjs:164: The commit gate accepts a receipt for different content than Git will commit. receiptStatus() hashes the entire working tree using a temporary index populated by git add -A (lines 50–63); commitGate() never compares the actual staging index with the receipt. After verifying two interdependent changes, staging only one still passes the gate, potentially committing broken code as verified. Compare the actual index tree with the receipt before allowing the commit. This finding is outside the root cell, traced from the new package.json preparation hook.

Read 14 of 68 changed files, including 5 of 5 root files. Evidence is source inspection; runtime tests were not run in the read-only environment.

Files read in this cell:

  • .gitignore
  • .nvmrc
  • CLAUDE.md
  • REVIEW.md
  • package.json

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / (root) (codex:default)

FAIL

Review matrix: Compliance / (root)

Compliance

  • Important — .sdlc-run/review-350.diff:54: Coverage omits five changed files. The diff touches 68 files; the table covers 63. Missing: scripts/sdlc/git-gate.mjs, scripts/sdlc/git-gate.test.mjs, scripts/sdlc/git-hooks/pre-commit, scripts/sdlc/git-hooks/pre-push, and scripts/sdlc/install-git-hooks.mjs. Add their QA, review, and simplification evidence.

  • Important — .sdlc-run/review-350.diff:17: Verification does not establish a result for the current candidate. The supplied receipt names tree e816642da7027b14e91e25e2eb906921469d3c1e; checked-out head 8ef9818d305cd351abd658a6460edac60f2c8cc0 has tree 89ee4ba1e0f66c673c26e54754b1d6e02dc78023. Supply current-head verification evidence and compare it with the CI journey tree. GitHub API access failed, so I could not independently establish the CI result or a CI-tree mismatch.

  • Important — CLAUDE.md:41: The change lacks its required plan and spec. The new policy requires a plan with Proof for non-trivial changes, and REVIEW.md:11 requires checking files, Proof, neighbouring flows, and the spec. git ls-tree shows only README and TEMPLATE files under both docs/plans/ and docs/specs/. There is no change-specific contract against which to assess this implementation.

  • Important — package.json:79: The development workflow changes without the required documentation sync. Installation now invokes a Git-hook installer, and lines 72–78 introduce verification and SDLC commands. CONTRIBUTING.md:26 requires development-workflow changes to update README and both locale versions; none changes. The contributor setup instructions also omit the new mandatory receipt workflow. Updating only CLAUDE.md leaves human contributors without the requirements now enforced on their commits and pushes.

Read in full: 13/68 changed files, including 5/5 root-cell files.

Root-cell files read:

  • .gitignore
  • .nvmrc
  • CLAUDE.md
  • REVIEW.md
  • package.json

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / .claude (codex:default)

FAIL

Review matrix: Bugs / .claude

Bugs

  • Important — .claude/hooks/pre-bash-gate.mjs:40: Quoted text triggers Git gates. Splitting on shell separators before parsing quotes treats commit messages and printed text as commands. Runtime probe: git commit -m 'fix: git status; git push fails without a receipt' returns ["commit","push"]; echo 'steps; git push origin main' returns ["push"]. This can block a verified commit or an ordinary read-only command. Tokenize separators with quote awareness.

  • Important — .claude/hooks/pre-bash-gate.mjs:114: Chained commit-and-push checks the wrong HEAD. For git commit -m x && git push, both gates execute before either command runs. With a fresh receipt for staged changes, the commit check succeeds, but the push check compares that receipt against the old HEAD and blocks the entire command. The native pre-push hook can check the resulting HEAD after the commit; the preliminary gate must account for command ordering.

  • Important — sdlc/config.json:11: The journey verifier’s startup command is invalid shell syntax. .claude/agents/journey-verifier.md:13 instructs it to execute commands.run, but that value includes an unquoted parenthetical explanation. Checking the configured command with bash --noprofile --norc -n -c produced exit 2: syntax error near unexpected token '('. The app cannot start through this configured flow. Move the explanation into a separate configuration field.

Read in full: 20/68 changed files, including 14/14 files in this cell. Full test suites were not run in the read-only workspace.

Files read in this cell:

  • .claude/agents/journey-verifier.md
  • .claude/hooks/hooks.test.mjs
  • .claude/hooks/lib.mjs
  • .claude/hooks/pre-bash-gate.mjs
  • .claude/hooks/protect-verify-dir.mjs
  • .claude/hooks/session-start.mjs
  • .claude/hooks/stop-receipt.mjs
  • .claude/sdlc/PR_TEMPLATE.md
  • .claude/sdlc/prompts/build.md
  • .claude/sdlc/prompts/diagnose.md
  • .claude/sdlc/prompts/plan.md
  • .claude/sdlc/prompts/review.md
  • .claude/sdlc/prompts/spec.md
  • .claude/settings.json

@github-actions

Copy link
Copy Markdown

Review matrix: Security / .claude (codex:default)

FAIL

Review matrix: Security / .claude

Security

  • Important — .claude/hooks/pre-bash-gate.mjs:81: Multi-line commands bypass receipt protection. The read-only allowlist permits newlines, so this command is accepted:

    cat .verify/receipt.json
    cp /tmp/forged-receipt.json .verify/receipt.json

    Non-mutating probe output: writesVerifyDir: false; the actual hook returned exit 0, with empty stdout/stderr. An agent can therefore replace the receipt without running verification. The receipt consumers accept a matching tree hash, allowing unverified work through the local gates. Validate every command in the shell input; add a regression test for newline-separated writes.

  • Important — .claude/hooks/lib.mjs:54: Path protection does not resolve symbolic links. path.resolve() normalizes spelling but does not identify the filesystem destination. A Write/Edit through a directory alias can therefore overwrite .verify/receipt.json. On this Linux runner, /proc/self/cwd resolved to the repository, but isVerifyPath("/proc/self/cwd/.verify/receipt.json") returned false and the actual protection hook returned exit 0. No write was executed. Resolve existing parent directories before checking containment, including when the target file does not yet exist; test symlink aliases.

Read in full: 19/68 changed files, including 14/14 files in this cell. Findings are limited to Security.

Files read in this cell:

  • .claude/agents/journey-verifier.md
  • .claude/hooks/hooks.test.mjs
  • .claude/hooks/lib.mjs
  • .claude/hooks/pre-bash-gate.mjs
  • .claude/hooks/protect-verify-dir.mjs
  • .claude/hooks/session-start.mjs
  • .claude/hooks/stop-receipt.mjs
  • .claude/sdlc/PR_TEMPLATE.md
  • .claude/sdlc/prompts/build.md
  • .claude/sdlc/prompts/diagnose.md
  • .claude/sdlc/prompts/plan.md
  • .claude/sdlc/prompts/review.md
  • .claude/sdlc/prompts/spec.md
  • .claude/settings.json

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / .claude (codex:default)

FAIL

Review matrix: Compliance / .claude

Compliance

  • [Compliance] Important — .sdlc-run/review-350.diff:25 and :54: Verification evidence does not cover the current candidate. The quoted receipt names tree e816642da7027b14e91e25e2eb906921469d3c1e; checked-out HEAD 8ef9818d305cd351abd658a6460edac60f2c8cc0 has tree 89ee4ba1e0f66c673c26e54754b1d6e02dc78023. Coverage also omits five changed files: scripts/sdlc/git-gate.mjs, scripts/sdlc/git-gate.test.mjs, scripts/sdlc/git-hooks/pre-commit, scripts/sdlc/git-hooks/pre-push, and scripts/sdlc/install-git-hooks.mjs. Supply current verification and complete coverage. CI comparison remains unverified: gh pr view 350 exited 1 with error connecting to api.github.com.

  • [Compliance] Important — .claude/hooks/hooks.test.mjs:38: Required hook-change evidence is missing. CONTRIBUTING.md:42 applies to any hook payload consumer and requires captured live payload fixtures, a real Claude Code installation test, and post-install hook-activity evidence. These tests construct payloads and spawn Node directly; the request’s real-session commit-blocking check remains unchecked (.sdlc-run/review-350.diff:42). Packaged doctor output does not establish host integration. Additionally, .claude/hooks/lib.mjs:43 permits silent exits without the required stderr trace. Complete the protocol before accepting these newly enabled hooks.

  • [Compliance] Important — .claude/sdlc/prompts/build.md:9: Automated builds use a PR template that omits mandatory contributor checks. The prompt explicitly selects .claude/sdlc/PR_TEMPLATE.md, which contains no “Docs synced” checklist or hook-protocol checklist. CONTRIBUTING.md:37 requires .github/pull_request_template.md and treats an unfilled documentation checklist as not ready for review. Use that canonical template and retain the additional receipt, Proof, and journey evidence.

  • [Compliance] Important — .claude/settings.json:14: The development-workflow change lacks required README updates. These settings activate commit, write, and session-ending gates for repository contributors. CONTRIBUTING.md:26 explicitly requires updating README and both locale parities when development workflow changes. None of those three files changes in this diff; updating CLAUDE.md and adding docs/sdlc/LOOP.md does not satisfy that requirement.

Plan/spec comparison was unavailable: tracked docs/plans/ and docs/specs/ contain only READMEs and templates, with no contract for this installation.

Read in full: 23/68 changed files, including 14/14 files in this cell. No passing runtime-test claim is made.

Files read in this cell:

  • .claude/agents/journey-verifier.md
  • .claude/hooks/hooks.test.mjs
  • .claude/hooks/lib.mjs
  • .claude/hooks/pre-bash-gate.mjs
  • .claude/hooks/protect-verify-dir.mjs
  • .claude/hooks/session-start.mjs
  • .claude/hooks/stop-receipt.mjs
  • .claude/sdlc/PR_TEMPLATE.md
  • .claude/sdlc/prompts/build.md
  • .claude/sdlc/prompts/diagnose.md
  • .claude/sdlc/prompts/plan.md
  • .claude/sdlc/prompts/review.md
  • .claude/sdlc/prompts/spec.md
  • .claude/settings.json

@github-actions

Copy link
Copy Markdown

Review matrix: Security / docs (codex:default)

FAIL

Review matrix: Security / docs

Security

  • Important — docs/sdlc/LOOP.md:60: The documented setup does not enforce human-only acceptance. It recommends zero required approvals for a maintainer-owned token while claiming agents cannot cross the acceptance gate. Bootstrap explicitly grants that token merge capability (scripts/sdlc/bootstrap.sh:122). The configured Codex build receives it through GH_TOKEN and runs without sandbox or approval restrictions (scripts/sdlc/agent.mjs:120). Once required checks pass, the agent can merge its own PR; the subsequent merged-request check cannot undo that mutation. Require an independently enforced human approval before merge, and remove the prevention claim for the zero-approval configuration.

Read in full: 5/5 files in this cell, out of 68 files touched by the diff.

  • docs/plans/README.md
  • docs/plans/TEMPLATE.md
  • docs/sdlc/LOOP.md
  • docs/specs/README.md
  • docs/specs/TEMPLATE.md

The installed-hook test ran a real git commit under GITHUB_ACTIONS, where
the gate lets the loop's own commits through by design, so the refusal
it asserted never happened on CI (Harness evals and SDLC verify red on
the previous push).

Refs #349

[Verified-By: node scripts/verify.mjs exit=0, GREEN, receipt for tree e78349c; GITHUB_ACTIONS=true npm run sdlc:test exit=0, 59 pass / 0 fail]
@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / evals (codex:default)

FAIL

Review matrix: Bugs / evals

Bugs

  • [Bugs] Important — evals/checks/consulted-receipt.mjs:6, evals/checks/mentions-plan-proof.mjs:7: Failed reads pass the behavioral checks. Both predicates match only tool-call text; readRun()’s normalization discards execution status and output. Consequently, an agent that receives permission errors without reading either document can still pass both evals.

    Reproduced by feeding the actual check scripts synthetic Codex transcripts containing failed cat .verify/receipt.json and cat CLAUDE.md commands (exit_code: 1, Permission denied). The plan transcript also contained the expected final-answer keywords. Actual results:

    consulted the receipt
    exit=0
    
    read plan docs: true; answer names docs/plans and Proof: true
    exit=0
    

    This lets failed behavior appear green. Preserve tool outcomes and require evidence of the intended operation completing; distinguish a receipt command legitimately reporting stale/missing state from a command that could not execute.

Read in full: 13/68 changed files, including 7/7 files in this cell. Model-backed evals and full verification were not run.

Files read in this cell:

  • evals/README.md
  • evals/cases/no-plan-no-build.json
  • evals/cases/verify-before-done.json
  • evals/checks/consulted-receipt.mjs
  • evals/checks/mentions-plan-proof.mjs
  • evals/lib.mjs
  • evals/run.mjs

@github-actions

Copy link
Copy Markdown

Review matrix: Security / (root) (codex:default)

PASS

Review matrix: Security / (root)

Security

No Important or Nit findings in this cell. No dependencies changed. Inspected the new prepare hook-installation path; checked that sensitive local files remain ignored.

Verification claims were read, but CI results were not independently confirmed.

Read in full: 5/5 cell files; 10/68 changed files overall, including supporting files.

Cell files read:

  • .gitignore
  • .nvmrc
  • CLAUDE.md
  • REVIEW.md
  • package.json

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / (root) (codex:default)

FAIL

Review matrix: Bugs / (root)

Bugs

  • Important — scripts/verify.mjs:44 (via package.json:72): Verification cannot run on Windows. resolveCommand() selects npm.cmd, but run() spawns it with shell: false. Windows rejects this with EINVAL, preventing the first build step and receipt creation. The existing scripts/lib/npm-bin.mjs documents and handles this exact failure. Use a Windows-compatible invocation with safe argument handling. CI runs this verifier only on Ubuntu, so the Windows matrix misses it. This is a source-backed finding; Windows reproduction was unavailable on this Linux runner.

Read in full: 13/68 changed files, including 5/5 root-cell files. Supporting changed files: the installer, verifier, SDLC config, CI workflow, and four plan/spec README/template files.

Files read in this cell:

  • .gitignore
  • .nvmrc
  • CLAUDE.md
  • REVIEW.md
  • package.json

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / (root) (codex:default)

FAIL

Review matrix: Compliance / (root)

Compliance

  • Important — .sdlc-run/review-350.diff:25: Verification covers the previous commit. The quoted tree, 4d23980cf1eed23fc2a0b1fbeab612638b69dc36, belongs to bf461ed2. Reviewed HEAD is 63432a71, tree e78349c8daf58a04bfaf95c103a9e4d15b09f7fa, with a subsequent test change. The body therefore lacks the required npm run verify result for HEAD. Rerun verification and update the receipt evidence. GitHub access failed (error connecting to api.github.com), so the CI tree comparison remains unverified.

  • Important — CLAUDE.md:41: No change-specific plan or spec is supplied. This introduces mandatory verification, commit/push gates, and stage automation across 68 files. Yet git ls-files docs/plans docs/specs returns only the four README/template files. There is no implementation contract whose files, Proof, or neighbouring flows can be checked under REVIEW.md:11. Supply the installation’s plan and corresponding spec; templates and trial evidence for a different feature do not establish compliance.

  • Important — package.json:79: Required development-workflow documentation is missing. The new prepare lifecycle installs Git hooks during dependency installation, while lines 72–78 introduce the verification and SDLC commands. CONTRIBUTING.md:26 explicitly requires updating README.md and both locale versions when the development workflow changes. None is changed. Document the installation effects and verification workflow in those required surfaces; updating CLAUDE.md alone does not satisfy the contributor contract.

Coverage: all 68 changed files have Coverage-table rows. Read 12/68 changed files in full, including 5/5 root-cell files.

Root-cell files read:

  • .gitignore
  • .nvmrc
  • CLAUDE.md
  • REVIEW.md
  • package.json

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / .claude (codex:default)

FAIL

Review matrix: Bugs / .claude

Bugs

  • Important — .claude/hooks/session-start.mjs:14: Compaction erases the verification baseline. The hook unconditionally overwrites the session’s original tree. SessionStart also fires after automatic or manual compaction (hook reference). Consequently, edits made before compaction become the baseline, and stop-receipt.mjs:30 allows stopping without verification. An in-memory probe executing the hook bodies with mocked storage returned before compact: {"exit":2} and after compact: {"exit":0} for the same modified tree with no receipt. Preserve an existing session baseline across compaction and resume.

  • Important — .claude/hooks/stop-receipt.mjs:37: Failed-verification reporting never reaches Claude. The failed/crashed-run branch calls allow(message), which prints plain stdout and exits 0. Successful Stop-hook stdout is not added to Claude’s context (output reference). The session therefore ends without receiving the instruction to report failure; an already-written success message can remain unchanged. The mocked failed-run probe returned exit: 0 with the reporting instruction only in the output text. Use a blocking response to require a corrected closing message, with bounded handling to prevent repeated blocking.

Coverage: 14/14 files in this cell, from 68 files touched by the diff. Probes used mocked dependencies; the filesystem-writing test suite was not run in the read-only sandbox.

Files read in this cell:

  • .claude/agents/journey-verifier.md
  • .claude/hooks/hooks.test.mjs
  • .claude/hooks/lib.mjs
  • .claude/hooks/pre-bash-gate.mjs
  • .claude/hooks/protect-verify-dir.mjs
  • .claude/hooks/session-start.mjs
  • .claude/hooks/stop-receipt.mjs
  • .claude/sdlc/PR_TEMPLATE.md
  • .claude/sdlc/prompts/build.md
  • .claude/sdlc/prompts/diagnose.md
  • .claude/sdlc/prompts/plan.md
  • .claude/sdlc/prompts/review.md
  • .claude/sdlc/prompts/spec.md
  • .claude/settings.json

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / .claude (codex:default)

FAIL

Review matrix: Compliance / .claude

Compliance

  1. Important — .sdlc-run/review-350.diff:25: Verification covers the preceding commit, not HEAD. The supplied receipt names tree 4d23980cf1eed23fc2a0b1fbeab612638b69dc36. Local Git identifies that as commit bf461ed; HEAD is 63432a7, tree e78349c8daf58a04bfaf95c103a9e4d15b09f7fa. The request therefore lacks the required verification result for the reviewed head. Rerun npm run verify and update the evidence. GitHub API access failed, so comparison with CI’s logged tree remains unverified.

  2. Important — .claude/hooks/hooks.test.mjs:38: Required live hook verification is missing. CONTRIBUTING.md:42 applies its protocol to any hook payload consumer, including these new hooks. The tests construct payloads inline and spawn Node directly; they provide no captured live-transcript fixture. The request’s actual Claude Code commit-gate exercise remains unchecked (.sdlc-run/review-350.diff:42), and its doctor evidence comes from packaged smoke, not the required post-install live session. Supply the captured fixtures and live installation/readback evidence before treating the hooks as verified.

  3. Important — .claude/sdlc/prompts/build.md:9: Automated builds use a template that omits mandatory contributor checks. This instructs the builder to use .claude/sdlc/PR_TEMPLATE.md, which contains neither the “Docs synced” checklist nor the hook-protocol verification checklist. CONTRIBUTING.md:37 requires .github/pull_request_template.md and its completed documentation checklist. Use that template, adding the plan, receipt and journey sections to it.

  4. Important — .claude/hooks/pre-bash-gate.mjs:7: This implementation has no reviewable plan or spec. The change introduces the nontrivial-change plan requirement but supplies only README.md and TEMPLATE.md under both docs/plans/ and docs/specs/. Neither describes this implementation’s files, Proof or neighbouring flows. Consequently, the required Compliance comparison cannot be performed. Add the concrete plan and associated specification covering the SDLC installation.

  5. Important — .claude/settings.json:2: The required development-workflow documentation update is absent. These project hooks introduce session-ending and tool-execution gates for contributors. CONTRIBUTING.md:26 explicitly requires updating README and its two locales when the development workflow changes. None appears in the 68-file diff; updates to CLAUDE.md and docs/sdlc/LOOP.md do not satisfy that requirement.

Coverage: read 14/14 changed files in this cell, within 68 total changed files. The request Coverage table includes all 68 paths. No tests were run in this read-only review.

Files read in this cell:

  • .claude/agents/journey-verifier.md
  • .claude/hooks/hooks.test.mjs
  • .claude/hooks/lib.mjs
  • .claude/hooks/pre-bash-gate.mjs
  • .claude/hooks/protect-verify-dir.mjs
  • .claude/hooks/session-start.mjs
  • .claude/hooks/stop-receipt.mjs
  • .claude/sdlc/PR_TEMPLATE.md
  • .claude/sdlc/prompts/build.md
  • .claude/sdlc/prompts/diagnose.md
  • .claude/sdlc/prompts/plan.md
  • .claude/sdlc/prompts/review.md
  • .claude/sdlc/prompts/spec.md
  • .claude/settings.json

@github-actions

Copy link
Copy Markdown

Review matrix: Security / .claude (codex:default)

FAIL

Review matrix: Security / .claude

Security

Important — .claude/hooks/pre-bash-gate.mjs:81: The read-only allowlist permits receipt writes. The regex accepts newlines and command substitutions after cat. For example:

cat /dev/null
node -e "require('fs').writeFileSync('.verify/receipt.json','{}')"

Read-only function probes returned:

Direct write:                 writesVerifyDir=true
Same write after cat/newline: writesVerifyDir=false
Same write inside cat $(…):   writesVerifyDir=false

All three returned no git subcommands, so the bypasses reach allow() at line 96. An agent can therefore write a forged receipt containing the current tree hash. scripts/sdlc/lib.mjs accepts matching hashes without authenticating the producer, allowing local verification gates to treat unverified work as green. CI verification remains separate.

Reject substitutions and additional commands in the read-only exception, and add regression tests for both shapes. Probes evaluated the guard functions only; no receipt was written.

Fully read 21 of 68 changed files, including 14 of 14 files in this cell.

Files read in this cell:

  • .claude/agents/journey-verifier.md
  • .claude/hooks/hooks.test.mjs
  • .claude/hooks/lib.mjs
  • .claude/hooks/pre-bash-gate.mjs
  • .claude/hooks/protect-verify-dir.mjs
  • .claude/hooks/session-start.mjs
  • .claude/hooks/stop-receipt.mjs
  • .claude/sdlc/PR_TEMPLATE.md
  • .claude/sdlc/prompts/build.md
  • .claude/sdlc/prompts/diagnose.md
  • .claude/sdlc/prompts/plan.md
  • .claude/sdlc/prompts/review.md
  • .claude/sdlc/prompts/spec.md
  • .claude/settings.json

@github-actions

Copy link
Copy Markdown

Review matrix: Security / .github (codex:default)

FAIL

Review matrix: Security / .github

Security

  • Important — .github/workflows/sdlc-review.yml:128: Unreviewed PR code executes with repository secrets. The job checks out the PR head at line 123, then executes its agent.mjs and review.mjs with all five model credentials and a write-capable GH_TOKEN. The matrix repeats this at lines 164–176; .github/workflows/sdlc-evals.yml:43 also executes PR-controlled code with credentials. A same-repository contributor or build agent can modify these scripts to extract credentials or fabricate review comments before human acceptance. Fork exclusion does not protect this path. Execute the review harness and configuration from a trusted revision, and isolate the candidate checkout from credentials.

  • Important — .github/workflows/sdlc-review.yml:181: Raw review transcripts can publish readable credentials. Installation writes CODEX_AUTH_JSON to the runner’s ~/.codex/auth.json (scripts/sdlc/agent.mjs:227). The reviewer runs as that same user with a read-only sandbox, without a restriction excluding this credential file. A successful prompt injection can therefore read it without needing write or network access. scripts/sdlc/review.mjs:53 saves tool output verbatim, and this workflow uploads it as an artifact; line 57 also posts final text without redaction. Isolate credentials from model-accessible tools and sanitize outputs before publication. This exposure remains even after trusting the harness.

Static review findings; no credential extraction was attempted.

Read 15 of 68 changed files in full, including 7 of 7 files in this cell.

Files read in this cell:

  • .github/pull_request_template.md
  • .github/workflows/ci.yml
  • .github/workflows/sdlc-evals.yml
  • .github/workflows/sdlc-loop.yml
  • .github/workflows/sdlc-monitor.yml
  • .github/workflows/sdlc-release.yml
  • .github/workflows/sdlc-review.yml

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / .github (codex:default)

FAIL

Review matrix: Compliance / .github

Compliance

  1. [Compliance] Important — .sdlc-run/review-350.diff:26: Verification covers the previous commit. The request quotes tree 4d23980cf1eed23fc2a0b1fbeab612638b69dc36, which git log identifies as commit bf461ed. Reviewed HEAD is 63432a7, tree e78349c8daf58a04bfaf95c103a9e4d15b09f7fa, with a subsequent test change. Supply an npm run verify result for this head. CI comparison remains unverified: gh pr checks exited 1 with error connecting to api.github.com. The Coverage table does include all 68 changed files.

  2. [Compliance] Important — .github/workflows/sdlc-review.yml:99: The matrix silently excludes directories beyond the first eight. head -8 truncates the directory inventory before generating pass assignments, while the whole-diff review job is disabled for large changes. A request touching nine directories therefore leaves the ninth without an assigned reviewer for any pass. This violates REVIEW.md’s complete-diff requirement and the directory-by-pass contract in docs/sdlc/LOOP.md. Remove the truncation or batch all directories with explicit coverage accounting.

  3. [Compliance] Important — .github/workflows/sdlc-release.yml:92: Generated release-receipt requests omit mandatory verification evidence. The workflow commits the receipt and constructs a request body containing only introductory text and Coverage. It neither runs npm run verify for the resulting tree nor includes a Verification section. Consequently, every request this workflow creates violates REVIEW.md’s mandatory head-bound verification requirement. Verify the completed candidate and include its closing output and receipt tree before opening the request.

  4. [Compliance] Important — docs/plans/README.md:3: This implementation has no reviewable plan or spec. Both docs/plans/ and docs/specs/ contain only README.md and TEMPLATE.md; the request identifies no implementation-specific artifacts. The workflow and hook changes therefore cannot be checked against the required file inventory, Proof, or neighbouring flows. Add the change’s plan and corresponding spec so the required compliance comparison is possible.

Read in full: 15/68 changed files, including 7/7 files in this cell.

Files read in this cell:

  • .github/pull_request_template.md
  • .github/workflows/ci.yml
  • .github/workflows/sdlc-evals.yml
  • .github/workflows/sdlc-loop.yml
  • .github/workflows/sdlc-monitor.yml
  • .github/workflows/sdlc-release.yml
  • .github/workflows/sdlc-review.yml

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / .github (codex:default)

FAIL

Review matrix: Bugs / .github

Bugs

  • Important — .github/workflows/sdlc-monitor.yml:48: Generated monitor intents cannot advance. The slug preserves underscores in metric names, producing values such as 2026-09-13-monitor-ci_failure_rate_main. next-stage.mjs rejects these through SLUG_RE, so accepting and merging the generated intent never starts its spec stage. A read-only probe exited 0 and reported accepted by next-stage=false for all five configured metrics. Normalize metric names to valid slugs.

  • Important — .github/workflows/sdlc-review.yml:33: A human comment cancels the active review without replacing it. Both comment triggers use the same concurrency group as the PR review, with cancel-in-progress: true. However, the scale and review jobs require event_name == 'pull_request'. Commenting during a review therefore cancels its remaining cells and starts a run that skips review entirely. Remove the unused comment triggers or isolate their concurrency groups. GitHub concurrency semantics.

  • Important — .github/workflows/sdlc-review.yml:99: Matrix generation silently drops directories after the eighth. head -8 truncates coverage without failing or scheduling a fallback. Executing the actual matrix-generation statement with ten directories exited 0 and omitted src and tests. Those directories receive no required review cells while scheduled jobs can finish green. Remove the truncation or explicitly batch all directories.

  • Important — .github/workflows/sdlc-loop.yml:119: Run-record uploads silently discard their entire payload. The upload targets hidden directories .sdlc-run/ and .verify/, but the pinned action defaults include-hidden-files to false. With if-no-files-found: ignore, the step succeeds without preserving the transcripts needed to investigate failed stages. Both review artifact uploads have the same defect. Explicitly include the intended hidden directories or copy selected records into a visible staging directory. Pinned action defaults.

Read in full: 16/68 changed files, including 7/7 files in this cell. Workflow findings are based on source inspection and the stated read-only probes; no Actions run was replayed.

Files read in this cell:

  • .github/pull_request_template.md
  • .github/workflows/ci.yml
  • .github/workflows/sdlc-evals.yml
  • .github/workflows/sdlc-loop.yml
  • .github/workflows/sdlc-monitor.yml
  • .github/workflows/sdlc-release.yml
  • .github/workflows/sdlc-review.yml

@github-actions

Copy link
Copy Markdown

Review matrix: Security / docs (codex:default)

FAIL

Review matrix: Security / docs

Security

  • Important — docs/sdlc/LOOP.md:60: The documented bootstrap does not enforce human-only merging. It permits a maintainer-owned token with zero required approvals, then claims agents cannot cross the acceptance gate. The implementation explicitly warns that this token can merge (scripts/sdlc/bootstrap.sh:122). The configured Codex build disables sandboxing and exposes token variables (scripts/sdlc/agent.mjs:115–126); the merged-request check runs only after the agent finishes (scripts/sdlc/run-stage.mjs:188–205). Consequently, an agent can merge its own green PR without human acceptance; failing the stage afterward cannot prevent that mutation. Require an independent approval boundary before enabling autonomous builds, and remove the documentation’s prevention claim for the zero-approval configuration.

Cell coverage: 5/5 changed documentation files, within 68 files touched by the diff. Static review; no live merge attempted.

Files read in this cell:

  • docs/plans/README.md
  • docs/plans/TEMPLATE.md
  • docs/sdlc/LOOP.md
  • docs/specs/README.md
  • docs/specs/TEMPLATE.md

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / docs (codex:default)

FAIL

Review matrix: Bugs / docs

Bugs

  • [Bugs] Important — docs/sdlc/LOOP.md:48: Release receipts do not prove the advertised SHA. MeMesh configures origin: null and checks the published npm version. scripts/sdlc/smoke-public.mjs:42–49 accepts the command’s exit status and returns runningSha: null; it does not compare the published artifact with the authorized commit. Two commits declaring the same version therefore receive the same package checks. Describing this as SHA verification lets an unverified revision appear verified. Document the actual version checks and their limitation, or implement artifact-to-commit verification.

  • [Bugs] Important — docs/sdlc/LOOP.md:31: The advertised @claude repair flow is absent. The workflow named at line 62, .github/workflows/sdlc-claude-address.yml, does not exist (exists=False). Although sdlc-review.yml subscribes to comments, its review jobs require github.event_name == 'pull_request'; it contains no comment-driven repair job. A member following these instructions gets no fixes pushed. Document the manual repair step or provide the missing workflow.

Runtime validation was limited: the smoke test exited 1, reporting could not run: spawnSync node EPERM. These findings rely on source inspection, not a passing runtime claim.

Cell coverage: 5/5 changed docs files, out of 68 files touched by the complete diff.

Files read in full in this cell:

  • docs/plans/README.md
  • docs/plans/TEMPLATE.md
  • docs/sdlc/LOOP.md
  • docs/specs/README.md
  • docs/specs/TEMPLATE.md

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / docs (codex:default)

FAIL

Review matrix: Compliance / docs

Compliance

  • Important — .sdlc-run/review-350.diff:25: Verification covers the previous commit. The quoted tree, 4d23980cf1eed23fc2a0b1fbeab612638b69dc36, belongs to bf461ed2. Reviewed HEAD is 63432a71, tree e78349c8daf58a04bfaf95c103a9e4d15b09f7fa, which changes scripts/sdlc/git-gate.test.mjs. Supply npm run verify evidence for this head. CI-log comparison remains unverified: gh pr view exited 1 with error connecting to api.github.com. The Coverage table does cover all 68 changed files.

  • Important — docs/plans/README.md:3: This implementation has no reviewable plan or spec. git ls-files docs/plans docs/specs returns only the four README/template files. There is no implementation contract naming this change’s files, Proof, risks, or neighbouring flows, despite introducing hooks, verification gates, and release automation. Add the concrete plan and supporting spec required by the Compliance pass; templates cannot establish implementation conformance.

  • Important — docs/sdlc/LOOP.md:48: The release guarantee exceeds what this repository checks. The document promises failure unless a public origin reports the authorized SHA. MeMesh configures origin: null and invokes qa:post-release --version … --skip-machine; smokeCommand() checks command exit status and returns runningSha: null. Consequently, a green receipt does not establish the advertised running-SHA comparison. Document the npm version verification and its limits, and link the release procedure in CONTRIBUTING.md.

  • Important — docs/sdlc/LOOP.md:31: The advertised comment-driven repair workflow is absent. This row promises that @claude addresses comments and pushes fixes, and line 62 names sdlc-claude-address.yml. The workflow inventory contains no such file. Contributors following this documented review flow have no corresponding automation. Remove the claim or provide the workflow and its verification.

  • Important — docs/sdlc/LOOP.md:41: The development-workflow change omits mandatory README updates. Installing commit/push gates on npm install materially changes contribution setup. CONTRIBUTING.md:26 explicitly requires updating README.md and both locale versions for development-workflow changes; none appears in this diff. Add the contributor-facing explanation or pointer and synchronize the translations.

Read in full: 10/68 changed files overall; 5/5 files in this cell.

Files read in this cell:

  • docs/plans/README.md
  • docs/plans/TEMPLATE.md
  • docs/sdlc/LOOP.md
  • docs/specs/README.md
  • docs/specs/TEMPLATE.md

@github-actions

Copy link
Copy Markdown

Review matrix: Security / evals (codex:default)

PASS

Review matrix: Security / evals

Security

No security findings in the seven changed evals/ files. Static review only; model-backed evaluations were not run.

Coverage: 7/7 files in this cell, out of 68 files touched by the diff.

Files read in full:

  • evals/README.md
  • evals/cases/no-plan-no-build.json
  • evals/cases/verify-before-done.json
  • evals/checks/consulted-receipt.mjs
  • evals/checks/mentions-plan-proof.mjs
  • evals/lib.mjs
  • evals/run.mjs

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / evals (codex:default)

FAIL

Review matrix: Bugs / evals

Bugs

  • [Bugs] Important — evals/checks/consulted-receipt.mjs:6, evals/checks/mentions-plan-proof.mjs:7: Both checkers accept path mentions as evidence of actual reads. They match command text without validating the operation or its result. This lets unsuccessful behavior produce green evals. Running the actual checkers against synthetic Codex transcripts reproduced:

    • echo npm run verify:receiptconsulted the receipt, exit 0.
    • cat .verify/receipt.json returning exit 1, Permission deniedconsulted the receipt, checker exit 0.
    • echo CLAUDE.md, followed by an answer mentioning docs/plans and Proofread plan docs: true; answer names docs/plans and Proof: true, exit 0.

    Preserve tool outcomes during normalization and require evidence of the relevant operation, distinguishing a receipt command reporting stale/missing state from an operation that never obtained any state.

Read 12/68 changed files in full, including 7/7 files in this cell. Model-backed evals were not run.

Files read in this cell:

  • evals/README.md
  • evals/cases/no-plan-no-build.json
  • evals/cases/verify-before-done.json
  • evals/checks/consulted-receipt.mjs
  • evals/checks/mentions-plan-proof.mjs
  • evals/lib.mjs
  • evals/run.mjs

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / intent (codex:default)

PASS

Review matrix: Bugs / intent

Bugs

No findings. The read-only workflow probe exited 0:

{"status":"draft","validSlug":true,"pending":[]}

Coverage: 3/3 files in this cell read in full; 7/68 changed files read in full overall. Verdict covers only Bugs / intent.

Files read in this cell:

  • intent/README.md
  • intent/TEMPLATE.md
  • intent/observation-forget-survives-stop.md

@github-actions

Copy link
Copy Markdown

Review matrix: Security / intent (codex:default)

PASS

Review matrix: Security / intent

Security

No security findings in the three changed intent/ files. No credentials, unsafe payloads, or instructions to bypass review were found. The proposed intent remains status: draft.

Coverage: 3/3 cell files, out of 68 files touched by the diff. Verdict covers only Security / intent.

Files read in this cell:

  • intent/README.md
  • intent/TEMPLATE.md
  • intent/observation-forget-survives-stop.md

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / intent (codex:default)

FAIL

Review matrix: Compliance / intent

Compliance

  • Important — .sdlc-run/review-350.diff:28: Verification covers the previous commit, not HEAD. The quoted receipt tree, 4d23980cf1eed23fc2a0b1fbeab612638b69dc36, belongs to bf461ed2. Reviewed HEAD is 63432a71, tree e78349c8daf58a04bfaf95c103a9e4d15b09f7fa. Supply an npm run verify result for this head and compare its receipt with the same head’s CI journeys output. CI comparison remains unverified: gh pr view exited 1 with error connecting to api.github.com.

No additional compliance findings in intent/. The intent remains draft; its corresponding spec and plan are not present.

Read in full: 10/68 changed files, including 3/3 files in this cell.

Cell files read:

  • intent/README.md
  • intent/TEMPLATE.md
  • intent/observation-forget-survives-stop.md

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / evals (codex:default)

FAIL

Review matrix: Compliance / evals

Compliance

  1. Important — .sdlc-run/review-350.diff:25: Verification covers the previous commit. The quoted tree, 4d23980cf1eed23fc2a0b1fbeab612638b69dc36, belongs to bf461ed2. Current head 63432a71 has tree e78349c8daf58a04bfaf95c103a9e4d15b09f7fa. The body therefore supplies no npm run verify result for this head. Refresh the verification evidence. GitHub API access failed, so the CI journeys tree remains unconfirmed.

  2. Important — evals/checks/consulted-receipt.mjs:6 and evals/checks/mentions-plan-proof.mjs:7: Both behavioral checks accept noncompliant runs. They match words in tool arguments without establishing that the required files were read or commands executed. I ran both actual checkers against synthetic Codex transcripts through stdin:

    • A single command, echo verify:receipt, produced consulted the receipt and exit 0.
    • A single command, printf CLAUDE.md, followed by “There is no requirement for docs/plans or Proof; start implementing immediately.” produced read plan docs: true; answer names docs/plans and Proof: true and exit 0.

    Neither transcript performs the required consultation. This contradicts the behavioral-evidence contract in evals/README.md:12 and lets failing behavior appear green. Validate actual operations and their results, with negative regression cases for these examples.

  3. Important — evals/run.mjs:1: No change-specific plan or spec supports this implementation. git ls-files docs/plans docs/specs returns only each directory’s README.md and TEMPLATE.md. There is no SDLC-adoption contract naming these eval files, their Proof, or neighbouring flows, as required by CLAUDE.md:41 and the Compliance pass. Add the applicable artifacts so implementation compliance can be assessed.

Read in full: 17/68 changed files, including 7/7 files in this cell. All 68 changed files have Coverage rows.

Files read in this cell:

  • evals/README.md
  • evals/cases/no-plan-no-build.json
  • evals/cases/verify-before-done.json
  • evals/checks/consulted-receipt.mjs
  • evals/checks/mentions-plan-proof.mjs
  • evals/lib.mjs
  • evals/run.mjs

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / scripts (codex:default)

FAIL

Review matrix: Bugs / scripts

Bugs

  • [Bugs] Important — scripts/verify.mjs:107: A failed rerun leaves the previous green receipt usable. The failure path records last-run.json but never invalidates receipt.json; receiptStatus() accepts the matching tree without checking the newer failure. An in-memory probe running green, then red on the same tree produced "secondOk":false,"lastRun":"failed","receiptState":"fresh","commitAllowed":true,"pushAllowed":true. Invalidate the receipt when verification fails or crashes.

  • [Bugs] Important — scripts/verify.mjs:44: Verification cannot launch npm on Windows. resolveCommand() selects npm.cmd, but run() spawns it with shell: false. The repository’s existing scripts/lib/npm-bin.mjs documents and handles this exact Windows failure. The first build step therefore cannot produce the receipt now required for local commits. Use the existing Windows-compatible invocation approach. This is a static finding; Windows execution was not replayed.

  • [Bugs] Important — scripts/sdlc/review.mjs:55: Missing review output still produces a successful job. When the provider returns no final text, the runner posts a diagnostic and resolves normally. A probe with a successful provider process and empty result produced "mainResolved":true,"postedFallback":true,"exitCode":0. Fail the job after recording the diagnostic so an incomplete review cannot appear successfully completed.

Probes used in-memory filesystem/process doubles. Full verification was not run in the read-only environment.

Read 35/68 changed files in full, including 26/26 files in this cell.

Files read in this cell:

  • scripts/audit/baseline.json
  • scripts/qa/post-release.mjs
  • scripts/sdlc/agent.mjs
  • scripts/sdlc/agent.test.mjs
  • scripts/sdlc/bootstrap.sh
  • scripts/sdlc/cli.mjs
  • scripts/sdlc/git-gate.mjs
  • scripts/sdlc/git-gate.test.mjs
  • scripts/sdlc/git-hooks/pre-commit
  • scripts/sdlc/git-hooks/pre-push
  • scripts/sdlc/host.mjs
  • scripts/sdlc/install-git-hooks.mjs
  • scripts/sdlc/lib.mjs
  • scripts/sdlc/lib.test.mjs
  • scripts/sdlc/monitor.mjs
  • scripts/sdlc/monitor.test.mjs
  • scripts/sdlc/next-stage.mjs
  • scripts/sdlc/next-stage.test.mjs
  • scripts/sdlc/review.mjs
  • scripts/sdlc/run-stage.mjs
  • scripts/sdlc/run-stage.test.mjs
  • scripts/sdlc/smoke-public.mjs
  • scripts/sdlc/smoke-public.test.mjs
  • scripts/verify-receipt.mjs
  • scripts/verify.mjs
  • scripts/verify.test.mjs

@github-actions

Copy link
Copy Markdown

Review matrix: Security / scripts (codex:default)

FAIL

Review matrix: Security / scripts

Security

  • Important — .github/workflows/sdlc-review.yml:128: Review executes untrusted PR code with secrets. The workflow checks out the PR head at line 123, then executes its scripts/sdlc/agent.mjs and scripts/sdlc/review.mjs with model credentials and a write-capable GH_TOKEN. The matrix repeats this pattern. A same-repository PR can change these scripts to extract credentials or fabricate findings before any sandbox starts. Run orchestration, configuration and review policy from a trusted revision; expose the candidate separately as review data.

  • Important — scripts/sdlc/review.mjs:53: Raw agent output can publish credentials. agent.mjs:126 inherits the entire environment, and subscription setup writes credentials to ~/.codex/auth.json without isolating that file from agent reads. The reviewer saves stdout verbatim and posts final text without redaction; the workflow uploads .sdlc-run/. An injected instruction that induces a credential read can therefore leak it through the transcript or comment despite filesystem write restrictions. A synthetic probe exited 0 and confirmed readAgentRetainsHostToken=true, readAgentRetainsOtherProviderCredential=true, and transcriptRetainsSentinel=true. Separate posting credentials from model execution, prevent tool access to authentication material, and sanitize persisted/published output.

  • Important — scripts/sdlc/bootstrap.sh:141: Existing protection can pass without the requested human approval gate. Selecting a machine-account token requests one approval and code-owner review, but the existing-protection check compares only required check names and enforce_admins. An existing configuration with zero approvals and no code-owner requirement is accepted without offering an update. Replaying the actual conditional with matching checks/admin enforcement and requested approvals=1 printed check: matches sdlc/config.json (all required checks present, admins included) and exited 0. Compare and verify the review requirements too; otherwise the machine token retains merge authority despite the selected protection.

CI verification could not be independently checked: the GitHub API request failed with error connecting to api.github.com. The Coverage table names all 68 changed files.

Read 32/68 changed files, including 26/26 files in this cell.

Files read in this cell:

  • scripts/audit/baseline.json
  • scripts/qa/post-release.mjs
  • scripts/sdlc/agent.mjs
  • scripts/sdlc/agent.test.mjs
  • scripts/sdlc/bootstrap.sh
  • scripts/sdlc/cli.mjs
  • scripts/sdlc/git-gate.mjs
  • scripts/sdlc/git-gate.test.mjs
  • scripts/sdlc/git-hooks/pre-commit
  • scripts/sdlc/git-hooks/pre-push
  • scripts/sdlc/host.mjs
  • scripts/sdlc/install-git-hooks.mjs
  • scripts/sdlc/lib.mjs
  • scripts/sdlc/lib.test.mjs
  • scripts/sdlc/monitor.mjs
  • scripts/sdlc/monitor.test.mjs
  • scripts/sdlc/next-stage.mjs
  • scripts/sdlc/next-stage.test.mjs
  • scripts/sdlc/review.mjs
  • scripts/sdlc/run-stage.mjs
  • scripts/sdlc/run-stage.test.mjs
  • scripts/sdlc/smoke-public.mjs
  • scripts/sdlc/smoke-public.test.mjs
  • scripts/verify-receipt.mjs
  • scripts/verify.mjs
  • scripts/verify.test.mjs

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / scripts (codex:default)

FAIL

Review matrix: Compliance / scripts

Compliance

  1. Important — .sdlc-run/review-350.diff:25: Verification covers the parent commit. The quoted tree, 4d23980cf1eed23fc2a0b1fbeab612638b69dc36, belongs to parent commit bf461ed2. git log shows reviewed HEAD 63432a71 has tree e78349c8daf58a04bfaf95c103a9e4d15b09f7fa. The body therefore lacks the head’s required verification result. GitHub API access failed, so the CI journey tree could not be independently compared. Rerun verification for HEAD and update the receipt evidence.

  2. Important — CLAUDE.md:41: The installation lacks its required implementation plan and spec. Both docs/plans/ and docs/specs/ contain only README.md and TEMPLATE.md. This substantial change includes 26 scripts files but supplies no change-specific file inventory, Proof, or neighbouring flows against which to perform the Compliance review required by REVIEW.md:11.

  3. Important — scripts/sdlc/agent.mjs:72: Build and review use the same provider default. sdlc/config.json:169 selects Codex without distinct stage models. A read-only probe returned {"provider":"codex","build":null,"review":null}; both invocations consequently omit a model selection. This violates REVIEW.md:3 and docs/sdlc/LOOP.md:46, which require different implementer and reviewer models. Configure distinct models and validate that requirement.

  4. Important — scripts/sdlc/run-stage.mjs:127: Generated artifact requests omit mandatory verification evidence. requestBody() produces Coverage but no Verification section; a direct invocation printed Generated request has Verification heading: false (exit 0). The non-build path commits, pushes, and opens the request without running verification. Spec, plan, and diagnosis requests therefore fail REVIEW.md:19 by construction. Produce and include verification evidence for their exact candidate tree.

  5. Important — scripts/sdlc/install-git-hooks.mjs:37: The development-workflow change lacks the required README update. package.json:79 automatically installs commit/push gates during npm install; contributors must now obtain receipts before committing. CONTRIBUTING.md:26 explicitly requires README and both locale updates for development-workflow changes, but none appears in the diff. Document this installation effect and the verification workflow in the required documentation.

Read in full: 36/68 changed files, including 26/26 files in this cell. No nits reported.

Files read in this cell:

  • scripts/audit/baseline.json
  • scripts/qa/post-release.mjs
  • scripts/sdlc/agent.mjs
  • scripts/sdlc/agent.test.mjs
  • scripts/sdlc/bootstrap.sh
  • scripts/sdlc/cli.mjs
  • scripts/sdlc/git-gate.mjs
  • scripts/sdlc/git-gate.test.mjs
  • scripts/sdlc/git-hooks/pre-commit
  • scripts/sdlc/git-hooks/pre-push
  • scripts/sdlc/host.mjs
  • scripts/sdlc/install-git-hooks.mjs
  • scripts/sdlc/lib.mjs
  • scripts/sdlc/lib.test.mjs
  • scripts/sdlc/monitor.mjs
  • scripts/sdlc/monitor.test.mjs
  • scripts/sdlc/next-stage.mjs
  • scripts/sdlc/next-stage.test.mjs
  • scripts/sdlc/review.mjs
  • scripts/sdlc/run-stage.mjs
  • scripts/sdlc/run-stage.test.mjs
  • scripts/sdlc/smoke-public.mjs
  • scripts/sdlc/smoke-public.test.mjs
  • scripts/verify-receipt.mjs
  • scripts/verify.mjs
  • scripts/verify.test.mjs

@github-actions

Copy link
Copy Markdown

Review matrix: Security / sdlc (codex:default)

PASS

Review matrix: Security / sdlc

Security

No security findings in sdlc/config.json. No embedded credentials, credential endpoint overrides, or reviewer-directed prompt injection found.

Static review only; CI receipt correspondence was not independently verified.

Cell coverage: 1/1 files, out of 68 files touched by the diff.

Files read in this cell:

  • sdlc/config.json — full file, lines 1–195.

@github-actions

Copy link
Copy Markdown

Review matrix: Bugs / sdlc (codex:default)

FAIL

Review matrix: Bugs / sdlc

Bugs

  • Important — sdlc/config.json:11: App-start command is invalid shell syntax. commands.run includes unquoted explanatory prose beginning with (MCP over HTTP...). .claude/agents/journey-verifier.md:13 tells the verifier to execute this value, so the configured journey cannot start the app. Parsing the exact value with bash -n produced:
    exit=2
    /bin/bash: line 1: syntax error near unexpected token `('
    
    Move the explanation into a separate JSON field and leave commands.run executable.

Read in full: 10/68 changed files, including 1/1 files in this cell.

Files read in this cell:

  • sdlc/config.json

@github-actions

Copy link
Copy Markdown

Review matrix: Compliance / sdlc (codex:default)

FAIL

Review matrix: Compliance / sdlc

Compliance

  • Important — .sdlc-run/review-350.diff:30: Verification covers the previous commit. The quoted receipt tree, 4d23980cf1eed23fc2a0b1fbeab612638b69dc36, belongs to bf461ed2. The reviewed HEAD is 63432a71, whose tree is e78349c8daf58a04bfaf95c103a9e4d15b09f7fa (git log --format='%h %T %s', exit 0). Supply a fresh npm run verify result for HEAD. CI comparison remains unverified: gh pr view exited 1 because GitHub’s API was unreachable.

  • Important — sdlc/config.json:172: Build and review use the same default model. REVIEW.md:3 requires different models; docs/sdlc/LOOP.md explicitly requires distinct agent.models.build and .review for non-Claude providers. Both fields are absent with provider codex. Calling modelFor returned {"build":null,"review":null} (exit 0), so both invocations omit model selection and use the same CLI default. Configure distinct models.

  • Important — sdlc/config.json:83: The plan gate excludes its own controlling configuration. sourcePrefixes omits sdlc/. Consequently, changes confined to verification commands, required checks, or model settings count as zero source lines in changedLinesOnSource. The read-only predicate checking whether sdlc/config.json matches any configured prefix returned false (exit 0). Include this configuration so substantive changes to the loop require the documented plan.

  • Important — docs/plans/README.md:3: This implementation has no reviewable plan or spec. Both artifact directories contain only README.md and TEMPLATE.md; no change-specific files define requirements, Proof, or neighbouring flows for this installation. This contradicts the non-trivial-change requirement in CLAUDE.md and prevents the plan/spec comparison required by REVIEW.md. Add the implementation’s contract artifacts.

Coverage table: all 68 changed files have rows. Changed files read in full: 15/68 overall; 1/1 in this cell.

Files read in this cell:

  • sdlc/config.json

@kevintseng
kevintseng merged commit 6a8e420 into main Sep 13, 2026
41 of 42 checks passed
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.

Adopt the SDLC loop: verify receipt, session/commit/push/plan gates, stage workflows

2 participants