@orkestrel/scaffold 0.0.33 → 0.0.36
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.
- package/dist/host/agents/orchestration.md +28 -12
- package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +146 -194
- package/dist/host/agents/skills/enterprise-bootstrap/references/bootstrap-reference.md +29 -22
- package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +31 -4
- package/dist/host/agents/skills/enterprise-bootstrap/references/frontend-design.md +103 -33
- package/dist/host/agents/skills/enterprise-bootstrap/references/utilities.md +1 -1
- package/dist/host/agents/skills/orkestrel-build-application/references/application.md +2 -2
- package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +2 -1
- package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +21 -3
- package/dist/host/agents/skills/orkestrel-falsify/agents/openai.yaml +4 -0
- package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +7 -7
- package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +10 -2
- package/dist/host/agents/skills/orkestrel-human-journey/SKILL.md +124 -0
- package/dist/host/agents/skills/orkestrel-human-journey/agents/openai.yaml +4 -0
- package/dist/host/agents/skills/orkestrel-human-journey/references/captures.md +74 -0
- package/dist/host/agents/skills/orkestrel-human-journey/references/layer.md +131 -0
- package/dist/host/claude/agents/analyst.md +4 -4
- package/dist/host/claude/agents/codex.md +4 -4
- package/dist/host/claude/agents/grok.md +4 -4
- package/dist/host/claude/agents/sol.md +56 -0
- package/dist/host/claude/rules/application.md +5 -3
- package/dist/host/claude/rules/documentation.md +6 -3
- package/dist/host/claude/rules/patterns.md +10 -0
- package/dist/host/claude/rules/quality.md +5 -4
- package/dist/host/claude/rules/tests.md +17 -12
- package/dist/host/claude/settings.json +94 -5
- package/dist/host/claude/skills/orkestrel-human-journey/SKILL.md +10 -0
- package/dist/host/claude/skills/orkestrel-polish-surface/SKILL.md +1 -1
- package/dist/host/codex/agents/grok.toml +1 -1
- package/dist/host/codex/agents/opus.toml +3 -3
- package/dist/host/codex/agents/planner.toml +1 -1
- package/dist/host/codex/agents/reviewer.toml +1 -1
- package/dist/host/dotfiles/gitignore +3 -0
- package/dist/host/manifest.json +41 -1
- package/dist/host/scripts/codex.sh +0 -0
- package/dist/host/scripts/cursor.sh +0 -0
- package/dist/host/scripts/deps.sh +0 -0
- package/dist/host/scripts/ollama.sh +0 -0
- package/dist/host/tests/policy.test.ts +33 -0
- package/dist/host/tests/setupPolicy.ts +319 -2
- package/dist/src/core/index.cjs +1 -1
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.js +1 -1
- package/dist/src/core/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orkestrel-human-journey
|
|
3
|
+
description: Prove a browser application the way a person uses it — real keystrokes, clicks, and Tab/Enter against only what is visible and reachable — and generate the capture portfolio from those same journeys. Use when accepting a UI build, proving an application end to end, deciding whether a surface is reachable by keyboard alone, proving what a screen refuses as well as what it does, auditing whether the interface speaks the user's vocabulary rather than the engine's, producing the screenshots a design review judges, or whenever the only evidence a screen works is a test that drove it through JavaScript instead of through the interface.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Prove an application through human journeys
|
|
7
|
+
|
|
8
|
+
## Load authority
|
|
9
|
+
|
|
10
|
+
Read the current files in this order:
|
|
11
|
+
|
|
12
|
+
1. `AGENTS.md`.
|
|
13
|
+
2. `.claude/rules/tests.md` for test law, real implementations, and shared test infrastructure;
|
|
14
|
+
`.claude/rules/browser.md` for browser and Vue usage; `.claude/rules/application.md` for app
|
|
15
|
+
composition and entries; `.claude/rules/documentation.md` for parity. Those rules are the
|
|
16
|
+
contract; this skill is the workflow.
|
|
17
|
+
3. [layer.md](references/layer.md) before building, extending, or debugging the journey layer.
|
|
18
|
+
4. [captures.md](references/captures.md) before registering a state or placing a capture.
|
|
19
|
+
5. `guides/README.md`, the governing guide for the surface, and `ROADMAP.md` when present.
|
|
20
|
+
6. The `*/types.ts` of every environment the journeys drive, plus the application's root component,
|
|
21
|
+
route entry, and store contract.
|
|
22
|
+
|
|
23
|
+
## Apply the journey laws
|
|
24
|
+
|
|
25
|
+
1. **Drive only what a person can see and reach.** Target every control by its ARIA role and its
|
|
26
|
+
accessible name as rendered. Never reach into a component instance, a store, a transport, a
|
|
27
|
+
copied credential, or a test-only hook to make a step succeed. Report a step that cannot be
|
|
28
|
+
performed through the interface as a finding about the interface.
|
|
29
|
+
2. **Assert what is seen.** Quote the rendered text a person reads, which is `innerText` — a label
|
|
30
|
+
under `text-uppercase` asserts as `TRACE` where the source says `Trace`. Never let a state read
|
|
31
|
+
replace a perception assertion; it may only corroborate one, and `.claude/rules/tests.md` fixes
|
|
32
|
+
which state a test may read at all.
|
|
33
|
+
3. **Assert what the interface withholds.** Assert every refusal through the resolver's exact
|
|
34
|
+
failure voice, and distinguish an absent control from a present but humanly unreachable one.
|
|
35
|
+
4. **Keep transport and persistence proofs in their own declared block,** never inside a journey.
|
|
36
|
+
Assert every live or asynchronous fact by convergence — poll until it contains or equals — never
|
|
37
|
+
by an identity read of one frame.
|
|
38
|
+
5. **Generate the portfolio from the acceptance journeys.** Place each registered state inside the
|
|
39
|
+
journey that reaches it, and never register a state no journey reaches.
|
|
40
|
+
6. **Commit a value through an act a person performs:** Enter, Tab away, or a named button. Report a
|
|
41
|
+
surface that commits on a timer, on an unpredictable event, or only after work the person cannot
|
|
42
|
+
observe as a surface finding, and never work around it in the layer.
|
|
43
|
+
|
|
44
|
+
## Build or verify the journey layer
|
|
45
|
+
|
|
46
|
+
- Build the layer as shared browser test infrastructure under `.claude/rules/tests.md`: it lives in
|
|
47
|
+
the workspace's browser test setup module, exports every helper from there, and adds a journey
|
|
48
|
+
helper only where `@orkestrel/test` publishes none. Never declare a resolver inside a test file.
|
|
49
|
+
- Give the layer every capability [layer.md](references/layer.md) fixes: the role-scoped resolver
|
|
50
|
+
and its distinct failure voices, region-scoped resolution, the input and traversal verbs, the
|
|
51
|
+
perception readers, and the capture hook.
|
|
52
|
+
- Drive every step through the browser provider's user-event API, and never dispatch a constructed
|
|
53
|
+
event ([layer.md](references/layer.md) → What it drives).
|
|
54
|
+
- Re-verify the layer against what the application renders now whenever markup changes
|
|
55
|
+
([layer.md](references/layer.md) → Role vocabulary).
|
|
56
|
+
|
|
57
|
+
## Derive journeys from intents
|
|
58
|
+
|
|
59
|
+
Write one journey per user intent, named for what the person achieves rather than for the
|
|
60
|
+
components it passes through. Place them in the browser environment's `integration.test.ts`, whose
|
|
61
|
+
placement and scope `.claude/rules/tests.md` fixes.
|
|
62
|
+
|
|
63
|
+
- Enter through the real entry: mount the shipped root component with a real store and the route a
|
|
64
|
+
person lands on, and let the application load itself.
|
|
65
|
+
- Reach each surface's own controls through forward Tab traversal in at least one journey.
|
|
66
|
+
- Type keystroke by keystroke where the keystrokes are the subject; fill in one operation where the
|
|
67
|
+
text is only a payload the person pastes.
|
|
68
|
+
- Poll every fact the application produces asynchronously until it converges. Never assert one from
|
|
69
|
+
a single read after the action.
|
|
70
|
+
- Assert the negative beside the positive whenever a value replaces another: the new sentence is
|
|
71
|
+
present **and** the old one is gone.
|
|
72
|
+
- After a confirmed destructive action, assert through trusted input that focus landed on a visible,
|
|
73
|
+
announced location.
|
|
74
|
+
- Assert the whole page's perception never matches the vocabulary the product does not speak —
|
|
75
|
+
engine, schema, and implementation words the interface is supposed to translate.
|
|
76
|
+
- Report a bare accessible name that answers for two reachable elements on one screen as a surface
|
|
77
|
+
finding, and target through role or region until the surface is fixed.
|
|
78
|
+
|
|
79
|
+
## Prove the refusals
|
|
80
|
+
|
|
81
|
+
- Give every surface a refusal family: the controls a person must not reach in the state the
|
|
82
|
+
journey has put the surface in.
|
|
83
|
+
- Assert the exact failure voice the case means. Never write an assertion that accepts either of
|
|
84
|
+
two voices.
|
|
85
|
+
- Cover the restrictions the interface imposes on itself: a collapsed panel's field, a verb
|
|
86
|
+
belonging to another kind of object, a control disabled until its precondition lands.
|
|
87
|
+
- When a refusal changes voice after a markup change, read it as a role or reachability change
|
|
88
|
+
before treating the element as missing
|
|
89
|
+
([layer.md](references/layer.md) → Role vocabulary).
|
|
90
|
+
|
|
91
|
+
## Declare the transport family
|
|
92
|
+
|
|
93
|
+
- Name the block for what it proves — persistence, restart, storage failure.
|
|
94
|
+
- Drive it through the application's real session and store contracts. Build a store that stalls a
|
|
95
|
+
read, fails a fixed number of reads, or fails a write as an inert configurable implementation of
|
|
96
|
+
the published interface, under the real-implementation law in `AGENTS.md`.
|
|
97
|
+
- Prove the visible half in a journey: the failure sentence a person reads, and the retry control
|
|
98
|
+
that clears it.
|
|
99
|
+
- Assert restart by starting a second session over the same store and polling the restored value.
|
|
100
|
+
|
|
101
|
+
## Generate the portfolio
|
|
102
|
+
|
|
103
|
+
Follow [captures.md](references/captures.md) for the state registry and its placement rules, the
|
|
104
|
+
theme-and-viewport variant matrix, the always-on filename proof, the capture-run membership proof,
|
|
105
|
+
and how a state that exists only during an activation is captured.
|
|
106
|
+
|
|
107
|
+
Route review of the portfolio to the `orkestrel-polish-surface` campaign. Do not judge it here.
|
|
108
|
+
|
|
109
|
+
## Accept
|
|
110
|
+
|
|
111
|
+
Completion requires all of:
|
|
112
|
+
|
|
113
|
+
- every in-scope user intent reaching its outcome through the interface, with no step that reaches
|
|
114
|
+
past it;
|
|
115
|
+
- keyboard-only reachability proven on every surface the journeys cover;
|
|
116
|
+
- a refusal family per surface, each asserting one exact failure voice;
|
|
117
|
+
- the transport family declared separately, driven through real implementations, and convergent;
|
|
118
|
+
- the registry-times-variants filename proof and the state-placement proof green in an ordinary run;
|
|
119
|
+
- one capture run per variant writing every registered file, each read back non-empty;
|
|
120
|
+
- perception assertions quoting rendered text, and the vocabulary sweep green on the whole page;
|
|
121
|
+
- the repository gates green, under the independent-verification law in `.agents/orchestration.md`.
|
|
122
|
+
|
|
123
|
+
Report each journey by the intent it proves, the refusals it establishes, the states it placed, and
|
|
124
|
+
every surface finding the layer's refusals exposed.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: 'Prove Human Journeys'
|
|
3
|
+
short_description: 'Prove an application through the interface a person uses'
|
|
4
|
+
default_prompt: 'Use $orkestrel-human-journey to prove this application through the interface a person uses, and generate the capture portfolio from those journeys.'
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# The capture portfolio
|
|
2
|
+
|
|
3
|
+
Take every screenshot from an acceptance journey, at the moment that journey is in the state the
|
|
4
|
+
picture names. Never add a test whose only purpose is a screenshot, and never stage a state for the
|
|
5
|
+
camera that a journey did not reach through the interface.
|
|
6
|
+
|
|
7
|
+
## The capture hook
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
capture(state: string): Promise<string | undefined>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- Return `undefined` and do nothing when the capture flag is unset, so an ordinary run neither
|
|
14
|
+
resizes the viewport nor writes a file.
|
|
15
|
+
- Read one variant value that names the theme and the viewport together, and refuse a value that
|
|
16
|
+
names no registered variant.
|
|
17
|
+
- Apply that variant's theme and viewport inside the hook, so the run's single variant value is the
|
|
18
|
+
only source of both.
|
|
19
|
+
- Write one file named `<state>--<variant>.png` under the workspace's git-ignored `tmp/` tree, and
|
|
20
|
+
return the path it wrote.
|
|
21
|
+
|
|
22
|
+
## The registry
|
|
23
|
+
|
|
24
|
+
Declare two frozen lists in the journey file: the state names, and the variants.
|
|
25
|
+
|
|
26
|
+
- Name a state for its surface and its condition — `answer-partial`, `start-storage-failure`,
|
|
27
|
+
`case-delete-confirmation`.
|
|
28
|
+
- Register the states the design work actually needs, and place every registered one. Never leave a
|
|
29
|
+
registered state unplaced.
|
|
30
|
+
- Wrap the hook in a placement helper that refuses an unregistered state name, refuses a second
|
|
31
|
+
placement of the same state, records each written path, and refuses a filename written twice.
|
|
32
|
+
- Place a state from inside the journey that reaches it, immediately after the assertion that
|
|
33
|
+
proves the surface is in that state.
|
|
34
|
+
|
|
35
|
+
## Variants
|
|
36
|
+
|
|
37
|
+
- Name a variant as one value carrying both the theme and the viewport, such as `dark-390`. Never
|
|
38
|
+
split them into two selectors: a split lets a run write a filename describing a combination it
|
|
39
|
+
did not render.
|
|
40
|
+
- Render one variant per run, and produce the portfolio — the registry times the variants — by
|
|
41
|
+
repeating the run once per variant.
|
|
42
|
+
|
|
43
|
+
## The two proofs
|
|
44
|
+
|
|
45
|
+
| Proof | Runs | Asserts |
|
|
46
|
+
| -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- |
|
|
47
|
+
| Filename expansion | Always | The registry's length and uniqueness, the variant count, and that the expansion is unique |
|
|
48
|
+
| Portfolio membership | Always; disk under the flag | Every registered state was placed; under the flag, the files on disk are exactly the expansion |
|
|
49
|
+
|
|
50
|
+
- Keep the filename proof always-on, so a registry edit that introduces a duplicate or a collision
|
|
51
|
+
fails the ordinary run.
|
|
52
|
+
- Assert placement equality as set equality against the registry, in every run. Never assert a
|
|
53
|
+
count: a count passes while one state is placed twice and another never.
|
|
54
|
+
- Under the capture flag, assert the written filenames equal the registry expanded for the run's
|
|
55
|
+
variant, then read each file back and require non-empty contents. Never treat the path a
|
|
56
|
+
screenshot call returned as proof that a file exists.
|
|
57
|
+
- Put the membership proof last in the file, after every journey that feeds its tally.
|
|
58
|
+
|
|
59
|
+
## Transient states
|
|
60
|
+
|
|
61
|
+
Capture a state that exists only while an activation is in flight from inside that activation,
|
|
62
|
+
never after the click returns.
|
|
63
|
+
|
|
64
|
+
- Attach a one-shot listener to the resolved control, place the capture from inside it, then click
|
|
65
|
+
through the normal verb and await the promise the listener recorded.
|
|
66
|
+
- Fail the step when the listener never ran.
|
|
67
|
+
|
|
68
|
+
## Hygiene
|
|
69
|
+
|
|
70
|
+
- Keep the portfolio out of version control.
|
|
71
|
+
- Regenerate the whole matrix from the journeys after any surface change. Never judge a round
|
|
72
|
+
against a portfolio that is part old and part new.
|
|
73
|
+
- Route review of the portfolio to the `orkestrel-polish-surface` campaign, which owns preflight,
|
|
74
|
+
verdicts, and reconciliation. This reference owns only how the journeys generate it.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# The journey layer
|
|
2
|
+
|
|
3
|
+
Build every capability here before writing the first journey, and route every journey step through
|
|
4
|
+
it. Treat a journey that works around a missing capability as a layer defect.
|
|
5
|
+
|
|
6
|
+
Implement the signatures below as a contract in the workspace's browser test setup module; never
|
|
7
|
+
copy them as source. Name each helper for the human act it performs.
|
|
8
|
+
|
|
9
|
+
## What it drives
|
|
10
|
+
|
|
11
|
+
- Drive the real browser through the installed Vitest browser provider. Import its `page` locators
|
|
12
|
+
and `userEvent` from `vitest/browser`; the `@vitest/browser/context` specifier is deprecated and
|
|
13
|
+
is not the import a new layer uses.
|
|
14
|
+
- Use the provider verbs for input: `click`, `keyboard`, `tab`, `type`, `clear`, `fill`, and
|
|
15
|
+
`selectOptions`. Use `page.viewport` and `page.screenshot` for captures, and the runner's file
|
|
16
|
+
command to read a written capture back.
|
|
17
|
+
- Never dispatch a constructed event from the layer or from a journey. The centralized event
|
|
18
|
+
factories `.claude/rules/tests.md` prescribes serve unit tests whose subject is the handler; a
|
|
19
|
+
journey drives input through the provider verbs only.
|
|
20
|
+
- Never let a helper take an element, a component instance, or a selector from the caller. Every
|
|
21
|
+
helper resolves its own target from role and accessible name.
|
|
22
|
+
|
|
23
|
+
## The resolver
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
resolveAccessible(name: string): HTMLElement
|
|
27
|
+
resolveAccessible(role: string, name: string): HTMLElement
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- Match the accessible name exactly, never a substring.
|
|
31
|
+
- Search a fixed set of interactive roles for the bare-name form, and exactly the named role for
|
|
32
|
+
the two-argument form.
|
|
33
|
+
- Count a match as reachable only when every condition holds: it is connected; it passes a
|
|
34
|
+
visibility check that honours opacity and CSS; its box has non-zero width and height; its
|
|
35
|
+
`tabIndex` is at least zero; it matches neither `:disabled` nor `[aria-disabled="true"]`; and it
|
|
36
|
+
has no `[inert]` ancestor.
|
|
37
|
+
- Scroll a wholly off-viewport target into view once, then measure reachability again. Count a
|
|
38
|
+
control a person can scroll to as reachable, and one that stays outside the viewport as
|
|
39
|
+
unreachable.
|
|
40
|
+
- Give the layer a rendered-only resolver beneath the public one, and use it from the acting verbs
|
|
41
|
+
so a click does not fail on a target the act itself scrolls into view.
|
|
42
|
+
|
|
43
|
+
### The failure voices
|
|
44
|
+
|
|
45
|
+
Keep these distinct, and never merge two into one message.
|
|
46
|
+
|
|
47
|
+
| Condition | The voice it must throw |
|
|
48
|
+
| ------------------------------------------ | ---------------------------------------------------------------- |
|
|
49
|
+
| No element carries the name | `No interactive element has the accessible name "<name>"` |
|
|
50
|
+
| Every match fails a reachability condition | `Interactive target "<name>" is not visible and focus-reachable` |
|
|
51
|
+
| Several matches are reachable | `Interactive target "<name>" is ambiguous across <n> elements` |
|
|
52
|
+
| Still off-viewport after being scrolled to | `Interactive target "<name>" is unreachable after scrolling` |
|
|
53
|
+
|
|
54
|
+
- Report an absent control and a present-but-unreachable one as different findings: the first names
|
|
55
|
+
a missing control, the second names the interface gating one that exists.
|
|
56
|
+
- Report ambiguity as a finding about the surface. Name the match count in the message, and
|
|
57
|
+
re-target the journey by role or region.
|
|
58
|
+
|
|
59
|
+
## Role vocabulary
|
|
60
|
+
|
|
61
|
+
Never infer a role from markup. Confirm the computed role in the browser whenever a target stops
|
|
62
|
+
resolving.
|
|
63
|
+
|
|
64
|
+
- A `list`-bearing input computes `combobox`, not `textbox`. Attaching native suggestion machinery
|
|
65
|
+
to a field is a role change: re-target every journey that names that field, and read a resolver
|
|
66
|
+
miss immediately after such a change as this before treating the element as missing.
|
|
67
|
+
- Always target a tab by its role. A tab and its panel collide on a bare name by construction,
|
|
68
|
+
because the panel is labelled by its tab.
|
|
69
|
+
- `<summary>` is exposed as a native disclosure rather than through a role the provider's role
|
|
70
|
+
locators accept. Give the layer a separate disclosure verb keyed to the summary's rendered text,
|
|
71
|
+
applying the same reachability conditions and its own failure voices.
|
|
72
|
+
|
|
73
|
+
## Region-scoped resolution
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
clickAccessibleWithin(region: string, role: string, name: string): Promise<void>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
- Provide this form for repeated short verbs such as `Add`, and for a control whose accessible name
|
|
80
|
+
is completed by a status the row renders.
|
|
81
|
+
- Apply the same reachability conditions inside the region, and throw voices that name the region
|
|
82
|
+
as well as the target.
|
|
83
|
+
|
|
84
|
+
## Input and traversal
|
|
85
|
+
|
|
86
|
+
| Verb | Contract |
|
|
87
|
+
| ---------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
88
|
+
| `typeAccessible(name, text)` | Focus the field, select all, delete, then send real keystrokes. Escape the provider's key syntax in the text. |
|
|
89
|
+
| `fillAccessible(name, text)` | Replace the value in one operation for text too long to type. The real element still publishes real input. |
|
|
90
|
+
| `pressKeys(keys)` | Send a provider keyboard sequence for Enter, arrows, modifiers, and combinations. |
|
|
91
|
+
| `traverseAccessible(name)` | Move focus by forward Tab from wherever focus is, and return the target once focus lands on it. |
|
|
92
|
+
|
|
93
|
+
- Count a traversal step only when focus actually lands on an element, and never charge the step
|
|
94
|
+
bound for a Tab that moved nothing.
|
|
95
|
+
- End the traversal when focus revisits an element, which is one complete cycle of the tab order,
|
|
96
|
+
and throw the traversal's own voice, carrying the trail of what focus did reach. Keep a hard cap
|
|
97
|
+
above the cycle so a page with no tab order fails instead of hanging.
|
|
98
|
+
- Re-resolve the target by role and name on every step, and never hold a node reference across
|
|
99
|
+
steps. A framework may replace the node between resolution and focus arrival.
|
|
100
|
+
- Never call the browser's focus method to place focus.
|
|
101
|
+
|
|
102
|
+
## Perception
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
readPerception(name: string): string
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- Return the normalized `innerText` of exactly one visible named region, dialog, table, tab panel,
|
|
109
|
+
alert, or status. Collapse whitespace runs to single spaces and trim.
|
|
110
|
+
- Read `innerText`, never `textContent`: `innerText` applies CSS transforms and leaves out content
|
|
111
|
+
the layout hides. Quote that text in assertions.
|
|
112
|
+
- Include descendant visually-hidden text, which a screen reader perceives and which a clip-based
|
|
113
|
+
hiding technique leaves in `innerText`.
|
|
114
|
+
- Throw when the named region is absent, hidden, or ambiguous.
|
|
115
|
+
- Give the layer a whole-page perception reader for cross-region sentences and the vocabulary
|
|
116
|
+
sweep, a focus reader that returns the active element's rendered text, and a value reader that
|
|
117
|
+
returns a resolved control's value. A perception assertion may quote that value: it is a rendered
|
|
118
|
+
fact rather than internal state.
|
|
119
|
+
|
|
120
|
+
## Mounting and cleanup
|
|
121
|
+
|
|
122
|
+
- Mount the shipped root component with its real provisions and return an idempotent cleanup that
|
|
123
|
+
unmounts the app and removes its container.
|
|
124
|
+
- Undo everything a journey changed after each test: unmount, destroy the session, reset the theme,
|
|
125
|
+
clear the keys the application persisted, and return the route to its entry. Never let a journey
|
|
126
|
+
inherit the previous journey's state.
|
|
127
|
+
|
|
128
|
+
## The capture hook
|
|
129
|
+
|
|
130
|
+
Give the layer exactly one capture helper. [captures.md](captures.md) owns the registry, the
|
|
131
|
+
variant matrix, and the proofs that read what it wrote.
|
|
@@ -43,9 +43,9 @@ Everything `.agents/orchestration.md`'s dispatch contract requires, plus:
|
|
|
43
43
|
|
|
44
44
|
An audit or analysis unit is long work. **Do not launch it.** Draft the brief to
|
|
45
45
|
`tmp/codex/<unit>-brief.md`, resolve the command per `codex.md`, and return the brief path, the
|
|
46
|
-
exact resolved command, the journal path
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
exact resolved command, and the journal path. The Orchestrator launches it as a tracked background
|
|
47
|
+
command and owns the cap: it holds the record of prior runs, and you do not. Never detach a run,
|
|
48
|
+
poll, restart, or kill one.
|
|
49
49
|
|
|
50
50
|
A short bounded question on a live thread may use the MCP tools directly, per `codex.md`'s
|
|
51
51
|
work-class rule. Persist the thread id the moment a response carries it.
|
|
@@ -53,7 +53,7 @@ work-class rule. Persist the thread id the moment a response carries it.
|
|
|
53
53
|
## Return
|
|
54
54
|
|
|
55
55
|
The brief path, the resolved command, the journal path, the session id, and — once the Orchestrator
|
|
56
|
-
reports the exec complete — Sol's answer verbatim, labelled untrusted and unaccepted.
|
|
56
|
+
reports the exec complete — Sol's answer verbatim, labelled untrusted and unaccepted. Never a cap.
|
|
57
57
|
|
|
58
58
|
Never edit, implement, reconcile, accept, commit, push, install, read a credential, or spawn any
|
|
59
59
|
agent.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: codex
|
|
3
|
-
description: 'GPT-5.6 Sol transport contract
|
|
3
|
+
description: 'The GPT-5.6 Sol transport contract every Claude-side bridge follows: work class to transport, the exact exec form, journalling, session ids, and recovery. Reach a route by its own name — `analyst` for audit, `sol` for implementation. Never dispatched directly for work.'
|
|
4
4
|
tools: Bash, Read, Grep, Glob, mcp__codex__codex, mcp__codex__codex-reply
|
|
5
5
|
model: sonnet
|
|
6
6
|
effort: low
|
|
@@ -52,9 +52,9 @@ never travel as shell arguments. Return the exact resolved command with a pointe
|
|
|
52
52
|
|
|
53
53
|
`timeout <cap> codex exec --json -C <working-directory> --sandbox <route-sandbox> --model gpt-5.6-sol -c "model_reasoning_effort=\"high\"" --output-last-message tmp/codex/<unit>-last.md "Read and execute the brief at tmp/codex/<unit>-brief.md exactly. Your final message must be the report it specifies." < /dev/null > tmp/codex/<unit>.jsonl`
|
|
54
54
|
|
|
55
|
-
- Return
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
- Return three things: the brief path, that resolved command, and the journal path. Leave
|
|
56
|
+
`<cap>` unresolved — the Orchestrator owns it, per **Long-running commands → Launching**
|
|
57
|
+
in `.agents/orchestration.md`. You hold no record of prior runs.
|
|
58
58
|
- Never launch, background, poll, sleep-loop, restart, or kill an exec.
|
|
59
59
|
- Keep `< /dev/null`. A background-launched exec that inherits an open stdin pipe wedges
|
|
60
60
|
before its first event, and only the cap ever surfaces it.
|
|
@@ -54,10 +54,10 @@ Write that chain to `tmp/cursor/run.sh` and run the file, so the resolution, the
|
|
|
54
54
|
journalling are one artifact the next run reuses.
|
|
55
55
|
|
|
56
56
|
Run that yourself only for a short bounded ask finishing in about two minutes. For anything
|
|
57
|
-
longer your job ends at drafting: return the brief path, the exact resolved command, the
|
|
58
|
-
journal path, and
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
longer your job ends at drafting: return the brief path, the exact resolved command, and the
|
|
58
|
+
journal path, and let the Orchestrator launch it as a harness-tracked background command under
|
|
59
|
+
a cap it owns. Never recommend a cap — you hold no record of prior runs. Never detach a run and
|
|
60
|
+
end your turn; an unowned run has no completion signal and no death notice.
|
|
61
61
|
|
|
62
62
|
## Brief and containment
|
|
63
63
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sol
|
|
3
|
+
description: 'GPT-5.6 Sol implementation of one bounded nontrivial unit, reached by name rather than by a remembered route. The objective mirror of the Opus `implementer`; favours constraint-heavy, mechanical-precision units. Never accepts its own output.'
|
|
4
|
+
tools: Bash, Read, Grep, Glob, mcp__codex__codex, mcp__codex__codex-reply
|
|
5
|
+
model: sonnet
|
|
6
|
+
effort: low
|
|
7
|
+
permissionMode: default
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are the named Claude-side bridge to the Sol `implementer`. You are a cheap driver: you prepare
|
|
11
|
+
a dispatch and return what Sol said, labelled untrusted. You never implement, judge, reconcile, or
|
|
12
|
+
endorse the result yourself.
|
|
13
|
+
|
|
14
|
+
Read `.agents/orchestration.md` first.
|
|
15
|
+
|
|
16
|
+
## Transport, sandbox, journalling, recovery
|
|
17
|
+
|
|
18
|
+
`.claude/agents/codex.md` owns the Sol transport contract in full — work class to transport, the
|
|
19
|
+
exact `codex exec` form, the journal and session-id discipline, the recovery ladder, and the
|
|
20
|
+
Windows notes. **Read it and follow it.** It is not restated here; two copies of a transport
|
|
21
|
+
contract drift, and the one you are not reading is the one that is right.
|
|
22
|
+
|
|
23
|
+
This role pins the one thing that file leaves to the dispatch: **the route is `implementer`, and
|
|
24
|
+
its sandbox is `workspace-write`.** A unit that needs no write is a misrouted unit — stop and
|
|
25
|
+
report, do not switch routes.
|
|
26
|
+
|
|
27
|
+
## What the brief must contain
|
|
28
|
+
|
|
29
|
+
Everything `.agents/orchestration.md`'s dispatch contract requires, plus:
|
|
30
|
+
|
|
31
|
+
- Owned files, shared and off-limits files, and the acceptance criteria that close using owned
|
|
32
|
+
files alone.
|
|
33
|
+
- The `AGENTS.md` non-negotiables, the applicable rules, and the governing guide or spec. An
|
|
34
|
+
external delegate carries no exemption.
|
|
35
|
+
- **Every authority the brief references must exist in the tree the exec is rooted in.** Check
|
|
36
|
+
before dispatch. A brief citing a file the executor cannot find delivers nothing while looking
|
|
37
|
+
like authority, and it fails silently.
|
|
38
|
+
- The deviation contract, scoped: a conflict with the primary objective stops the unit; an
|
|
39
|
+
ancillary conflict is the executor's to decide, record, and carry on from.
|
|
40
|
+
|
|
41
|
+
## Launching
|
|
42
|
+
|
|
43
|
+
An implementation unit is long work. **Do not launch it.** Draft the brief to
|
|
44
|
+
`tmp/codex/<unit>-brief.md`, resolve the command per `codex.md`, and return the brief path, the
|
|
45
|
+
exact resolved command, and the journal path. The Orchestrator launches it as a tracked background
|
|
46
|
+
command and owns the cap: it holds the record of prior runs, and you do not. Never detach a run,
|
|
47
|
+
poll, restart, or kill one.
|
|
48
|
+
|
|
49
|
+
Writing units are strictly serialized. Never run beside another writer in the same checkout.
|
|
50
|
+
|
|
51
|
+
## Return
|
|
52
|
+
|
|
53
|
+
The brief path, the resolved command, the journal path, the session id, and — once the Orchestrator
|
|
54
|
+
reports the exec complete — Sol's answer verbatim, labelled untrusted and unaccepted. Never a cap.
|
|
55
|
+
|
|
56
|
+
Never edit, judge, reconcile, accept, commit, push, install, read a credential, or spawn any agent.
|
|
@@ -48,9 +48,11 @@ paths:
|
|
|
48
48
|
- Give app/server process signals to a tested, explicitly stoppable,
|
|
49
49
|
generation-safe runner whose stale failures cannot release a newer run.
|
|
50
50
|
- Return the runner from convenience startup, so normal cleanup cannot be hidden.
|
|
51
|
-
- `ApplicationServerRunner` lives alone in `ApplicationServerRunner.ts`.
|
|
52
|
-
`startApplicationServer`
|
|
53
|
-
|
|
51
|
+
- `ApplicationServerRunner` lives alone in `ApplicationServerRunner.ts`.
|
|
52
|
+
`startApplicationServer` belongs in `handlers.ts` beside the other process-lifecycle
|
|
53
|
+
functions, because `factories.ts` admits only `create`-prefixed construction and this
|
|
54
|
+
one starts a signal-owning resource. `main.ts` invokes it and owns no reusable
|
|
55
|
+
declarations or duplicated signal handling.
|
|
54
56
|
- Do not add showcase, auth, storage, proxy, CSS framework, or other product
|
|
55
57
|
policy unless the request requires it.
|
|
56
58
|
- Test repeated lifecycle, concurrent calls, malformed environment input,
|
|
@@ -22,7 +22,7 @@ Documentation is an enforced contract, not explanatory decoration. The Writing r
|
|
|
22
22
|
- Read the matching spec/guide before code, form the intended design, then compare implementation. Existing code is a verification target, not ground truth.
|
|
23
23
|
- `AGENTS.md` and its linked rules are the sole convention source. Do not create competing instruction copies in guides.
|
|
24
24
|
- `guides/README.md` is the map: maintain both a concept index and a directory index. The concept index runs `spec ↔ source ↔ tests ↔ showcase` minus every column whose subject this workspace lacks, so an app-only workspace that publishes no library and builds no showcase still owes a full index over the columns it has.
|
|
25
|
-
- `ROADMAP.md` is the sequenced plan of record. Each chunk reaches green before the next.
|
|
25
|
+
- Where the repository keeps one, `ROADMAP.md` is the sequenced plan of record. Each chunk reaches green before the next.
|
|
26
26
|
- A showcase is executable proof of public API. A missing demonstration is a missing feature, detectable by parity.
|
|
27
27
|
- An integration surface's guide documents the validated hookup for each supported client: the exact commands run, the authentication and approval model that client needs, and the honest limit wherever a client cannot reach part of the surface.
|
|
28
28
|
|
|
@@ -33,7 +33,7 @@ Documentation is an enforced contract, not explanatory decoration. The Writing r
|
|
|
33
33
|
- TypeScript, SCSS, Markdown, tests, and showcase remain aligned.
|
|
34
34
|
- A parity failure identifies drift; never suppress or weaken the test.
|
|
35
35
|
- A vendored dependency guide is a mirror. Its relative links address the upstream tree and resolve to nothing here, so they are outside local-link parity. Refresh a mirror rather than rewriting it: a rewritten copy is a translation, and no comparison against the fetched bytes can check it.
|
|
36
|
-
- Falsify a prose claim the way you falsify a code claim. The parity test proves a name exists, never that a sentence about behavior is true, so run the example and read what it returns. A `// false` beside a call that returns `true` is a defect of the same kind as a wrong return value, and it reaches every consumer who installs the package.
|
|
36
|
+
- Falsify a prose claim the way you falsify a code claim. The parity test proves a name exists, never that a sentence about behavior is true, so run the example and read what it returns. A `// false` beside a call that returns `true` is a defect of the same kind as a wrong return value, and it reaches every consumer who installs the package. That proof has a home: `tests/guides.test.ts` executes the flagship fences, per `.claude/rules/tests.md`. An ordered behaviour with no gate is not a gate.
|
|
37
37
|
- Re-read the prose last, against what actually shipped. Where a change chose to document a limit rather than close it, the sentence was often drafted for the option that lost, or written more confidently than the code earns. Code rulings survive review because a test can break them; prose rulings survive because nothing tries.
|
|
38
38
|
|
|
39
39
|
For behavioral interfaces/classes:
|
|
@@ -65,5 +65,8 @@ Never use in-repository `@src/*` aliases in public guide examples; reserve them
|
|
|
65
65
|
- Keep `SKILL.md` concise and route conditional detail to one-level `references/`.
|
|
66
66
|
- Frontmatter contains only `name` and a trigger-focused `description`.
|
|
67
67
|
- Do not put model routing or package version catalogs in a skill.
|
|
68
|
-
- Validate every referenced resource
|
|
68
|
+
- Validate every referenced resource; do not leave template TODOs or auxiliary README/changelog files.
|
|
69
|
+
- Write `agents/openai.yaml` as one root `interface:` mapping over exactly `display_name`, `short_description`, and `default_prompt`, in that order, each on its own two-space-indented line.
|
|
70
|
+
- Give every one of those keys a non-empty single-quoted scalar, and write an apostrophe inside it as `''`.
|
|
71
|
+
- Name the skill's own `$<directory>` token in `default_prompt`.
|
|
69
72
|
- Keep provider bridges minimal: they load one canonical workflow and add no competing instructions.
|
|
@@ -128,3 +128,13 @@ Use four orthogonal contract mechanisms:
|
|
|
128
128
|
- guard-valid input is never rejected by its parser;
|
|
129
129
|
- every parsed result satisfies its guard.
|
|
130
130
|
- Derive parser and guard from one source or test the round trip.
|
|
131
|
+
|
|
132
|
+
### Foreign contracts
|
|
133
|
+
|
|
134
|
+
A value returned by an interface another package publishes is FOREIGN data. Own it, validate what you dereference, and narrow nothing.
|
|
135
|
+
|
|
136
|
+
- Enforce the published contract and no more: accept unknown members, accept any implementation the interface admits including a class instance, and check each member as its published type declares it. A member typed `number` is not checked as an integer.
|
|
137
|
+
- Reserve the exact-record guard for a record this package owns. Over a foreign interface it refuses values the interface permits and fails closed on a valid implementation.
|
|
138
|
+
- Narrow nothing in an ownership transform. Where the published contract is wider than the copy mechanism, seal the value in place rather than refusing it.
|
|
139
|
+
- Own a foreign value at arrival, validate the owned copy, and read the foreign object exactly once. Read count is this package's decision, so no result may depend on it.
|
|
140
|
+
- Validate only what the package dereferences from a union it must narrow. Own a wide foreign record it merely carries and leave it unvalidated. State that asymmetry on the option that admits the implementation.
|
|
@@ -24,12 +24,10 @@ paths:
|
|
|
24
24
|
- Never end a row as "hardened further." Replace any evaluative phrase with the concrete condition that closes the row.
|
|
25
25
|
- Record a finding outside the matrix against the row that owns it, for the next matrix. Do not reopen this one.
|
|
26
26
|
|
|
27
|
-
##
|
|
27
|
+
## Probes before arguments
|
|
28
28
|
|
|
29
29
|
A question a probe can settle is settled by the probe, whether or not anyone has disputed it. Reasoning decides what to run and what the result means. It does not replace the run.
|
|
30
30
|
|
|
31
|
-
This is a habit for your own work first, and a rule about disagreements second. Most unverified beliefs are never challenged by anyone — they are simply built on.
|
|
32
|
-
|
|
33
31
|
- Test your own assumptions before you rely on them. You do not need a disagreement to justify a probe. If you are about to depend on what a function returns, what a config resolves to, what a flag does, or whether a path is even reached, run it and find out.
|
|
34
32
|
- Treat a long deliberation about behaviour as the signal to stop and run something. Deliberation that a ten-line probe would have ended is the most expensive habit in this process, and it is invisible because it feels like rigour.
|
|
35
33
|
- Verify a belief before stating it, or label it as unverified. An unverified assertion put into context becomes a fact for everything downstream, including other agents, and correcting it later costs more than the check would have.
|
|
@@ -39,6 +37,7 @@ This is a habit for your own work first, and a rule about disagreements second.
|
|
|
39
37
|
- Bound the search before starting it, and put the bound in the brief. Name the benchmark, the population, or the row that ends it. An investigation with no stated stopping condition runs until attention runs out. This includes the case where the honest answer is that the limit is inherent and belongs in documentation rather than in code.
|
|
40
38
|
- Treat a negative probe as evidence about the probe until its input is shown to reach the code under test. A pass proves nothing if the vector never arrived. Instrument the path, assert an observable side effect, or drive it through a door you can see.
|
|
41
39
|
- When a report names a defect and your reproduction comes back clean, assume first that your vector was weaker than theirs, and go get their exact vector. Treating a failed reproduction as a disproof is the most common way a true finding is lost.
|
|
40
|
+
- A reported vector the compiler rejects refutes the VECTOR, never the finding. Where a claim asserts reachability through a typed API, compile the exact vector under the project's own settings; re-derive one the types admit before dropping the finding, and record which vector was actually tested.
|
|
42
41
|
- Reproduce a reported defect's cause before instructing a fix from it. A real symptom can carry a wrong diagnosis, and a fix aimed at the stated cause edits the wrong file while the defect survives.
|
|
43
42
|
- Do not read a result into a tool's failure to find your probe. "No tests found", an empty match, a skipped file, a runner that resolved nothing — these report on the harness, not the subject. Confirm the probe was collected and executed first.
|
|
44
43
|
- Prefer an observation over a derivation, including your own. When a measurement and an argument disagree, the argument is wrong until the measurement is shown to be broken.
|
|
@@ -63,6 +62,7 @@ A review that reads a diff finds what the diff shows. A review that tries to bre
|
|
|
63
62
|
- Draw the negative control from outside the population the instrument covers. Name the instrument's membership rule first, then pick a control that rule excludes. A control sampled from constructs the instrument already handles proves only that it discriminates among those constructs, and says nothing about the class it silently cannot reach.
|
|
64
63
|
- State an instrument's coverage beside its result. A conclusion inherits the instrument's scope, not the question's. An unstated coverage claim is read as complete, and it never is. A search proves something about the paths it walked, so name them.
|
|
65
64
|
- Match the instrument to the question. A text search reports on text, so a claim about declarations, call sites, or structure needs the compiler or a parser instead. A pattern written for one spelling of a construct reports on that spelling alone. A path check answers relative to the directory it runs from, so resolve the inputs against their own base before reading a miss as a finding.
|
|
65
|
+
- Name the rival reading the instrument must exclude, and show it reports differently under that reading. Give independent measurements independent state: one counter shared across members reports read order and per-member read count identically, so a result consistent with both measured neither.
|
|
66
66
|
- Report a question unanswered rather than answering it with a weaker instrument. A fallback that measures something adjacent returns a confident wrong answer, and nothing downstream can tell that answer from the real one — searching commit messages for a release when the question is where a version changed will match some release, just not the one asked about. Name the substitute and what it actually measures, or say the question is open.
|
|
67
67
|
- State what the controls established and what they did not. An instrument certified only from the inside is trusted exactly where it has never been tested.
|
|
68
68
|
- Treat a gap between what an instrument says it checks and what it actually matches as a defect in the instrument, not as a documented limit. A recorded blind spot buys trust only when everything outside it is genuinely covered.
|
|
@@ -80,7 +80,8 @@ A review that reads a diff finds what the diff shows. A review that tries to bre
|
|
|
80
80
|
- Let reachability bound the fix. A defect reachable through the package's own shipped code or a documented extension seam falsifies its claim and is repaired now.
|
|
81
81
|
- Document the obligation instead when a defect is reachable only through a hypothetical foreign implementation of a contract this package publishes. State it on the interface that owns it and prove the documentation. Do not build coordination machinery against a requirement nobody wrote down. Attacks are unlimited; reachable ones are not, and only the reachable set is a work list.
|
|
82
82
|
- **Three rounds at one seam is the budget.** Repeated rounds against one seam are evidence about the design, not evidence of diligence. At the third round the next unit is a ruling — on the threat model, the mechanism, or the boundary — taken with the same adversarial pass a design gets, not a fourth repair.
|
|
83
|
-
- Write the round count down when the seam opens, so it is a fact rather than a feeling. A seam that has consumed more rounds than the rest of the matrix combined has already answered the question.
|
|
83
|
+
- Write the round count down in the capability/defect matrix row that owns the seam, when the seam opens, so it is a fact rather than a feeling. A seam that has consumed more rounds than the rest of the matrix combined has already answered the question.
|
|
84
|
+
- State the ruling that ends a seam as three things: the invariant the code will obey, the constraint bounding it against over-correction, and the interface where a consumer meets the obligation. A ruling that names only the defect it replaces produces the opposite defect next round.
|
|
84
85
|
- Give every behavioural audit the means to run its attacks. An auditor that cannot execute cannot falsify a behavioural claim: it returns derivations, and a derivation reads exactly like a verdict while being a different thing — it will confirm a claim one probe would break. Treat a report with no executed evidence as a review of the source, and label it as such.
|
|
85
86
|
|
|
86
87
|
## Ecosystem reuse
|
|
@@ -35,6 +35,7 @@ paths:
|
|
|
35
35
|
- Measure an elapsed interval with `performance.now()`, never `Date.now()`. `Date.now()` returns whole milliseconds, so an interval built from two of its readings truncates at both ends and can under-report by a millisecond — enough to fail a boundary assertion against a timer that behaved correctly. `performance.now()` is monotonic and sub-millisecond, and it does not move when the wall clock does.
|
|
36
36
|
- Give a conditional skip the mechanism that makes it inapplicable, cited, not the platform name alone. A test skipped on a platform is a test nobody re-examines; a test skipped because a named API rejects a named case is one anybody can re-check.
|
|
37
37
|
- A regression test records the exact command and its failing count before the fix, and the same command's passing count after.
|
|
38
|
+
- The revert that proves a repair reddens exactly the test that names the defect. Keep the import and collection graph valid while reverting, and confirm the named test was collected. A revert that reddens anything beyond that test broke the harness, and its count is not evidence.
|
|
38
39
|
- Use `it.todo()` only for explicitly out-of-scope roadmap work, never to complete the current request. Every `.skip` or conditional skip has a narrow verifiable applicability reason.
|
|
39
40
|
- Do not create test files solely for `constants.ts`, barrels, error definitions, or `types.ts`.
|
|
40
41
|
- Run the narrowest relevant Vitest project during development; do not run the entire suite casually.
|
|
@@ -44,20 +45,24 @@ paths:
|
|
|
44
45
|
A proof that covers the workspace instead of one module has a fixed location, so no package invents
|
|
45
46
|
its own:
|
|
46
47
|
|
|
47
|
-
| Path | Proves
|
|
48
|
-
| ---------------------------- |
|
|
49
|
-
| `tests/policy.test.ts` | Every source file obeys the syntactic coding and placement law
|
|
50
|
-
| `tests/config.test.ts` | Root configuration resolves its aliases, projects, and outputs, and the `configs/` leaves behind them
|
|
51
|
-
| `tests/guides.test.ts` | Every documented API exists
|
|
52
|
-
| `tests/conformance.test.ts` | Where this package drifts from the official tooling it tracks
|
|
53
|
-
| `tests/distribution.test.ts` | The packed package installs and resolves through its public exports
|
|
54
|
-
| `tests/integration.test.ts` | The package's features work together end to end across environments
|
|
55
|
-
| `tests/service/**/*.test.ts` | The live external services this package drives, driven for real
|
|
48
|
+
| Path | Proves |
|
|
49
|
+
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
50
|
+
| `tests/policy.test.ts` | Every source file obeys the syntactic coding and placement law |
|
|
51
|
+
| `tests/config.test.ts` | Root configuration resolves its aliases, projects, and outputs, and the `configs/` leaves behind them |
|
|
52
|
+
| `tests/guides.test.ts` | Every documented API exists, every public API is documented, and every executable fence returns what the guide says it returns |
|
|
53
|
+
| `tests/conformance.test.ts` | Where this package drifts from the official tooling it tracks |
|
|
54
|
+
| `tests/distribution.test.ts` | The packed package installs and resolves through its public exports |
|
|
55
|
+
| `tests/integration.test.ts` | The package's features work together end to end across environments |
|
|
56
|
+
| `tests/service/**/*.test.ts` | The live external services this package drives, driven for real |
|
|
56
57
|
|
|
57
58
|
- `.claude/rules/workspace.md` names the Vitest project each location belongs to.
|
|
58
|
-
- The `guides` project runs in Node with the browser disabled. Its subject is
|
|
59
|
-
documented
|
|
60
|
-
|
|
59
|
+
- The `guides` project runs in Node with the browser disabled. Its subject is what the guide
|
|
60
|
+
claims: that every documented name resolves, and that every fence asserting a value returns
|
|
61
|
+
that value. A proof that renders a component and compares it against a definition is a
|
|
62
|
+
composition and belongs in an `integration.test.ts` scoped to its directory.
|
|
63
|
+
- Transcribe each flagship fence and assert the values its comments claim. Name resolution is
|
|
64
|
+
not a behavioural proof, so a fence documenting a value the code contradicts passes every
|
|
65
|
+
parity assertion. Change a fence, change the transcription beside it.
|
|
61
66
|
- `integration.test.ts` is a reserved filename at any level. It names a scope rather than a module,
|
|
62
67
|
so the mirror rule does not reach it; its scope is the directory it sits in.
|
|
63
68
|
- An integration test is an end-to-end test: it composes the package's own features and drives them
|