@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.
Files changed (57) hide show
  1. package/README.md +29 -104
  2. package/dist/bin/main.js +95 -27
  3. package/dist/bin/main.js.map +1 -1
  4. package/dist/host/AGENTS.md +2 -2
  5. package/dist/host/CLAUDE.md +6 -0
  6. package/dist/host/agents/orchestration.md +23 -15
  7. package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +184 -177
  8. package/dist/host/agents/skills/enterprise-bootstrap/references/bootstrap-reference.md +314 -91
  9. package/dist/host/agents/skills/enterprise-bootstrap/references/color-modes.md +241 -0
  10. package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +83 -36
  11. package/dist/host/agents/skills/enterprise-bootstrap/references/frontend-design.md +297 -98
  12. package/dist/host/agents/skills/enterprise-bootstrap/references/inputs.md +25 -14
  13. package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +216 -128
  14. package/dist/host/agents/skills/enterprise-bootstrap/references/responsive-layout.md +187 -0
  15. package/dist/host/agents/skills/enterprise-bootstrap/references/utilities.md +109 -20
  16. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +5 -5
  17. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +1 -1
  18. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +15 -15
  19. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +43 -17
  20. package/dist/host/agents/skills/orkestrel-publish/references/window.md +41 -16
  21. package/dist/host/claude/agents/orkestrel.md +56 -56
  22. package/dist/host/claude/agents/reviewer.md +13 -0
  23. package/dist/host/claude/rules/architecture.md +51 -45
  24. package/dist/host/claude/rules/documentation.md +18 -1
  25. package/dist/host/claude/rules/portability.md +2 -0
  26. package/dist/host/claude/rules/quality.md +1 -1
  27. package/dist/host/claude/rules/tests.md +12 -11
  28. package/dist/host/claude/rules/typescript.md +5 -0
  29. package/dist/host/claude/rules/workspace.md +25 -20
  30. package/dist/host/claude/rules/writing.md +4 -0
  31. package/dist/host/claude/settings.json +1 -1
  32. package/dist/host/claude/skills/enterprise-bootstrap/SKILL.md +10 -9
  33. package/dist/host/codex/agents/orkestrel.toml +3 -3
  34. package/dist/host/codex/agents/reviewer.toml +4 -2
  35. package/dist/host/configs/helpers.ts +311 -2
  36. package/dist/host/configs/policy.ts +1100 -51
  37. package/dist/host/dotfiles/oxlintrc.json +72 -1
  38. package/dist/host/guides/guide.md +749 -222
  39. package/dist/host/guides/scaffold.md +529 -394
  40. package/dist/host/manifest.json +53 -40
  41. package/dist/host/scripts/ollama.sh +322 -13
  42. package/dist/host/tests/config.test.ts +1200 -16
  43. package/dist/host/tests/policy.test.ts +157 -173
  44. package/dist/host/tests/setupPolicy.ts +522 -1007
  45. package/dist/src/core/index.cjs +402 -287
  46. package/dist/src/core/index.cjs.map +1 -1
  47. package/dist/src/core/index.d.cts +160 -128
  48. package/dist/src/core/index.d.ts +160 -128
  49. package/dist/src/core/index.js +400 -286
  50. package/dist/src/core/index.js.map +1 -1
  51. package/dist/src/server/index.cjs +28 -21
  52. package/dist/src/server/index.cjs.map +1 -1
  53. package/dist/src/server/index.d.cts +38 -33
  54. package/dist/src/server/index.d.ts +38 -33
  55. package/dist/src/server/index.js +28 -21
  56. package/dist/src/server/index.js.map +1 -1
  57. 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.8` | L1 | `@orkestrel/contract` `^0.0.13` |
49
- | `@orkestrel/agent` | `0.0.19` | L5 | `@orkestrel/abort` `^0.0.8`, `@orkestrel/budget` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/queue` `^0.0.11`, `@orkestrel/timeout` `^0.0.8`, `@orkestrel/tool` `^0.0.12`, `@orkestrel/workflow` `^0.0.16`, `@orkestrel/workspace` `^0.0.6` |
50
- | `@orkestrel/brief` | `0.0.6` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/interpret` `^0.0.11`, `@orkestrel/reason` `^0.0.8` |
51
- | `@orkestrel/browser` | `0.0.14` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/html` `^0.0.7`, `@orkestrel/websocket` `^0.0.10` |
52
- | `@orkestrel/budget` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
53
- | `@orkestrel/codec` | `0.0.1` | L0 | |
54
- | `@orkestrel/console` | `0.0.11` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
55
- | `@orkestrel/contract` | `0.0.15` | L0 | |
56
- | `@orkestrel/csv` | `0.0.5` | L1 | `@orkestrel/contract` `^0.0.13` |
57
- | `@orkestrel/database` | `0.0.12` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/indexeddb` `^0.0.9`, `@orkestrel/sqlite` `^0.0.9` |
58
- | `@orkestrel/emitter` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
59
- | `@orkestrel/form` | `0.0.4` | L2 | `@orkestrel/contract` `^0.0.15`, `@orkestrel/emitter` `^0.0.8` |
60
- | `@orkestrel/guide` | `0.0.15` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/markdown` `^0.0.12` |
61
- | `@orkestrel/html` | `0.0.7` | L1 | `@orkestrel/contract` `^0.0.13` |
62
- | `@orkestrel/indexeddb` | `0.0.9` | L1 | `@orkestrel/contract` `^0.0.13` |
63
- | `@orkestrel/interpret` | `0.0.11` | L3 | `@orkestrel/reason` `^0.0.8`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/template` `^0.0.5` |
64
- | `@orkestrel/lsp` | `0.0.5` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/process` `^0.0.8` |
65
- | `@orkestrel/markdown` | `0.0.12` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/html` `^0.0.7` |
66
- | `@orkestrel/mcp` | `0.0.27` | L3 | `@orkestrel/codec` `^0.0.1`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/process` `^0.0.8`, `@orkestrel/sse` `^0.0.5`, `@orkestrel/tool` `^0.0.12`, `@orkestrel/websocket` `^0.0.10` |
67
- | `@orkestrel/middleware` | `0.0.18` | L2 | `@orkestrel/abort` `^0.0.8`, `@orkestrel/budget` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/timeout` `^0.0.8` |
68
- | `@orkestrel/msg` | `0.0.8` | L0 | |
69
- | `@orkestrel/ndjson` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
70
- | `@orkestrel/ollama` | `0.0.13` | L6 | `@orkestrel/agent` `^0.0.19`, `@orkestrel/budget` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/ndjson` `^0.0.8`, `@orkestrel/timeout` `^0.0.8`, `@orkestrel/tool` `^0.0.12` |
71
- | `@orkestrel/pool` | `0.0.9` | L2 | `@orkestrel/emitter` `^0.0.8` |
72
- | `@orkestrel/probe` | `0.0.11` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/lsp` `^0.0.5`, `@orkestrel/mcp` `^0.0.27`, `@orkestrel/queue` `^0.0.11`, `@orkestrel/timeout` `^0.0.8`, `@orkestrel/tool` `^0.0.12` |
73
- | `@orkestrel/process` | `0.0.9` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
74
- | `@orkestrel/program` | `0.0.11` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/qualifier` `^0.0.12`, `@orkestrel/rater` `^0.0.12`, `@orkestrel/reason` `^0.0.8` |
75
- | `@orkestrel/qualifier` | `0.0.12` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/reason` `^0.0.8` |
76
- | `@orkestrel/queue` | `0.0.11` | L3 | `@orkestrel/abort` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/timeout` `^0.0.8` |
77
- | `@orkestrel/rater` | `0.0.12` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/reason` `^0.0.8` |
78
- | `@orkestrel/reason` | `0.0.8` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
79
- | `@orkestrel/relation` | `0.0.10` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8` |
80
- | `@orkestrel/router` | `0.0.12` | L2 | `@orkestrel/abort` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
81
- | `@orkestrel/scaffold` | `0.0.60` | L3 | `@orkestrel/console` `^0.0.11`, `@orkestrel/contract` `^0.0.15`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/markdown` `^0.0.12`, `@orkestrel/process` `^0.0.9`, `@orkestrel/template` `^0.0.5` |
82
- | `@orkestrel/sea` | `0.0.13` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/process` `^0.0.8` |
83
- | `@orkestrel/server` | `0.0.17` | L3 | `@orkestrel/abort` `^0.0.8`, `@orkestrel/codec` `^0.0.1`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/router` `^0.0.12`, `@orkestrel/timeout` `^0.0.8` |
84
- | `@orkestrel/sqlite` | `0.0.9` | L1 | `@orkestrel/contract` `^0.0.13` |
85
- | `@orkestrel/sse` | `0.0.5` | 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.3` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
88
- | `@orkestrel/template` | `0.0.5` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
89
- | `@orkestrel/terminal` | `0.0.13` | L3 | `@orkestrel/console` `^0.0.11`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/form` `^0.0.3`, `@orkestrel/sse` `^0.0.5` |
90
- | `@orkestrel/test` | `0.0.12` | L0 | |
91
- | `@orkestrel/timeout` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
92
- | `@orkestrel/tool` | `0.0.12` | L1 | `@orkestrel/contract` `^0.0.13` |
93
- | `@orkestrel/toolbox` | `0.0.11` | L6 | `@orkestrel/agent` `^0.0.19`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/form` `^0.0.3`, `@orkestrel/relation` `^0.0.10`, `@orkestrel/server` `^0.0.17`, `@orkestrel/terminal` `^0.0.13`, `@orkestrel/tool` `^0.0.12`, `@orkestrel/workflow` `^0.0.16`, `@orkestrel/workspace` `^0.0.6` |
94
- | `@orkestrel/websocket` | `0.0.10` | L2 | `@orkestrel/emitter` `^0.0.8` |
95
- | `@orkestrel/worker` | `0.0.10` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/pool` `^0.0.9`, `@orkestrel/queue` `^0.0.11` |
96
- | `@orkestrel/workflow` | `0.0.16` | L4 | `@orkestrel/abort` `^0.0.8`, `@orkestrel/budget` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/queue` `^0.0.11`, `@orkestrel/timeout` `^0.0.8` |
97
- | `@orkestrel/workspace` | `0.0.6` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8` |
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 first; each
125
- later layer publishes only after every layer before it is on the registry. A row with no
126
- layer sits in a cycle and cannot be placed in a round at all. Packages in one layer are
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 sweep 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.
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 sweep proves
99
+ ### What the policy instruments prove
100
100
 
101
- The fleet policy sweep (`tests/policy.test.ts`, `tests/setupPolicy.ts`) enforces syntactic
102
- placement: a declaration of a given syntactic kind appears only in a file permitted to hold that
103
- kind. It reads declaration syntax and file name, never meaning.
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
- - It proves that a module function sits in a function-kind file, that module data sits in a
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
- - It proves that no source, test, config, or script file carries an `eslint-disable` or
111
+ - The sweep proves that no source, test, config, or script file carries an `eslint-disable` or
110
112
  `oxlint-disable` directive.
111
- - It proves that every `.claude/rules/*.md` file has a rule-map row in `AGENTS.md` and that every
112
- row resolves to a file.
113
- - It proves the host portability rules that are path- or text-shaped over the populations
114
- `POLICY_PORTABILITY_GLOB` and `POLICY_PORTABILITY_SOURCE_GLOB` name: no path segment carries a
115
- Windows reserved device name, a character Windows refuses, a trailing dot or space, or a sibling
116
- differing only by case; no `package.json` script names a `.sh` file; and no source in the parsed
117
- population trims a payload before splitting it on `'\n'`, reads `os.EOL`, or imports `EOL` from
118
- `node:os`.
119
- - It cannot write a filename the host refuses. A Windows host rejects `<`, folds a case collision
120
- into one file, and turns `:` into an alternate data stream, so those boundaries are proven from a
121
- path population rather than from written files.
122
- - It does not prove a collection is frozen. It reads the declaration, never the value a call
123
- returns, so `Object.freeze([…])` and any other call initializer are one syntax to it. The freeze
124
- obligation in the earlier kind-purity rules binds regardless; only the bare literal is mechanical.
125
- - It does not tell one function kind from another. Every centralized file that permits functions
126
- reads the same to it apart from the `parse*` and `create*` name forms: `cloners.ts`, `combinators.ts`,
127
- `compilers.ts`, `errors.ts`, `factories.ts`, `handlers.ts`, `helpers.ts`, `inferers.ts`,
128
- `middlewares.ts`, `parsers.ts`, `relations.ts`, `schemas.ts`, `seeders.ts`, `shapers.ts`, and
129
- `validators.ts`. That list is exhaustive, a new function kind joins it, and no later version of
130
- the sweep claims more.
131
- - It reports no `data` violation in `helpers.ts`. The kind rules place a camelCase namespace of
132
- functions there, and a namespace of callables is not separable from a data table by declaration
133
- syntax, so `DATA_EXEMPT_FILES` in `tests/setupPolicy.ts` excludes the file. Ordinary module data
134
- there — `export const RETRIES = 3` — is unreported; the earlier constants rule binds regardless.
135
- - It inspects no ambient declaration file: `.d.ts`, `.d.mts`, and `.d.cts` are all outside its
136
- reach. An ambient declaration file is not a module in the kind table, so it sits outside the
137
- parsed population entirely rather than being exempted from the `type` rule.
138
- - It does not inspect class-expression members. A function assigned inside a class-expression
139
- method is unreported; the earlier functions rule still binds, and cleanup and review enforce it.
140
- - The cleanup sweep and independent review prove kind purity across those files. A helper misfiled
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 red tests.
143
- - It does not decide barrel membership. It parses each file alone and resolves no module, so it
144
- cannot tell whether a declaration is reachable from its barrel. That question belongs to each
145
- package's `tests/guides.test.ts`, which imports the barrel and gets real resolution. Do not add
146
- module resolution here to duplicate it.
147
- - The kind table is mandatory whether or not a test can see the violation.
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 (`tests/setupPolicy.ts`) registers the
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 currently empty.
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
- - The TSDoc voice rule governs a doc block; a guide tagline and a Surface-row description are noun phrases.
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, just not the one asked about. Name the substitute and what it actually measures, or say the question is open.
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` | Every source file obeys the syntactic coding and placement law |
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 sweep, because a probe filename is not a centralized kind file.
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. Each
65
- `configs/src/*.config.ts` imports the root config rather than a leaf, so shared build logic stays
66
- in one place.
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. Because it may import nothing, keep its own types, data, and functions in that one file: the
75
- centralized-kind placement in `.claude/rules/architecture.md` does not reach it.
76
- - When a file is vendored byte-identical, import nothing that fails to resolve in any target. Import
77
- no `@orkestrel/*` package from it: every such package is itself a target and cannot depend on
78
- itself.
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 | Gate |
127
- | -------------- | ---------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------- |
128
- | `policy` | `tests/policy.test.ts` | Every source file obeys the syntactic coding and placement law | `test` |
129
- | `config` | `tests/config.test.ts` | Root configuration resolves its aliases, projects, and outputs | `test` |
130
- | `setup` | `tests/setup*.test.ts` | Reusable behavior exported from the root test setup modules works as the consuming suites require | `test` |
131
- | `guides` | `tests/guides.test.ts` | Every documented API exists and every public API is documented | `test` |
132
- | `conformance` | `tests/conformance.test.ts` | Where this package drifts from the official tooling it tracks | `test` |
133
- | `distribution` | `tests/distribution.test.ts` | The packed package installs and resolves through its public exports | `prepublishOnly`; absent when private |
134
- | `integration` | `tests/integration.test.ts` | The package's features work together end to end across environments | `test` |
135
- | `service` | `tests/service/**/*.test.ts` | The live external services this package drives, driven for real | `prepublishOnly`; `test` when private |
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
- - A live-service project is the `service` project in the preceding table, `scripts/service.sh`
165
- provisions what it drives, and `.claude/rules/tests.md` governs it. Name it `service` whatever it
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`.
@@ -977,7 +977,7 @@
977
977
  },
978
978
  {
979
979
  "type": "command",
980
- "command": "\"$CLAUDE_PROJECT_DIR\"/scripts/ollama.sh",
980
+ "command": "if [ \"${CLAUDE_CODE_REMOTE:-}\" = \"true\" ]; then \"$CLAUDE_PROJECT_DIR\"/scripts/ollama.sh; fi",
981
981
  "timeout": 600
982
982
  },
983
983
  {