@hybridlabor-api/aos 4.2.0-beta.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/.agents/graph.md +3 -1
  2. package/.agents/nodes.json +4 -2
  3. package/.claude/workflows/startcycle-dispatch.mjs +18 -5
  4. package/.claude/workflows/teamwork-dispatch.mjs +287 -0
  5. package/THIRD_PARTY_NOTICES.md +50 -0
  6. package/docs/skills_table.md +1 -0
  7. package/installer.js +15 -0
  8. package/package.json +1 -1
  9. package/skills/basic/bdbmediastorm/SKILL.md +7 -5
  10. package/skills/basic/startcycle/SKILL.md +3 -1
  11. package/skills/basic/startcycle-graph/SKILL.md +18 -2
  12. package/skills/basic/startcycle-graph-user/SKILL.md +3 -1
  13. package/skills/basic/teamwork-preview/SKILL.md +209 -0
  14. package/skills/bdbrainstorm/SKILL.md +4 -3
  15. package/skills/global_config/ask-tim/SKILL.md +73 -6
  16. package/skills/global_config/bdbresilience/SKILL.md +216 -0
  17. package/skills/global_config/bdbresilience/contracts/nodes-integration.md +225 -0
  18. package/skills/global_config/bdbresilience/references/cicd-triage.md +179 -0
  19. package/skills/global_config/bdbresilience/references/distributed-locking.md +235 -0
  20. package/skills/global_config/bdbresilience/references/error-recovery.md +210 -0
  21. package/skills/global_config/bdbresilience/references/two-phase-go-gate.md +151 -0
  22. package/skills/global_config/domain-modeling/ADR-FORMAT.md +47 -0
  23. package/skills/global_config/domain-modeling/CONTEXT-FORMAT.md +60 -0
  24. package/skills/global_config/domain-modeling/SKILL.md +77 -0
  25. package/skills/global_config/grill-me/SKILL.md +14 -0
  26. package/skills/global_config/grill-with-docs/SKILL.md +24 -0
  27. package/skills/global_config/grilling/SKILL.md +42 -0
  28. package/skills/global_config/openwiki-skill/scripts/install_daemon.sh +55 -12
  29. package/.agents/skills/firecrawl/SKILL.md +0 -149
  30. package/.agents/skills/firecrawl/rules/install.md +0 -82
  31. package/.agents/skills/firecrawl/rules/security.md +0 -26
  32. package/.agents/skills/firecrawl-agent/SKILL.md +0 -58
  33. package/.agents/skills/firecrawl-build/SKILL.md +0 -39
  34. package/.agents/skills/firecrawl-build-interact/SKILL.md +0 -68
  35. package/.agents/skills/firecrawl-build-onboarding/SKILL.md +0 -103
  36. package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +0 -39
  37. package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +0 -20
  38. package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +0 -17
  39. package/.agents/skills/firecrawl-build-scrape/SKILL.md +0 -69
  40. package/.agents/skills/firecrawl-build-search/SKILL.md +0 -69
  41. package/.agents/skills/firecrawl-crawl/SKILL.md +0 -59
  42. package/.agents/skills/firecrawl-download/SKILL.md +0 -70
  43. package/.agents/skills/firecrawl-interact/SKILL.md +0 -84
  44. package/.agents/skills/firecrawl-map/SKILL.md +0 -51
  45. package/.agents/skills/firecrawl-scrape/SKILL.md +0 -69
  46. package/.agents/skills/firecrawl-search/SKILL.md +0 -60
  47. package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +0 -10
  48. package/mcps/after-effects-mcp/build/index.js +0 -840
  49. package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +0 -153
  50. package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +0 -218
  51. package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +0 -71
  52. package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +0 -147
  53. package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +0 -114
  54. package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +0 -115
  55. package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +0 -192
  56. package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +0 -90
  57. package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +0 -50
  58. package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +0 -1773
  59. package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +0 -160
  60. package/mcps/bdb-remoteos-mcp/queue.db +0 -0
  61. package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/__init__.cpython-312.pyc +0 -0
  62. package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/incus_client.cpython-312.pyc +0 -0
  63. package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/main.cpython-312.pyc +0 -0
  64. package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/queue.cpython-312.pyc +0 -0
  65. package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/schemas.cpython-312.pyc +0 -0
  66. package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/server.cpython-312.pyc +0 -0
  67. package/mcps/bdb-remoteos-mcp/src/bdb_remoteos_mcp/__pycache__/webhook.cpython-312.pyc +0 -0
  68. package/mcps/bdb-remoteos-mcp/tests/__pycache__/__init__.cpython-312.pyc +0 -0
  69. package/mcps/bdb-remoteos-mcp/tests/__pycache__/mock_incus.cpython-312.pyc +0 -0
  70. package/mcps/bdb-remoteos-mcp/tests/__pycache__/test_mcp_server.cpython-312-pytest-9.1.1.pyc +0 -0
  71. package/mcps/bdb-remoteos-mcp/tests/__pycache__/test_security_redteam.cpython-312-pytest-9.1.1.pyc +0 -0
  72. package/mcps/bdb-remoteos-mcp/tests/__pycache__/test_webhook.cpython-312-pytest-9.1.1.pyc +0 -0
  73. package/mcps/computer-use-mcp/dist/client.d.ts +0 -150
  74. package/mcps/computer-use-mcp/dist/client.js +0 -136
  75. package/mcps/computer-use-mcp/dist/entrypoint.d.ts +0 -16
  76. package/mcps/computer-use-mcp/dist/entrypoint.js +0 -26
  77. package/mcps/computer-use-mcp/dist/native.d.ts +0 -212
  78. package/mcps/computer-use-mcp/dist/native.js +0 -50
  79. package/mcps/computer-use-mcp/dist/server.d.ts +0 -32
  80. package/mcps/computer-use-mcp/dist/server.js +0 -342
  81. package/mcps/computer-use-mcp/dist/session.d.ts +0 -101
  82. package/mcps/computer-use-mcp/dist/session.js +0 -2372
  83. package/skills/bdbsaastraining/scripts/__pycache__/build_profile.cpython-314.pyc +0 -0
package/.agents/graph.md CHANGED
@@ -45,7 +45,9 @@ the registry's own per-node allowlist would have reached for.
45
45
  - The dispatcher script (`startcycle-dispatch.mjs`) extracts every
46
46
  `--skill=` flag from the invocation text before anything else runs, then
47
47
  validates each name resolves to a real installed skill (a `SKILL.md`
48
- under `~/.claude/skills/<name>/` or this project's own `skills/` tree) via
48
+ under any harness's global skills directory — `~/.claude/skills/<name>/`,
49
+ `~/.agents/skills/`, `~/.codex/skills/`, `~/.cursor/skills/`, `~/.roo/skills/`,
50
+ all of which the installer writes — or this project's own `skills/` tree) via
49
51
  a read-only lookup agent. **A name that doesn't resolve escalates
50
52
  immediately** — same "never silently fall back or guess" posture as a
51
53
  missing registry node id. This is a fail-fast check specifically so a
@@ -72,7 +72,8 @@
72
72
  "drizzle-orm-expert",
73
73
  "postgres-best-practices",
74
74
  "typescript-pro",
75
- "python-pro"
75
+ "python-pro",
76
+ "bdbresilience"
76
77
  ],
77
78
  "instructions": "Implement the backend per the plan: DDD models, type-safe schemas, API routes, Clean Architecture. Write production_artifacts/02_backend_schema.md and the code."
78
79
  },
@@ -128,7 +129,8 @@
128
129
  "seo-audit",
129
130
  "wcag-audit-patterns",
130
131
  "github-repo",
131
- "clean-code"
132
+ "clean-code",
133
+ "bdbresilience"
132
134
  ],
133
135
  "instructions": null
134
136
  }
@@ -385,10 +385,17 @@ const mandatorySkillNames = [...new Set([...skillsFromFlags, ...skillsFromArgs])
385
385
  if (mandatorySkillNames.length > 0) {
386
386
  const skillCheckResult = await agent(
387
387
  `Check whether each of these skill names resolves to an installed skill with a real SKILL.md: ${JSON.stringify(mandatorySkillNames)}. ` +
388
- 'Look under ~/.claude/skills/<name>/SKILL.md first (the global install location every harness syncs to); ' +
389
- 'if this project has its own skills/ directory, also accept skills/<name>/SKILL.md or skills/<container>/<name>/SKILL.md. ' +
390
- 'This is a read-only lookup, not a reasoning task -- do not invent a path that does not exist, and do not guess a close match for a name that is not actually there.\n\n' +
391
- 'Return only: { "found": string[], "missing": string[] }.',
388
+ 'The installer syncs the same skill set to every harness it detects, so check all of these global locations, not just the first: ' +
389
+ '~/.claude/skills/<name>/SKILL.md, ~/.agents/skills/<name>/SKILL.md, ~/.codex/skills/<name>/SKILL.md, ' +
390
+ '~/.cursor/skills/<name>/SKILL.md, ~/.roo/skills/<name>/SKILL.md. A skill present in any one of them counts as installed — ' +
391
+ 'this workflow may be driven from a harness whose directory is not ~/.claude. ' +
392
+ 'If this project has its own skills/ directory, also accept skills/<name>/SKILL.md or skills/<container>/<name>/SKILL.md. ' +
393
+ 'This is a read-only lookup, not a reasoning task -- do not invent a path that does not exist, and never report a close match as `found`.\n\n' +
394
+ 'For any name that does NOT resolve, list up to five installed skills whose directory names are plausible near-misses ' +
395
+ '(substring, obvious typo, or the same words in another order) in `suggestions`. Read the real directory listing to do this -- ' +
396
+ 'suggest only names that actually exist on disk. `--skill=` requires an exact directory name, and a user who mistyped one ' +
397
+ 'has no way to discover the right spelling from an error that only says "not found".\n\n' +
398
+ 'Return only: { "found": string[], "missing": string[], "suggestions": string[] }.',
392
399
  {
393
400
  label: 'validate-mandatory-skills',
394
401
  model: 'haiku',
@@ -398,15 +405,21 @@ if (mandatorySkillNames.length > 0) {
398
405
  properties: {
399
406
  found: { type: 'array', items: { type: 'string' } },
400
407
  missing: { type: 'array', items: { type: 'string' } },
408
+ suggestions: { type: 'array', items: { type: 'string' } },
401
409
  },
402
410
  },
403
411
  }
404
412
  );
405
413
  const missing = skillCheckResult?.missing ?? [];
406
414
  if (missing.length > 0) {
415
+ const near = skillCheckResult?.suggestions ?? [];
407
416
  return await escalate(
408
417
  `--skill named skill(s) that could not be found on this machine: ${missing.join(', ')}. ` +
409
- 'Refusing to silently proceed without a mandated skill -- check the name (it must match an installed skill directory) and re-run.'
418
+ (near.length
419
+ ? `Did you mean: ${near.join(', ')}? `
420
+ : 'No installed skill has a similar name. ') +
421
+ '--skill= takes the exact skill directory name; run /ask-tim to find the one you want. ' +
422
+ 'Refusing to silently proceed without a mandated skill.'
410
423
  );
411
424
  }
412
425
  mandatorySkills = skillCheckResult?.found ?? mandatorySkillNames;
@@ -0,0 +1,287 @@
1
+ // Dispatcher for /teamwork-preview. Turns the 9-step prompt-crafting protocol
2
+ // from skills/basic/teamwork-preview/SKILL.md into an actual runnable sequence.
3
+ //
4
+ // Why a script and not prose: this repo has already paid for the alternative
5
+ // once, recorded verbatim in skills/basic/startcycle-graph/SKILL.md --
6
+ //
7
+ // "an earlier version of this file embedded the full pipeline description in
8
+ // prose, and the model followed it 'in spirit' inline instead of invoking the
9
+ // script -- silently skipping the whole graph, with no state.json, no
10
+ // subagents, no Reviewer, and no quality gate ever running."
11
+ //
12
+ // A 9-step protocol with acceptance criteria and integrity modes is exactly the
13
+ // kind of thing that gets followed approximately. A script either runs or it
14
+ // does not.
15
+ //
16
+ // Runtime constraints inherited from startcycle-dispatch.mjs, all four of which
17
+ // this script obeys:
18
+ // 1. No filesystem access from the script itself. Every read and write happens
19
+ // inside an agent() call; the script branches on schema-validated returns.
20
+ // 2. No module loading. `agent`, `args` are ambient globals injected by the
21
+ // runtime, not imports.
22
+ // 3. Concurrent agents writing one file race. This script is deliberately
23
+ // sequential -- each step's answers reshape the next question, so there is
24
+ // nothing to parallelise and no fragment/merge dance is needed.
25
+ // 4. Prompts are the interface. An agent that returns prose instead of the
26
+ // declared schema breaks the branch, so every step declares one.
27
+ //
28
+ // This is NOT Antigravity's /teamwork-preview. That command is compiled into the
29
+ // agy binary (its own conductor/orchestrator/auditor agent types, maintained by
30
+ // Google). This is an independent implementation of the same idea, on a
31
+ // different runtime, and it will behave differently.
32
+
33
+ export const meta = {
34
+ name: 'teamwork-dispatch',
35
+ description:
36
+ 'Interactive 9-step prompt crafting for multi-agent delegation: elicit, disambiguate, set integrity mode, draft requirements, design verification, set acceptance criteria, then assemble and validate a spec. Produces prompt_draft.md; does not build anything.',
37
+ };
38
+
39
+ // The user's answers accumulate here. Each step gets the answers so far, so a
40
+ // later question can be shaped by an earlier one -- which is the whole point of
41
+ // an interview and the reason these run sequentially rather than in parallel.
42
+ const spec = {
43
+ idea: null,
44
+ scale: null,
45
+ integrityMode: null,
46
+ requirements: [],
47
+ verification: null,
48
+ acceptanceCriteria: [],
49
+ infrastructure: null,
50
+ workingDirectory: null,
51
+ };
52
+
53
+ // One shared preamble. Every step is an interview turn, not a build turn: the
54
+ // agent asks, the human answers, nothing gets implemented. Stated once here
55
+ // rather than restated nine times, where the ninth copy would drift.
56
+ const INTERVIEW_RULE =
57
+ 'You are conducting one step of an interactive interview. Ask the user, wait for their answer, and record it. ' +
58
+ 'Do NOT implement anything, do NOT write project code, and do NOT proceed past your own step. ' +
59
+ 'Finding facts is your job, not the user\'s: if a question can be answered by reading the filesystem or running a command, ' +
60
+ 'do that yourself instead of asking. The decisions are the user\'s: put each to them and wait. ' +
61
+ 'If the user has already answered something in an earlier step, do not ask it again -- the answers so far are given below.';
62
+
63
+ function answersSoFar() {
64
+ const known = Object.entries(spec).filter(([, v]) =>
65
+ Array.isArray(v) ? v.length > 0 : v !== null
66
+ );
67
+ if (known.length === 0) return 'Nothing settled yet -- this is the first step.';
68
+ return `Answers settled so far:\n${JSON.stringify(Object.fromEntries(known), null, 2)}`;
69
+ }
70
+
71
+ async function step(n, title, instruction, schema, label) {
72
+ return await agent(
73
+ `${INTERVIEW_RULE}\n\n` +
74
+ `## Step ${n} of 9: ${title}\n\n${instruction}\n\n` +
75
+ `${answersSoFar()}\n\n` +
76
+ 'Return only the declared JSON.',
77
+ { label: label || `step-${n}`, schema }
78
+ );
79
+ }
80
+
81
+ const goal = typeof args === 'string' ? args : args?.goal;
82
+
83
+ // ---------------------------------------------------------------------
84
+ // Steps 1-3: what is this, how big, and what is it allowed to use
85
+ // ---------------------------------------------------------------------
86
+
87
+ const s1 = await step(
88
+ 1,
89
+ 'Elicit the idea',
90
+ 'Ask what the user wants to build, what its purpose is (production, demo, eval, or prototype), and who the audience is. ' +
91
+ 'Condense their answer into a description of one or two sentences -- not a paragraph, and not a restatement of the question.' +
92
+ (goal ? `\n\nThe user already said: ${JSON.stringify(goal)}. Start from that; ask only what it leaves open.` : ''),
93
+ {
94
+ type: 'object',
95
+ required: ['description', 'purpose'],
96
+ properties: {
97
+ description: { type: 'string' },
98
+ purpose: { type: 'string', enum: ['production', 'demo', 'eval', 'prototype'] },
99
+ audience: { type: 'string' },
100
+ },
101
+ }
102
+ );
103
+ spec.idea = s1;
104
+
105
+ const s2 = await step(
106
+ 2,
107
+ 'Identify ambiguity and scale',
108
+ 'Probe every point that has more than one reasonable interpretation -- data sources, third-party services, where the scope stops. ' +
109
+ 'Then establish the shape of the effort:\n' +
110
+ '- a single self-contained fix or feature (one implementer plus repeated adversarial review)\n' +
111
+ '- math, formal proofs, or a massive search space (may warrant a large agent team)\n' +
112
+ '- a standard multi-agent build\n\n' +
113
+ 'Ambiguity you leave unresolved here becomes a wrong assumption baked into the spec, so be thorough now rather than agreeable.',
114
+ {
115
+ type: 'object',
116
+ required: ['scale'],
117
+ properties: {
118
+ scale: { type: 'string', enum: ['single-focused', 'large-scale', 'standard'] },
119
+ ambiguitiesResolved: { type: 'array', items: { type: 'string' } },
120
+ },
121
+ }
122
+ );
123
+ spec.scale = s2;
124
+
125
+ const s3 = await step(
126
+ 3,
127
+ 'Determine integrity mode',
128
+ 'Clarify the operational boundaries: may code be copied from existing open-source projects? Are pre-built libraries allowed for the core logic ' +
129
+ '(as opposed to the scaffolding)? May the implementer inspect the tests before writing the code?\n\n' +
130
+ 'Map the answers: unrestricted → `development`; some shortcuts acceptable because it is a showcase → `demo`; ' +
131
+ 'strict isolation, zero external leakage → `benchmark`.\n\n' +
132
+ 'The last question matters more than it looks: an implementer who can read the tests first can satisfy them without solving the problem.',
133
+ {
134
+ type: 'object',
135
+ required: ['integrityMode'],
136
+ properties: {
137
+ integrityMode: { type: 'string', enum: ['development', 'demo', 'benchmark'] },
138
+ rationale: { type: 'string' },
139
+ },
140
+ }
141
+ );
142
+ spec.integrityMode = s3.integrityMode;
143
+
144
+ // ---------------------------------------------------------------------
145
+ // Steps 4-6: what must be true, and how anyone would know
146
+ // ---------------------------------------------------------------------
147
+
148
+ const s4 = await step(
149
+ 4,
150
+ 'Draft requirements',
151
+ 'Write two to five requirement blocks (R1, R2, ...). Each states **what** is required, never **how** to implement it.\n\n' +
152
+ 'Apply the litmus test to every one: would a senior engineer feel over-constrained by this? If yes, prune it. ' +
153
+ 'A requirement that dictates implementation removes the judgement you are hiring the implementer for.',
154
+ {
155
+ type: 'object',
156
+ required: ['requirements'],
157
+ properties: {
158
+ requirements: {
159
+ type: 'array',
160
+ minItems: 2,
161
+ maxItems: 5,
162
+ items: {
163
+ type: 'object',
164
+ required: ['id', 'text'],
165
+ properties: { id: { type: 'string' }, text: { type: 'string' } },
166
+ },
167
+ },
168
+ },
169
+ }
170
+ );
171
+ spec.requirements = s4.requirements;
172
+
173
+ const s5 = await step(
174
+ 5,
175
+ 'Design the verification mechanism',
176
+ 'This is the forcing function, and it is the step that decides whether the whole exercise works.\n\n' +
177
+ 'Its job is to create an objective target that forces a real build → test → debug loop and makes premature self-certification impossible. ' +
178
+ 'An agent that can declare its own work done, will.\n\n' +
179
+ 'Prefer something programmatic: a unit test suite, a test runner invocation, a CLI script that asserts. ' +
180
+ 'Only if that is genuinely infeasible, draft an explicit agent-as-judge rubric -- and say why programmatic was not possible. ' +
181
+ 'Ask whether the user has existing test suites, schemas, or a reference implementation to hand the implementer.',
182
+ {
183
+ type: 'object',
184
+ required: ['mechanism', 'isProgrammatic'],
185
+ properties: {
186
+ mechanism: { type: 'string' },
187
+ isProgrammatic: { type: 'boolean' },
188
+ resources: { type: 'array', items: { type: 'string' } },
189
+ },
190
+ }
191
+ );
192
+ spec.verification = s5;
193
+
194
+ const s6 = await step(
195
+ 6,
196
+ 'Set acceptance criteria',
197
+ 'Convert the verification mechanism into checkable criteria -- each one a thing that is either true or false, never a judgement call.\n\n' +
198
+ `Calibrate to the stated purpose (${spec.idea.purpose}): a demo must be achievable in a rapid time budget; ` +
199
+ 'production needs real coverage, error handling and readiness; an eval needs reproducible metrics far more than polish.\n\n' +
200
+ 'A criterion nobody can mechanically check is a wish, not a criterion.',
201
+ {
202
+ type: 'object',
203
+ required: ['criteria'],
204
+ properties: { criteria: { type: 'array', minItems: 1, items: { type: 'string' } } },
205
+ }
206
+ );
207
+ spec.acceptanceCriteria = s6.criteria;
208
+
209
+ // ---------------------------------------------------------------------
210
+ // Steps 7-8: where it runs
211
+ // ---------------------------------------------------------------------
212
+
213
+ const s7 = await step(
214
+ 7,
215
+ 'Infrastructure constraints',
216
+ 'Only if the work reaches outside the local workspace: define the sandboxing or controlled APIs for remote file operations, ' +
217
+ 'job launching, and outbound network calls.\n\n' +
218
+ 'If the project stays entirely within local workspace files, say so and skip -- do not invent constraints to fill this step.',
219
+ {
220
+ type: 'object',
221
+ required: ['applicable'],
222
+ properties: { applicable: { type: 'boolean' }, constraints: { type: 'string' } },
223
+ }
224
+ );
225
+ spec.infrastructure = s7.applicable ? s7.constraints : null;
226
+
227
+ const s8 = await step(
228
+ 8,
229
+ 'Choose the working directory',
230
+ 'Confirm where this runs. Default to a path inside the current repository if the work belongs to it, ' +
231
+ `otherwise \`~/teamwork_projects/<project_name>\`. Check that the path exists or can be created, and say which.`,
232
+ {
233
+ type: 'object',
234
+ required: ['workingDirectory'],
235
+ properties: { workingDirectory: { type: 'string' }, exists: { type: 'boolean' } },
236
+ }
237
+ );
238
+ spec.workingDirectory = s8.workingDirectory;
239
+
240
+ // ---------------------------------------------------------------------
241
+ // Step 9: assemble, validate, and stop for approval
242
+ // ---------------------------------------------------------------------
243
+
244
+ const s9 = await agent(
245
+ 'You are assembling the final specification from a completed 9-step interview. Do NOT implement any of it.\n\n' +
246
+ `Write \`prompt_draft.md\` into ${JSON.stringify(spec.workingDirectory)} with this structure:\n\n` +
247
+ '- the one-to-two sentence project description\n' +
248
+ '- `Working directory: <path>`\n' +
249
+ '- `Integrity mode: <mode>`\n' +
250
+ '- a team-scaling directive, if the scale calls for one\n' +
251
+ '- `## Requirements` — the R1..Rn blocks\n' +
252
+ '- `## Verification` — the mechanism, and the resources it may use\n' +
253
+ '- `## Acceptance Criteria` — as markdown checkboxes (`- [ ]`)\n' +
254
+ (spec.infrastructure ? '- `## Infrastructure Constraints`\n' : '') +
255
+ '\nThen validate it against three checks and report each honestly:\n' +
256
+ '1. Does every acceptance criterion trace back to a stated requirement? An orphan criterion means the interview missed a requirement.\n' +
257
+ '2. Is every criterion mechanically checkable — true or false, no judgement call?\n' +
258
+ '3. Does any requirement dictate *how* rather than *what*?\n\n' +
259
+ 'Report failures rather than quietly fixing them: a validation step that edits its own input proves nothing.\n\n' +
260
+ `The interview produced:\n${JSON.stringify(spec, null, 2)}`,
261
+ {
262
+ label: 'step-9-assemble',
263
+ schema: {
264
+ type: 'object',
265
+ required: ['draftPath', 'validationsPassed'],
266
+ properties: {
267
+ draftPath: { type: 'string' },
268
+ validationsPassed: { type: 'boolean' },
269
+ issues: { type: 'array', items: { type: 'string' } },
270
+ },
271
+ },
272
+ }
273
+ );
274
+
275
+ // Deliberately stops here. Delegation is a separate, human-approved act: the
276
+ // spec is the deliverable of this workflow, not a launch command. Handing an
277
+ // unapproved spec straight to a swarm is precisely the premature
278
+ // self-certification step 5 exists to prevent.
279
+ return {
280
+ phase: s9.validationsPassed ? 'ready_for_approval' : 'validation_failed',
281
+ draftPath: s9.draftPath,
282
+ issues: s9.issues ?? [],
283
+ integrityMode: spec.integrityMode,
284
+ reason: s9.validationsPassed
285
+ ? `Spec assembled at ${s9.draftPath}. Review it, then delegate to the execution harness of your choice — this workflow deliberately does not launch anything.`
286
+ : `Spec assembled at ${s9.draftPath} but validation found issues; resolve them before delegating.`,
287
+ };
@@ -127,6 +127,56 @@ SOFTWARE.
127
127
 
128
128
  ---
129
129
 
130
+ ## mattpocock/skills
131
+
132
+ <https://github.com/mattpocock/skills> — MIT.
133
+
134
+ The grilling family and the domain-modeling discipline it composes with:
135
+
136
+ | In AOS | Upstream |
137
+ |---|---|
138
+ | `skills/global_config/grilling/` | `skills/productivity/grilling/` |
139
+ | `skills/global_config/grill-me/` | `skills/productivity/grill-me/` |
140
+ | `skills/global_config/grill-with-docs/` | `skills/engineering/grill-with-docs/` |
141
+ | `skills/global_config/domain-modeling/` | `skills/engineering/domain-modeling/` (incl. `ADR-FORMAT.md`, `CONTEXT-FORMAT.md`) |
142
+
143
+ `grilling`'s interview protocol and `domain-modeling` are carried over
144
+ essentially verbatim; `grill-me` and `grill-with-docs` are rewritten to name AOS's
145
+ own pipelines in their hand-off sections, but keep upstream's composition — both
146
+ are thin wrappers that invoke the primitive rather than restating it. Upstream's
147
+ `agents/openai.yaml` under `domain-modeling` is harness-specific to that project
148
+ and was not carried over.
149
+
150
+ `skills/global_config/ask-tim/` is derived from upstream's `ask-matt` router. It
151
+ is not a copy: the flow it maps is AOS's own, since most of the skills on
152
+ upstream's main flow have no AOS equivalent.
153
+
154
+ ```
155
+ MIT License
156
+
157
+ Copyright (c) 2026 Matt Pocock
158
+
159
+ Permission is hereby granted, free of charge, to any person obtaining a copy
160
+ of this software and associated documentation files (the "Software"), to deal
161
+ in the Software without restriction, including without limitation the rights
162
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
163
+ copies of the Software, and to permit persons to whom the Software is
164
+ furnished to do so, subject to the following conditions:
165
+
166
+ The above copyright notice and this permission notice shall be included in all
167
+ copies or substantial portions of the Software.
168
+
169
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
170
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
171
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
172
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
173
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
174
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
175
+ SOFTWARE.
176
+ ```
177
+
178
+ ---
179
+
130
180
  ## Note on `mcps/`
131
181
 
132
182
  Sub-repositories vendored under `mcps/` carry their own `LICENSE` files in
@@ -48,6 +48,7 @@
48
48
  | `subagent-driven-development` | Use when executing implementation plans with independent tasks in the current session |
49
49
  | `tdd-workflow` | Test-Driven Development workflow principles. RED-GREEN-REFACTOR cycle. |
50
50
  | `tmux` | Expert tmux session, window, and pane management for terminal multiplexing, persistent remote workflows, and shell scripting automation. |
51
+ | `teamwork-preview` | Interactive 9-step prompt crafting and delegation protocol for autonomous multi-agent teams across harnesses. |
51
52
 
52
53
  #### 🎨 Frontend & UI/UX
53
54
  | Skill Name | Description |
package/installer.js CHANGED
@@ -2554,6 +2554,21 @@ function injectHarnessRules() {
2554
2554
  log.step(`Installed GEMINI.md to ${path.join(geminiDir, 'GEMINI.md')}`);
2555
2555
  }, 'The harness injection below still runs.');
2556
2556
 
2557
+ // Dispatcher scripts must land in ~/.claude/workflows/, because that is
2558
+ // where the skills that route to them look: startcycle-graph's SKILL.md
2559
+ // and teamwork-preview's both tell the model to call `Workflow` with
2560
+ // scriptPath `$HOME/.claude/workflows/<name>.mjs`. installProjectHarness()
2561
+ // copies them into a *project*, which only helps a project that opted into
2562
+ // the local harness -- on a plain global install those paths did not exist
2563
+ // at all, so the skill pointed at a file that was never delivered.
2564
+ installStep(`install dispatcher workflows to ${path.join(homeDir, '.claude', 'workflows')}`, () => {
2565
+ const workflowsSrc = path.join(srcDir, '.claude', 'workflows');
2566
+ if (fs.existsSync(workflowsSrc)) {
2567
+ copyDirRecursiveSync(workflowsSrc, path.join(homeDir, '.claude', 'workflows'));
2568
+ log.step(`Installed dispatcher workflows to ${path.join(homeDir, '.claude', 'workflows')}`);
2569
+ }
2570
+ }, '/startcycle-graph and /teamwork-preview fall back to their prose protocols.');
2571
+
2557
2572
  const startcycleWorkflowSrc = path.join(srcDir, '.agents', 'workflows', 'startcycle.md');
2558
2573
  const sources = installStep('read the global rule sources', () => ({
2559
2574
  globalRules: fs.readFileSync(geminiMdSrc, 'utf8'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hybridlabor-api/aos",
3
- "version": "4.2.0-beta.0",
3
+ "version": "4.2.0",
4
4
  "description": "AOS — A Curated AI AGENT OS. Optimized agent skills and add-ons like memB, OpenWiki, Heimdall Token Saver, and Godmode architectures.",
5
5
  "main": "installer.js",
6
6
  "bin": {
@@ -26,9 +26,11 @@ Ideation must never be performed in isolation. Spawn specialized subagents to an
26
26
 
27
27
  ---
28
28
 
29
- ## 2. Interactive `/grill-me` Technical Interview
29
+ ## 2. Interactive Technical Interview
30
30
 
31
- Before drafting signal flow diagrams or system configs, execute a mandatory `/grill-me` interactive interview. Deeply challenge the user's technical assumptions and hardware readiness by asking targeted questions:
31
+ Before drafting signal flow diagrams or system configs, **invoke the `grill-with-docs` skill** (or `grill-me` when there is no working directory) and run it to completion. Those skills hold the interview protocol — design tree, frontier rounds, numbered questions each with a recommended answer — and it is not restated here.
32
+
33
+ What this domain adds to that protocol: deeply challenge the user's technical assumptions and hardware readiness. The frontier questions for a show-control build are:
32
34
 
33
35
  * **Signal & Network Protocols:**
34
36
  - What protocols govern data movement? (OSC, Art-Net, sACN, MIDI, SMPTE Timecode, NDI)?
@@ -48,7 +50,7 @@ Before drafting signal flow diagrams or system configs, execute a mandatory `/gr
48
50
 
49
51
  ## 3. Target Directory & Scaffolding
50
52
 
51
- After aligning on system architecture through the `/grill-me` process:
53
+ After aligning on system architecture through the grilling interview:
52
54
  1. **Confirm Output Directory:** Ask the user: *"In which project directory should the output show-control plan and architecture files be stored?"*
53
55
  2. **Scaffold Foundational Files:** Once confirmed, write the core show specification files (`agent.md`, `signal-flow.md`, `network-patch.json`, `failover-matrix.md`).
54
56
 
@@ -94,7 +96,7 @@ BDB MediaStorm is the master ideation and brainstorming engine for live show-con
94
96
  - **Exclude:** Do not use for generating video timelines or 3D meshes.
95
97
 
96
98
  ## Core Process
97
- 1. Run an interactive `/grill-me` session to challenge assumptions about protocols, hardware, and bandwidth.
99
+ 1. Run `grill-with-docs` (or `grill-me`) to challenge assumptions about protocols, hardware, and bandwidth.
98
100
  2. Scaffold foundational files (`agent.md`, `signal-flow.md`, `network-patch.json`).
99
101
  3. Generate a strict Mermaid.js signal flow diagram mapping all protocols.
100
102
  4. Document a main/backup redundancy and failover matrix.
@@ -115,7 +117,7 @@ BDB MediaStorm is the master ideation and brainstorming engine for live show-con
115
117
 
116
118
  ## Verification
117
119
 
118
- - [ ] `/grill-me` session was completed with answers regarding protocols and bandwidth.
120
+ - [ ] The grilling interview was completed with answers regarding protocols and bandwidth.
119
121
  - [ ] Output includes a Mermaid.js signal flow diagram.
120
122
  - [ ] A dedicated failover/blackout mechanism is documented.
121
123
 
@@ -88,7 +88,9 @@ Run only the streams the goal actually needs. A plain backend feature does not n
88
88
  > does the work `startcycle-graph`'s script does for you: extract the
89
89
  > `--skill=` flag(s) from the invocation text before anything else runs,
90
90
  > confirm each name resolves to a real `SKILL.md` (under
91
- > `~/.claude/skills/<name>/` or this project's own `skills/` tree) — stop
91
+ > any harness's global skills directory — `~/.claude/skills/<name>/`,
92
+ > `~/.agents/skills/`, `~/.codex/skills/`, `~/.cursor/skills/` or `~/.roo/skills/`
93
+ > — or this project's own `skills/` tree) — stop
92
94
  > and tell the user if one doesn't, don't silently proceed without it —
93
95
  > note the validated list in `00_execution_plan.md`, and include it as a
94
96
  > **hard requirement, not a suggestion** in each Build stream's dispatch
@@ -56,8 +56,24 @@ rather than guessing one.
56
56
  (repeatable, quote a name with spaces) forces that skill into this run as a
57
57
  hard requirement for the build nodes, validated to exist before anything
58
58
  else runs — this is how you make the pipeline use your own private skill
59
- that isn't part of `.agents/nodes.json`'s registry. See
60
- [`.agents/graph.md`](../../../.agents/graph.md)'s "Mandatory Skill
59
+ that isn't part of `.agents/nodes.json`'s registry.
60
+
61
+ `<name>` is the **exact skill directory name**, not a description — `ui-component`,
62
+ not "the UI one". Two ways to find it without leaving the terminal:
63
+
64
+ - `/ask-tim` — the routing skill; start there when you know the *job* but not the name
65
+ - list the installed skills directly, if you half-remember the spelling. The installer
66
+ syncs the same set to every harness it detects, so use whichever path is yours:
67
+ `~/.claude/skills`, `~/.agents/skills`, `~/.codex/skills`, `~/.cursor/skills`, or
68
+ `~/.roo/skills`. `ls ~/.agents/skills` is the safest guess on an unknown machine —
69
+ that one is written on every install regardless of harness.
70
+
71
+ A name that does not resolve halts the run before any agent works, and the
72
+ error now lists installed near-misses rather than only saying "not found".
73
+ That is deliberate: silently running without a skill you explicitly demanded
74
+ is worse than stopping.
75
+
76
+ See [`.agents/graph.md`](../../../.agents/graph.md)'s "Mandatory Skill
61
77
  Injection" section for the full mechanics; nothing about it needs handling
62
78
  in this router file, since `args` is passed through as raw text either way.
63
79
 
@@ -36,7 +36,9 @@ with spaces) forces that skill into this run as a hard requirement — for a
36
36
  private skill of the user's own this throwaway graph would otherwise never
37
37
  know to reach for. Extract any `--skill=` flag(s) from the invocation text
38
38
  before step 1, confirm each name resolves to a real `SKILL.md` (under
39
- `~/.claude/skills/<name>/` or this project's own `skills/` tree if it has
39
+ any harness's global skills directory — `~/.claude/skills/<name>/`,
40
+ `~/.agents/skills/`, `~/.codex/skills/`, `~/.cursor/skills/`, `~/.roo/skills/` —
41
+ or this project's own `skills/` tree if it has
40
42
  one) — stop and tell the user if one doesn't, never silently proceed
41
43
  without it — and include it as a **hard requirement, not a suggestion** in
42
44
  the Plan node's and every Worker node's prompt. The Review node checks the