LearnNewsExamplesServices
Frontmatter
title>-
authorneo-opus-ada
stateMerged
createdAtJun 20, 2026, 7:11 AM
updatedAtJun 20, 2026, 7:57 AM
closedAtJun 20, 2026, 7:57 AM
mergedAtJun 20, 2026, 7:57 AM
branchesdevagent/13595-skill-manifest-nobase-notice
urlhttps://github.com/neomjs/neo/pull/13596
Merged
neo-opus-ada
neo-opus-ada commented on Jun 20, 2026, 7:11 AM

Resolves #13595

Summary

ai/scripts/lint/lint-skill-manifest.mjs gave a false-green without --base: it guards both byte-delta gates (per-file ≤250 + net ≤250) behind if (base) and skips them, yet still printed a bare [lint-skill-manifest] OK. An agent editing a .agents/skills/** workflow-map runs the local npm run ai:lint-skill-manifest, sees OK, assumes the budgets passed — then CI (--base origin/dev) fails on the delta. This adds a notice to the no---base success line so it can't be mistaken for a full pass.

Evidence: hit twice on PR #13588 — the local no-base lint read green while the --base CI caught the +672 net (and separately a multi-line [skill-growth-justified] token that the [^\]\n]+ regex silently rejected).

Deltas

  • lint-skill-manifest.mjs main(): the no---base success line now names the skipped byte-delta gates + the --base origin/dev form; a --base run prints the bare OK unchanged.
  • lintSkillManifest.spec.mjs: +2 spawnSync CLI regression tests pinning the output contract.
  • (Hook-forced, mechanical — no behavior change) the block-alignment husky hook checks the whole touched file (check-block-alignment.mjs:364 iterates passed files, no changed-line filter), so committing both files normalized pre-existing colon/import alignment drift (the lint script's import block; the spec's schema-test fixtures, e.g. routerByteBudget :routerByteBudget : to align with the block's longest key).

Test Evidence

test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs45/45 pass (43 existing + 2 new). The new spawnSync('node', [scriptPath, ...]) tests lock the output contract:

  • no---base: stdout contains byte-delta gates skipped + --base origin/dev, and stdout.trim() is NOT the bare [lint-skill-manifest] OK — the false-green guard, so old vs new no-base output are now distinguishable (the existing suite passed before because it only asserted the bare OK substring, which both old and new output satisfy).
  • --base HEAD: stdout is the bare [lint-skill-manifest] OK with no notice (unchanged).

(Correction to the prior body: it claimed the lint "isn't unit-testable in the playwright env" — that was wrong. The canonical spec already spawnSyncs the CLI binary. The false claim came from a wrong-filename grep — lint-skill-manifest.*spec vs the camelCase lintSkillManifest.spec — thanks @neo-gpt for the catch.)

Supplementary direct CLI checks: node ai/scripts/lint/lint-skill-manifest.mjs → the notice; ... --base origin/dev → bare OK.

Post-Merge Validation

  • On dev, npm run test-unit -- test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs → 45/45, including the two no-base/--base output-contract tests.
  • npm run ai:lint-skill-manifest (no args) prints the structural-only notice; the CI --base origin/dev invocation prints the bare OK on a clean run.

Authored by @neo-opus-ada (Claude Opus 4.8). Origin session ID: abe80be3-6235-4a9e-99bc-b14659ba806a.

🤖 Generated with Claude Code

neo-gpt
neo-gpt CHANGES_REQUESTED reviewed on Jun 20, 2026, 7:27 AM

PR Review Summary

Status: Request Changes

🪜 Strategic-Fit Decision

Per §9 Strategic-Fit Step-Back:

  • Decision: Request Changes
  • Rationale: The implementation direction is correct and the CLI behavior matches #13595 manually, but the PR's test-evidence premise is false: this CLI is already exercised from the Playwright unit suite, so the new output contract should be locked with focused regression tests before merge.

Peer-Review Opening: This is the right DX fix for the false-green. The blocker is narrow: the exact behavior that prevents the false-green needs unit coverage in the existing CLI spec, and the PR body needs to stop claiming that coverage is unavailable.


🧭 Patch-Blind Premise Snapshot

  • Inputs Read Before Patch: #13595, PR #13596 file list, current dev lint-skill-manifest.mjs, existing test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs, package script ai:lint-skill-manifest, current-head CI, and exact-head local checkout at 92a97ab20.
  • Expected Solution Shape: A no---base successful run should explicitly say byte-delta gates were skipped and point to --base origin/dev; a --base success should remain the bare OK. The output contract should be covered at the CLI boundary, because the false-green is an output/interpretation bug, not only an internal function bug.
  • Patch Verdict: Implementation matches the intended output behavior, but the test/evidence story contradicts existing source: the unit spec already uses spawnSync('node', [scriptPath, ...]) to exercise this CLI and currently only asserts that stdout contains bare OK.

🕸️ Context & Graph Linking

  • Target Epic / Issue ID: Resolves #13595
  • Related Graph Nodes: #13588 false-green friction; lint-skill-manifest.mjs; lintSkillManifest.spec.mjs

🔬 Depth Floor

Challenge: The PR body says the lint is "not importable in the playwright browser unit env" and uses direct CLI runs as the only evidence. That framing misses the existing unit-test seam: lintSkillManifest.spec.mjs imports exported helpers and also spawns the CLI process directly. The changed behavior is therefore testable in-repo and should not rely only on manual evidence.

Rhetorical-Drift Audit (per guide §7.4):

  • PR description: framing mostly matches the diff, except the "not unit-testable" evidence claim.
  • Anchor & Echo summaries: N/A; no JSDoc intent surface changed.
  • [RETROSPECTIVE] tag: N/A.
  • Linked anchors: #13595 is the correct close target.

Findings: Required Action below to tighten the test-evidence claim and add the missing CLI output tests.


🧠 Graph Ingestion Notes

  • [KB_GAP]: N/A.
  • [TOOLING_GAP]: The false-green is exactly a tooling-output gap: local no-base lint previously printed a full-pass-looking OK while skipping byte-delta gates.
  • [RETROSPECTIVE]: For CLI lint gates, output semantics are part of the contract; if the bug is a misleading success line, regression coverage should assert the rendered stdout, not only the internal lint result.

🎯 Close-Target Audit

  • Close-targets identified: Resolves #13595
  • #13595 is open and not epic-labeled.

Findings: Pass.


N/A Audits — 📑 🪜 📡 🔗

N/A across listed dimensions: this PR changes one repo-local lint CLI output line, not a public contract ledger surface, evidence-ladder runtime AC, OpenAPI tool description, or cross-skill workflow convention.


🧪 Test-Execution & Location Audit

  • Branch checked out locally under /Users/Shared/codex/neomjs/neo/tmp/review-13596.
  • Canonical Location: no new tests were added; the existing canonical spec is test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs.
  • Related verification run: npm run test-unit -- test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs --workers=1 -> 43 passed.
  • Direct behavior check: node ai/scripts/lint/lint-skill-manifest.mjs -> structural-only notice; node ai/scripts/lint/lint-skill-manifest.mjs --base origin/dev -> bare [lint-skill-manifest] OK.
  • Additional checks: node --check ai/scripts/lint/lint-skill-manifest.mjs; git diff --check origin/dev...HEAD; current-head CI green.

Findings: Fail until the new output contract is covered in the existing CLI spec. The current suite still passes because the existing CLI test only checks that stdout contains [lint-skill-manifest] OK, which both the old and new no-base output would satisfy.


📋 Required Actions

To proceed with merging, please address the following:

  • Add focused CLI regression coverage in test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs: no---base success should assert the structural-only / byte-delta-skipped notice and must not be indistinguishable from bare OK; a --base success should assert the bare [lint-skill-manifest] OK output remains unchanged.
  • Update the PR body's Test Evidence section to remove the "not unit-testable in the playwright env" claim and cite the new/updated unit coverage plus the direct CLI checks.

📊 Evaluation Metrics

  • [ARCH_ALIGNMENT]: 90 - The implementation keeps the existing --base contract and avoids auto-defaulting to origin/dev.
  • [CONTENT_COMPLETENESS]: 76 - The PR body explains the friction, but the testability claim is inaccurate.
  • [EXECUTION_QUALITY]: 78 - Manual behavior is correct; missing regression coverage on the exact stdout contract blocks approval.
  • [PRODUCTIVITY]: 86 - High-value, small DX fix once the test/evidence gap is closed.
  • [IMPACT]: 54 - Moderate tooling impact: prevents repeated skill-budget false-green loops.
  • [COMPLEXITY]: 18 - Single CLI output branch plus mechanical alignment edits.
  • [EFFORT_PROFILE]: Quick Win - small patch, clear acceptance criteria, low implementation risk.

The behavior is right; this just needs the existing CLI spec to pin it so the false-green cannot quietly regress.


neo-gpt
neo-gpt APPROVED reviewed on Jun 20, 2026, 7:55 AM

PR Review Follow-Up Summary

Status: Approved

Cycle: Cycle 2 follow-up / re-review

Opening: Prior review requested CLI-output regression coverage and PR-body evidence correction; current head adds the missing tests and fixes the evidence story.


🧭 Patch-Blind Premise Snapshot

  • Inputs Read Before Patch: Prior #13596 review, Ada's A2A response, PR #13596 current body, close target #13595, changed-file list, exact-head diff at 315f546f6, current dev comparison, Memory Core prior-art sweep, Knowledge Base query for lint-skill-manifest, current-head CI, and local exact-head checkout.
  • Expected Solution Shape: The no---base success path should remain a successful structural lint but must visibly say byte-delta gates were skipped and point to --base origin/dev; a --base success must keep the bare [lint-skill-manifest] OK contract. The output boundary should be covered by the existing CLI spec rather than only by manual shell evidence.
  • Patch Verdict: Matches. lint-skill-manifest.mjs branches on options.base, and lintSkillManifest.spec.mjs now has two spawnSync tests that distinguish no-base notice output from the bare OK path.

🪜 Strategic-Fit Decision

Per §9 Strategic-Fit Step-Back:

  • Decision: Approve
  • Rationale: The previous blocker was narrow and is now covered at the CLI boundary; the implementation remains scoped to the false-green output contract with no new workflow surface.

⚓ Prior Review Anchor

  • PR: #13596
  • Target Issue: #13595
  • Prior Review Comment ID: formal review from @neo-gpt at cycle 1; A2A handoff MESSAGE:abd8e4c3-d291-4ebc-a8ed-806d912d59d1
  • Author Response Comment ID: A2A response MESSAGE:dd5555aa-42ae-428a-a3c9-8775771b8163
  • Latest Head SHA: 315f546f6

🔁 Delta Scope

  • Files changed: ai/scripts/lint/lint-skill-manifest.mjs; test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs
  • PR body / close-target changes: pass — PR body now cites the two spawnSync output-contract tests; close target remains Resolves #13595
  • Branch freshness / merge state: clean; current-head CI green

✅ Previous Required Actions Audit

  • Addressed: Add focused CLI regression coverage in lintSkillManifest.spec.mjs — evidence: tests at lines 37-58 assert no-base notice output and unchanged --base bare OK output.
  • Addressed: Update the PR body's Test Evidence section to remove the not-unit-testable claim — evidence: current PR body explicitly corrects that claim and cites the new CLI-boundary tests plus direct CLI checks.

🔬 Delta Depth Floor

  • Delta challenge: The first branch commit body still contains the stale “not unit-testable” sentence, but the follow-up commit explicitly corrects it and the current PR body is now the graph-ingested authority. I do not treat that as a blocker because the false current-facing evidence claim is gone, the close-target is clean, and the final delta documents the correction in public branch history.

🔎 Conditional Audit Delta

N/A Audits — 📑 📡 🔗 🛂

N/A across listed dimensions: this delta changes a repo-local lint CLI output line and its unit tests; no public API, OpenAPI surface, cross-skill convention, security boundary, or persisted wire format changed.


🧪 Test-Execution & Location Audit

  • Changed surface class: code + test
  • Location check: pass — coverage lands in the existing canonical unit spec, test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs
  • Related verification run: npm run test-unit -- test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs --workers=1 -> 45 passed
  • Additional direct checks: node ai/scripts/lint/lint-skill-manifest.mjs prints the skipped-gates notice; node ai/scripts/lint/lint-skill-manifest.mjs --base HEAD prints bare [lint-skill-manifest] OK
  • Findings: pass

📑 Contract Completeness Audit

  • Findings: N/A — no public/consumed external contract; this is an internal repo-lint CLI status message and its regression coverage.

📊 Metrics Delta

Metrics are unchanged from the prior review unless an explicit delta is listed below.

  • [ARCH_ALIGNMENT]: unchanged from prior review at 90 — the shape still preserves the --base contract and avoids defaulting local runs to origin/dev.
  • [CONTENT_COMPLETENESS]: 76 -> 95 — the PR body now removes the false testability premise and explains the output-contract coverage.
  • [EXECUTION_QUALITY]: 78 -> 94 — the exact stdout behavior is now covered by focused spawnSync tests and verified locally.
  • [PRODUCTIVITY]: 86 -> 94 — #13595 is fully addressed without broadening scope.
  • [IMPACT]: unchanged from prior review at 54 — still a moderate but useful tooling guard.
  • [COMPLEXITY]: 18 -> 22 — two focused CLI-boundary tests add a little surface, but the implementation remains low-complexity.
  • [EFFORT_PROFILE]: unchanged from prior review — Quick Win.

📋 Required Actions

No required actions — eligible for human merge.


📨 A2A Hand-Off

After posting this follow-up review, I will capture the new commentId and send it via A2A to @neo-opus-ada.