@orkestrel/scaffold 0.0.103 → 0.0.104

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 (88) hide show
  1. package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +84 -1
  2. package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +21 -6
  3. package/dist/agents/skills/orkestrel-harden/scripts/titles.js +338 -0
  4. package/dist/agents/skills/orkestrel-publish/scripts/swap.js +3 -39
  5. package/dist/agents/skills/orkestrel-publish/scripts/wave.js +433 -47
  6. package/dist/agents/skills/orkestrel-publish/scripts/window.js +2 -1
  7. package/dist/bin/main.js +16 -9
  8. package/dist/bin/main.js.map +1 -1
  9. package/dist/host/agents/orchestration.md +3 -3
  10. package/dist/host/agents/skills/enterprise-bootstrap/references/components.md +2 -2
  11. package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +1 -1
  12. package/dist/host/agents/skills/orkestrel-build/SKILL.md +2 -2
  13. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +2 -2
  14. package/dist/host/agents/skills/orkestrel-debrief/references/field-testing.md +1 -1
  15. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +3 -3
  16. package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +10 -10
  17. package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +1 -0
  18. package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +100 -1
  19. package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +27 -6
  20. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +4 -4
  21. package/dist/host/agents/skills/orkestrel-falsify/agents/openai.yaml +1 -1
  22. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +8 -7
  23. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +6 -6
  24. package/dist/host/agents/skills/orkestrel-harden/SKILL.md +6 -1
  25. package/dist/host/agents/skills/orkestrel-harden/references/bindings.md +1700 -0
  26. package/dist/host/agents/skills/orkestrel-harden/references/contract.md +2 -2
  27. package/dist/host/agents/skills/orkestrel-harden/references/equivalence.md +48 -0
  28. package/dist/host/agents/skills/orkestrel-harden/references/hardening.md +4 -2
  29. package/dist/host/agents/skills/orkestrel-harden/scripts/titles.ts +425 -0
  30. package/dist/host/agents/skills/orkestrel-journey/SKILL.md +2 -2
  31. package/dist/host/agents/skills/orkestrel-journey/references/captures.md +9 -8
  32. package/dist/host/agents/skills/orkestrel-polish/SKILL.md +3 -3
  33. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +2 -2
  34. package/dist/host/agents/skills/orkestrel-publish/references/release.md +1 -0
  35. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +56 -13
  36. package/dist/host/agents/skills/orkestrel-publish/references/window.md +6 -6
  37. package/dist/host/agents/skills/orkestrel-publish/scripts/swap.ts +5 -49
  38. package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +646 -49
  39. package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +2 -1
  40. package/dist/host/agents/transports/codex.md +1 -1
  41. package/dist/host/claude/agents/orkestrel.md +54 -53
  42. package/dist/host/claude/agents/reviewer.md +4 -4
  43. package/dist/host/claude/rules/documentation.md +2 -1
  44. package/dist/host/claude/rules/patterns.md +1 -1
  45. package/dist/host/claude/rules/quality.md +2 -2
  46. package/dist/host/claude/rules/styles.md +1 -1
  47. package/dist/host/claude/rules/tests.md +34 -8
  48. package/dist/host/claude/rules/typescript.md +29 -0
  49. package/dist/host/claude/rules/workspace.md +32 -22
  50. package/dist/host/claude/rules/writing.md +34 -26
  51. package/dist/host/claude/settings.json +2 -0
  52. package/dist/host/claude/skills/orkestrel-debrief/SKILL.md +1 -1
  53. package/dist/host/claude/skills/orkestrel-falsify/SKILL.md +1 -1
  54. package/dist/host/codex/agents/analyst.toml +3 -3
  55. package/dist/host/codex/agents/reviewer.toml +4 -4
  56. package/dist/host/configs/policy.ts +13 -2
  57. package/dist/host/dotfiles/editorconfig +0 -1
  58. package/dist/host/dotfiles/gitattributes +0 -1
  59. package/dist/host/dotfiles/gitignore +0 -1
  60. package/dist/host/dotfiles/oxlintrc.json +24 -0
  61. package/dist/host/guides/agent.md +1638 -598
  62. package/dist/host/guides/budget.md +89 -29
  63. package/dist/host/guides/form.md +477 -91
  64. package/dist/host/guides/mcp.md +14 -2
  65. package/dist/host/guides/ollama.md +97 -73
  66. package/dist/host/guides/probe.md +1 -1
  67. package/dist/host/guides/scaffold.md +158 -101
  68. package/dist/host/guides/study.md +2635 -0
  69. package/dist/host/guides/table.md +225 -15
  70. package/dist/host/guides/terminal.md +22 -20
  71. package/dist/host/guides/test.md +689 -255
  72. package/dist/host/manifest.json +87 -63
  73. package/dist/host/tests/config.test.ts +136 -82
  74. package/dist/host/tests/policy.test.ts +39 -1
  75. package/dist/host/tests/setupPolicy.ts +86 -28
  76. package/dist/src/core/index.cjs +1387 -611
  77. package/dist/src/core/index.cjs.map +1 -1
  78. package/dist/src/core/index.d.cts +35 -20
  79. package/dist/src/core/index.d.ts +35 -20
  80. package/dist/src/core/index.js +1385 -612
  81. package/dist/src/core/index.js.map +1 -1
  82. package/dist/src/server/index.cjs +12 -12
  83. package/dist/src/server/index.cjs.map +1 -1
  84. package/dist/src/server/index.d.cts +12 -12
  85. package/dist/src/server/index.d.ts +12 -12
  86. package/dist/src/server/index.js +12 -12
  87. package/dist/src/server/index.js.map +1 -1
  88. package/package.json +4 -4
@@ -61,32 +61,40 @@
61
61
 
62
62
  ## Substitutions
63
63
 
64
- Replace each term with its replacement. A code identifier and a string inside a fence or a fixture are data and exempt.
65
-
66
- | Term | Replacement |
67
- | ---------------------------------- | -------------------------------------------- |
68
- | `should` | `must`, `can`, `might`, or the imperative |
69
- | `simply`, `easy`, `just` | Delete |
70
- | `currently`, `now` | Delete, or give the date |
71
- | `new`, `latest` | Delete, or give the version |
72
- | `utilize`, `leverage` | `use` |
73
- | `via` | `through`, `by using` |
74
- | `in order to` | `to` |
75
- | `e.g.`, `i.e.` | `for example`, `that is` |
76
- | `etc.` | Bound the list, or recast the sentence |
77
- | `performant`, `robust` | The measured property |
78
- | `allows you to` | `lets you` |
79
- | `and/or` | `and`, `or`, or `both` |
80
- | `since` (causal) | `because` |
81
- | `once` (temporal) | `after` |
82
- | `above`, `below` (cross-reference) | `preceding`, `following`, `earlier`, `later` |
83
- | `please` | Delete |
84
- | `sanity check` | `quick check` |
85
- | `dummy` | `placeholder` |
86
- | `blacklist`, `whitelist` | `denylist`, `allowlist` |
87
- | `master`, `slave` | `primary`, `replica` |
88
-
89
- - `policy/no-banned-term` reads comments and the prose sweep in `tests/setupPolicy.ts` reads authored Markdown; each matches the rows banned unconditionally. Rule a hit in `now`, `new`, `latest`, `once`, `since`, `above`, `below`, or `master` yourself by the banned sense.
64
+ Replace each term with its replacement. A code identifier, an API name, and a string inside a fence or a fixture are data and exempt.
65
+
66
+ | Term | Replacement |
67
+ | --------------------------------------- | --------------------------------------------------------------- |
68
+ | `should` | `must`, `can`, `might`, or the imperative |
69
+ | `simply`, `easy`, `just` | Delete |
70
+ | `currently`, `now` | Delete, or give the date |
71
+ | `new`, `latest` | Delete, or give the version |
72
+ | `utilize`, `leverage` | `use` |
73
+ | `via` | `through`, `by using` |
74
+ | `in order to` | `to` |
75
+ | `e.g.`, `i.e.` | `for example`, `that is` |
76
+ | `etc.` | Bound the list, or recast the sentence |
77
+ | `performant`, `robust` | The measured property |
78
+ | `allows you to` | `lets you` |
79
+ | `and/or` | `and`, `or`, or `both` |
80
+ | `since` (causal) | `because` |
81
+ | `once` (temporal) | `after` |
82
+ | `above`, `below` (cross-reference) | `preceding`, `following`, `earlier`, `later` |
83
+ | `please` | Delete |
84
+ | `sanity check` | `quick check` |
85
+ | `dummy` | `placeholder` |
86
+ | `blacklist`, `whitelist` | `denylist`, `allowlist` |
87
+ | `master`, `slave` | `primary`, `replica` |
88
+ | `hostile`, `adversarial` (input, value) | `malformed`, `unexpected`, or `untrusted` |
89
+ | `adversarial` (review, round, audit) | `independent` or `skeptical` |
90
+ | `attack`, `break` (a claim) | `test` or `falsify` |
91
+ | `forge` | `fabricate`, `fake`, or `does not match` |
92
+ | `bypass` | `skip`, or recast as reaching one thing without passing another |
93
+ | `poison` | `corrupt`, `invalidate`, or `stale` |
94
+ | `escape` (a root, a sandbox) | `read outside` or `resolve outside` |
95
+ | `exploit`, `payload` (attack sense) | Name the defect, or `input` |
96
+
97
+ - `policy/no-banned-term` reads comments and the prose sweep in `tests/setupPolicy.ts` reads authored Markdown; each matches the rows banned unconditionally. Rule a hit in `now`, `new`, `latest`, `once`, `since`, `above`, `below`, `master`, `hostile`, `adversarial`, `attack`, `break`, `forge`, `bypass`, `poison`, `escape`, `exploit`, or `payload` yourself by the banned sense.
90
98
  - Sweep case-insensitively and across inflections. Name the pattern and the paths behind every sweep result.
91
99
  - Write singular `they` for a person of unstated gender.
92
100
  - `.claude/rules/names.md` § Fixed lifecycle vocabulary owns `execute`, `abort`, `kill`, `terminate`, and `run`.
@@ -183,6 +183,8 @@
183
183
  "Bash(npm run test:guides *)",
184
184
  "Bash(npm run test:conformance)",
185
185
  "Bash(npm run test:conformance *)",
186
+ "Bash(npm run test:tree)",
187
+ "Bash(npm run test:tree *)",
186
188
  "Bash(npm run test:integration)",
187
189
  "Bash(npm run test:integration *)",
188
190
  "Bash(npm run test:distribution)",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: orkestrel-debrief
3
- description: Look back at a long campaign to learn from its mistakes and successes and improve the agents, rules, skills, and processes that ran it. Use after a campaign or milestone closes to run the retrospective - field evidence, layer and boundary audits, package promotion, an adversarial audit of the instruction set itself, process doctrine - and to land every learning as a refinement that propagates, then retire the campaign folder.
3
+ description: Look back at a long campaign to learn from its mistakes and successes and improve the agents, rules, skills, and processes that ran it. Use after a campaign or milestone closes to run the retrospective - field evidence, layer and boundary audits, package promotion, an independent audit of the instruction set itself, process doctrine - and to land every learning as a refinement that propagates, then retire the campaign folder.
4
4
  ---
5
5
 
6
6
  # Load the canonical workflow
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: orkestrel-falsify
3
3
  description: >-
4
- Run one adversarial audit round against finished work: write the subject as numbered falsifiable claims, dispatch independent auditors instructed to break them, reconcile their evidence, and rule. Use when the size gate in `.agents/orchestration.md` names a review, before a fix round is accepted, before a version bump or publication, or when a defect has recurred across rounds. Do not use it for a small change, a mechanical rename, or a round with no added or repaired claim to attack.
4
+ Run one skeptical audit round against finished work: write the subject as numbered falsifiable claims, dispatch independent auditors instructed to falsify them, reconcile their evidence, and rule. Use when the size gate in `.agents/orchestration.md` names a review, before a fix round is accepted, before a version bump or publication, or when a defect has recurred across rounds. Do not use it for a small change, a mechanical rename, or a round with no added or repaired claim to test.
5
5
  ---
6
6
 
7
7
  # Load the canonical workflow
@@ -12,12 +12,12 @@ Hold the lane the dispatch names and say which: objective (correctness under adv
12
12
  what the contracts and installed declarations permit, dependency and range truth, test
13
13
  sufficiency, the letter of the rules) or subjective (shape, naming, ergonomics, design fit).
14
14
 
15
- Attack each numbered claim with a concrete input, state, or interleaving. Before confirming a
16
- claim about a proof, name the mutation that would make the proof fail and whether the assertions
15
+ Try to falsify each numbered claim with a concrete input, state, or interleaving. Before
16
+ confirming a claim about a proof, name the mutation that would make the proof fail and whether the assertions
17
17
  distinguish it. Rule a claim whose only evidence is the writer's report UNRESOLVED. Mark a
18
18
  rendered-surface claim the capture cannot show NOT-EVIDENCED.
19
19
 
20
20
  Return the orkestrel-falsify verdict shape: numbered verdicts with evidence, findings outside the
21
- claims, attacked-and-held, one terminal line. Never edit, implement, reconcile, accept, or spawn.
21
+ claims, tested-and-held, one terminal line. Never edit, implement, reconcile, accept, or spawn.
22
22
  Your final message is the verdict.
23
23
  """
@@ -4,7 +4,7 @@ model = "gpt-6-astra"
4
4
  model_reasoning_effort = "high"
5
5
  sandbox_mode = "read-only"
6
6
  developer_instructions = """
7
- Review one dispatched unit on GPT-6 Astra by trying to break its claims. Use read-only inspection
7
+ Review one dispatched unit on GPT-6 Astra by trying to falsify its claims. Use read-only inspection
8
8
  commands. Never edit, run a mutating command, or spawn. Use a clean context; never review work you wrote.
9
9
 
10
10
  Read the claims file, the actual diff and git status --porcelain the dispatch supplies,
@@ -16,14 +16,14 @@ names and boundaries, the right layer, each concept's purpose, guide parity. Obj
16
16
  correctness under adverse orderings, what contracts and installed declarations permit,
17
17
  dependency and range truth, test sufficiency, and the letter of the rules.
18
18
 
19
- Attack each claim with a concrete input, state, or interleaving. Before confirming a proof,
20
- name the mutation that would make it fail and whether its assertions distinguish it. Rule a
19
+ Try to falsify each claim with a concrete input, state, or interleaving. Before confirming a
20
+ proof, name the mutation that would make it fail and whether its assertions distinguish it. Rule a
21
21
  claim whose only evidence is the writer's report UNRESOLVED. Cite a capture for every rendered
22
22
  surface claim; mark what the portfolio cannot show NOT-EVIDENCED. Refer a question outside your
23
23
  lane to the other lane or the Orchestrator with evidence; never rule on it. Treat a bench finding
24
24
  as a proposal to test against the code, never as authority.
25
25
 
26
26
  Return the orkestrel-falsify verdict shape: numbered verdicts with evidence, findings outside the
27
- claims, attacked-and-held, one terminal line. Each required change carries file:line, what is
27
+ claims, tested-and-held, one terminal line. Each required change carries file:line, what is
28
28
  wrong, and what right looks like. Nothing else. Your final message is the verdict.
29
29
  """
@@ -386,8 +386,9 @@ export const POLICY_BANNED_TERMS: readonly PolicyTerm[] = Object.freeze([
386
386
  *
387
387
  * @remarks
388
388
  * Each row carries a permitted sense: a date value, a version value, a causal clause, the name a
389
- * replication topology takes, and a comparative or spatial relation. The currency check proves each
390
- * row is registered here.
389
+ * replication topology takes, a comparative or spatial relation, and a literal engineering term such
390
+ * as a string escape, a loop `break`, or a request payload. The currency check proves each row is
391
+ * registered here.
391
392
  */
392
393
  export const POLICY_JUDGED_TERMS: readonly string[] = Object.freeze([
393
394
  'now',
@@ -398,6 +399,16 @@ export const POLICY_JUDGED_TERMS: readonly string[] = Object.freeze([
398
399
  'above',
399
400
  'below',
400
401
  'master',
402
+ 'hostile',
403
+ 'adversarial',
404
+ 'attack',
405
+ 'break',
406
+ 'forge',
407
+ 'bypass',
408
+ 'poison',
409
+ 'escape',
410
+ 'exploit',
411
+ 'payload',
401
412
  ])
402
413
 
403
414
  /** Returns the file name a policy rule keys on, read from either host separator. */
@@ -14,4 +14,3 @@ indent_size = 2
14
14
 
15
15
  [*.md]
16
16
  trim_trailing_whitespace = false
17
-
@@ -1,3 +1,2 @@
1
1
  # Enforce LF line endings everywhere — prevents CRLF/LF churn on Windows
2
2
  * text=auto eol=lf
3
-
@@ -47,4 +47,3 @@ playwright-report/
47
47
 
48
48
  # Agent worktrees (created by an isolated subagent dispatch, never committed)
49
49
  .claude/worktrees/
50
-
@@ -220,6 +220,10 @@
220
220
  {
221
221
  "regex": "^(?:node:|(?:_(?:http_(?:agent|client|common|incoming|outgoing|server)|stream_(?:duplex|passthrough|readable|transform|wrap|writable)|tls_(?:common|wrap))|assert(?:/strict)?|async_hooks|buffer|child_process|cluster|console|constants|crypto|dgram|diagnostics_channel|dns(?:/promises)?|domain|events|fs(?:/promises)?|http|http2|https|inspector(?:/promises)?|module|net|os|path(?:/(?:posix|win32))?|perf_hooks|process|punycode|querystring|readline(?:/promises)?|repl|sqlite|stream(?:/(?:consumers|promises|web))?|string_decoder|sys|timers(?:/promises)?|tls|trace_events|tty|url|util(?:/types)?|v8|vm|wasi|worker_threads|zlib)(?:[/?#]|$)|@src/server(?:[/?#]|$)|@orkestrel/[^/]+/server(?:[/?#]|$)|(?:\\.\\./)+(?:server|src/server|app/server)(?:[/?#]|$))",
222
222
  "message": "src/browser must not depend on Node or server-only modules"
223
+ },
224
+ {
225
+ "regex": "^(?:\\.\\./)+(?:src/)?core(?:[/?#]|$)",
226
+ "message": "src/browser must import src/core through the @src/core alias"
223
227
  }
224
228
  ]
225
229
  }
@@ -436,6 +440,14 @@
436
440
  {
437
441
  "regex": "^(?:node:|(?:_(?:http_(?:agent|client|common|incoming|outgoing|server)|stream_(?:duplex|passthrough|readable|transform|wrap|writable)|tls_(?:common|wrap))|assert(?:/strict)?|async_hooks|buffer|child_process|cluster|console|constants|crypto|dgram|diagnostics_channel|dns(?:/promises)?|domain|events|fs(?:/promises)?|http|http2|https|inspector(?:/promises)?|module|net|os|path(?:/(?:posix|win32))?|perf_hooks|process|punycode|querystring|readline(?:/promises)?|repl|sqlite|stream(?:/(?:consumers|promises|web))?|string_decoder|sys|timers(?:/promises)?|tls|trace_events|tty|url|util(?:/types)?|v8|vm|wasi|worker_threads|zlib)(?:[/?#]|$)|@src/server(?:[/?#]|$)|@orkestrel/[^/]+/server(?:[/?#]|$)|(?:\\.\\./)+(?:server|src/server|app/server)(?:[/?#]|$))",
438
442
  "message": "src/vue must not depend on Node or server-only modules"
443
+ },
444
+ {
445
+ "regex": "^(?:\\.\\./)+(?:src/)?core(?:[/?#]|$)",
446
+ "message": "src/vue must import src/core through the @src/core alias"
447
+ },
448
+ {
449
+ "regex": "^(?:\\.\\./)+(?:src/)?browser(?:[/?#]|$)",
450
+ "message": "src/vue must import src/browser through the @src/browser alias"
439
451
  }
440
452
  ]
441
453
  }
@@ -488,6 +500,10 @@
488
500
  {
489
501
  "regex": "^(?:(?:vue|vite)(?:[/?#]|$)|@(?:vue|vitejs)/|@src/browser(?:[/?#]|$)|@orkestrel/[^/]+/browser(?:[/?#]|$)|(?:\\.\\./)+(?:browser|src/browser|app/browser)(?:[/?#]|$))",
490
502
  "message": "src/server must not depend on Vue or browser-only modules"
503
+ },
504
+ {
505
+ "regex": "^(?:\\.\\./)+(?:src/)?core(?:[/?#]|$)",
506
+ "message": "src/server must import src/core through the @src/core alias"
491
507
  }
492
508
  ]
493
509
  }
@@ -720,6 +736,14 @@
720
736
  {
721
737
  "regex": "^(?:(?:vue|vite)(?:[/?#]|$)|@(?:vue|vitejs)/|@src/(?:browser|vue)(?:[/?#]|$)|@orkestrel/[^/]+/(?:browser|vue)(?:[/?#]|$)|(?:\\.\\./)+(?:browser|vue|src/(?:browser|vue)|app/browser)(?:[/?#]|$))",
722
738
  "message": "src/bin must not depend on browser-only modules"
739
+ },
740
+ {
741
+ "regex": "^(?:\\.\\./)+(?:src/)?core(?:[/?#]|$)",
742
+ "message": "src/bin must import src/core through the @src/core alias"
743
+ },
744
+ {
745
+ "regex": "^(?:\\.\\./)+(?:src/)?server(?:[/?#]|$)",
746
+ "message": "src/bin must import src/server through the @src/server alias"
723
747
  }
724
748
  ]
725
749
  }