fix(verify-unixy-cli): defer ARG5 to verify-readme and correct the package rules #42

Merged
jercik merged 5 commits from align/verify-unixy-cli into main 2026-08-06 10:52:38 +00:00
Owner

ARG5 carried a second README contract that diverged from verify-readme (three required sections vs nine, "under 10 lines" vs one paragraph) — it now defers to verify-readme by name. PKG3 read as an exact ^14 requirement, failing any repo on commander 15, and now states a floor; PKG4 claimed inquirer is deprecated, which the registry does not support — the prefer-@inquirer/prompts guidance stays; INT2 gains INT1's alternatives carve-out so a CLI legitimately following INT3 passes. Philosophy stubs, ARG9, and heading structure untouched, as ruled.

ARG5 carried a second README contract that diverged from verify-readme (three required sections vs nine, "under 10 lines" vs one paragraph) — it now defers to verify-readme by name. PKG3 read as an exact `^14` requirement, failing any repo on commander 15, and now states a floor; PKG4 claimed `inquirer` is deprecated, which the registry does not support — the prefer-`@inquirer/prompts` guidance stays; INT2 gains INT1's alternatives carve-out so a CLI legitimately following INT3 passes. Philosophy stubs, ARG9, and heading structure untouched, as ruled.
fix(verify-unixy-cli): defer ARG5 to verify-readme and correct the package rules
Some checks failed
Node tests / node:test (pull_request) Successful in 35s
commit-msg / commitlint (pull_request) Successful in 43s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m54s
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 50s
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Failing after 51s
PR Review / forgejo-review-approach-3 generator (pull_request_target) Failing after 51s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Successful in 2m23s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 3m22s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 3m43s
c0be53cc44
forgejo-actions left a comment

Approach review: The approach is sound.

  • ARG5 deferral is the right call. Two competing README contracts in one repo is the actual defect, and pointing ARG5 at verify-readme removes the duplicate rather than trying to keep the two in sync. I checked skills/verify-readme/SKILL.md: it covers everything ARG5 dropped — CLI pipeline patterns in the Usage section, and an Agent Rule template that requires npx -y <tool> --help first plus a why-not-how paragraph. Nothing was lost in the move. Cross-skill reference by name also matches existing practice (verify-readme invokes human-facing-writing-style the same way).
  • The two package corrections match the registry. commander latest is 15.0.0 and @commander-js/extra-typings latest is 15.0.0, so the old ^14.0.0 phrasing would have failed a current, correct project; the floor wording fixes that without inventing a ceiling. inquirer latest (14.0.2) carries no deprecation marker on the registry, so dropping the deprecation claim while keeping the modularity/tree-shaking/TypeScript rationale for @inquirer/prompts keeps the rule true and still actionable.
  • The INT2 carve-out is copied verbatim from INT1, which is correct given each reference file is read standalone — a pointer-only note would leave a reader who opened INT2 alone unable to tell that INT3 is an accepted alternative. The added --dry-run clause is the meaningful delta and it is stated explicitly.

No dangling references remain: the only other README mention (ARG8's Requirements section) is independent of ARG5 and is also covered by verify-readme's Requirements slot. One small durability note on the ARG5 file below.

Approach review by Claude Code Opus (opus)

**Approach review:** The approach is sound. - **ARG5 deferral is the right call.** Two competing README contracts in one repo is the actual defect, and pointing ARG5 at `verify-readme` removes the duplicate rather than trying to keep the two in sync. I checked `skills/verify-readme/SKILL.md`: it covers everything ARG5 dropped — CLI pipeline patterns in the Usage section, and an Agent Rule template that requires `npx -y <tool> --help` first plus a why-not-how paragraph. Nothing was lost in the move. Cross-skill reference by name also matches existing practice (`verify-readme` invokes `human-facing-writing-style` the same way). - **The two package corrections match the registry.** `commander` latest is 15.0.0 and `@commander-js/extra-typings` latest is 15.0.0, so the old `^14.0.0` phrasing would have failed a current, correct project; the floor wording fixes that without inventing a ceiling. `inquirer` latest (14.0.2) carries no deprecation marker on the registry, so dropping the deprecation claim while keeping the modularity/tree-shaking/TypeScript rationale for `@inquirer/prompts` keeps the rule true and still actionable. - **The INT2 carve-out is copied verbatim from INT1**, which is correct given each reference file is read standalone — a pointer-only note would leave a reader who opened INT2 alone unable to tell that INT3 is an accepted alternative. The added `--dry-run` clause is the meaningful delta and it is stated explicitly. No dangling references remain: the only other README mention (ARG8's Requirements section) is independent of ARG5 and is also covered by `verify-readme`'s Requirements slot. One small durability note on the ARG5 file below. _Approach review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjQyIiwiaGVhZFNoYSI6ImMwYmU1M2NjNDQyYzBkN2U0NWViMGZhMTFiNjBkN2FlMzYyNTYxMzIiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctYXBwcm9hY2gtc21hcnQtMSIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxNzM5NSIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiJjODM1OTg2YS03MGM4LTQwNTktOTRmZC1hZWNiZDg5OWNiM2QifQ== -->
@ -34,3 +5,1 @@
- Verify the rule tells agent to run `--help` first
- Verify the rule explains WHY (not HOW) to use the tool
- Confirm the rule is concise (under 10 lines)
**How to verify**: Apply the verify-readme skill to the CLI's README.

Deferring to verify-readme is the right structure, but ARG5 now has zero self-contained content, and skills here are selected per run — a session that loads verify-unixy-cli without verify-readme gets a rule that says only "apply a skill you do not have," and the auditor either skips ARG5 or improvises a contract.

Consider keeping a one-line fallback so the rule degrades instead of vanishing, e.g. "If verify-readme is unavailable, check at minimum for a Quick Start, CLI-composition examples in Usage, and an Agent Rule section." That preserves the single source of truth (no second contract to drift) while leaving the rule verifiable on its own.

Deferring to `verify-readme` is the right structure, but ARG5 now has zero self-contained content, and skills here are selected per run — a session that loads `verify-unixy-cli` without `verify-readme` gets a rule that says only "apply a skill you do not have," and the auditor either skips ARG5 or improvises a contract. Consider keeping a one-line fallback so the rule degrades instead of vanishing, e.g. "If `verify-readme` is unavailable, check at minimum for a Quick Start, CLI-composition examples in Usage, and an Agent Rule section." That preserves the single source of truth (no second contract to drift) while leaving the rule verifiable on its own.
Author
Owner

Deliberate decision — not changing. ARG5 stays a pure by-name deferral to verify-readme, with no local fallback list. The suggested minimum-sections line would reintroduce a second, smaller README contract inside this file, which is exactly the drift-prone shape this PR removes: the previous local contract had already diverged from verify-readme (three required sections vs nine). When verify-readme is not part of the run, skipping ARG5 (a Warning-severity rule) is the intended degradation; a mini-contract that ages independently would fail worse than an honest skip.

Deliberate decision — not changing. ARG5 stays a pure by-name deferral to `verify-readme`, with no local fallback list. The suggested minimum-sections line would reintroduce a second, smaller README contract inside this file, which is exactly the drift-prone shape this PR removes: the previous local contract had already diverged from `verify-readme` (three required sections vs nine). When `verify-readme` is not part of the run, skipping ARG5 (a Warning-severity rule) is the intended degradation; a mini-contract that ages independently would fail worse than an honest skip.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Reviewed the six changed skill/reference files. The substantive claims in the PR check out: commander and @commander-js/extra-typings are both at 15.0.0 on the registry (so the old ^14.0.0 phrasing did fail current repos), the registry lists no deprecated inquirer versions (latest 14.0.2), and verify-readme does cover everything ARG5 dropped (Quick Start §3, pipeline patterns §4, Agent Rule §8 + template). Three issues found: 1 medium, 2 low.

  • Medium — INT2's How to verify line still demands --force, contradicting the new INT3 carve-out note directly above it.
  • Low — ARG3's rewritten npx rationale claims bare npx prompts in CI; npm suppresses the prompt under non-TTY/CI.
  • Low — ARG5 is now empty without verify-readme, which isn't guaranteed to be delivered in the same run.

Code review by Claude Code Opus (opus)

**Summary:** Reviewed the six changed skill/reference files. The substantive claims in the PR check out: `commander` and `@commander-js/extra-typings` are both at 15.0.0 on the registry (so the old `^14.0.0` phrasing did fail current repos), the registry lists no deprecated `inquirer` versions (latest 14.0.2), and `verify-readme` does cover everything ARG5 dropped (Quick Start §3, pipeline patterns §4, Agent Rule §8 + template). Three issues found: 1 medium, 2 low. - **Medium** — INT2's `How to verify` line still demands `--force`, contradicting the new INT3 carve-out note directly above it. - **Low** — ARG3's rewritten `npx` rationale claims bare `npx` prompts in CI; npm suppresses the prompt under non-TTY/CI. - **Low** — ARG5 is now empty without `verify-readme`, which isn't guaranteed to be delivered in the same run. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjQyIiwiaGVhZFNoYSI6ImMwYmU1M2NjNDQyYzBkN2U0NWViMGZhMTFiNjBkN2FlMzYyNTYxMzIiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE3Mzk1Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjY2NWQ5ZGNiLWFkMjctNDM1NS1iZjYxLTExMDcxNmI4YWQ4NiJ9 -->
@ -15,3 +15,3 @@
**Pipeline examples**: CLIs that output data should include an example showing how to filter, sort, or aggregate output using standard Unix tools. This teaches composability and demonstrates the output format is pipe-friendly. Skip if the CLI doesn't produce pipe-friendly output.
**npx example format**: If an example runs the CLI through `npx`, use `npx -y` explicitly (for example, `npx -y mycli --help`). Do not use bare `npx`. This avoids interactive install prompts and keeps examples deterministic in fresh environments and CI.
**npx example format**: If an example runs the CLI through `npx`, use `npx -y` explicitly (for example, `npx -y mycli --help`) — bare `npx` stops on an interactive install prompt in fresh environments and CI.

🟢 Low: The new rationale overstates what bare npx does in CI. In libnpmexec (checked against npm 11.17.0, lib/index.js), the install confirmation is only read when stdin is a TTY and CI is not detected; under noTTY() || ciInfo.isCI it logs The following package was not found and will be installed: … and proceeds. So bare npx doesn't stop on a prompt in CI — it stops only in an interactive shell without the package cached (and --no / npm_config_yes=false turns it into a hard error). The previous wording ("avoids interactive install prompts and keeps examples deterministic") was accurate; consider e.g. "— bare npx stops on an interactive install prompt when the package isn't cached locally."

🟢 **Low:** The new rationale overstates what bare `npx` does in CI. In `libnpmexec` (checked against npm 11.17.0, `lib/index.js`), the install confirmation is only read when stdin is a TTY and CI is not detected; under `noTTY() || ciInfo.isCI` it logs `The following package was not found and will be installed: …` and proceeds. So bare `npx` doesn't stop on a prompt in CI — it stops only in an interactive shell without the package cached (and `--no` / `npm_config_yes=false` turns it into a hard error). The previous wording ("avoids interactive install prompts and keeps examples deterministic") was accurate; consider e.g. "— bare `npx` stops on an interactive install prompt when the package isn't cached locally."
Author
Owner

Fixed in 17d3bb5 with the suggested wording: the rationale now says bare npx stops on an interactive install prompt when the package isn't cached locally, dropping the CI claim — matching the libnpmexec behavior you cite (prompt only when TTY and not CI).

Fixed in 17d3bb5 with the suggested wording: the rationale now says bare `npx` stops on an interactive install prompt when the package isn't cached locally, dropping the CI claim — matching the `libnpmexec` behavior you cite (prompt only when TTY and not CI).
jercik marked this conversation as resolved
@ -34,3 +5,1 @@
- Verify the rule tells agent to run `--help` first
- Verify the rule explains WHY (not HOW) to use the tool
- Confirm the rule is concise (under 10 lines)
**How to verify**: Apply the verify-readme skill to the CLI's README.

🟢 Low: ARG5 now has no self-contained content, so it fails closed when verify-readme isn't part of the run. axskills delivers only the selected skills per launch, and verify-unixy-cli can be selected without verify-readme; an agent that can't resolve the skill has nothing left to check here. (verify-readme -> human-facing-writing-style degrades gracefully — only prose polish is lost — whereas this leaves the whole rule empty.) A one-line fallback would close the gap, e.g. "If the verify-readme skill isn't available, check at minimum for a Quick Start, pipeline examples (ARG3 criteria), and an Agent Rule section that points at npx -y <cli> --help."

🟢 **Low:** ARG5 now has no self-contained content, so it fails closed when `verify-readme` isn't part of the run. `axskills` delivers only the selected skills per launch, and `verify-unixy-cli` can be selected without `verify-readme`; an agent that can't resolve the skill has nothing left to check here. (`verify-readme` -> `human-facing-writing-style` degrades gracefully — only prose polish is lost — whereas this leaves the whole rule empty.) A one-line fallback would close the gap, e.g. "If the verify-readme skill isn't available, check at minimum for a Quick Start, pipeline examples (ARG3 criteria), and an Agent Rule section that points at `npx -y <cli> --help`."
Author
Owner

Deliberate decision — not changing. ARG5 stays a pure by-name deferral to verify-readme, with no local fallback list. The suggested minimum-sections line would reintroduce a second, smaller README contract inside this file, which is exactly the drift-prone shape this PR removes: the previous local contract had already diverged from verify-readme (three required sections vs nine). When verify-readme is not part of the run, skipping ARG5 (a Warning-severity rule) is the intended degradation; a mini-contract that ages independently would fail worse than an honest skip.

Deliberate decision — not changing. ARG5 stays a pure by-name deferral to `verify-readme`, with no local fallback list. The suggested minimum-sections line would reintroduce a second, smaller README contract inside this file, which is exactly the drift-prone shape this PR removes: the previous local contract had already diverged from `verify-readme` (three required sections vs nine). When `verify-readme` is not part of the run, skipping ARG5 (a Warning-severity rule) is the intended degradation; a mini-contract that ages independently would fail worse than an honest skip.
jercik marked this conversation as resolved
@ -2,6 +2,8 @@
Default behavior should be non-destructive. Destructive operations must refuse without `--force`/`-f` and provide `--dry-run` to preview what would happen.
> **Note:** INT3 provides a less strict alternative for destructive-operation confirmations. A CLI that follows INT3 instead of the strict `--force`-only approach here is compliant — see INT3 for requirements. The `--dry-run` requirement applies either way.

🟡 Medium: The new carve-out isn't reflected in the rule's checklist. The last line of this file still reads "Verify destructive actions refuse by default without --force", so a verifier that jumps to How to verify (which the SKILL.md workflow encourages) will still fail an INT3-style CLI — exactly the false failure this note is meant to prevent. Update the closing line to something like: "Check for --dry-run and --force. Verify destructive actions are non-destructive by default: either refusing without --force, or gating behind an INT3-compliant confirmation." (INT1's How to verify bullet — "Verify destructive operations refuse without --force, not prompt for confirmation" — has the same unpatched contradiction with its own note, though that file is outside this diff.)

🟡 **Medium:** The new carve-out isn't reflected in the rule's checklist. The last line of this file still reads "Verify destructive actions refuse by default without `--force`", so a verifier that jumps to **How to verify** (which the SKILL.md workflow encourages) will still fail an INT3-style CLI — exactly the false failure this note is meant to prevent. Update the closing line to something like: "Check for `--dry-run` and `--force`. Verify destructive actions are non-destructive by default: either refusing without `--force`, or gating behind an INT3-compliant confirmation." (INT1's `How to verify` bullet — "Verify destructive operations refuse without `--force`, not prompt for confirmation" — has the same unpatched contradiction with its own note, though that file is outside this diff.)
Author
Owner

Fixed in 17d3bb5. The closing line now reads: "Verify destructive actions are non-destructive by default: either refusing without --force, or gating behind an INT3-compliant confirmation." Also applied the same correction to INT1's third How-to-verify bullet, which carried the identical contradiction with its own INT3 note — the two files' carve-outs are deliberately kept in lockstep.

Fixed in 17d3bb5. The closing line now reads: "Verify destructive actions are non-destructive by default: either refusing without `--force`, or gating behind an INT3-compliant confirmation." Also applied the same correction to INT1's third How-to-verify bullet, which carried the identical contradiction with its own INT3 note — the two files' carve-outs are deliberately kept in lockstep.
jercik marked this conversation as resolved
fix(verify-unixy-cli): align INT verify checklists with the INT3 carve-out and correct the npx claim
Some checks failed
Node tests / node:test (pull_request) Successful in 15s
commit-msg / commitlint (pull_request) Successful in 27s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m52s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 1m1s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 4m6s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 4m24s
17d3bb55c0
forgejo-actions left a comment

Summary: Found 2 medium and 1 low issue in a documentation-only change to the verify-unixy-cli skill.

I checked the registry claims the PR rests on: commander is at 15.0.0 and @commander-js/extra-typings also publishes 15.0.0, so PKG3's new floor wording and its ^15.0.0 example are accurate; inquirer is at 14.0.2 (published 2026-05-31) with no npm deprecated field, so removing the "deprecated" claim from PKG4 is correct. The ARG5 deferral does not lose much substance — verify-readme covers the Agent Rule template (with npx -y) and CLI pipeline patterns.

The remaining findings are residual inconsistencies in the two lines this PR rewrote: INT2's verify step still demands --force unconditionally despite the new INT3 carve-out, and PKG3's verify step still requires @commander-js/extra-typings for JavaScript-only CLIs.

Code review by Claude Code Opus (opus)

**Summary:** Found 2 medium and 1 low issue in a documentation-only change to the `verify-unixy-cli` skill. I checked the registry claims the PR rests on: `commander` is at `15.0.0` and `@commander-js/extra-typings` also publishes `15.0.0`, so PKG3's new floor wording and its `^15.0.0` example are accurate; `inquirer` is at `14.0.2` (published 2026-05-31) with no npm `deprecated` field, so removing the "deprecated" claim from PKG4 is correct. The ARG5 deferral does not lose much substance — `verify-readme` covers the Agent Rule template (with `npx -y`) and CLI pipeline patterns. The remaining findings are residual inconsistencies in the two lines this PR rewrote: INT2's verify step still demands `--force` unconditionally despite the new INT3 carve-out, and PKG3's verify step still requires `@commander-js/extra-typings` for JavaScript-only CLIs. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjQyIiwiaGVhZFNoYSI6IjE3ZDNiYjU1YzBhNTNkNjRkMjU2ODYzYWYxNjhiMDM5ZjQ4YWJmNjgiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE3NDY5Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjcyMTY3OGFjLTM2NGUtNDJkYy05ZWNjLTkwYmNkZjQyNTY5YiJ9 -->
@ -1,36 +1,5 @@
# ARG5. README Quality (Warning)
The README must include these sections:
The verify-readme skill is the canonical README contract — required sections, their order, and the agent-rule requirements all live there. Audit the README against that skill.

🟢 Low: The rule now has no self-contained content: if verify-readme isn't part of the run's skill selection, ARG5 becomes unverifiable with nothing to fall back on. axskills delivers a per-run selection, so co-delivery isn't guaranteed. Consider pointing at the file (skills/verify-readme/SKILL.md in this source) and adding a one-line fallback for when the skill isn't loaded — e.g. check for Quick Start, CLI pipeline examples in Usage, and an Agent Rule section. Cross-skill references are established here (verify-readme invokes human-facing-writing-style), so this is about the missing fallback, not the deferral itself.

🟢 **Low:** The rule now has no self-contained content: if `verify-readme` isn't part of the run's skill selection, ARG5 becomes unverifiable with nothing to fall back on. `axskills` delivers a per-run selection, so co-delivery isn't guaranteed. Consider pointing at the file (`skills/verify-readme/SKILL.md` in this source) and adding a one-line fallback for when the skill isn't loaded — e.g. check for Quick Start, CLI pipeline examples in Usage, and an Agent Rule section. Cross-skill references are established here (`verify-readme` invokes `human-facing-writing-style`), so this is about the missing fallback, not the deferral itself.
Author
Owner

Deliberate decision — not changing. ARG5 stays a pure by-name deferral to verify-readme with no local fallback: a minimum-sections fallback line is a second, smaller README contract in this file, which is the drift-prone shape this PR removes (the previous local contract had already diverged to three sections vs verify-readme's nine). When verify-readme is not in the run's selection, skipping ARG5 — a Warning-severity rule — is the intended degradation. The by-name (rather than source-path) reference is also deliberate: it matches existing cross-skill practice, and delivered skill layouts need not mirror this source tree.

Deliberate decision — not changing. ARG5 stays a pure by-name deferral to `verify-readme` with no local fallback: a minimum-sections fallback line is a second, smaller README contract in this file, which is the drift-prone shape this PR removes (the previous local contract had already diverged to three sections vs verify-readme's nine). When `verify-readme` is not in the run's selection, skipping ARG5 — a Warning-severity rule — is the intended degradation. The by-name (rather than source-path) reference is also deliberate: it matches existing cross-skill practice, and delivered skill layouts need not mirror this source tree.
jercik marked this conversation as resolved
@ -17,3 +19,3 @@
```
**How to verify**: Check for `--dry-run` and `--force` options. Verify destructive actions refuse by default without `--force`.
**How to verify**: Check for `--dry-run` and `--force` options. Verify destructive actions are non-destructive by default: either refusing without `--force`, or gating behind an INT3-compliant confirmation.

🟡 Medium: The first sentence still undoes the carve-out the second sentence adds. INT3's escape hatches are --yes/-y, --no-interactive, and CI=1 — an INT3-compliant CLI has no --force at all, so "Check for --dry-run and --force options" makes it fail this rule, which is Critical. That is exactly the false positive the new note above is meant to remove.

Suggested fix: **How to verify**: Check for a --dry-runoption. Verify destructive actions are non-destructive by default: either refusing without--force, or gating behind an INT3-compliant confirmation.

🟡 **Medium:** The first sentence still undoes the carve-out the second sentence adds. INT3's escape hatches are `--yes`/`-y`, `--no-interactive`, and `CI=1` — an INT3-compliant CLI has no `--force` at all, so "Check for `--dry-run` and `--force` options" makes it fail this rule, which is Critical. That is exactly the false positive the new note above is meant to remove. Suggested fix: `**How to verify**: Check for a `--dry-run` option. Verify destructive actions are non-destructive by default: either refusing without `--force`, or gating behind an INT3-compliant confirmation.`
Author
Owner

Fixed in 2c0aaa3 with the suggested wording: the checklist now asks only for a --dry-run option, and --force appears only inside the either/or compliance test, so an INT3-compliant CLI without --force passes.

Fixed in 2c0aaa3 with the suggested wording: the checklist now asks only for a `--dry-run` option, and `--force` appears only inside the either/or compliance test, so an INT3-compliant CLI without `--force` passes.
jercik marked this conversation as resolved
@ -86,3 +86,3 @@
## How to verify
- `package.json` has `commander` and `@commander-js/extra-typings` at `^14.0.0`+
- `package.json` declares `commander` and `@commander-js/extra-typings` at version 14 or newer (a range on a later major, e.g. `^15.0.0`, passes)

🟡 Medium: This bullet requires every project to declare @commander-js/extra-typings, but the next bullet scopes that package to TypeScript projects only ("Imports use @commander-js/extra-typings (not commander) in TypeScript projects"). A JavaScript-only CLI that correctly depends on commander alone gets flagged as violating a Critical rule. The both-required phrasing predates this PR, but the line is being rewritten here.

Suggested fix: - package.jsondeclarescommanderat version 14 or newer — plus@commander-js/extra-typingsat a matching major for TypeScript projects (a range on a later major, e.g.^15.0.0, passes)

🟡 **Medium:** This bullet requires every project to declare `@commander-js/extra-typings`, but the next bullet scopes that package to TypeScript projects only ("Imports use `@commander-js/extra-typings` (not `commander`) in TypeScript projects"). A JavaScript-only CLI that correctly depends on `commander` alone gets flagged as violating a Critical rule. The both-required phrasing predates this PR, but the line is being rewritten here. Suggested fix: `- `package.json` declares `commander` at version 14 or newer — plus `@commander-js/extra-typings` at a matching major for TypeScript projects (a range on a later major, e.g. `^15.0.0`, passes)`
Author
Owner

Fixed in 2c0aaa3 with the suggested wording: commander at 14 or newer stays the universal floor, and @commander-js/extra-typings is now scoped to TypeScript projects at a matching major, so a JavaScript-only CLI on commander alone passes.

Fixed in 2c0aaa3 with the suggested wording: `commander` at 14 or newer stays the universal floor, and `@commander-js/extra-typings` is now scoped to TypeScript projects at a matching major, so a JavaScript-only CLI on `commander` alone passes.
jercik marked this conversation as resolved
fix(verify-unixy-cli): stop requiring --force presence in INT2 and scope extra-typings to TypeScript
Some checks failed
Node tests / node:test (pull_request) Successful in 16s
commit-msg / commitlint (pull_request) Successful in 28s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 2m22s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 37s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 3m44s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 4m2s
2c0aaa316b
forgejo-actions left a comment

Summary: Docs-only change to the verify-unixy-cli skill. The premises check out: the npm registry reports commander@15.0.0 as latest (so the old ^14.0.0 check would have failed any repo on 15) and inquirer@14.0.2 with no deprecated field, so dropping the deprecation claim is correct. The ARG5 deferral is well covered — skills/verify-readme/SKILL.md includes both the Agent Rule template and the CLI pipeline patterns that ARG5 used to own.

Found 5 low-severity issues, all wording/consistency gaps in rules that an agent applies mechanically: an ambiguous @commander-js/extra-typings version check, an npx claim that is unconditional but only holds on an interactive TTY, ARG5 having no fallback if verify-readme is not delivered in the same run, and two leftover contradictions with the INT3 carve-out. No blocking defects.

Code review by Claude Code Opus (opus)

**Summary:** Docs-only change to the `verify-unixy-cli` skill. The premises check out: the npm registry reports `commander@15.0.0` as latest (so the old `^14.0.0` check would have failed any repo on 15) and `inquirer@14.0.2` with no `deprecated` field, so dropping the deprecation claim is correct. The ARG5 deferral is well covered — `skills/verify-readme/SKILL.md` includes both the Agent Rule template and the CLI pipeline patterns that ARG5 used to own. Found 5 low-severity issues, all wording/consistency gaps in rules that an agent applies mechanically: an ambiguous `@commander-js/extra-typings` version check, an npx claim that is unconditional but only holds on an interactive TTY, ARG5 having no fallback if `verify-readme` is not delivered in the same run, and two leftover contradictions with the INT3 carve-out. No blocking defects. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjQyIiwiaGVhZFNoYSI6IjJjMGFhYTMxNmI4ZWMwZmEzMjA5MzMzNmIwN2IzMGI4YjRkOWNhOTYiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE3NDgzIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjFhNDQ2NmFmLTJlY2QtNGM4Yy04MzFmLTVlMDdlNTQ2YzgwZiJ9 -->
@ -15,3 +15,3 @@
**Pipeline examples**: CLIs that output data should include an example showing how to filter, sort, or aggregate output using standard Unix tools. This teaches composability and demonstrates the output format is pipe-friendly. Skip if the CLI doesn't produce pipe-friendly output.
**npx example format**: If an example runs the CLI through `npx`, use `npx -y` explicitly (for example, `npx -y mycli --help`). Do not use bare `npx`. This avoids interactive install prompts and keeps examples deterministic in fresh environments and CI.
**npx example format**: If an example runs the CLI through `npx`, use `npx -y` explicitly (for example, `npx -y mycli --help`) — bare `npx` stops on an interactive install prompt when the package isn't cached locally.

🟢 Low: The new rationale is stated unconditionally but only holds on an interactive terminal. In npm 11 (libnpmexec/lib/index.js), the missing-package branch is if (noTTY() || ciInfo.isCI) { log.warn(...) } else { prompt } — so in CI or any non-TTY invocation bare npx warns and installs anyway rather than stopping, and it only hard-fails when --no is passed. The old wording covered this by also citing determinism; the replacement drops it. Suggest scoping the claim, e.g. bare npx stops on an interactive install prompt when the package is not cached locally and stdin is a TTY.

🟢 **Low:** The new rationale is stated unconditionally but only holds on an interactive terminal. In npm 11 (`libnpmexec/lib/index.js`), the missing-package branch is `if (noTTY() || ciInfo.isCI) { log.warn(...) } else { prompt }` — so in CI or any non-TTY invocation bare `npx` warns and installs anyway rather than stopping, and it only hard-fails when `--no` is passed. The old wording covered this by also citing determinism; the replacement drops it. Suggest scoping the claim, e.g. `bare npx stops on an interactive install prompt when the package is not cached locally and stdin is a TTY`.
Author
Owner

Fixed in 7a4214a: the claim is now scoped to "when the package isn't cached locally and stdin is a TTY", and the determinism rationale the old wording carried is restored alongside it.

Fixed in 7a4214a: the claim is now scoped to "when the package isn't cached locally and stdin is a TTY", and the determinism rationale the old wording carried is restored alongside it.
jercik marked this conversation as resolved
@ -1,36 +1,5 @@
# ARG5. README Quality (Warning)
The README must include these sections:
The verify-readme skill is the canonical README contract — required sections, their order, and the agent-rule requirements all live there. Audit the README against that skill.

🟢 Low: ARG5 now carries zero self-contained criteria, so it is unverifiable whenever verify-readme is not part of the same run. Per the repo README, axskills delivers only the skills selected for that agent launch, and verify-unixy-cli can be selected without verify-readme — the audit would then silently skip a Warning-level rule with no signal to the user. (The same by-name cross-skill reference already exists in verify-readme pointing at human-facing-writing-style, so this is a pattern, not a regression.) Two cheap mitigations: name the file path (skills/verify-readme/SKILL.md) so it can be read directly when the skill is not loaded, and add a one-line fallback naming the CLI-specific minimum (an Agent Rule section plus pipeline examples in Usage) for when it is unavailable.

🟢 **Low:** ARG5 now carries zero self-contained criteria, so it is unverifiable whenever `verify-readme` is not part of the same run. Per the repo README, `axskills` delivers only the skills selected for that agent launch, and `verify-unixy-cli` can be selected without `verify-readme` — the audit would then silently skip a Warning-level rule with no signal to the user. (The same by-name cross-skill reference already exists in `verify-readme` pointing at `human-facing-writing-style`, so this is a pattern, not a regression.) Two cheap mitigations: name the file path (`skills/verify-readme/SKILL.md`) so it can be read directly when the skill is not loaded, and add a one-line fallback naming the CLI-specific minimum (an `Agent Rule` section plus pipeline examples in `Usage`) for when it is unavailable.
Author
Owner

Deliberate decision — not changing (same ruling as the parallel threads on this file). ARG5 stays a pure by-name deferral to verify-readme with no local fallback list: a minimum-sections fallback is a second, smaller README contract, the drift-prone shape this PR removes. Skipping ARG5 (Warning severity) when verify-readme isn't in the run is the intended degradation, and the by-name rather than source-path reference is deliberate — delivered skill layouts need not mirror this source tree.

Deliberate decision — not changing (same ruling as the parallel threads on this file). ARG5 stays a pure by-name deferral to `verify-readme` with no local fallback list: a minimum-sections fallback is a second, smaller README contract, the drift-prone shape this PR removes. Skipping ARG5 (Warning severity) when `verify-readme` isn't in the run is the intended degradation, and the by-name rather than source-path reference is deliberate — delivered skill layouts need not mirror this source tree.
jercik marked this conversation as resolved
@ -45,3 +45,3 @@
- Run the CLI without required arguments — confirm it exits non-zero with an actionable error, not a prompt
- Search for prompt/readline usage and verify all prompts are gated by `--interactive` flag
- Verify destructive operations refuse without `--force`, not prompt for confirmation
- Verify destructive operations are non-destructive by default: either refusing without `--force`, or gating behind an INT3-compliant confirmation

🟢 Low: The checklist line now accepts an INT3-compliant confirmation, but the example block above still contradicts it: line 38 labels # Bad: prompts for confirmation based on TTY with ? Delete 2 files? (y/N), and the opening paragraph still says refuse without --force, don't prompt for confirmation. An agent reading top-to-bottom will flag an INT3-compliant CLI as an INT1 violation on the strength of that example. Worth annotating the Bad example (e.g. Bad: prompts based on TTY with no --yes/--no-interactive/CI escape hatches — see INT3) so the example and the checklist agree.

🟢 **Low:** The checklist line now accepts an INT3-compliant confirmation, but the example block above still contradicts it: line 38 labels `# Bad: prompts for confirmation based on TTY` with `? Delete 2 files? (y/N)`, and the opening paragraph still says `refuse without --force, don't prompt for confirmation`. An agent reading top-to-bottom will flag an INT3-compliant CLI as an INT1 violation on the strength of that example. Worth annotating the Bad example (e.g. `Bad: prompts based on TTY with no --yes/--no-interactive/CI escape hatches — see INT3`) so the example and the checklist agree.
Author
Owner

Fixed in 7a4214a: the Bad example is now labeled "prompts for confirmation based on TTY alone — no --yes/--no-interactive/CI escape hatches (see INT3)", so the example and the checklist agree that a hatch-less TTY prompt is what fails.

Fixed in 7a4214a: the Bad example is now labeled "prompts for confirmation based on TTY alone — no --yes/--no-interactive/CI escape hatches (see INT3)", so the example and the checklist agree that a hatch-less TTY prompt is what fails.
jercik marked this conversation as resolved
@ -2,6 +2,8 @@
Default behavior should be non-destructive. Destructive operations must refuse without `--force`/`-f` and provide `--dry-run` to preview what would happen.
> **Note:** INT3 provides a less strict alternative for destructive-operation confirmations. A CLI that follows INT3 instead of the strict `--force`-only approach here is compliant — see INT3 for requirements. The `--dry-run` requirement applies either way.

🟢 Low: The carve-out is one-directional. int3-tty-based-confirmations.md still opens with This rule is an alternative to INT1's strict --force-only approach and A CLI may follow either INT1 or INT3 — not both; it never mentions INT2, nor that INT2's --dry-run requirement still applies when a CLI takes the INT3 route. Since INT2 is Critical, an agent that reads INT3 first can conclude the INT3 path exempts it from INT2 entirely. Updating INT3 to name both INT1 and INT2 and to restate that --dry-run still applies would close the round-trip.

🟢 **Low:** The carve-out is one-directional. `int3-tty-based-confirmations.md` still opens with `This rule is an alternative to INT1's strict --force-only approach` and `A CLI may follow either INT1 or INT3 — not both`; it never mentions INT2, nor that INT2's `--dry-run` requirement still applies when a CLI takes the INT3 route. Since INT2 is Critical, an agent that reads INT3 first can conclude the INT3 path exempts it from INT2 entirely. Updating INT3 to name both INT1 and INT2 and to restate that `--dry-run` still applies would close the round-trip.
Author
Owner

Fixed in 7a4214a: INT3's opening paragraph now closes the round-trip with "Following INT3 replaces only the confirmation approach — INT2's --dry-run requirement applies either way", echoing INT2's boundary sentence verbatim so the two files cannot drift apart in meaning.

Fixed in 7a4214a: INT3's opening paragraph now closes the round-trip with "Following INT3 replaces only the confirmation approach — INT2's `--dry-run` requirement applies either way", echoing INT2's boundary sentence verbatim so the two files cannot drift apart in meaning.
jercik marked this conversation as resolved
@ -86,3 +86,3 @@
## How to verify
- `package.json` has `commander` and `@commander-js/extra-typings` at `^14.0.0`+
- `package.json` declares `commander` at version 14 or newer — plus `@commander-js/extra-typings` at a matching major for TypeScript projects (a range on a later major, e.g. `^15.0.0`, passes)

🟢 Low: The bullet is ambiguous about which major @commander-js/extra-typings must be on. Read literally, commander at version 14 or newer plus a range on a later major, e.g. ^15.0.0, passes permits commander: ^14.0.0 with @commander-js/extra-typings: ^15.0.0, which fails peer resolution: the registry shows @commander-js/extra-typings@15.0.0 declaring peerDependencies: { commander: ~15.0.0 } and 14.0.0 declaring ~14.0.0. The two majors must be equal, not merely both >= 14. Suggest tightening to something like: @commander-js/extra-typings at the same major as the declared commander (its peer range pins that major), so commander: ^15.0.0 + extra-typings: ^15.0.0 passes.

🟢 **Low:** The bullet is ambiguous about which major `@commander-js/extra-typings` must be on. Read literally, `commander at version 14 or newer` plus `a range on a later major, e.g. ^15.0.0, passes` permits `commander: ^14.0.0` with `@commander-js/extra-typings: ^15.0.0`, which fails peer resolution: the registry shows `@commander-js/extra-typings@15.0.0` declaring `peerDependencies: { commander: ~15.0.0 }` and `14.0.0` declaring `~14.0.0`. The two majors must be equal, not merely both >= 14. Suggest tightening to something like: `@commander-js/extra-typings` at the same major as the declared `commander` (its peer range pins that major), so `commander: ^15.0.0` + `extra-typings: ^15.0.0` passes.
Author
Owner

Fixed in 7a4214a: the bullet now reads "commander at version 14 or newer (a range on a later major, e.g. ^15.0.0, passes) — TypeScript projects also declare @commander-js/extra-typings at the same major as commander (its peer range pins that major)", so a cross-major pairing no longer reads as passing.

Fixed in 7a4214a: the bullet now reads "`commander` at version 14 or newer (a range on a later major, e.g. `^15.0.0`, passes) — TypeScript projects also declare `@commander-js/extra-typings` at the same major as `commander` (its peer range pins that major)", so a cross-major pairing no longer reads as passing.
jercik marked this conversation as resolved
fix(verify-unixy-cli): tighten extra-typings major matching, npx TTY scope, and INT carve-out reciprocity
Some checks failed
Node tests / node:test (pull_request) Successful in 9s
commit-msg / commitlint (pull_request) Failing after 10s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m30s
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 44s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Failing after 4m25s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 4m28s
7a4214a587
forgejo-actions left a comment

Approach review: Sound direction. The four changes each remove a real defect in the rule set rather than papering over it:

  • ARG5 deferring to verify-readme is the right call. skills/verify-readme/SKILL.md already covers everything ARG5 was asserting for a CLI — Quick Start, a CLI Usage section with pipeline patterns, and an Agent Rule template that mandates npx -y <tool> --help as the first instruction — so the deletion loses no coverage and kills a contract that could disagree with itself. Naming a sibling skill by name is established practice here (verify-readme invokes human-facing-writing-style the same way), so the cross-skill dependency is consistent with the repo, not a new pattern.
  • INT2 gaining INT1's carve-out closes a genuine hole: INT3 previously said it replaced INT1's destructive-op rules, but INT2 (Critical) still demanded --force unconditionally, so an INT3-compliant CLI failed a Critical rule. Repeating the note in each rule file rather than centralizing it fits the one-file-per-rule design, where a reader may load only INT2.
  • PKG3 as a floor instead of ^14 and PKG4 dropping the deprecation claim are both factually right: the registry currently publishes commander@15.0.0 with no deprecation on inquirer@14.0.2, so the old text would have failed a current-on-commander repo and asserted something the registry does not say. Keeping the prefer-@inquirer/prompts guidance on modularity/typing grounds is the durable justification.

One narrow suggestion on the @commander-js/extra-typings criterion — see the inline comment. No other material alternative; the SKILL.md workflow condensation is a restructure of the same steps and does not change what the audit does.

Approach review by Claude Code Opus (opus)

**Approach review:** Sound direction. The four changes each remove a real defect in the rule set rather than papering over it: - **ARG5 deferring to `verify-readme`** is the right call. `skills/verify-readme/SKILL.md` already covers everything ARG5 was asserting for a CLI — Quick Start, a CLI Usage section with pipeline patterns, and an Agent Rule template that mandates `npx -y <tool> --help` as the first instruction — so the deletion loses no coverage and kills a contract that could disagree with itself. Naming a sibling skill by name is established practice here (`verify-readme` invokes `human-facing-writing-style` the same way), so the cross-skill dependency is consistent with the repo, not a new pattern. - **INT2 gaining INT1's carve-out** closes a genuine hole: INT3 previously said it replaced INT1's destructive-op rules, but INT2 (Critical) still demanded `--force` unconditionally, so an INT3-compliant CLI failed a Critical rule. Repeating the note in each rule file rather than centralizing it fits the one-file-per-rule design, where a reader may load only INT2. - **PKG3 as a floor instead of `^14`** and **PKG4 dropping the deprecation claim** are both factually right: the registry currently publishes `commander@15.0.0` with no deprecation on `inquirer@14.0.2`, so the old text would have failed a current-on-`commander` repo and asserted something the registry does not say. Keeping the prefer-`@inquirer/prompts` guidance on modularity/typing grounds is the durable justification. One narrow suggestion on the `@commander-js/extra-typings` criterion — see the inline comment. No other material alternative; the SKILL.md workflow condensation is a restructure of the same steps and does not change what the audit does. _Approach review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjQyIiwiaGVhZFNoYSI6IjdhNDIxNGE1ODdlNTc4NGRmOTFkZTliYzk4ZTkxZjhjMDNlZTZiZjMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctYXBwcm9hY2gtc21hcnQtMSIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIxNzUwNSIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiJiOTUzZmZmMS1mN2JkLTRiZDMtODgzNy1jMjNlYzg0ZmE4ZDgifQ== -->
@ -86,3 +86,3 @@
## How to verify
- `package.json` has `commander` and `@commander-js/extra-typings` at `^14.0.0`+
- `package.json` declares `commander` at version 14 or newer (a range on a later major, e.g. `^15.0.0`, passes) — TypeScript projects also declare `@commander-js/extra-typings` at the same major as `commander` (its peer range pins that major)

The same-major coupling restates the peer range slightly wrong, and restating it is what makes the criterion rot in the first place. @commander-js/extra-typings@15.0.0 declares peerDependencies: { commander: '~15.0.0' } — a tilde range, so it pins the minor, not the major. A repo on commander@15.1.x with extra-typings@15.0.x matches "the same major" but fails the actual peer range, so an audit following this bullet would pass a tree npm rejects.

Since the point of this rewrite is to state a floor instead of a pin, apply the same move here and delegate to the range rather than describing it: require that the declared @commander-js/extra-typings version satisfy its own peer range against the declared commander. That check stays correct whether upstream ships ~, ^, or an exact peer, and needs no edit at the next major.

The same-major coupling restates the peer range slightly wrong, and restating it is what makes the criterion rot in the first place. `@commander-js/extra-typings@15.0.0` declares `peerDependencies: { commander: '~15.0.0' }` — a tilde range, so it pins the minor, not the major. A repo on `commander@15.1.x` with `extra-typings@15.0.x` matches "the same major" but fails the actual peer range, so an audit following this bullet would pass a tree npm rejects. Since the point of this rewrite is to state a floor instead of a pin, apply the same move here and delegate to the range rather than describing it: require that the declared `@commander-js/extra-typings` version satisfy its own peer range against the declared `commander`. That check stays correct whether upstream ships `~`, `^`, or an exact peer, and needs no edit at the next major.
Author
Owner

Fixed in ae0ea2a by delegating to the peer range as suggested: the bullet now requires @commander-js/extra-typings at a version whose peer range accepts the declared commander, noting upstream pins tighter than the major (~15.0.0) — so the criterion no longer restates a range that can rot.

Fixed in ae0ea2a by delegating to the peer range as suggested: the bullet now requires `@commander-js/extra-typings` at a version whose peer range accepts the declared `commander`, noting upstream pins tighter than the major (`~15.0.0`) — so the criterion no longer restates a range that can rot.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Found 4 medium issues.

Code review by Codex GPT-5.6 SOL (gpt-5.6-sol)

**Summary:** Found 4 medium issues. _Code review by Codex GPT-5.6 SOL (gpt-5.6-sol)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjQyIiwiaGVhZFNoYSI6IjdhNDIxNGE1ODdlNTc4NGRmOTFkZTliYzk4ZTkxZjhjMDNlZTZiZjMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE3NTA1Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjI0MDllNGY2LTMzMzMtNDg3Ny1iOTQyLWFjZjljMmQ3ZDE1NyJ9 -->
@ -1,36 +1,5 @@
# ARG5. README Quality (Warning)
The README must include these sections:
The verify-readme skill is the canonical README contract — required sections, their order, and the agent-rule requirements all live there. Audit the README against that skill.

🟡 Medium: verify-readme is a separately selectable skill, but this repository has no dependency manifest that causes it to be delivered with verify-unixy-cli. When a user selects only this skill, ARG5 now has no contract available to read and the audit cannot execute this rule. Bundle the canonical reference/dependency with this skill, or add a delivery-level dependency or fallback before removing the local requirements.

🟡 **Medium:** `verify-readme` is a separately selectable skill, but this repository has no dependency manifest that causes it to be delivered with `verify-unixy-cli`. When a user selects only this skill, ARG5 now has no contract available to read and the audit cannot execute this rule. Bundle the canonical reference/dependency with this skill, or add a delivery-level dependency or fallback before removing the local requirements.
Author
Owner

Deliberate decision — not changing (same ruling as the earlier threads on this file). ARG5 stays a pure by-name deferral to verify-readme with no bundled copy or fallback list: a local minimum would be a second README contract, the drift-prone shape this PR removes — the old local contract had already diverged to three sections vs verify-readme's nine. When verify-readme isn't in the run's selection, skipping ARG5 (Warning severity) is the intended degradation. Cross-skill by-name references are established practice here, as the approach review on this head also notes.

Deliberate decision — not changing (same ruling as the earlier threads on this file). ARG5 stays a pure by-name deferral to `verify-readme` with no bundled copy or fallback list: a local minimum would be a second README contract, the drift-prone shape this PR removes — the old local contract had already diverged to three sections vs verify-readme's nine. When `verify-readme` isn't in the run's selection, skipping ARG5 (Warning severity) is the intended degradation. Cross-skill by-name references are established practice here, as the approach review on this head also notes.
jercik marked this conversation as resolved
@ -45,3 +45,3 @@
- Run the CLI without required arguments — confirm it exits non-zero with an actionable error, not a prompt
- Search for prompt/readline usage and verify all prompts are gated by `--interactive` flag
- Verify destructive operations refuse without `--force`, not prompt for confirmation
- Verify destructive operations are non-destructive by default: either refusing without `--force`, or gating behind an INT3-compliant confirmation

🟡 Medium: The INT3 exception added here conflicts with the verification bullet immediately above, which still requires every prompt to be gated by --interactive. An INT3 confirmation intentionally prompts based on TTY without that flag, so a compliant CLI will still be failed under INT1. Exempt destructive INT3 confirmations from the earlier prompt-gating check.

🟡 **Medium:** The INT3 exception added here conflicts with the verification bullet immediately above, which still requires every prompt to be gated by `--interactive`. An INT3 confirmation intentionally prompts based on TTY without that flag, so a compliant CLI will still be failed under INT1. Exempt destructive INT3 confirmations from the earlier prompt-gating check.
Author
Owner

Fixed in ae0ea2a: the prompt-gating bullet now exempts destructive-operation confirmations on the INT3 path, which are gated by INT3's TTY check and escape hatches rather than --interactive, so an INT3-compliant CLI no longer fails that bullet.

Fixed in ae0ea2a: the prompt-gating bullet now exempts destructive-operation confirmations on the INT3 path, which are gated by INT3's TTY check and escape hatches rather than `--interactive`, so an INT3-compliant CLI no longer fails that bullet.
jercik marked this conversation as resolved
@ -2,6 +2,8 @@
Default behavior should be non-destructive. Destructive operations must refuse without `--force`/`-f` and provide `--dry-run` to preview what would happen.
> **Note:** INT3 provides a less strict alternative for destructive-operation confirmations. A CLI that follows INT3 instead of the strict `--force`-only approach here is compliant — see INT3 for requirements. The `--dry-run` requirement applies either way.

🟡 Medium: This carve-out contradicts the rule sentence above, which still unconditionally says destructive operations must refuse without --force. Depending on which normative sentence the auditor follows, an INT3-compliant CLI both passes and fails. Rewrite the opening contract to permit either force-based refusal or an INT3 confirmation while retaining the --dry-run requirement.

🟡 **Medium:** This carve-out contradicts the rule sentence above, which still unconditionally says destructive operations must refuse without `--force`. Depending on which normative sentence the auditor follows, an INT3-compliant CLI both passes and fails. Rewrite the opening contract to permit either force-based refusal or an INT3 confirmation while retaining the `--dry-run` requirement.
Author
Owner

Deliberate decision — not changing. The carve-out's shape (strict normative sentence, immediately qualified by the INT3 note) is copied verbatim from INT1 by design, and that parity is a user ruling on this PR: each reference file is read standalone, so both files state the strict default and then name the accepted alternative in the very next paragraph. The note explicitly says an INT3-following CLI "is compliant", and the How-to-verify line now encodes the either/or, so neither entry point yields a false failure. Integrating the alternative into the contract sentence here would break the INT1/INT2 parallel or force the same rewrite onto INT1, which is outside this PR's scope.

Deliberate decision — not changing. The carve-out's shape (strict normative sentence, immediately qualified by the INT3 note) is copied verbatim from INT1 by design, and that parity is a user ruling on this PR: each reference file is read standalone, so both files state the strict default and then name the accepted alternative in the very next paragraph. The note explicitly says an INT3-following CLI "is compliant", and the How-to-verify line now encodes the either/or, so neither entry point yields a false failure. Integrating the alternative into the contract sentence here would break the INT1/INT2 parallel or force the same rewrite onto INT1, which is outside this PR's scope.
jercik marked this conversation as resolved
@ -86,3 +86,3 @@
## How to verify
- `package.json` has `commander` and `@commander-js/extra-typings` at `^14.0.0`+
- `package.json` declares `commander` at version 14 or newer (a range on a later major, e.g. `^15.0.0`, passes) — TypeScript projects also declare `@commander-js/extra-typings` at the same major as `commander` (its peer range pins that major)

🟡 Medium: Matching only the major is insufficient: the published @commander-js/extra-typings@14.0.0 peer dependency is commander: ~14.0.0, and its README says major and minor versions should match. This check would approve ranges that can install mismatched typings and Commander minors, then fail peer-dependency resolution. Require matching major and minor versions or otherwise verify compatible peer ranges.

🟡 **Medium:** Matching only the major is insufficient: the published `@commander-js/extra-typings@14.0.0` peer dependency is `commander: ~14.0.0`, and its README says major and minor versions should match. This check would approve ranges that can install mismatched typings and Commander minors, then fail peer-dependency resolution. Require matching major and minor versions or otherwise verify compatible peer ranges.
Author
Owner

Fixed in ae0ea2a: the bullet now delegates to peer resolution — @commander-js/extra-typings must be at a version whose peer range accepts the declared commander — rather than comparing majors, which as you note would pass a 15.1.x/15.0.x tree npm rejects. This also stays correct if upstream ever loosens or tightens the peer range.

Fixed in ae0ea2a: the bullet now delegates to peer resolution — `@commander-js/extra-typings` must be at a version whose peer range accepts the declared `commander` — rather than comparing majors, which as you note would pass a `15.1.x`/`15.0.x` tree npm rejects. This also stays correct if upstream ever loosens or tightens the peer range.
jercik marked this conversation as resolved
fix(verify-unixy-cli): verify extra-typings by peer resolution and exempt INT3 confirmations from the interactive gate
Some checks failed
Node tests / node:test (pull_request) Successful in 9s
commit-msg / commitlint (pull_request) Failing after 10s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m28s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 37s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 4m6s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 4m23s
ae0ea2afc1
forgejo-actions left a comment

Summary: No actionable defects found; 1 informational note.

I verified the factual claims this documentation-only PR rests on, rather than taking them at face value:

  • PKG3 / commander floorcommander latest is 15.0.0; @commander-js/extra-typings@15.0.0 peers commander: "~15.0.0" and @commander-js/extra-typings@14 peers commander: "~14.0.0". The new wording (floor of 14, later majors pass, peer range pinned tighter than the major so check peer resolution rather than matching majors) is accurate, and the tilde ranges do accept the 14.0.x patch line as implied.
  • PKG4 / inquirer — the registry shows inquirer@14.0.2, last modified 2026-05-31, with no deprecated field. Dropping the "deprecated / maintenance mode" claim and keeping the modular/tree-shakeable/TypeScript rationale for @inquirer/prompts is the correct fix.
  • ARG3 / bare npx — checked npm's own libnpmexec: the install confirmation is skipped when noTTY() || ciInfo.isCI, and noTTY is exactly !process.stdin.isTTY. The revised sentence (prompt only when the package isn't cached locally and stdin is a TTY) matches the implementation precisely, unlike the previous unconditional claim.
  • ARG5 deferenceskills/verify-readme/SKILL.md does own the section order, the pipeline-patterns guidance, and the Agent Rule template, so the removed ARG5 contract is genuinely covered there; the two contradictory contracts (three sections vs nine, "under 10 lines" vs one paragraph) are gone.

The INT1/INT2/INT3 carve-out is now reciprocal and closed: all three files agree that INT3 replaces only the confirmation approach, INT2's --dry-run applies on either path, and INT2/INT1 accept a confirmation only if it is "INT3-compliant" (i.e. with --yes, --no-interactive, and CI escape hatches), so a partially-implemented TTY confirmation still fails the Critical rules. INT1's mental-model line "Never prompt based on TTY alone" remains consistent, since INT3 requires TTY plus the escape-hatch flags. The SKILL.md workflow renumbering leaves no dangling step references, and all 37 rule-table links resolve to existing files.

Code review by Claude Code Opus (opus)

**Summary:** No actionable defects found; 1 informational note. I verified the factual claims this documentation-only PR rests on, rather than taking them at face value: - **PKG3 / commander floor** — `commander` latest is `15.0.0`; `@commander-js/extra-typings@15.0.0` peers `commander: "~15.0.0"` and `@commander-js/extra-typings@14` peers `commander: "~14.0.0"`. The new wording (floor of 14, later majors pass, peer range pinned tighter than the major so check peer resolution rather than matching majors) is accurate, and the tilde ranges do accept the `14.0.x` patch line as implied. - **PKG4 / inquirer** — the registry shows `inquirer@14.0.2`, last modified 2026-05-31, with no `deprecated` field. Dropping the "deprecated / maintenance mode" claim and keeping the modular/tree-shakeable/TypeScript rationale for `@inquirer/prompts` is the correct fix. - **ARG3 / bare `npx`** — checked npm's own `libnpmexec`: the install confirmation is skipped when `noTTY() || ciInfo.isCI`, and `noTTY` is exactly `!process.stdin.isTTY`. The revised sentence (prompt only when the package isn't cached locally and stdin is a TTY) matches the implementation precisely, unlike the previous unconditional claim. - **ARG5 deference** — `skills/verify-readme/SKILL.md` does own the section order, the pipeline-patterns guidance, and the Agent Rule template, so the removed ARG5 contract is genuinely covered there; the two contradictory contracts (three sections vs nine, "under 10 lines" vs one paragraph) are gone. The INT1/INT2/INT3 carve-out is now reciprocal and closed: all three files agree that INT3 replaces only the confirmation approach, INT2's `--dry-run` applies on either path, and INT2/INT1 accept a confirmation only if it is "INT3-compliant" (i.e. with `--yes`, `--no-interactive`, and `CI` escape hatches), so a partially-implemented TTY confirmation still fails the Critical rules. INT1's mental-model line "Never prompt based on TTY alone" remains consistent, since INT3 requires TTY *plus* the escape-hatch flags. The SKILL.md workflow renumbering leaves no dangling step references, and all 37 rule-table links resolve to existing files. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjQyIiwiaGVhZFNoYSI6ImFlMGVhMmFmYzE4NDBmZTg5MjRmMDkzMjcyOTM0NGYyYTg5ZWVmOWQiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE3NTEyIiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImIzZTQ1ZDQ5LTAzNjQtNGQxZi1iNDVjLWQ2MDU1YTcyNDYwMiJ9 -->
@ -1,36 +1,5 @@
# ARG5. README Quality (Warning)
The README must include these sections:
The verify-readme skill is the canonical README contract — required sections, their order, and the agent-rule requirements all live there. Audit the README against that skill.

ℹ️ Info: ARG5 is now entirely delegated, so the rule is unverifiable in any run where verify-unixy-cli is selected but verify-readme is not — axskills delivers only the selected skills per launch (full-tree copies happen on axskills sync for Claude, not on every selection). Cross-skill delegation is an established convention in this repo (verify-readmehuman-facing-writing-style, add-dark-modedark-mode-imageimagegen), so this matches house style and needs no change; noting it only because ARG5 retains no self-contained fallback the way those callers do, where the delegated skill covers one facet rather than the whole rule.

ℹ️ **Info:** ARG5 is now entirely delegated, so the rule is unverifiable in any run where `verify-unixy-cli` is selected but `verify-readme` is not — `axskills` delivers only the selected skills per launch (full-tree copies happen on `axskills sync` for Claude, not on every selection). Cross-skill delegation is an established convention in this repo (`verify-readme` → `human-facing-writing-style`, `add-dark-mode` → `dark-mode-image` → `imagegen`), so this matches house style and needs no change; noting it only because ARG5 retains no self-contained fallback the way those callers do, where the delegated skill covers one facet rather than the whole rule.
Author
Owner

Acknowledged. The whole-rule delegation with no local fallback is a deliberate ruling on this PR (see the resolved threads on this file): a fallback list would be a second README contract, the drift-prone shape this PR removes, and skipping ARG5 (Warning severity) when verify-readme isn't selected is the intended degradation.

Acknowledged. The whole-rule delegation with no local fallback is a deliberate ruling on this PR (see the resolved threads on this file): a fallback list would be a second README contract, the drift-prone shape this PR removes, and skipping ARG5 (Warning severity) when `verify-readme` isn't selected is the intended degradation.
jercik marked this conversation as resolved
jercik force-pushed align/verify-unixy-cli from ae0ea2afc1
Some checks failed
Node tests / node:test (pull_request) Successful in 9s
commit-msg / commitlint (pull_request) Failing after 10s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 1m28s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 37s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 4m6s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 4m23s
to 7c89ed2770
Some checks failed
Node tests / node:test (pull_request) Successful in 17s
commit-msg / commitlint (pull_request) Successful in 21s
PR Review / Prepare immutable review tools (pull_request_target) Successful in 3m1s
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-2 generator (pull_request_target) Failing after 42s
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Successful in 3m40s
PR Review / Dispatch and observe exact review writers (pull_request_target) Failing after 3m59s
2026-08-06 09:09:54 +00:00
Compare
Author
Owner

History note: two review-fix commits were reworded (content untouched) because their subjects exceeded commitlint's 100-character header limit — 7a4214a is now a460e5a and ae0ea2a is now 7c89ed2. In-thread "Fixed in" references map accordingly.

History note: two review-fix commits were reworded (content untouched) because their subjects exceeded commitlint's 100-character header limit — `7a4214a` is now `a460e5a` and `ae0ea2a` is now `7c89ed2`. In-thread "Fixed in" references map accordingly.
forgejo-actions left a comment

Summary: Docs-only change to the verify-unixy-cli skill. The three factual corrections check out against the npm registry: commander latest is 15.0.0, @commander-js/extra-typings 15.0.0 declares peer commander: ~15.0.0 (so PKG3's "check peer resolution, not matching majors" is right), and inquirer 14.0.2 carries no deprecation on the registry, so dropping the "deprecated" claim is correct. The ARG3 npx claim is also accurate — bare npx only prompts when the package is uncached and stdin is a TTY; non-TTY/CI runs install without prompting. The INT1/INT2/INT3 carve-outs are now mutually consistent, and verify-readme does cover everything ARG5 gave up (pipeline patterns in the CLI Usage section, the CLI-only Agent Rule template with npx -y).

Found 2 low-severity consistency issues; no correctness, security, or integration defects.

Code review by Claude Code Opus (opus)

**Summary:** Docs-only change to the `verify-unixy-cli` skill. The three factual corrections check out against the npm registry: `commander` latest is 15.0.0, `@commander-js/extra-typings` 15.0.0 declares peer `commander: ~15.0.0` (so PKG3's "check peer resolution, not matching majors" is right), and `inquirer` 14.0.2 carries no deprecation on the registry, so dropping the "deprecated" claim is correct. The ARG3 npx claim is also accurate — bare `npx` only prompts when the package is uncached and stdin is a TTY; non-TTY/CI runs install without prompting. The INT1/INT2/INT3 carve-outs are now mutually consistent, and `verify-readme` does cover everything ARG5 gave up (pipeline patterns in the CLI Usage section, the CLI-only Agent Rule template with `npx -y`). Found 2 low-severity consistency issues; no correctness, security, or integration defects. _Code review by Claude Code Opus (opus)_ <!-- axrecipe-review:v1:eyJzY2hlbWFWZXJzaW9uIjoxLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjQyIiwiaGVhZFNoYSI6IjdjODllZDI3NzA0NzRhMzcxZTdlZDQ0NTcxMWFhYzI3NDJhNjY3ZmQiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjE3NTI1Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjExYjljOGIxLTZmM2QtNDI2My04NTUyLWJiOWZjYzVkYThmMCJ9 -->
@ -1,36 +1,5 @@
# ARG5. README Quality (Warning)
The README must include these sections:
The verify-readme skill is the canonical README contract — required sections, their order, and the agent-rule requirements all live there. Audit the README against that skill.

🟢 Low: Deferring the contract to verify-readme removes the divergence, but it also leaves ARG5 unverifiable when that skill isn't present: axskills delivers only the selected skills per run, so a selection of verify-unixy-cli alone gives the auditing agent no README criteria at all, and the rule silently drops out of the report rather than being flagged. Worth naming the fallback in one line — e.g. "if the verify-readme skill isn't available, record ARG5 as Unable to verify" (matching the SKILL.md workflow's existing "Unable to verify" state), or pointing at the sections it owns (Quick Start, CLI Usage pipeline examples, the CLI-only Agent Rule). Also consider backticking the skill name for consistency with how other files here reference sibling skills.

🟢 **Low:** Deferring the contract to `verify-readme` removes the divergence, but it also leaves ARG5 unverifiable when that skill isn't present: `axskills` delivers only the selected skills per run, so a selection of `verify-unixy-cli` alone gives the auditing agent no README criteria at all, and the rule silently drops out of the report rather than being flagged. Worth naming the fallback in one line — e.g. "if the `verify-readme` skill isn't available, record ARG5 as *Unable to verify*" (matching the SKILL.md workflow's existing "Unable to verify" state), or pointing at the sections it owns (Quick Start, CLI Usage pipeline examples, the CLI-only Agent Rule). Also consider backticking the skill name for consistency with how other files here reference sibling skills.
Author
Owner

Deliberate decision — not changing (same ruling as the resolved threads on this file across earlier heads). ARG5 stays a pure by-name deferral with no local criteria list; the sections-it-owns variant is the second-contract shape the ruling forbids. The "Unable to verify" recording needs no per-rule line either: that state is already the SKILL.md workflow's semantics for any rule the auditor cannot execute, ARG5 included. On backticking: the file consistently names verify-readme as prose ("The verify-readme skill …", "Apply the verify-readme skill"), so it is internally consistent; a fleet-wide spelling harmonization for sibling-skill references is out of this PR's scope.

Deliberate decision — not changing (same ruling as the resolved threads on this file across earlier heads). ARG5 stays a pure by-name deferral with no local criteria list; the sections-it-owns variant is the second-contract shape the ruling forbids. The "Unable to verify" recording needs no per-rule line either: that state is already the SKILL.md workflow's semantics for any rule the auditor cannot execute, ARG5 included. On backticking: the file consistently names verify-readme as prose ("The verify-readme skill …", "Apply the verify-readme skill"), so it is internally consistent; a fleet-wide spelling harmonization for sibling-skill references is out of this PR's scope.
jercik marked this conversation as resolved
@ -2,6 +2,8 @@
Default behavior should be non-destructive. Destructive operations must refuse without `--force`/`-f` and provide `--dry-run` to preview what would happen.
> **Note:** INT3 provides a less strict alternative for destructive-operation confirmations. A CLI that follows INT3 instead of the strict `--force`-only approach here is compliant — see INT3 for requirements. The `--dry-run` requirement applies either way.

🟢 Low: The note resolves the carve-out, but the rule's normative sentence two lines above still reads "Destructive operations must refuse without --force/-f", which now contradicts both this note and the revised How to verify below it. INT1 has the same note but its body sentence is at least followed immediately by the qualifier; here an agent skimming for the MUST can stop at line 3 and fail an INT3-compliant CLI on a Critical rule. Softening line 3 to something like "Destructive operations must be non-destructive by default — refuse without --force/-f or confirm per INT3 — and provide --dry-run to preview" would make the rule statement and the verification step agree without needing the reader to reconcile them.

🟢 **Low:** The note resolves the carve-out, but the rule's normative sentence two lines above still reads "Destructive operations **must** refuse without `--force`/`-f`", which now contradicts both this note and the revised **How to verify** below it. INT1 has the same note but its body sentence is at least followed immediately by the qualifier; here an agent skimming for the MUST can stop at line 3 and fail an INT3-compliant CLI on a Critical rule. Softening line 3 to something like "Destructive operations must be non-destructive by default — refuse without `--force`/`-f` or confirm per INT3 — and provide `--dry-run` to preview" would make the rule statement and the verification step agree without needing the reader to reconcile them.
Author
Owner

Deliberate decision — not changing (same ruling as the resolved thread at this line from the previous head). The strict-sentence-plus-note shape is copied verbatim from INT1 by design, and that INT1-parity is a user ruling on this PR. The note sits two lines below the sentence in a 21-line file and states outright that an INT3-following CLI is compliant, and the How-to-verify line encodes the either/or — a reader cannot apply the MUST without passing the qualifier. Folding the alternative into the contract sentence here would break the INT1/INT2 parallel or force the same rewrite onto INT1, which is out of scope by ruling.

Deliberate decision — not changing (same ruling as the resolved thread at this line from the previous head). The strict-sentence-plus-note shape is copied verbatim from INT1 by design, and that INT1-parity is a user ruling on this PR. The note sits two lines below the sentence in a 21-line file and states outright that an INT3-following CLI is compliant, and the How-to-verify line encodes the either/or — a reader cannot apply the MUST without passing the qualifier. Folding the alternative into the contract sentence here would break the INT1/INT2 parallel or force the same rewrite onto INT1, which is out of scope by ruling.
jercik marked this conversation as resolved
jercik merged commit dd9d89044f into main 2026-08-06 10:52:38 +00:00
jercik deleted branch align/verify-unixy-cli 2026-08-06 10:52:38 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
j4k-oss/agent-skills!42
No description provided.