@orkestrel/scaffold 0.0.63 → 0.0.65
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/README.md +29 -104
- package/dist/bin/main.js +95 -27
- package/dist/bin/main.js.map +1 -1
- package/dist/host/AGENTS.md +2 -2
- package/dist/host/CLAUDE.md +6 -0
- package/dist/host/agents/orchestration.md +23 -15
- package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +184 -177
- package/dist/host/agents/skills/enterprise-bootstrap/references/bootstrap-reference.md +314 -91
- package/dist/host/agents/skills/enterprise-bootstrap/references/color-modes.md +241 -0
- package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +83 -36
- package/dist/host/agents/skills/enterprise-bootstrap/references/frontend-design.md +297 -98
- package/dist/host/agents/skills/enterprise-bootstrap/references/inputs.md +25 -14
- package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +216 -128
- package/dist/host/agents/skills/enterprise-bootstrap/references/responsive-layout.md +187 -0
- package/dist/host/agents/skills/enterprise-bootstrap/references/utilities.md +109 -20
- package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +5 -5
- package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +1 -1
- package/dist/host/agents/skills/orkestrel-publish/SKILL.md +15 -15
- package/dist/host/agents/skills/orkestrel-publish/references/wave.md +43 -17
- package/dist/host/agents/skills/orkestrel-publish/references/window.md +41 -16
- package/dist/host/claude/agents/orkestrel.md +56 -56
- package/dist/host/claude/agents/reviewer.md +13 -0
- package/dist/host/claude/rules/architecture.md +51 -45
- package/dist/host/claude/rules/documentation.md +18 -1
- package/dist/host/claude/rules/portability.md +2 -0
- package/dist/host/claude/rules/quality.md +1 -1
- package/dist/host/claude/rules/tests.md +12 -11
- package/dist/host/claude/rules/typescript.md +5 -0
- package/dist/host/claude/rules/workspace.md +25 -20
- package/dist/host/claude/rules/writing.md +4 -0
- package/dist/host/claude/settings.json +1 -1
- package/dist/host/claude/skills/enterprise-bootstrap/SKILL.md +10 -9
- package/dist/host/codex/agents/orkestrel.toml +3 -3
- package/dist/host/codex/agents/reviewer.toml +4 -2
- package/dist/host/configs/helpers.ts +311 -2
- package/dist/host/configs/policy.ts +1100 -51
- package/dist/host/dotfiles/oxlintrc.json +72 -1
- package/dist/host/guides/guide.md +749 -222
- package/dist/host/guides/scaffold.md +529 -394
- package/dist/host/manifest.json +53 -40
- package/dist/host/scripts/ollama.sh +322 -13
- package/dist/host/tests/config.test.ts +1200 -16
- package/dist/host/tests/policy.test.ts +157 -173
- package/dist/host/tests/setupPolicy.ts +522 -1007
- package/dist/src/core/index.cjs +402 -287
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +160 -128
- package/dist/src/core/index.d.ts +160 -128
- package/dist/src/core/index.js +400 -286
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/index.cjs +28 -21
- package/dist/src/server/index.cjs.map +1 -1
- package/dist/src/server/index.d.cts +38 -33
- package/dist/src/server/index.d.ts +38 -33
- package/dist/src/server/index.js +28 -21
- package/dist/src/server/index.js.map +1 -1
- package/package.json +18 -19
|
@@ -43,58 +43,58 @@ so network-controlled descriptions never enter agent instruction context.
|
|
|
43
43
|
|
|
44
44
|
<!-- orkestrel:catalog -->
|
|
45
45
|
|
|
46
|
-
| Package | Version | Layer | Runtime dependencies |
|
|
47
|
-
| ----------------------- | -------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
48
|
-
| `@orkestrel/abort` | `0.0.
|
|
49
|
-
| `@orkestrel/agent` | `0.0.
|
|
50
|
-
| `@orkestrel/brief` | `0.0.
|
|
51
|
-
| `@orkestrel/browser` | `0.0.
|
|
52
|
-
| `@orkestrel/budget` | `0.0.
|
|
53
|
-
| `@orkestrel/codec` | `0.0.
|
|
54
|
-
| `@orkestrel/console` | `0.0.
|
|
55
|
-
| `@orkestrel/contract` | `0.0.
|
|
56
|
-
| `@orkestrel/csv` | `0.0.
|
|
57
|
-
| `@orkestrel/database` | `0.0.
|
|
58
|
-
| `@orkestrel/emitter` | `0.0.
|
|
59
|
-
| `@orkestrel/form` | `0.0.
|
|
60
|
-
| `@orkestrel/guide` | `0.0.
|
|
61
|
-
| `@orkestrel/html` | `0.0.
|
|
62
|
-
| `@orkestrel/indexeddb` | `0.0.
|
|
63
|
-
| `@orkestrel/interpret` | `0.0.
|
|
64
|
-
| `@orkestrel/lsp` | `0.0.
|
|
65
|
-
| `@orkestrel/markdown` | `0.0.
|
|
66
|
-
| `@orkestrel/mcp` | `0.0.
|
|
67
|
-
| `@orkestrel/middleware` | `0.0.
|
|
68
|
-
| `@orkestrel/msg` | `0.0.
|
|
69
|
-
| `@orkestrel/ndjson` | `0.0.
|
|
70
|
-
| `@orkestrel/ollama` | `0.0.
|
|
71
|
-
| `@orkestrel/pool` | `0.0.
|
|
72
|
-
| `@orkestrel/probe` | `0.0.
|
|
73
|
-
| `@orkestrel/process` | `0.0.
|
|
74
|
-
| `@orkestrel/program` | `0.0.
|
|
75
|
-
| `@orkestrel/qualifier` | `0.0.
|
|
76
|
-
| `@orkestrel/queue` | `0.0.
|
|
77
|
-
| `@orkestrel/rater` | `0.0.
|
|
78
|
-
| `@orkestrel/reason` | `0.0.
|
|
79
|
-
| `@orkestrel/relation` | `0.0.
|
|
80
|
-
| `@orkestrel/router` | `0.0.
|
|
81
|
-
| `@orkestrel/scaffold` | `0.0.
|
|
82
|
-
| `@orkestrel/sea` | `0.0.
|
|
83
|
-
| `@orkestrel/server` | `0.0.
|
|
84
|
-
| `@orkestrel/sqlite` | `0.0.
|
|
85
|
-
| `@orkestrel/sse` | `0.0.
|
|
86
|
-
| `@orkestrel/supervisor` | `0.0.1` | L5 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.9`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/workflow` `^0.0.12` |
|
|
87
|
-
| `@orkestrel/table` | `0.0.
|
|
88
|
-
| `@orkestrel/template` | `0.0.
|
|
89
|
-
| `@orkestrel/terminal` | `0.0.
|
|
90
|
-
| `@orkestrel/test` | `0.0.
|
|
91
|
-
| `@orkestrel/timeout` | `0.0.
|
|
92
|
-
| `@orkestrel/tool` | `0.0.
|
|
93
|
-
| `@orkestrel/toolbox` | `0.0.
|
|
94
|
-
| `@orkestrel/websocket` | `0.0.
|
|
95
|
-
| `@orkestrel/worker` | `0.0.
|
|
96
|
-
| `@orkestrel/workflow` | `0.0.
|
|
97
|
-
| `@orkestrel/workspace` | `0.0.
|
|
46
|
+
| Package | Version | Layer | Runtime dependencies | Peer dependencies |
|
|
47
|
+
| ----------------------- | -------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
|
|
48
|
+
| `@orkestrel/abort` | `0.0.10` | L1 | `@orkestrel/contract` `^0.0.17` | |
|
|
49
|
+
| `@orkestrel/agent` | `0.0.20` | L5 | `@orkestrel/abort` `^0.0.9`, `@orkestrel/budget` `^0.0.9`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/database` `^0.0.13`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/queue` `^0.0.12`, `@orkestrel/timeout` `^0.0.9`, `@orkestrel/tool` `^0.0.13`, `@orkestrel/workflow` `^0.0.17`, `@orkestrel/workspace` `^0.0.7` | |
|
|
50
|
+
| `@orkestrel/brief` | `0.0.7` | L4 | `@orkestrel/contract` `^0.0.16`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/interpret` `^0.0.12`, `@orkestrel/reason` `^0.0.9` | |
|
|
51
|
+
| `@orkestrel/browser` | `0.0.15` | L3 | `@orkestrel/contract` `^0.0.16`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/html` `^0.0.8`, `@orkestrel/websocket` `^0.0.11` | |
|
|
52
|
+
| `@orkestrel/budget` | `0.0.10` | L1 | `@orkestrel/contract` `^0.0.17` | |
|
|
53
|
+
| `@orkestrel/codec` | `0.0.3` | L0 | | |
|
|
54
|
+
| `@orkestrel/console` | `0.0.13` | L2 | `@orkestrel/emitter` `^0.0.10`, `@orkestrel/contract` `^0.0.17` | |
|
|
55
|
+
| `@orkestrel/contract` | `0.0.17` | L0 | | |
|
|
56
|
+
| `@orkestrel/csv` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.17` | |
|
|
57
|
+
| `@orkestrel/database` | `0.0.14` | L2 | `@orkestrel/contract` `^0.0.17`, `@orkestrel/emitter` `^0.0.10`, `@orkestrel/indexeddb` `^0.0.11`, `@orkestrel/sqlite` `^0.0.11` | |
|
|
58
|
+
| `@orkestrel/emitter` | `0.0.10` | L1 | `@orkestrel/contract` `^0.0.17` | |
|
|
59
|
+
| `@orkestrel/form` | `0.0.6` | L2 | `@orkestrel/contract` `^0.0.17`, `@orkestrel/emitter` `^0.0.10` | |
|
|
60
|
+
| `@orkestrel/guide` | `0.0.17` | L3 | `@orkestrel/contract` `^0.0.16`, `@orkestrel/markdown` `^0.0.13` | |
|
|
61
|
+
| `@orkestrel/html` | `0.0.9` | L1 | `@orkestrel/contract` `^0.0.17` | |
|
|
62
|
+
| `@orkestrel/indexeddb` | `0.0.11` | L1 | `@orkestrel/contract` `^0.0.17` | |
|
|
63
|
+
| `@orkestrel/interpret` | `0.0.12` | L3 | `@orkestrel/reason` `^0.0.9`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/template` `^0.0.6` | |
|
|
64
|
+
| `@orkestrel/lsp` | `0.0.6` | L3 | `@orkestrel/emitter` `^0.0.9`, `@orkestrel/process` `^0.0.10`, `@orkestrel/contract` `^0.0.16` | |
|
|
65
|
+
| `@orkestrel/markdown` | `0.0.14` | L2 | `@orkestrel/contract` `^0.0.17`, `@orkestrel/html` `^0.0.9` | |
|
|
66
|
+
| `@orkestrel/mcp` | `0.0.28` | L4 | `@orkestrel/codec` `^0.0.2`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/process` `^0.0.10`, `@orkestrel/sse` `^0.0.6`, `@orkestrel/tool` `^0.0.13`, `@orkestrel/websocket` `^0.0.11` | `@orkestrel/router` `^0.0.13`, `@orkestrel/server` `^0.0.18` |
|
|
67
|
+
| `@orkestrel/middleware` | `0.0.19` | L4 | `@orkestrel/abort` `^0.0.9`, `@orkestrel/budget` `^0.0.9`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/timeout` `^0.0.9` | `@orkestrel/database` `^0.0.13`, `@orkestrel/server` `^0.0.18` |
|
|
68
|
+
| `@orkestrel/msg` | `0.0.10` | L0 | | |
|
|
69
|
+
| `@orkestrel/ndjson` | `0.0.10` | L1 | `@orkestrel/contract` `^0.0.17` | |
|
|
70
|
+
| `@orkestrel/ollama` | `0.0.14` | L6 | `@orkestrel/agent` `^0.0.20`, `@orkestrel/budget` `^0.0.9`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/ndjson` `^0.0.9`, `@orkestrel/timeout` `^0.0.9`, `@orkestrel/tool` `^0.0.13` | |
|
|
71
|
+
| `@orkestrel/pool` | `0.0.11` | L2 | `@orkestrel/emitter` `^0.0.10` | |
|
|
72
|
+
| `@orkestrel/probe` | `0.0.12` | L5 | `@orkestrel/contract` `^0.0.16`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/lsp` `^0.0.6`, `@orkestrel/mcp` `^0.0.28`, `@orkestrel/queue` `^0.0.12`, `@orkestrel/timeout` `^0.0.9`, `@orkestrel/tool` `^0.0.13` | `oxlint` `^1.80.0`, `typescript` `^6.0.3`, `vitest` `^4.1.11` |
|
|
73
|
+
| `@orkestrel/process` | `0.0.11` | L2 | `@orkestrel/contract` `^0.0.17`, `@orkestrel/emitter` `^0.0.10` | |
|
|
74
|
+
| `@orkestrel/program` | `0.0.12` | L4 | `@orkestrel/contract` `^0.0.16`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/qualifier` `^0.0.13`, `@orkestrel/rater` `^0.0.13`, `@orkestrel/reason` `^0.0.9` | |
|
|
75
|
+
| `@orkestrel/qualifier` | `0.0.13` | L3 | `@orkestrel/contract` `^0.0.16`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/reason` `^0.0.9` | |
|
|
76
|
+
| `@orkestrel/queue` | `0.0.12` | L3 | `@orkestrel/abort` `^0.0.9`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/database` `^0.0.13`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/timeout` `^0.0.9` | |
|
|
77
|
+
| `@orkestrel/rater` | `0.0.13` | L3 | `@orkestrel/reason` `^0.0.9`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/contract` `^0.0.16` | |
|
|
78
|
+
| `@orkestrel/reason` | `0.0.10` | L2 | `@orkestrel/contract` `^0.0.17`, `@orkestrel/emitter` `^0.0.10` | |
|
|
79
|
+
| `@orkestrel/relation` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.16`, `@orkestrel/database` `^0.0.13`, `@orkestrel/emitter` `^0.0.9` | |
|
|
80
|
+
| `@orkestrel/router` | `0.0.14` | L2 | `@orkestrel/abort` `^0.0.10`, `@orkestrel/emitter` `^0.0.10`, `@orkestrel/contract` `^0.0.17` | |
|
|
81
|
+
| `@orkestrel/scaffold` | `0.0.63` | L3 | `@orkestrel/console` `^0.0.12`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/markdown` `^0.0.13`, `@orkestrel/process` `^0.0.10`, `@orkestrel/template` `^0.0.6` | |
|
|
82
|
+
| `@orkestrel/sea` | `0.0.14` | L3 | `@orkestrel/contract` `^0.0.16`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/process` `^0.0.10` | |
|
|
83
|
+
| `@orkestrel/server` | `0.0.18` | L3 | `@orkestrel/abort` `^0.0.9`, `@orkestrel/codec` `^0.0.2`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/router` `^0.0.13`, `@orkestrel/timeout` `^0.0.9` | |
|
|
84
|
+
| `@orkestrel/sqlite` | `0.0.11` | L1 | `@orkestrel/contract` `^0.0.17` | |
|
|
85
|
+
| `@orkestrel/sse` | `0.0.7` | L0 | | |
|
|
86
|
+
| `@orkestrel/supervisor` | `0.0.1` | L5 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.9`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/workflow` `^0.0.12` | |
|
|
87
|
+
| `@orkestrel/table` | `0.0.5` | L2 | `@orkestrel/contract` `^0.0.17`, `@orkestrel/emitter` `^0.0.10` | |
|
|
88
|
+
| `@orkestrel/template` | `0.0.7` | L2 | `@orkestrel/emitter` `^0.0.10`, `@orkestrel/contract` `^0.0.17` | |
|
|
89
|
+
| `@orkestrel/terminal` | `0.0.14` | L3 | `@orkestrel/console` `^0.0.12`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/database` `^0.0.13`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/form` `^0.0.5`, `@orkestrel/sse` `^0.0.6` | |
|
|
90
|
+
| `@orkestrel/test` | `0.0.14` | L0 | | `vitest` `^4.1.11` |
|
|
91
|
+
| `@orkestrel/timeout` | `0.0.10` | L1 | `@orkestrel/contract` `^0.0.17` | |
|
|
92
|
+
| `@orkestrel/tool` | `0.0.14` | L1 | `@orkestrel/contract` `^0.0.17` | |
|
|
93
|
+
| `@orkestrel/toolbox` | `0.0.12` | L6 | `@orkestrel/agent` `^0.0.20`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/database` `^0.0.13`, `@orkestrel/form` `^0.0.5`, `@orkestrel/relation` `^0.0.11`, `@orkestrel/server` `^0.0.18`, `@orkestrel/terminal` `^0.0.14`, `@orkestrel/tool` `^0.0.13`, `@orkestrel/workflow` `^0.0.17`, `@orkestrel/workspace` `^0.0.7` | |
|
|
94
|
+
| `@orkestrel/websocket` | `0.0.12` | L2 | `@orkestrel/emitter` `^0.0.10` | |
|
|
95
|
+
| `@orkestrel/worker` | `0.0.11` | L4 | `@orkestrel/contract` `^0.0.16`, `@orkestrel/database` `^0.0.13`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/pool` `^0.0.10`, `@orkestrel/queue` `^0.0.12` | |
|
|
96
|
+
| `@orkestrel/workflow` | `0.0.17` | L4 | `@orkestrel/abort` `^0.0.9`, `@orkestrel/budget` `^0.0.9`, `@orkestrel/contract` `^0.0.16`, `@orkestrel/database` `^0.0.13`, `@orkestrel/emitter` `^0.0.9`, `@orkestrel/queue` `^0.0.12`, `@orkestrel/timeout` `^0.0.9` | |
|
|
97
|
+
| `@orkestrel/workspace` | `0.0.7` | L3 | `@orkestrel/contract` `^0.0.16`, `@orkestrel/database` `^0.0.13`, `@orkestrel/emitter` `^0.0.9` | |
|
|
98
98
|
|
|
99
99
|
<!-- /orkestrel:catalog -->
|
|
100
100
|
|
|
@@ -121,10 +121,10 @@ forced `src`/`app` edit or a changed toolchain emit, and the package then bumps
|
|
|
121
121
|
account rather than on the dependency's. A superfluous diff obliges nothing.
|
|
122
122
|
|
|
123
123
|
The `Layer` column in the catalog table is the publish round, derived from the runtime
|
|
124
|
-
edges in the same row. `L0` depends on nothing else in the fleet and publishes
|
|
125
|
-
later layer publishes only after every layer before it is on the registry. A
|
|
126
|
-
layer sits in a cycle and cannot be placed in a round at all. Packages in
|
|
127
|
-
independent of each other and may publish in any order within it.
|
|
124
|
+
and peer edges in the same row. `L0` depends on nothing else in the fleet and publishes
|
|
125
|
+
first; each later layer publishes only after every layer before it is on the registry. A
|
|
126
|
+
row with no layer sits in a cycle and cannot be placed in a round at all. Packages in
|
|
127
|
+
one layer are independent of each other and may publish in any order within it.
|
|
128
128
|
|
|
129
129
|
Report a disagreeing pin as a defect, never as drift to tidy later. When packages in
|
|
130
130
|
one install graph pin different versions of a dependency, npm installs both copies, and the
|
|
@@ -42,6 +42,19 @@ subjective and creative lens:
|
|
|
42
42
|
5. **Guide voice and product coherence** — documentation reads as the package's
|
|
43
43
|
current, self-contained human guide and matches the experience the code presents.
|
|
44
44
|
|
|
45
|
+
While you hold the objective lane, audit the changed work through these lenses with
|
|
46
|
+
the same weight:
|
|
47
|
+
|
|
48
|
+
1. **Correctness under adverse orderings** — the adverse conditions
|
|
49
|
+
`.claude/rules/quality.md` § Falsification names.
|
|
50
|
+
2. **Constraints** — what the declared contracts, the installed declarations, and the
|
|
51
|
+
permission floor permit.
|
|
52
|
+
3. **Dependency and range truth** — the installed `@orkestrel/*` capabilities and the
|
|
53
|
+
ranges that reach a consumer.
|
|
54
|
+
4. **Test sufficiency** — the missing seam, the assertion that cannot fail, the probe
|
|
55
|
+
with no control.
|
|
56
|
+
5. **Mechanical conformance** — the letter of `AGENTS.md` and the applicable rules.
|
|
57
|
+
|
|
45
58
|
Test a design claim by asking whether the shipped artifact still matches it — a
|
|
46
59
|
guide, charter, or name that described the work two revisions ago is drift, and
|
|
47
60
|
that question is what finds it. Anything you cannot settle within your lane becomes
|
|
@@ -50,7 +50,7 @@ Use only the centralized files an environment needs.
|
|
|
50
50
|
- Every declaration in a centralized file is exported. Fold away a trivial single-use declaration or export/test it; never leave it hidden.
|
|
51
51
|
- The only permitted non-exported module-scope declarations are in a runtime entrypoint that must be self-contained and cannot import siblings, such as raw source loaded in a worker. Explain that necessity in a comment.
|
|
52
52
|
- A runtime entry—`src/bin/main.ts`, `app/browser/main.ts`, `app/server/main.ts`—is a fixed name, not a centralized kind file. Both the data rule and the function rule reach it, so it declares no module-scope constant and no module-scope function: it imports what it needs and runs. The preceding self-contained exception covers only an entrypoint that cannot import siblings.
|
|
53
|
-
- Perform a cleanup
|
|
53
|
+
- Perform a cleanup pass after implementation: no stray implementation-file declarations, non-exported/wrong-kind centralized declarations, prohibited nested declarations, duplicate implementations, compatibility aliases, superfluous wrappers, stale imports/barrel rows, or untested extracted functions.
|
|
54
54
|
|
|
55
55
|
## Kind purity
|
|
56
56
|
|
|
@@ -96,55 +96,61 @@ Use only the centralized files an environment needs.
|
|
|
96
96
|
and referenced by name, never to a function expression written in place. Neither file mixes kinds and the
|
|
97
97
|
route set stays readable as data.
|
|
98
98
|
|
|
99
|
-
### What the policy
|
|
99
|
+
### What the policy instruments prove
|
|
100
100
|
|
|
101
|
-
The
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
The `policy` Oxlint plugin (`configs/policy.ts`) enforces syntactic placement: a declaration of a
|
|
102
|
+
given syntactic kind appears only in a file permitted to hold that kind. The fleet policy sweep
|
|
103
|
+
(`tests/policy.test.ts`, `tests/setupPolicy.ts`) enforces what a path or a text reading decides.
|
|
104
|
+
The plugin reads declaration syntax and file name; the sweep reads paths and workspace text;
|
|
105
|
+
neither reads meaning.
|
|
104
106
|
|
|
105
|
-
-
|
|
107
|
+
- The plugin proves that a module function sits in a function-kind file, that module data sits in a
|
|
106
108
|
data-kind file, that every centralized declaration is exported, that a class sits in its matching
|
|
107
109
|
implementation or errors file, and that `constants.ts` declares only UPPER_SNAKE_CASE consts with
|
|
108
110
|
no bare collection literal.
|
|
109
|
-
-
|
|
111
|
+
- The sweep proves that no source, test, config, or script file carries an `eslint-disable` or
|
|
110
112
|
`oxlint-disable` directive.
|
|
111
|
-
-
|
|
112
|
-
row resolves to a file.
|
|
113
|
-
-
|
|
114
|
-
`POLICY_PORTABILITY_GLOB`
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
`node:os`.
|
|
119
|
-
-
|
|
120
|
-
into one file, and turns `:` into an alternate data stream, so those boundaries are
|
|
121
|
-
path population rather than from written files.
|
|
122
|
-
-
|
|
123
|
-
returns, so `Object.freeze([…])` and any other call initializer are one syntax to it. The
|
|
124
|
-
obligation in the earlier kind-purity rules binds regardless; only the bare literal is
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
`
|
|
129
|
-
`
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
113
|
+
- The sweep proves that every `.claude/rules/*.md` file has a rule-map row in `AGENTS.md` and that
|
|
114
|
+
every row resolves to a file.
|
|
115
|
+
- The sweep proves the host portability rules that are path- or text-shaped over the population
|
|
116
|
+
`POLICY_PORTABILITY_GLOB` names: no path segment carries a Windows reserved device name, a
|
|
117
|
+
character Windows refuses, a trailing dot or space, or a sibling differing only by case; and no
|
|
118
|
+
`package.json` script names a `.sh` file.
|
|
119
|
+
- The plugin proves, over the population `POLICY_ENDING_GLOBS` names, that no source trims a
|
|
120
|
+
payload before splitting it on `'\n'`, reads `os.EOL`, or imports `EOL` from `node:os`.
|
|
121
|
+
- The sweep cannot write a filename the host refuses. A Windows host rejects `<`, folds a case
|
|
122
|
+
collision into one file, and turns `:` into an alternate data stream, so those boundaries are
|
|
123
|
+
proven from a path population rather than from written files.
|
|
124
|
+
- The plugin does not prove a collection is frozen. It reads the declaration, never the value a
|
|
125
|
+
call returns, so `Object.freeze([…])` and any other call initializer are one syntax to it. The
|
|
126
|
+
freeze obligation in the earlier kind-purity rules binds regardless; only the bare literal is
|
|
127
|
+
mechanical.
|
|
128
|
+
- The plugin does not tell one function kind from another. Every centralized file that permits
|
|
129
|
+
functions reads the same to it apart from the `parse*` and `create*` name forms: `cloners.ts`,
|
|
130
|
+
`combinators.ts`, `compilers.ts`, `errors.ts`, `factories.ts`, `handlers.ts`, `helpers.ts`,
|
|
131
|
+
`inferers.ts`, `middlewares.ts`, `parsers.ts`, `relations.ts`, `schemas.ts`, `seeders.ts`,
|
|
132
|
+
`shapers.ts`, and `validators.ts`. That list is exhaustive, a new function kind joins it, and no
|
|
133
|
+
later version of the plugin claims more.
|
|
134
|
+
- The plugin reports no `data` violation in `helpers.ts`. The kind rules place a camelCase
|
|
135
|
+
namespace of functions there, and a namespace of callables is not separable from a data table by
|
|
136
|
+
declaration syntax, so `DATA_EXEMPT_FILES` in `configs/policy.ts` excludes the file. Ordinary
|
|
137
|
+
module data there — `export const RETRIES = 3` — is unreported; the earlier constants rule binds
|
|
138
|
+
regardless.
|
|
139
|
+
- No placement or line-ending rule inspects an ambient declaration file: `.d.ts`, `.d.mts`, and
|
|
140
|
+
`.d.cts` are outside their reach. The lint population reaches those files, and each of those
|
|
141
|
+
rules refuses the file by its name, because an ambient declaration file is not a module in the
|
|
142
|
+
kind table.
|
|
143
|
+
- The plugin does not inspect class-expression members. A function assigned inside a
|
|
144
|
+
class-expression method is unreported; the earlier functions rule still binds, and cleanup and
|
|
145
|
+
review enforce it.
|
|
146
|
+
- The cleanup pass and independent review prove kind purity across those files. A helper misfiled
|
|
141
147
|
as a parser, a coercer misfiled as a guard, a compiler misfiled as a factory, and a shaper
|
|
142
|
-
misfiled as a cloner are review findings, not
|
|
143
|
-
-
|
|
144
|
-
cannot tell whether a declaration is reachable from its barrel. That question belongs to
|
|
145
|
-
package's `tests/guides.test.ts`, which imports the barrel and gets real resolution. Do not
|
|
146
|
-
module resolution here to duplicate it.
|
|
147
|
-
- The kind table is mandatory whether or not
|
|
148
|
+
misfiled as a cloner are review findings, not instrument diagnostics.
|
|
149
|
+
- The plugin does not decide barrel membership. It parses each file alone and resolves no module,
|
|
150
|
+
so it cannot tell whether a declaration is reachable from its barrel. That question belongs to
|
|
151
|
+
each package's `tests/guides.test.ts`, which imports the barrel and gets real resolution. Do not
|
|
152
|
+
add module resolution here to duplicate it.
|
|
153
|
+
- The kind table is mandatory whether or not an instrument can see the violation.
|
|
148
154
|
|
|
149
155
|
## Wrapper test
|
|
150
156
|
|
|
@@ -214,7 +220,7 @@ Store child managers in `#` fields and expose readonly getters typed as their in
|
|
|
214
220
|
|
|
215
221
|
- A word is either a centralized kind or a domain folder, never both.
|
|
216
222
|
- A folder named for a centralized kind—`helpers/`, `validators/`, `handlers/`—is that kind's file, not a folder.
|
|
217
|
-
- `FUNCTION_DOMAIN_FOLDERS` in the fleet-canon register (`
|
|
223
|
+
- `FUNCTION_DOMAIN_FOLDERS` in the fleet-canon register (`configs/policy.ts`) registers the
|
|
218
224
|
folder paths whose direct modules are function modules. Registration makes a path eligible and
|
|
219
225
|
fixes the declaration shape checked there; it judges nothing about what a module does.
|
|
220
226
|
- Never infer a function domain from a folder's name; a camelCase module inside an unregistered
|
|
@@ -293,7 +299,7 @@ export * from './greeters/Greeter.js'
|
|
|
293
299
|
- Keep everything generic/reusable and free of unrelated-project logic.
|
|
294
300
|
- Do not expand the capability set without concrete need. Once that capability exists intentionally,
|
|
295
301
|
its reusable top-level exports follow the earlier barrel rule without a second consumer gate.
|
|
296
|
-
- Do not remove structural files because they are
|
|
302
|
+
- Do not remove structural files because they are empty.
|
|
297
303
|
- Prefer the smallest complete implementation that preserves architecture.
|
|
298
304
|
- No deprecation aliases, compatibility shims, or backward-compatibility branches; update all consumers atomically.
|
|
299
305
|
- No polling/busy loops or recursive microtasks as architecture. Park idle work on an event/abort wakeup and yield long work in cooperative quanta.
|
|
@@ -32,7 +32,24 @@ Documentation is an enforced contract, not explanatory decoration. The Writing r
|
|
|
32
32
|
- Every public export is documented.
|
|
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 guide `Summary` cell equals its export's doc-block description paragraph, both read in the form
|
|
36
|
+
the `findDrift` function compares (a `{@link}` tag written as its target's code token, whitespace
|
|
37
|
+
collapsed, a code span's boundary whitespace trimmed); a titled `@example` equals the guide fence
|
|
38
|
+
under the heading of that title; and the README pitch equals the guide's tagline.
|
|
39
|
+
`tests/guides.test.ts` asserts each through the `findDrift` function and the `tagline` method
|
|
40
|
+
that `@orkestrel/guide` exports. Invoke the public `GuideCommand` class there with the package's
|
|
41
|
+
inventory policy and direct host ports, and register the package assertions in the anonymous
|
|
42
|
+
callback passed to its `execute` method. The command owns argument validation, explicit
|
|
43
|
+
rewriting, and remaining-drift reporting. Run `npm run test:guides` for read-only parity
|
|
44
|
+
assertions. Use
|
|
45
|
+
`npm run test:guides -- --to guide` or `npm run test:guides -- --to source` only when choosing
|
|
46
|
+
an explicit rewrite direction. Before adopting the generated command, implement its direct
|
|
47
|
+
entry and rewrite directions in the package-owned `tests/guides.test.ts`. Scaffold must not
|
|
48
|
+
synthesize or overwrite that authored proof. Update each fleet package's authored file before
|
|
49
|
+
its release. Never weaken the gate.
|
|
50
|
+
- The TSDoc voice rule governs a doc block, and a `Summary` cell carries that block's description
|
|
51
|
+
paragraph, so the same voice governs the cell. A guide tagline and a README pitch are noun
|
|
52
|
+
phrases, and each is the blockquote under its file's H1.
|
|
36
53
|
- 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.
|
|
37
54
|
- 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.
|
|
38
55
|
Asserting that the sentence appears is not asserting that it is true. `expect(text).toContain('a spawn fault reports null')` passes unchanged when the code starts returning something else, so it guards the documentation's presence and nothing about the behaviour. Where a prose claim about behaviour sits under no fence, add the executed assertion that would break if the claim went false, and keep the substring check only as a presence guard beside it. A row whose close condition names a behaviour does not close on a substring.
|
|
@@ -52,6 +52,8 @@ and the form of a conditional skip.
|
|
|
52
52
|
host.
|
|
53
53
|
- Read the temporary directory from `os.tmpdir()`. Never write a `/tmp` literal in source.
|
|
54
54
|
- Build a `file:` URI with `pathToFileURL`. Never format one from a path string.
|
|
55
|
+
- Convert a `file:` URI to a host path with `fileURLToPath`. Never read `URL.pathname` as
|
|
56
|
+
a host path or strip the scheme, decode escapes, or rewrite a drive prefix by hand.
|
|
55
57
|
|
|
56
58
|
## Processes and executables
|
|
57
59
|
|
|
@@ -67,7 +67,7 @@ A review that reads a diff finds what the diff shows. A review that tries to bre
|
|
|
67
67
|
- 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.
|
|
68
68
|
- 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.
|
|
69
69
|
- 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.
|
|
70
|
-
- 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,
|
|
70
|
+
- 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, but not the one asked about. Name the substitute and what it actually measures, or say the question is open.
|
|
71
71
|
- 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.
|
|
72
72
|
- 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.
|
|
73
73
|
- Measure the product, not the harness. A recorded baseline that counts something about its own fixture is not evidence about the shipped surface, however often a guide quotes it.
|
|
@@ -48,16 +48,16 @@ paths:
|
|
|
48
48
|
A proof that covers the workspace instead of one module has a fixed location, so no package invents
|
|
49
49
|
its own:
|
|
50
50
|
|
|
51
|
-
| Path | Proves
|
|
52
|
-
| ---------------------------- |
|
|
53
|
-
| `tests/policy.test.ts` |
|
|
54
|
-
| `tests/config.test.ts` | Root configuration resolves its aliases, projects, and outputs, and the `configs/` leaves behind them
|
|
55
|
-
| `tests/guides.test.ts` | Every documented API exists, every public API is documented, and every executable fence returns what the guide says it returns |
|
|
56
|
-
| `tests/conformance.test.ts` | Where this package drifts from the official tooling it tracks
|
|
57
|
-
| `tests/distribution.test.ts` | The packed package installs and resolves through its public exports
|
|
58
|
-
| `tests/integration.test.ts` | The package's features work together end to end across environments
|
|
59
|
-
| `tests/setup*.test.ts` | Reusable behavior exported from sibling `tests/setup*.ts` modules works as the workspace's suites require
|
|
60
|
-
| `tests/service/**/*.test.ts` | The live external services this package drives, driven for real
|
|
51
|
+
| Path | Proves |
|
|
52
|
+
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
53
|
+
| `tests/policy.test.ts` | The path- and text-shaped policy laws: mirrors, suppressions, the rule map, filenames, manifest scripts, skills, and bridges |
|
|
54
|
+
| `tests/config.test.ts` | Root configuration resolves its aliases, projects, and outputs, and the `configs/` leaves behind them |
|
|
55
|
+
| `tests/guides.test.ts` | Every documented API exists, every public API is documented, every compared summary, example, and pitch equals its source, and every executable fence returns what the guide says it returns |
|
|
56
|
+
| `tests/conformance.test.ts` | Where this package drifts from the official tooling it tracks |
|
|
57
|
+
| `tests/distribution.test.ts` | The packed package installs and resolves through its public exports |
|
|
58
|
+
| `tests/integration.test.ts` | The package's features work together end to end across environments |
|
|
59
|
+
| `tests/setup*.test.ts` | Reusable behavior exported from sibling `tests/setup*.ts` modules works as the workspace's suites require |
|
|
60
|
+
| `tests/service/**/*.test.ts` | The live external services this package drives, driven for real |
|
|
61
61
|
|
|
62
62
|
- Put each root `tests/setup*.test.ts` proof in the `setup` project. Keep its assertions on
|
|
63
63
|
exported test-infrastructure behavior: do not duplicate production behavior there, and do not
|
|
@@ -105,7 +105,8 @@ The kinds split by which tool has to see the probe:
|
|
|
105
105
|
|
|
106
106
|
- A **type probe** is read by `tsc`, whose scoped project includes only its own environment, so it
|
|
107
107
|
lives in the source tree beside what it measures. Delete it before the unit returns; a leaked one
|
|
108
|
-
fails the placement
|
|
108
|
+
fails the `policy` plugin's placement rules, because a probe filename is not a centralized kind
|
|
109
|
+
file.
|
|
109
110
|
- A **runtime probe** is collected by a Vitest project, so it lives in `tmp/probe/` and runs through
|
|
110
111
|
the `probe` project. `tmp/` is ignored by git, so no probe enters a commit by accident, and every
|
|
111
112
|
test script names its project, so no gate runs the `probe` project.
|
|
@@ -77,6 +77,11 @@ type Result<T, E = Error> = Success<T> | Failure<E>
|
|
|
77
77
|
- Every public export has complete TSDoc: description, `@param`, `@returns`, and `@example` where applicable.
|
|
78
78
|
- The first sentence states what the symbol does in the third person with an `-s` verb — `Creates`,
|
|
79
79
|
`Returns`, `Checks whether` — and never repeats the symbol's name.
|
|
80
|
+
- `policy/no-malformed-summary` reads that first sentence over every doc block a top-level export
|
|
81
|
+
declaration follows, and refuses an opening word that is not a third-person `-s` verb and a
|
|
82
|
+
sentence naming the declared symbol. A word ending in `s` that the rule's stop set does not name
|
|
83
|
+
passes whether or not it is a verb — a plural noun such as `Files` included — so read the sentence
|
|
84
|
+
in review as well.
|
|
80
85
|
- Describe a boolean parameter as "If `true`, …; if `false`, …", and a boolean return as
|
|
81
86
|
"True if …; false otherwise".
|
|
82
87
|
- Write a default as "Default: …" and a thrown error as "Thrown when …".
|
|
@@ -61,9 +61,11 @@ Define aliases in `tsconfig.json` first. `vite.config.ts` derives from `compiler
|
|
|
61
61
|
- `configs/src/` and `configs/app/`: thin per-target wrappers, including optional
|
|
62
62
|
`configs/src/*bin*` files. Shared logic remains in root configs.
|
|
63
63
|
- `configs/helpers.ts`, `configs/browsers.ts`, and `configs/policy.ts`: the only permitted leaves
|
|
64
|
-
under `configs/`. Each imports nothing from the workspace, which is what keeps it a leaf
|
|
65
|
-
`configs/
|
|
66
|
-
in
|
|
64
|
+
under `configs/`. Each imports nothing from the workspace, which is what keeps it a leaf, so no
|
|
65
|
+
`configs/types.ts` exists for one to import: each keeps its own types, data, and functions in its
|
|
66
|
+
one file, and the centralized-kind placement in `.claude/rules/architecture.md` does not reach a
|
|
67
|
+
leaf. Each `configs/src/*.config.ts` imports the root config rather than a leaf, so shared build
|
|
68
|
+
logic stays in one place.
|
|
67
69
|
- Keep `configs/helpers.ts` free of any dependency a core-only workspace does not declare. It is
|
|
68
70
|
vendored byte-identical to every workspace, so an import there must resolve in all of them.
|
|
69
71
|
`configs/browsers.ts` exists for that reason: it imports `playwright` and
|
|
@@ -71,11 +73,14 @@ Define aliases in `tsconfig.json` first. `vite.config.ts` derives from `compiler
|
|
|
71
73
|
- Keep `configs/policy.ts` free of imports entirely. It is the workspace's oxlint plugin, the lint
|
|
72
74
|
instrument of the policy law, and it is vendored byte-identical to every workspace including a
|
|
73
75
|
core-only one, so a module that imports nothing at all is the only form that resolves in all of
|
|
74
|
-
them.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
them.
|
|
77
|
+
- When a file is vendored byte-identical, import only what resolves in every workspace: a `node:`
|
|
78
|
+
module, or a package `BASE_DEV_DEPENDENCIES` declares. Refuse any other `@orkestrel/*` import;
|
|
79
|
+
`tests/src/server/helpers.test.ts` reads every vendored JavaScript and TypeScript module against
|
|
80
|
+
that set. A base package resolves in its own checkout through its `exports` map to its built
|
|
81
|
+
`dist/` entry, so a vendored module that imports it runs there after `npm run build`; the
|
|
82
|
+
generated root `tsconfig.json` maps the workspace's own published specifiers to its source, so
|
|
83
|
+
`npm run check` there needs no build.
|
|
79
84
|
|
|
80
85
|
Environment rules:
|
|
81
86
|
|
|
@@ -123,16 +128,16 @@ environment axis is one project per src/app axis × environment:
|
|
|
123
128
|
The workspace-proof axis is cross-cutting. Each proof covers the whole workspace rather than
|
|
124
129
|
one environment, so each is its own project:
|
|
125
130
|
|
|
126
|
-
| Project | Files | Proves
|
|
127
|
-
| -------------- | ---------------------------- |
|
|
128
|
-
| `policy` | `tests/policy.test.ts` |
|
|
129
|
-
| `config` | `tests/config.test.ts` | Root configuration resolves its aliases, projects, and outputs
|
|
130
|
-
| `setup` | `tests/setup*.test.ts` | Reusable behavior exported from the root test setup modules works as the consuming suites require
|
|
131
|
-
| `guides` | `tests/guides.test.ts` | Every documented API exists
|
|
132
|
-
| `conformance` | `tests/conformance.test.ts` | Where this package drifts from the official tooling it tracks
|
|
133
|
-
| `distribution` | `tests/distribution.test.ts` | The packed package installs and resolves through its public exports
|
|
134
|
-
| `integration` | `tests/integration.test.ts` | The package's features work together end to end across environments
|
|
135
|
-
| `service` | `tests/service/**/*.test.ts` | The live external services this package drives, driven for real
|
|
131
|
+
| Project | Files | Proves | Gate |
|
|
132
|
+
| -------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- |
|
|
133
|
+
| `policy` | `tests/policy.test.ts` | The path- and text-shaped policy laws: mirrors, suppressions, the rule map, filenames, manifest scripts, skills, and bridges | `test` |
|
|
134
|
+
| `config` | `tests/config.test.ts` | Root configuration resolves its aliases, projects, and outputs | `test` |
|
|
135
|
+
| `setup` | `tests/setup*.test.ts` | Reusable behavior exported from the root test setup modules works as the consuming suites require | `test` |
|
|
136
|
+
| `guides` | `tests/guides.test.ts` | Every documented API exists, every public API is documented, every compared summary, example, and pitch equals its source, and every executable fence returns what the guide says it returns | `test` |
|
|
137
|
+
| `conformance` | `tests/conformance.test.ts` | Where this package drifts from the official tooling it tracks | `test` |
|
|
138
|
+
| `distribution` | `tests/distribution.test.ts` | The packed package installs and resolves through its public exports | `prepublishOnly`; absent when private |
|
|
139
|
+
| `integration` | `tests/integration.test.ts` | The package's features work together end to end across environments | `test` |
|
|
140
|
+
| `service` | `tests/service/**/*.test.ts` | The live external services this package drives, driven for real | `prepublishOnly`; `test` when private |
|
|
136
141
|
|
|
137
142
|
- Define the `setup` project only when a root file matches `tests/setup*.test.ts`, exact-case.
|
|
138
143
|
Include every matching file. When registered, emit `test:setup` and run it from `test`. When no
|
|
@@ -161,8 +166,8 @@ the `test:bench` script joins no chain, so no gate runs either mode; the project
|
|
|
161
166
|
ignored by git; and `.claude/rules/tests.md` governs what may live there.
|
|
162
167
|
|
|
163
168
|
- Define a cross-cutting project only for a proof the package actually has.
|
|
164
|
-
-
|
|
165
|
-
|
|
169
|
+
- Prepare the external service before invoking the `service` project. Use `tests/setupService.ts`
|
|
170
|
+
to verify readiness, apply `.claude/rules/tests.md`, and name the project `service` whatever it
|
|
166
171
|
drives.
|
|
167
172
|
- In a publishing workspace, a project leaves the default run when it drives a live external
|
|
168
173
|
service or is hermetic but slow — it spawns processes, packs, installs, or drives a real build.
|
|
@@ -107,6 +107,10 @@ a sample string inside a code fence or a test fixture: quote each as itself, exe
|
|
|
107
107
|
| `blacklist`, `whitelist` | `denylist`, `allowlist` |
|
|
108
108
|
| `master`, `slave` | `primary`, `replica` |
|
|
109
109
|
|
|
110
|
+
- `policy/no-banned-term` reads every comment and the prose sweep in `tests/setupPolicy.ts` reads
|
|
111
|
+
every authored Markdown file, and each matches the rows this table bans unconditionally. The rule
|
|
112
|
+
and the sweep leave `now`, `new`, `latest`, `once`, `since`, and `master` unmatched because those
|
|
113
|
+
rows carry a permitted sense, so rule a hit in one of those rows yourself.
|
|
110
114
|
- Sweep case-insensitively and across inflections when checking prose against the preceding table. A
|
|
111
115
|
pattern for `easy` reaches neither `Easy` nor `easier`, and a temporal `once` most often appears
|
|
112
116
|
as a sentence-initial `Once`.
|