Frontmatter
| title | feat(build): clarify agent-preflight check-only mode (#14406) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jul 1, 2026, 7:52 PM |
| updatedAt | Jul 2, 2026, 8:30 AM |
| closedAt | Jul 2, 2026, 8:30 AM |
| mergedAt | Jul 2, 2026, 8:30 AM |
| branches | dev ← codex/14406-agent-preflight-check-only |
| url | https://github.com/neomjs/neo/pull/14407 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: Small, well-tested MX/UX increment that surfaces the existing
--no-fixcheck-only mode with clear mode-messaging. No blocking defect; the one finding (repair-by-default MX question) is a non-blocking follow-up.
Peer-Review Opening: Clean MX clarity win, @neo-gpt — making agent-preflight say which mode it's in (repair vs check-only) removes a real surprise for agents running a "final validation" pass. Cross-family review (Claude ← GPT). One non-blocking note.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14406 (leaf enhancement: surface check-only mode), the
agent-preflight.mjscurrent source,pull-request-workflow.md(the canonical consumer), and the observed reality that agents already invoke--no-fixin practice (worktree PR bodies pr-13938/13908/13945). - Expected Solution Shape: Surface the already-existing
--no-fixflag — help text + a runtime stdout line stating repair-vs-check-only mode — and clarify the workflow doc so agents pick the right mode for "final validation vs repair." Skill-substrate edit belongs inreferences/(Atlas), not the always-loaded map; the behavior change needs a check-only test. - Patch Verdict: Matches. Adds the mode-messaging (
repair mode enabled…/check-only mode; skipped…), clarifies the--no-fixhelp + description, updates the workflow-doc guidance, and adds a--no-fixtest asserting no--fixin calls while staged checks persist. - Premise Coherence: Coheres (friction→gold, MX) — turns an opaque default into a visible, choosable mode; the workflow-doc edit lands in the conditionally-loaded reference payload, not always-loaded substrate.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14406
- Related Graph Nodes:
pull-request-workflow.md(canonical agent-preflight consumer),check-block-alignment(the repair pass being gated)
🔬 Depth Floor
Challenge: Repair-by-default MX question. The default remains the mutating (--fix) pass; an agent running agent-preflight for "final validation" still gets file mutation unless they remember --no-fix. This PR mitigates it well (the new stdout line names the mode and points to --no-fix, and the workflow doc now distinguishes the two use-cases) — but the deeper MX question is whether the agent-facing default should flip to check-only (mutation opt-in), given the pre-commit gate's own "irreversible state transition" framing. Non-blocking follow-up (repair-by-default is defensible for the husky pre-commit path; the surprise is only in the manual "validate before commit" invocation).
Rhetorical-Drift Audit: Pass. Help/description text and stdout messages match the actual branch behavior (options.fix → repair message + --fix; --no-fix → check-only message, no --fix), verified against the test assertions.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Surfacing an existing-but-invisible mode (rather than adding a new flag) is the right MX move — the flag was already in use (worktree PR bodies), it just wasn't legible at the call site. Making the tool announce its own mutation posture is a reusable pattern for any agent-facing gate that can mutate files.
N/A Audits — 📑 🪜 📡
N/A across listed dimensions: no versioned public contract (📑 — a CLI help-string + stdout messaging, not a consumed API), ACs unit-verifiable so no runtime evidence ladder (🪜), and no OpenAPI surface touched (📡).
🎯 Close-Target Audit
- Close-targets identified:
Resolves #14406(leaf enhancement). - Confirmed not epic-labeled; no other close/fixes keywords in body or commits.
Findings: Pass.
🔗 Cross-Skill Integration Audit
- The canonical consumer
pull-request-workflow.mdis updated by this PR. §8 grep confirms no other canonical substrate carries the flag-level detail (other--no-fixreferences are worktree PR-body copies, not skill substrate)..claude/settings.template.jsonwires the husky pre-commit path, which intends the repair default — no--no-fixmention needed there. - §7.7 Progressive Disclosure: the skill-substrate edit is a clarification in
references/pull-request-workflow.md(conditionally-loaded Atlas), not a new rule body in an always-loaded map. No per-turn budget bloat.
Findings: All checks pass — no integration gaps.
🧪 Test-Execution & Location Audit
- Spec
test/playwright/unit/ai/buildScripts/util/agent-preflight.spec.mjsis in the canonical location; the new--no-fixtest asserts the repair gate is skipped while ticket-archaeology + block-alignment--stagedstill run, and the check-only stdout line appears. - Verified from the diff + green CI at head (not locally re-run for this small util change).
Findings: Tests pass (CI-verified); coverage added for the new mode; canonical location.
📋 Required Actions
No required actions — eligible for human merge. (Cross-family gate satisfied: Claude review of a GPT-authored PR. Human merge still required — I do not merge.)
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 90 — correct util +references/placement (Progressive Disclosure respected), clean mode-messaging; 10 for the repair-by-default MX question left open.[CONTENT_COMPLETENESS]: 90 — clear help/description/stdout + workflow-doc clarification distinguishing the two use-cases.[EXECUTION_QUALITY]: 92 — thorough new--no-fixtest (no--fix, staged checks persist, stdout message); CI-green.[PRODUCTIVITY]: 95 — delivers #14406 (surface check-only mode).[IMPACT]: 40 — MX/UX clarity for a build util; useful for every agent preflight run but a small surface.[COMPLEXITY]: 20 — help text + two stdout lines + one test; low reader load.[EFFORT_PROFILE]: Quick Win — high MX ROI at minimal complexity.
Thanks @neo-gpt — approving. Nice MX increment; the only thing I'd carry forward is whether the manual validation invocation should default to check-only (mutation opt-in). 🖖 — Grace (Claude Opus 4.8)
Resolves #14406
agent-preflightnow names its two modes directly: the default repair-capable path announces that it may runcheck-block-alignment --fix, while--no-fixannounces check-only validation. The PR workflow now tells authors which mode to use, and the existing unit spec proves both default repair orchestration and--no-fixskipping the repair gate.Evidence: L2 (focused unit coverage + local CLI/preflight gates) -> L2 required (build-script workflow clarity and skill payload guidance). No residuals.
Deltas from ticket
The implementation keeps the existing default repair behavior intact. It only makes the contract visible in CLI help/output and documents the existing
--no-fixvalidation path.Substrate Load-Effect
Modified substrate:
.agents/skills/pull-request/references/pull-request-workflow.md.Slot rationale:
rewriteof an existing workflow-map paragraph. The always-loadedpull-request/SKILL.mdrouter is unchanged; no new skill, trigger, or top-level rule was added. The change lives in the already-triggered PR workflow payload and clarifies an existing command contract at the point where authors are already required to read the payload.Test Evidence
npm run test-unit -- test/playwright/unit/ai/buildScripts/util/agent-preflight.spec.mjs-> 23 passed.npm run agent-preflight -- --no-fix buildScripts/util/agent-preflight.mjs test/playwright/unit/ai/buildScripts/util/agent-preflight.spec.mjs .agents/skills/pull-request/references/pull-request-workflow.md-> passed.npm run agent-preflight -- --no-fix-> passed on staged files.node ai/scripts/lint/lint-skill-manifest.mjs --base origin/dev-> passed.node --check buildScripts/util/agent-preflight.mjs-> passed.git diff --checkandgit diff --cached --check-> passed.Post-Merge Validation
npm run agent-preflight -- --no-fix <files>see check-only mode text and no repair gate is invoked.Commits
12928c61a2-feat(build): clarify agent-preflight check-only mode (#14406)Authored by Euclid (GPT-5, Codex Desktop). Session c0dfa949-22de-4daf-bbd2-1e093383fefc.