@hellraisercenobit/ai-engineering-gate 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +82 -0
  2. package/agents/design-pattern-reviewer.md +40 -0
  3. package/agents/modern-typescript-reviewer.md +24 -0
  4. package/agents/testing-pattern-reviewer.md +23 -0
  5. package/bin/ai-engineering-gate.mjs +6 -0
  6. package/contracts/axi/axi-standard.md +273 -0
  7. package/contracts/axi/pin.json +36 -0
  8. package/contracts/members.json +58 -0
  9. package/contracts/schemas/arbitration.schema.json +45 -0
  10. package/contracts/schemas/decision-envelope.schema.json +215 -0
  11. package/contracts/schemas/declaration.schema.json +190 -0
  12. package/contracts/schemas/dispute.schema.json +67 -0
  13. package/contracts/schemas/evidence-append.schema.json +72 -0
  14. package/contracts/schemas/gate-output.schema.json +296 -0
  15. package/contracts/schemas/marker.schema.json +75 -0
  16. package/contracts/schemas/review-envelope.schema.json +378 -0
  17. package/contracts/schemas/verdict-record.schema.json +191 -0
  18. package/contracts/suite-contract.md +270 -0
  19. package/dist/ai-engineering-gate.mjs +2762 -0
  20. package/package.json +47 -0
  21. package/skills/engineering/review-design-patterns/LICENSE +6 -0
  22. package/skills/engineering/review-design-patterns/SKILL.md +196 -0
  23. package/skills/engineering/review-design-patterns/agents/openai.yaml +3 -0
  24. package/skills/engineering/review-design-patterns/references/smell-signatures.md +117 -0
  25. package/skills/engineering/review-design-patterns/review-design-patterns.yaml +25 -0
  26. package/skills/engineering/review-modern-typescript/LICENSE +21 -0
  27. package/skills/engineering/review-modern-typescript/SKILL.md +88 -0
  28. package/skills/engineering/review-modern-typescript/agents/openai.yaml +3 -0
  29. package/skills/engineering/review-modern-typescript/references/smell-signatures.md +36 -0
  30. package/skills/engineering/review-modern-typescript/review-modern-typescript.yaml +22 -0
  31. package/skills/engineering/review-testing-patterns/SKILL.md +108 -0
  32. package/skills/engineering/review-testing-patterns/agents/openai.yaml +4 -0
  33. package/skills/engineering/review-testing-patterns/references/compiler-profile.mjs +103 -0
  34. package/skills/engineering/review-testing-patterns/references/smell-signatures.md +30 -0
  35. package/skills/engineering/review-testing-patterns/review-testing-patterns.yaml +23 -0
  36. package/skills/engineering/transpose-design-patterns/LICENSE +6 -0
  37. package/skills/engineering/transpose-design-patterns/SKILL.md +231 -0
  38. package/skills/engineering/transpose-design-patterns/agents/openai.yaml +3 -0
  39. package/skills/engineering/transpose-design-patterns/references/arbitration.schema.json +45 -0
  40. package/skills/engineering/transpose-design-patterns/references/decision-envelope.schema.json +215 -0
  41. package/skills/engineering/transpose-design-patterns/references/declaration.schema.json +190 -0
  42. package/skills/engineering/transpose-design-patterns/references/design-decision-record.schema.json +731 -0
  43. package/skills/engineering/transpose-design-patterns/references/dispute.schema.json +67 -0
  44. package/skills/engineering/transpose-design-patterns/references/evidence-append.schema.json +72 -0
  45. package/skills/engineering/transpose-design-patterns/references/marker.schema.json +75 -0
  46. package/skills/engineering/transpose-design-patterns/references/pattern-catalog.md +305 -0
  47. package/skills/engineering/transpose-design-patterns/references/record.example.json +120 -0
  48. package/skills/engineering/transpose-design-patterns/references/review-envelope.schema.json +378 -0
  49. package/skills/engineering/transpose-design-patterns/references/suite-contract.md +270 -0
  50. package/skills/engineering/transpose-design-patterns/references/transpose-angular.md +224 -0
  51. package/skills/engineering/transpose-design-patterns/references/transpose-php.md +561 -0
  52. package/skills/engineering/transpose-design-patterns/references/transpose-quarkus.md +283 -0
  53. package/skills/engineering/transpose-design-patterns/references/transpose-react.md +256 -0
  54. package/skills/engineering/transpose-design-patterns/references/transpose-vanilla.md +204 -0
  55. package/skills/engineering/transpose-design-patterns/references/transpose-vue.md +234 -0
  56. package/skills/engineering/transpose-design-patterns/transpose-design-patterns.yaml +24 -0
  57. package/skills/engineering/transpose-modern-typescript/LICENSE +21 -0
  58. package/skills/engineering/transpose-modern-typescript/SKILL.md +90 -0
  59. package/skills/engineering/transpose-modern-typescript/agents/openai.yaml +3 -0
  60. package/skills/engineering/transpose-modern-typescript/references/arbitration.schema.json +45 -0
  61. package/skills/engineering/transpose-modern-typescript/references/catalog.md +38 -0
  62. package/skills/engineering/transpose-modern-typescript/references/collections.md +50 -0
  63. package/skills/engineering/transpose-modern-typescript/references/compatibility.md +61 -0
  64. package/skills/engineering/transpose-modern-typescript/references/decision-envelope.schema.json +215 -0
  65. package/skills/engineering/transpose-modern-typescript/references/decision-record.schema.json +830 -0
  66. package/skills/engineering/transpose-modern-typescript/references/declaration.schema.json +190 -0
  67. package/skills/engineering/transpose-modern-typescript/references/dispute.schema.json +67 -0
  68. package/skills/engineering/transpose-modern-typescript/references/evidence-append.schema.json +72 -0
  69. package/skills/engineering/transpose-modern-typescript/references/idioms.md +74 -0
  70. package/skills/engineering/transpose-modern-typescript/references/marker.schema.json +75 -0
  71. package/skills/engineering/transpose-modern-typescript/references/platform.md +147 -0
  72. package/skills/engineering/transpose-modern-typescript/references/record.example.json +172 -0
  73. package/skills/engineering/transpose-modern-typescript/references/record.md +37 -0
  74. package/skills/engineering/transpose-modern-typescript/references/review-envelope.schema.json +378 -0
  75. package/skills/engineering/transpose-modern-typescript/references/suite-contract.md +270 -0
  76. package/skills/engineering/transpose-modern-typescript/references/types.md +97 -0
  77. package/skills/engineering/transpose-modern-typescript/transpose-modern-typescript.yaml +22 -0
  78. package/skills/engineering/transpose-testing-patterns/SKILL.md +96 -0
  79. package/skills/engineering/transpose-testing-patterns/agents/openai.yaml +4 -0
  80. package/skills/engineering/transpose-testing-patterns/references/arbitration.schema.json +45 -0
  81. package/skills/engineering/transpose-testing-patterns/references/catalog.md +218 -0
  82. package/skills/engineering/transpose-testing-patterns/references/decision-envelope.schema.json +215 -0
  83. package/skills/engineering/transpose-testing-patterns/references/decision-record.schema.json +857 -0
  84. package/skills/engineering/transpose-testing-patterns/references/declaration.schema.json +190 -0
  85. package/skills/engineering/transpose-testing-patterns/references/detect-adapter.mjs +98 -0
  86. package/skills/engineering/transpose-testing-patterns/references/dispute.schema.json +67 -0
  87. package/skills/engineering/transpose-testing-patterns/references/doubles-data.md +45 -0
  88. package/skills/engineering/transpose-testing-patterns/references/evidence-append.schema.json +72 -0
  89. package/skills/engineering/transpose-testing-patterns/references/journal-event.schema.json +115 -0
  90. package/skills/engineering/transpose-testing-patterns/references/marker.schema.json +75 -0
  91. package/skills/engineering/transpose-testing-patterns/references/record.example.json +230 -0
  92. package/skills/engineering/transpose-testing-patterns/references/record.md +25 -0
  93. package/skills/engineering/transpose-testing-patterns/references/review-envelope.schema.json +378 -0
  94. package/skills/engineering/transpose-testing-patterns/references/suite-contract.md +270 -0
  95. package/skills/engineering/transpose-testing-patterns/references/tdd.md +62 -0
  96. package/skills/engineering/transpose-testing-patterns/references/transpose-codeception.md +84 -0
  97. package/skills/engineering/transpose-testing-patterns/references/transpose-karma-jasmine-angular.md +73 -0
  98. package/skills/engineering/transpose-testing-patterns/references/transpose-vitest.md +111 -0
  99. package/skills/engineering/transpose-testing-patterns/references/typescript.md +42 -0
  100. package/skills/engineering/transpose-testing-patterns/transpose-testing-patterns.yaml +23 -0
package/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # ai-engineering-gate
2
+
3
+ Command and enforcement reference. Strategy, workflow diagrams and environment choices (local harness, [no-mistakes](https://kunchenguid.github.io/no-mistakes/), direct PR + CI) live in the [README](../README.md#how-the-suite-works).
4
+
5
+ One CLI, one JSON surface, three fingerprints. The gate does not judge design, TypeScript or tests: it stores the documents, derives the state, and answers whether a task is complete.
6
+
7
+ Install it with the Claude Code plugin, with `npm i -g @hellraisercenobit/ai-engineering-gate`, or run it from this checkout:
8
+
9
+ ```sh
10
+ node packages/ai-engineering-gate/dist/ai-engineering-gate.mjs --help
11
+ ```
12
+
13
+ ## Opt-in
14
+
15
+ The gate is silent and allows everything in a repository that does not carry `.ai-engineering-suite.json` at the root. That marker is the project's opt-in. A typical marker:
16
+
17
+ ```json
18
+ {
19
+ "markerVersion": "1.0.0",
20
+ "dimensions": "all",
21
+ "base": "origin/main",
22
+ "exportDirectory": ".engineering-suite"
23
+ }
24
+ ```
25
+
26
+ `dimensions` may also name a subset of the registry in `contracts/members.json`. Without a registered member the gate fails loud rather than inventing a dimension.
27
+
28
+ ## What it answers
29
+
30
+ | Command | Question |
31
+ | --- | --- |
32
+ | `status` | compact state of every registered dimension, plus the next action |
33
+ | `declare --dimension D --stdin` | file the applicability decision before any record |
34
+ | `record --dimension D --stdin` | file a decision record; a dangling citation is refused |
35
+ | `evidence append --dimension D --stdin` | append a journal event, a check output or a snapshot |
36
+ | `begin --dimension D` | open a review window and freeze the three fingerprints |
37
+ | `attest` / `report --dimension D --stdin` | file a SOUND envelope, or a SMELLS / VIOLATIONS one |
38
+ | `dispute` / `arbitrate --dimension D --stdin` | contest a finding; only a human-typed command writes an arbitration |
39
+ | `replay --dimension D --record R --scenario S --command C` | the gate runs the red/green pair and stamps both events |
40
+ | `can-write --path P` | may this path be edited now |
41
+ | `can-review --dimension D` | may a fresh review of this dimension start now |
42
+ | `can-stop` | is the task complete; the exit code is the publication lock |
43
+ | `export` | copy the task's documents into the marker's export directory |
44
+ | `fingerprint` | the three fingerprints, as the gate computes them |
45
+
46
+ `--json` is the schema-checked machine surface. `--full` discloses reasons, missing evidence and the dispatch plan. `--hook` answers in the harness event's own shape.
47
+
48
+ Exit codes: `0` allowed or valid, `2` denied by policy, `1` gate or infrastructure failure.
49
+
50
+ ```mermaid
51
+ flowchart LR
52
+ declare --> record --> evidence
53
+ record --> canWrite["can-write"]
54
+ evidence --> begin
55
+ begin --> attest["attest / report"]
56
+ attest --> canStop["can-stop"]
57
+ canStop --> export["export, then CI --from-export"]
58
+ ```
59
+
60
+ Publication lock is `can-stop` exit 0. With no-mistakes the driver consumes `can-stop --full` after lint. Without it, CI consumes `can-stop --json --from-export`. Local hooks are advisory. See [how it fits the environment](../README.md#how-it-fits-the-environment).
61
+
62
+ ## Fingerprints
63
+
64
+ A verdict binds to three content hashes the gate computes and never accepts from a document:
65
+
66
+ - **source** - declared scope, configuration files and the change set (tracked, staged, untracked)
67
+ - **reference** - the dimension's catalog, schemas and guides plus the contract and gate versions
68
+ - **decision** - the declaration and every record, each with its revision number
69
+
70
+ A content-neutral rebase leaves a verdict current. A catalog edit, a record revision or a new file in scope expires it.
71
+
72
+ ## Hooks
73
+
74
+ The plugin ships the three required hooks (`SessionStart`, `PreToolUse`, `Stop`) and the two optional ones (`PostToolUse` eager fingerprint refresh, `SubagentStop` `release --hook`) against this bundle. `SessionStart` and `Stop` inject the **compact** status (`next:` plus `status --full`). The dispatch briefs stay behind an explicit `can-stop --full` / `status --full`, which is what a no-mistakes driver runs. Neither optional hook decides validity. `npm run install:hooks -- --optional` covers a skills.sh install and Codex. Codex has no `sessionStart` context injection; the installer reports that limit instead of wiring a hook that answers into the void.
75
+
76
+ ## Threat model
77
+
78
+ The gate catches omission, drift and stale evidence. It does not defend against a forged index or a write through a tool the hooks do not see. `can-write` denies harness edits and shell write forms that target the index outside gate commands.
79
+
80
+ ## AXI
81
+
82
+ The surface is self-assessed against a pinned AXI text in `contracts/axi/`. `npm run check:axi` re-runs the named assertions. There is no AXI runtime dependency, and a new upstream revision requires a re-qualification, never a silent bump.
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: design-pattern-reviewer
3
+ description: Fresh, read-only reviewer for design-pattern audits. Runs the review-design-patterns skill on code it did not write - blind matrix first, then the recorded decision, then the code - and attests only a SOUND verdict. Use after a transpose-design-patterns implementation, with the brief that skill prescribes.
4
+ tools: Read, Grep, Glob, Bash, Skill
5
+ model: inherit
6
+ ---
7
+
8
+ # Design-pattern reviewer
9
+
10
+ You are the independent reviewer for one change. You did not write the code, you have no stake in it,
11
+ and your output is judgment only.
12
+
13
+ ## Protocol
14
+
15
+ Open your window first with `ai-engineering-gate begin --dimension design-patterns`: it prints the three
16
+ fingerprints your verdict will bind to and refuses you if you are the builder of this task. Then invoke the
17
+ `review-design-patterns` skill (the Skill tool; reading its `SKILL.md` loads the same text) and run every
18
+ step yourself on the scope the brief gives you. Do not dispatch another reviewer: you are the fresh one.
19
+ File the review envelope through `ai-engineering-gate attest --dimension design-patterns --stdin` for
20
+ `SOUND`, or `ai-engineering-gate report --dimension design-patterns --stdin` otherwise.
21
+
22
+ ## Rules that do not bend
23
+
24
+ - **The catalog is the standard.** The author's pattern names, comments, commit messages and rationale are
25
+ never evidence.
26
+ - **Freeze before you compare.** Write your expected design for every site before you open the design
27
+ decision record named in the brief. Open it only when the skill's step 4 says to.
28
+ - **Never modify a file.** Bash is read-only here: `git diff`, search, `cat`, and the gate commands that
29
+ open the window and file the envelope. Never `git log`: commit subjects carry the author's intent. A fix
30
+ belongs to the author, followed by a fresh review.
31
+ - **Attest only `SOUND`.** `SMELLS` and `VIOLATIONS` are filed through `report`, never attested. Both need
32
+ the window you opened; a refusal of `state-moved` means the code changed while you read it, so the review
33
+ is void - say so and stop rather than filing on code you did not read.
34
+ - **A brief that carries a pattern name, a rationale or the author's force analysis is contaminated.** The
35
+ requirement as the requester stated it is legitimate context. Say so in the report and derive anyway -
36
+ the frozen matrix still comes first.
37
+
38
+ ## Output
39
+
40
+ The skill's report format, ending on one verdict. Nothing else.
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: modern-typescript-reviewer
3
+ description: Fresh read-only reviewer for TS/JS decisions. Runs review-modern-typescript without builder history, freezes expectations before records, and attests only SOUND.
4
+ tools: Read, Grep, Glob, Bash, Skill
5
+ model: inherit
6
+ ---
7
+
8
+ # Modern TypeScript reviewer
9
+
10
+ Open your window with `ai-engineering-gate begin --dimension modern-typescript`, which prints the
11
+ three fingerprints your verdict binds to and refuses you if you built this task. Then run
12
+ /review-modern-typescript yourself on the neutral brief's exact scope. Read its skill file if no
13
+ Skill tool exists. You own no additional rules and do not delegate.
14
+
15
+ Modify no files, including code, records, catalogs and fixtures. Shell access is read-only; the
16
+ sole external mutation is the review envelope, piped to
17
+ `ai-engineering-gate attest --dimension modern-typescript --stdin` for SOUND or to
18
+ `ai-engineering-gate report --dimension modern-typescript --stdin` otherwise. Put no fingerprint
19
+ in it. A refusal of `state-moved` voids the review: say so and stop. Never git log or PR
20
+ rationale. Check record paths exist but open contents only after emitting the frozen matrix.
21
+
22
+ A brief with builder choices or rationale needs a new neutral dispatch before completion.
23
+ The original user request and independent constraints are legitimate facts. Return the
24
+ skill report. The builder fixes and dispatches a new reviewer.
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: testing-pattern-reviewer
3
+ description: Fresh read-only reviewer for testing decisions and TDD evidence. Runs review-testing-patterns, freezes expectations before records and attests only SOUND.
4
+ tools: Read, Grep, Glob, Bash, Skill
5
+ model: inherit
6
+ ---
7
+
8
+ # Testing pattern reviewer
9
+
10
+ Open your window with `ai-engineering-gate begin --dimension testing-patterns`, which prints the
11
+ three fingerprints your verdict binds to and refuses you if you built this task. Then run
12
+ /review-testing-patterns yourself on the neutral brief's exact scope. Read the skill file if no
13
+ Skill tool exists. You own no additional rules and do not delegate.
14
+
15
+ Modify no files, including fixtures and evidence. Shell access is read-only; the sole external
16
+ mutation is the review envelope, piped to
17
+ `ai-engineering-gate attest --dimension testing-patterns --stdin` for SOUND or to
18
+ `ai-engineering-gate report --dimension testing-patterns --stdin` otherwise. Never run a test to
19
+ produce evidence for the builder: a missing red is an evidence finding whose remedy is a `replay`
20
+ the gate performs. A refusal of `state-moved` voids the review: say so and stop. Never read git
21
+ log or PR rationale. Check record paths exist, then freeze the matrix before opening their
22
+ contents. Return the skill report. The builder corrects or disputes, then a fresh reviewer
23
+ reassesses.
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ // The generated bundle is what ships and what the hooks run, so the executable runs it too rather than
3
+ // the sources beside it: a stale bundle then fails the tests, not only the check.
4
+ import { main } from '../dist/ai-engineering-gate.mjs';
5
+
6
+ process.exitCode = main(process.argv.slice(2));
@@ -0,0 +1,273 @@
1
+ ---
2
+ name: axi
3
+ description: >
4
+ Agent eXperience Interface (AXI) — ergonomic standards for building CLI tools that agents
5
+ use via shell execution. Use when building, modifying, or reviewing any agent-facing CLI.
6
+ ---
7
+
8
+ # Agent eXperience Interface (AXI)
9
+
10
+ AXI defines ergonomic standards for building CLI tools that autonomous agents interact with through shell execution.
11
+
12
+ ## Before you start
13
+
14
+ Read the [TOON specification](https://toonformat.dev/reference/spec.html) before building any AXI output.
15
+
16
+ ## 1. Token-efficient output
17
+
18
+ Use [TOON](https://toonformat.dev/) (Token-Oriented Object Notation) as the output format on stdout.
19
+ TOON provides ~40% token savings over equivalent JSON while remaining readable by agents.
20
+ Convert to TOON at the output boundary — keep internal logic on JSON.
21
+
22
+ ```
23
+ tasks[2]{id,title,status,assignee}:
24
+ "1",Fix auth bug,open,alice
25
+ "2",Add pagination,closed,bob
26
+ ```
27
+
28
+ ## 2. Minimal default schemas
29
+
30
+ Every field in stdout costs tokens — multiplied by row count in collections.
31
+ Default to the smallest schema that lets the agent decide what to do next: typically an identifier, a title, and a status.
32
+
33
+ - Default list schemas: 3-4 fields, not 10
34
+ - Default limits: high enough to cover common cases in one call (if most repos have <100 labels, default to 100, not 30)
35
+ - Long-form content (bodies, descriptions) belongs in detail views, not lists
36
+ - Offer a `--fields` flag to let agents request additional fields explicitly
37
+
38
+ ## 3. Content truncation
39
+
40
+ Detail views often contain large text fields. Omitting them forces agents to hunt; including them wastes tokens.
41
+ Truncate by default and tell the agent how to get the full version.
42
+
43
+ ```
44
+ task:
45
+ number: 42
46
+ title: Fix auth bug
47
+ state: open
48
+ body: First 500 chars of the issue body...
49
+ ... (truncated, 8432 chars total)
50
+ help[1]: Run `tasks view 42 --full` to see complete body
51
+ ```
52
+
53
+ - Never omit large fields entirely — include a truncated preview
54
+ - Show the total size so the agent knows how much it's missing
55
+ - Suggest the escape hatch (`--full`) only when content is actually truncated
56
+ - Choose a truncation limit that covers most use cases (500-1500 chars)
57
+
58
+ ## 4. Pre-computed aggregates
59
+
60
+ The most expensive token cost is often not a longer response — it's a follow-up call. If your backend has data that agents commonly need as a next step, compute it and include it.
61
+
62
+ **Aggregate counts**: include the **total count** in list output, not just the page size. Agents need "how many are there?" and will paginate if the answer isn't definitive.
63
+
64
+ ```
65
+ count: 30 of 847 total
66
+ tasks[30]{number,title,state}:
67
+ 1,Fix auth bug,open
68
+ ...
69
+ ```
70
+
71
+ **Derived status fields**: when the next step almost always involves checking related state, include a lightweight summary inline.
72
+
73
+ ```
74
+ task:
75
+ number: 42
76
+ title: Deploy pipeline fix
77
+ state: open
78
+ checks: 3/3 passed
79
+ comments: 7
80
+ ```
81
+
82
+ Only include derived fields your backend can provide cheaply — a summary ("3/3 passed"), not the full data.
83
+
84
+ ## 5. Definitive empty states
85
+
86
+ When the answer is "nothing", say so explicitly. Ambiguous empty output causes agents to re-run with different flags to verify.
87
+
88
+ ```
89
+ $ tasks list --state closed
90
+ tasks: 0 closed tasks found in this repository
91
+ ```
92
+
93
+ State the zero with context. Make it clear the command succeeded — the absence of results is the answer.
94
+
95
+ ## 6. Structured errors & exit codes
96
+
97
+ ### Idempotent mutations
98
+
99
+ Don't error when the desired state already exists. If the agent closes something already closed, acknowledge and move on with exit code 0. Reserve non-zero exit codes for situations where the agent's intent genuinely cannot be satisfied.
100
+
101
+ ```
102
+ $ tasks close 42
103
+ task: #42 already closed (no-op) # exit 0
104
+ ```
105
+
106
+ ### Structured errors on stdout
107
+
108
+ Errors go to **stdout** in the same structured format as normal output, so the agent can read and act on them. Include what went wrong and an actionable suggestion. Never let raw dependency output (API errors, stack traces) leak through.
109
+
110
+ ```
111
+ error: --title is required
112
+ help: tasks create --title "..." [--body "..."]
113
+ ```
114
+
115
+ - Validate required flags before calling any dependency
116
+ - Translate errors — extract actionable meaning, discard noise
117
+ - Never leak dependency names — suggestions reference your CLI's commands, not the underlying tool
118
+
119
+ ### No interactive prompts
120
+
121
+ Every operation must be completable with flags alone. If a required value is missing, fail immediately with a clear error — don't prompt for it. Suppress prompts from wrapped tools.
122
+
123
+ ### Fail loud on unrecognized input
124
+
125
+ Reject unknown flags and arguments — never silently ignore them. A dropped flag is worse than an error: the agent gets plausible-looking output it believes is scoped or filtered, then proceeds confidently on wrong data. This is the same guarantee a CLI already owes for an unknown _command_; extend it to flags.
126
+
127
+ ```
128
+ $ tasks list --stat closed
129
+ error: unknown flag --stat for `list`
130
+ help: valid flags for `list`: --state, --assignee, --limit (--help always allowed)
131
+ ```
132
+
133
+ - **Validate before any dependency call**, with exit code 2 — the same as a missing required flag. Each command declares its own known flags; an unrecognized one is rejected by name and the command's valid flags are listed.
134
+ - **`--help` always passes** — it's the one universal flag. Beyond it, a CLI may standardize its own always-allowed globals (e.g. an `--account` selector); whatever the set, those flags pass on every command and are never reported as unknown.
135
+ - **Renamed or removed flags get a targeted hint**, not the generic list — point at what replaced them (`--status was renamed; use --state instead`) so the agent self-corrects in one step.
136
+ - **Per-subcommand flag sets.** For grouped nouns where one command dispatches to subcommands (a `list` vs a `create` under the same noun), validate against the _subcommand's_ flags — they differ, and only the subcommand layer knows which is in play.
137
+ - **Make the error self-correcting in one turn.** The agent's deterministic next move after an unknown-flag error is to run `<command> --help` (e.g. `tasks list --help`) — so fold that lookup into the error: list the valid flags inline, or print the command's concise `--help` block directly beneath it. Per §4 the expensive cost is the follow-up call, and per §10 per-command help is already concise, so inlining it collapses the two-turn correction into one.
138
+
139
+ ### Output channels
140
+
141
+ - **stdout**: all structured output the agent consumes — data, errors, suggestions
142
+ - **stderr**: debug logging, progress indicators, diagnostics (agents don't read this)
143
+ - **Exit codes**: 0 = success (including no-ops), 1 = error, 2 = usage error
144
+
145
+ Never mix progress messages into stdout. An agent that reads "Fetching data..." will try to interpret it as data.
146
+
147
+ ## 7. Ambient context via session integrations
148
+
149
+ Register your tool into the agent's session lifecycle so every conversation starts with relevant state already visible — before the agent takes any action.
150
+
151
+ **Pattern:**
152
+
153
+ 1. Provide an explicit setup command that installs or repairs a session hook or plugin after user intent is clear
154
+ 2. At session start, the integration runs your tool and provides a compact dashboard as context
155
+ 3. The agent receives this as initial context and can act immediately
156
+
157
+ ```
158
+ # Agent sees this at session start — no invocation needed:
159
+ specs[2]{id,title,status}:
160
+ 1,Fix auth bug,open
161
+ 2,Add pagination,in-progress
162
+
163
+ help[2]:
164
+ Run `mytool specs view 1` for details
165
+ Run `mytool specs create --title "..."` to add a spec
166
+ ```
167
+
168
+ **Rules:**
169
+
170
+ - **Default app targets**: by default, support Claude Code, Codex, and OpenCode. Do not hard-code a single agent integration when the tool can reasonably support multiple agents
171
+ - **Explicit opt-in**: register hooks or plugins only from a user-invoked setup command, not from ordinary CLI commands
172
+ - **Portable commands**: hook commands should use a PATH-verified binary name when it resolves to the current executable, and fall back to the full absolute path otherwise. This keeps global installs portable while ensuring hooks do not accidentally run a different binary
173
+ - **Path repair**: setup commands should check existing hooks and update the executable path if it has changed (e.g., after reinstall or relocation)
174
+ - **Idempotent**: repeated installs with the same path are silent no-ops
175
+ - **Directory-scoped**: show only state relevant to the current working directory
176
+ - **Token-budget-aware**: this context loads on _every_ session — ruthlessly minimize it. Include just enough for the agent to orient and act; deep data belongs in explicit invocations
177
+ - **Lifecycle capture**: use session-end hooks to capture what happened (transcripts, files touched, specs referenced) so future session-start context gets richer over time
178
+
179
+ **How to integrate with each app:**
180
+
181
+ - **Claude Code**: use native hooks in `~/.claude/settings.json` or project `.claude/settings.json`. Prefer `SessionStart` to inject compact context via stdout
182
+ - **Codex**: use native hooks in `~/.codex/hooks.json` or `<repo>/.codex/hooks.json`, and ensure `[features].hooks = true` in `config.toml`. Prefer `SessionStart` for ambient context via stdout
183
+ - **OpenCode**: use a managed plugin in `~/.config/opencode/plugins/` or `<repo>/.opencode/plugins/`. Prefer ambient system-context injection for the home view rather than adding a custom tool
184
+
185
+ **Also ship an installable skill (secondary recommendation):**
186
+
187
+ The session hook is the primary integration, but it only helps agents whose harness supports hooks, and it loads on _every_ session.
188
+ Offer an installable [Agent Skill](https://agentskills.io) as a secondary discovery path.
189
+ It loads on demand when the agent recognizes a matching task, carries no per-session token cost, and works in any agent that supports the skill format.
190
+ Recommend the hook first (ambient context plus live state) and the skill second (lower overhead, broader agent support) - they are complementary, and a user installs whichever fits, or both.
191
+
192
+ ```sh
193
+ npx skills add <owner>/<repo> --skill <name>
194
+ ```
195
+
196
+ - **Single source of truth**: generate `SKILL.md` from the same content your no-args home view prints, so the skill never drifts from the CLI's own guidance. Add a `--check` build step to CI that fails if the committed skill is stale
197
+ - **Strip live state**: a skill is static, so omit dynamic data (open sessions, current items) that only the hook can show
198
+ - **Non-interactive commands**: rewrite command examples to a form the agent can run without a global install (e.g. `npx -y mytool ...`), since a skill may be installed without the binary on PATH
199
+ - **Trigger-shaped frontmatter**: include `name` and a `description` written as a trigger — terse and outcome-focused so the agent loads it on the right intent
200
+ - **Document both paths**: in your README, present the hook and the skill as two ways to achieve the same thing, and make clear the user only needs one
201
+
202
+ ## 8. Content first
203
+
204
+ Running your CLI with no arguments should show the most relevant live content — not a usage manual.
205
+ When an agent sees actual state it can act immediately. When it sees help text, it has to make a second call.
206
+
207
+ ```
208
+ $ tasks
209
+ tasks[3]{id,title,status}:
210
+ 1,Fix auth bug,open
211
+ 2,Add pagination,open
212
+ 3,Update docs,closed
213
+ help[2]:
214
+ Run `tasks view <id>` to see full details
215
+ Run `tasks create --title "..."` to add a task
216
+ ```
217
+
218
+ ## 9. Contextual disclosure
219
+
220
+ Include **a few next steps** that follow logically from the current output.
221
+ The agent discovers your CLI's surface area organically by using it, not by reading a manual upfront.
222
+
223
+ Rules:
224
+
225
+ - **Relevant**: after an open item → suggest closing; after an empty list → suggest creating; after a list → suggest viewing
226
+ - **Actionable**: every suggestion is a complete command (or template) carrying forward any disambiguating flags from the current invocation (e.g., `--repo`, `--source`)
227
+ - **Parameterize dynamic values**: when a suggested command needs a runtime value such as an ID, title, branch, URL, or path, use placeholders like `<id>` or `"<title>"` instead of guessing a concrete value that may mislead the agent
228
+ - **Omit when self-contained**: when the output fully answers the query (a detail view, a count, a confirmation), suggestions are noise — leave them out. Include them on list and mutation responses where the next step isn't obvious.
229
+ - **Guide discovery, not workflows**: suggest a variety of possible next actions, don't prescribe a fixed sequence. An agent that already knows what it wants should never be nudged into an extra step.
230
+ - **Reveal truncated lists**: when a list shows only the most recent N items out of a larger total, add a help hint telling the agent how to see all of them (e.g., `Run 'mytool list' for all 47 items`). Don't encode pagination into TOON array headers — use help hints instead.
231
+ - **Resolve errors**: on errors, suggest the specific command that fixes the problem, not "see `--help`"
232
+
233
+ ## 10. Consistent way to get help
234
+
235
+ The top-level home view should also identify the tool itself before the live data:
236
+
237
+ - Include the absolute path of the current executable, with the user's home directory collapsed to `~`
238
+ - Include a one-sentence description of what this AXI does
239
+
240
+ ```
241
+ $ tasks
242
+ bin: ~/.local/bin/tasks
243
+ description: Manage project tasks in the current workspace
244
+ ...
245
+ ```
246
+
247
+ Every subcommand should support `--help` with a concise, complete reference: available flags with defaults, required arguments, and 2-3 usage examples. Keep it focused on the requested subcommand — don't dump the entire CLI's manual.
248
+
249
+ ### Identify yourself instantly: the `--version` fast path
250
+
251
+ `-v`, `-V`, and `--version` must all print the bare version and exit 0. Agents and their harnesses probe `--version` constantly - to confirm a tool is installed, to check whether a fix has shipped, to decide whether to suggest `update`. That makes latency an ergonomics property, not just a perf tweak: a probe that takes 80 ms is 80 ms of every session start, paid before any useful work happens.
252
+
253
+ The trap is ESM static imports. If `bin/<tool>.js` statically imports the module that builds the command graph, every dependency in that graph is fully evaluated _before_ the version check runs. One heavy import anywhere in the tree - an SDK, a server framework - is then paid on every `--version`.
254
+
255
+ Answer the version before the graph loads: keep the version in a leaf module that imports only node builtins, and defer the real CLI to a dynamic `import()`.
256
+
257
+ ```js
258
+ #!/usr/bin/env node
259
+ import { tryFastPath } from "axi-sdk-js/fast-path";
260
+ import { VERSION } from "../src/version.js"; // leaf module - node builtins only
261
+
262
+ if (!tryFastPath(process.argv.slice(2), { version: VERSION })) {
263
+ const { main } = await import("../src/cli.js"); // heavy graph loads only here
264
+ await main();
265
+ }
266
+ ```
267
+
268
+ `axi-sdk-js/fast-path` is a dedicated subpath export that imports nothing at all, so pulling it in never drags in `runAxiCli` or its dependencies. `tryFastPath` handles only a bare, single-argument version flag and returns `false` for everything else, so all other argv - including version flags in trailing positions - falls through to `runAxiCli`, which stays the single owner of the general case. Its accepted flags and output are identical to the SDK's own version handling, so adopting it changes nothing an agent can observe except the latency.
269
+
270
+ Two things keep this honest:
271
+
272
+ - The version must come from a **leaf** module. If `VERSION` is defined inside `cli.ts`, importing it re-pulls the whole graph and the fast path buys nothing.
273
+ - Guard it with a test that measures the version path against the `node -e "console.log(1)"` floor measured in the same process, rather than an absolute millisecond budget that goes flaky across machines.
@@ -0,0 +1,36 @@
1
+ {
2
+ "upstream": "https://github.com/kunchenguid/axi",
3
+ "revision": "b7dbc1324ce637f08835ce5c45783a24287511f2",
4
+ "path": ".agents/skills/axi/SKILL.md",
5
+ "text": "contracts/axi/axi-standard.md",
6
+ "textHash": "sha256:2f5a6b3dd6f84bb3ee56d814ac6dde00c3c2b54fd0b0554129c2680a655948c4",
7
+ "qualifiedOn": "2026-09-18",
8
+ "complianceLevel": "partial, self-assessed against the pinned text",
9
+ "assessment": "This repository asserts the surface properties below against the pinned text by running the gate. It is self-assessment, not an upstream certification, and it carries no AXI runtime dependency. A new upstream revision requires re-qualification: the pin, the text and this assessment move together, or the claim does not move at all.",
10
+ "adopted": [
11
+ "2 - minimal default schemas: the compact status is one row per dimension with its state, not its evidence",
12
+ "3 - content truncation: reasons, missing evidence and the dispatch plan sit behind `--full`",
13
+ "4 - pre-computed aggregates: the compact status carries the round, the completion codes and the next action, so the caller needs no follow-up to know where the task stands",
14
+ "5 - definitive empty states: a repository with no marker prints nothing and allows, and a dimension with nothing to do says so",
15
+ "6 - structured errors and exit codes: 0 allowed, 2 denied by policy, 1 gate failure; a refusal carries its code, its reason and its cause; unknown flags fail loud; no command prompts",
16
+ "7 - ambient context: the plugin's SessionStart hook injects the compact status, and the installer covers the routes a plugin does not",
17
+ "8 - content first: no argument prints the live state of the task, never the manual",
18
+ "9 - contextual disclosure: every answer ends on the next command to run, with placeholders rather than guessed values",
19
+ "10 - consistent help: `--help` lists every command, flag and exit code in one screen"
20
+ ],
21
+ "notAdopted": [
22
+ "1 - TOON output: the gate's machine surface is JSON validated against `contracts/schemas/gate-output.schema.json`, because the contract pins that surface for reviewers, harness hooks and CI alike, and a second serialization would be a second thing to keep true. The compact surface stays a table plus a `next` line, which is what the suite contract describes."
23
+ ],
24
+ "surfaceAssertions": [
25
+ "no-argument output is live state",
26
+ "compact status names one state per dimension",
27
+ "compact status names the next action",
28
+ "reasons are disclosed only behind --full",
29
+ "json output is versioned and schema-valid",
30
+ "an unknown flag fails loud on stderr",
31
+ "a refusal is structured on stdout",
32
+ "exit codes are 0, 2 and 1 as documented",
33
+ "help lists every command and exit code",
34
+ "an unmarked repository is silent and allows"
35
+ ]
36
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "contractVersion": "1.1.0",
3
+ "members": [
4
+ {
5
+ "dimension": "design-patterns",
6
+ "transpose": "skills/engineering/transpose-design-patterns",
7
+ "review": "skills/engineering/review-design-patterns",
8
+ "agent": "agents/design-pattern-reviewer.md",
9
+ "decisionSchema": "skills/engineering/transpose-design-patterns/references/design-decision-record.schema.json",
10
+ "evidenceSchemas": {},
11
+ "referenceBundle": [
12
+ "skills/engineering/transpose-design-patterns/references",
13
+ "skills/engineering/review-design-patterns/references"
14
+ ],
15
+ "contractVersions": [
16
+ "1.0.0",
17
+ "1.1.0"
18
+ ],
19
+ "status": "implemented"
20
+ },
21
+ {
22
+ "dimension": "modern-typescript",
23
+ "transpose": "skills/engineering/transpose-modern-typescript",
24
+ "review": "skills/engineering/review-modern-typescript",
25
+ "agent": "agents/modern-typescript-reviewer.md",
26
+ "decisionSchema": "skills/engineering/transpose-modern-typescript/references/decision-record.schema.json",
27
+ "evidenceSchemas": {},
28
+ "referenceBundle": [
29
+ "skills/engineering/transpose-modern-typescript/references",
30
+ "skills/engineering/review-modern-typescript/references"
31
+ ],
32
+ "contractVersions": [
33
+ "1.0.0",
34
+ "1.1.0"
35
+ ],
36
+ "status": "implemented"
37
+ },
38
+ {
39
+ "dimension": "testing-patterns",
40
+ "transpose": "skills/engineering/transpose-testing-patterns",
41
+ "review": "skills/engineering/review-testing-patterns",
42
+ "agent": "agents/testing-pattern-reviewer.md",
43
+ "decisionSchema": "skills/engineering/transpose-testing-patterns/references/decision-record.schema.json",
44
+ "evidenceSchemas": {
45
+ "journal-event": "skills/engineering/transpose-testing-patterns/references/journal-event.schema.json"
46
+ },
47
+ "referenceBundle": [
48
+ "skills/engineering/transpose-testing-patterns/references",
49
+ "skills/engineering/review-testing-patterns/references"
50
+ ],
51
+ "contractVersions": [
52
+ "1.0.0",
53
+ "1.1.0"
54
+ ],
55
+ "status": "implemented"
56
+ }
57
+ ]
58
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/hellraisercenobit/skills/blob/main/contracts/schemas/arbitration.schema.json",
4
+ "title": "Arbitration 1.0.0",
5
+ "description": "A dispute's only exit, and only a human hand writes it. `arbitrate` is refused whenever an identity handoff exists for the call, which is the case for every agent tool call a hook saw.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "document",
10
+ "documentVersion",
11
+ "dimension",
12
+ "dispute",
13
+ "decision",
14
+ "words"
15
+ ],
16
+ "properties": {
17
+ "document": {
18
+ "const": "arbitration"
19
+ },
20
+ "documentVersion": {
21
+ "const": "1.0.0"
22
+ },
23
+ "dimension": {
24
+ "type": "string",
25
+ "minLength": 1
26
+ },
27
+ "dispute": {
28
+ "description": "The identifier of the dispute being arbitrated.",
29
+ "type": "string",
30
+ "minLength": 1
31
+ },
32
+ "decision": {
33
+ "description": "`uphold` closes the finding by arbitration and allows one fresh review on the same state; `reject` puts its remedy or correction back to pending.",
34
+ "enum": [
35
+ "uphold",
36
+ "reject"
37
+ ]
38
+ },
39
+ "words": {
40
+ "description": "The user's own words.",
41
+ "type": "string",
42
+ "minLength": 1
43
+ }
44
+ }
45
+ }