@hybridlabor-api/aos 4.14.1 → 4.16.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 (51) hide show
  1. package/.claude/hooks/aos-bus.mjs +146 -0
  2. package/.claude/hooks/go-gate.mjs +2 -1
  3. package/.opencode/plugins/bdb-aos.js +111 -5
  4. package/bin/aos-acp.mjs +7 -3
  5. package/bin/aos-doctor.mjs +21 -6
  6. package/docs/master-session-acp.md +15 -0
  7. package/docs/sessions/audit-agents.md +2 -0
  8. package/installer.js +341 -163
  9. package/package.json +3 -2
  10. package/scripts/validate-skills.mjs +29 -6
  11. package/skills/basic/godmode-shipping/SKILL.md +0 -1
  12. package/skills/basic/master-session/SKILL.md +1 -1
  13. package/skills/basic/startcycle/SKILL.md +0 -1
  14. package/skills/basic/startcycle-graph/SKILL.md +0 -1
  15. package/skills/global_config/ask-tim/SKILL.md +0 -1
  16. package/skills/global_config/grill-me/SKILL.md +0 -1
  17. package/skills/global_config/grill-with-docs/SKILL.md +0 -1
  18. package/skills/playbooks/pb-bug-fix/SKILL.md +48 -0
  19. package/skills/playbooks/pb-ci-fix/SKILL.md +0 -1
  20. package/skills/playbooks/pb-clip-from-moodboard/SKILL.md +55 -0
  21. package/skills/playbooks/pb-crew-call-sheet/SKILL.md +40 -0
  22. package/skills/playbooks/pb-deploy-saas/SKILL.md +44 -0
  23. package/skills/playbooks/pb-docs-site/SKILL.md +44 -0
  24. package/skills/playbooks/pb-event-tracker/SKILL.md +0 -1
  25. package/skills/playbooks/pb-focus-chunks/SKILL.md +40 -0
  26. package/skills/playbooks/pb-handover/SKILL.md +41 -0
  27. package/skills/playbooks/pb-harness-work/SKILL.md +64 -0
  28. package/skills/playbooks/pb-health-weekly/SKILL.md +43 -0
  29. package/skills/playbooks/pb-idea-to-launch/SKILL.md +51 -0
  30. package/skills/playbooks/pb-image-to-3d/SKILL.md +46 -0
  31. package/skills/playbooks/pb-inbox-zero/SKILL.md +39 -0
  32. package/skills/playbooks/pb-invoice-check/SKILL.md +41 -0
  33. package/skills/playbooks/pb-landing-page/SKILL.md +46 -0
  34. package/skills/playbooks/pb-launch-video/SKILL.md +49 -0
  35. package/skills/playbooks/pb-machine-setup/SKILL.md +44 -0
  36. package/skills/playbooks/pb-master/SKILL.md +53 -0
  37. package/skills/playbooks/pb-meeting-actions/SKILL.md +0 -1
  38. package/skills/playbooks/pb-newsletter/SKILL.md +43 -0
  39. package/skills/playbooks/pb-offer/SKILL.md +39 -0
  40. package/skills/playbooks/pb-open-source/SKILL.md +50 -0
  41. package/skills/playbooks/pb-pcb-to-case/SKILL.md +46 -0
  42. package/skills/playbooks/pb-project-new/SKILL.md +0 -1
  43. package/skills/playbooks/pb-redesign-app/SKILL.md +47 -0
  44. package/skills/playbooks/pb-release-aos/SKILL.md +50 -0
  45. package/skills/playbooks/pb-security-sweep/SKILL.md +48 -0
  46. package/skills/playbooks/pb-ship/SKILL.md +49 -0
  47. package/skills/playbooks/pb-show-build/SKILL.md +48 -0
  48. package/skills/playbooks/pb-social-pack/SKILL.md +47 -0
  49. package/skills/playbooks/pb-todo/SKILL.md +41 -0
  50. package/skills/playbooks/pb-week-plan/SKILL.md +0 -1
  51. package/skills/playbooks/pb-worktrees-land/SKILL.md +52 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hybridlabor-api/aos",
3
- "version": "4.14.1",
3
+ "version": "4.16.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
  "engines": {
@@ -12,6 +12,7 @@
12
12
  "bdb-agent-skills-pro": "installer.js",
13
13
  "bdb-agent-skills": "installer.js",
14
14
  "aos-plan-canvas": "skills/global_config/plan-canvas/scripts/plan-canvas.js",
15
+ "aos-bus": ".claude/hooks/aos-bus.mjs",
15
16
  "aos-trail": "skills/global_config/agenttrail/bin/agenttrail.mjs",
16
17
  "aos-archify": "skills/global_config/archify/bin/archify.mjs",
17
18
  "aos-dashboard": "bin/aos-dashboard.mjs",
@@ -28,7 +29,7 @@
28
29
  "plugin:build": "node scripts/build-plugin-manifest.mjs",
29
30
  "plugin:check": "node scripts/build-plugin-manifest.mjs --check",
30
31
  "doctor": "node bin/aos-doctor.mjs",
31
- "test": "node scripts/validate-skills.mjs --selftest && node scripts/validate-skills.mjs && node scripts/build-plugin-manifest.mjs --check && node --test tests/opencode-graph-gate.test.js && node --test tests/cross-harness-hooks.test.js && node --test tests/plan-canvas-security.test.mjs && node --test tests/plan-canvas-modes.test.mjs && node --test tests/swarm-wiring.test.js && node tests/aos-store.test.mjs && node --test tests/aos-store-ui.test.mjs && node tests/aos-store-scenario.test.mjs && node tests/aos-doctor.test.mjs && node tests/build-plugin-manifest.test.mjs && node --test tests/agent-models.test.js && node --test tests/installer-p3.test.js && node --test tests/installer-binary.test.js && node --test tests/installer-version.test.js && node --test tests/mcsc-server.test.js && node --test tests/antigravity-hooks.test.js && node --test tests/windows-hooks.test.js && node --test tests/plan-builder.test.mjs && node --test tests/plan-builder-trail.test.mjs && node --test tests/plan-builder-showcase.test.mjs && node --test tests/plan-builder-templates.test.mjs && node --test tests/plan-canvas-home.test.mjs && node --test tests/launchpad-installer.test.js && node --test tests/launchpad-plan-canvas.test.js && node --test tests/go-token.test.js && node --test tests/master-session-skill.test.js && node --test tests/aos-acp.test.js && node --test tests/opencode-go-token.test.js && node --test tests/opencode-adapter.test.js && node --test tests/pr-recap.test.mjs && node --test tests/bdb-visual-edit.test.mjs && node --test tests/opencode-trail-autostart.test.mjs && node --test tests/trail-autostart-hook.test.mjs && node --test tests/agenttrail-ensure.test.mjs"
32
+ "test": "node scripts/validate-skills.mjs --selftest && node scripts/validate-skills.mjs && node scripts/build-plugin-manifest.mjs --check && node --test tests/opencode-graph-gate.test.js && node --test tests/cross-harness-hooks.test.js && node --test tests/plan-canvas-security.test.mjs && node --test tests/plan-canvas-modes.test.mjs && node --test tests/swarm-wiring.test.js && node tests/aos-store.test.mjs && node --test tests/aos-store-ui.test.mjs && node tests/aos-store-scenario.test.mjs && node tests/aos-doctor.test.mjs && node tests/build-plugin-manifest.test.mjs && node --test tests/agent-models.test.js && node --test tests/installer-p3.test.js && node --test tests/installer-binary.test.js && node --test tests/installer-version.test.js && node --test tests/mcsc-server.test.js && node --test tests/antigravity-hooks.test.js && node --test tests/windows-hooks.test.js && node --test tests/plan-builder.test.mjs && node --test tests/plan-builder-trail.test.mjs && node --test tests/plan-builder-showcase.test.mjs && node --test tests/plan-builder-templates.test.mjs && node --test tests/plan-canvas-home.test.mjs && node --test tests/launchpad-installer.test.js && node --test tests/launchpad-plan-canvas.test.js && node --test tests/go-token.test.js && node --test tests/master-session-skill.test.js && node --test tests/aos-acp.test.js && node --test tests/opencode-go-token.test.js && node --test tests/opencode-adapter.test.js && node --test tests/pr-recap.test.mjs && node --test tests/bdb-visual-edit.test.mjs && node --test tests/opencode-trail-autostart.test.mjs && node --test tests/trail-autostart-hook.test.mjs && node --test tests/agenttrail-ensure.test.mjs && node --test tests/aos-bus.test.js && node --test tests/installer-quick-update.test.js"
32
33
  },
33
34
  "publishConfig": {
34
35
  "access": "public"
@@ -242,7 +242,7 @@ function checkSkillRefs(text, file, known, self, findings) {
242
242
  }
243
243
 
244
244
  // Playbooks are skills with `kind: playbook`; skills without `kind` are untouched.
245
- const PB_REQUIRED = ['trigger', 'inputs', 'requires', 'go_points', 'outputs', 'verify', 'difficulty', 'est_time', 'disable-model-invocation'];
245
+ const PB_REQUIRED = ['trigger', 'inputs', 'requires', 'go_points', 'outputs', 'verify', 'difficulty', 'est_time'];
246
246
  const DIFFICULTY = new Set(['beginner', 'intermediate', 'advanced']);
247
247
  const EXTERNAL = ' (external)';
248
248
 
@@ -274,12 +274,28 @@ export function checkPlaybook(byKey, known) {
274
274
  add('E-PB04', `\`difficulty: ${unquote(diff.value)}\` is not one of: ${[...DIFFICULTY].join(', ')}`, 'difficulty');
275
275
  }
276
276
  const dmi = byKey.get('disable-model-invocation');
277
- if (dmi && unquote(dmi.value) !== 'true') {
278
- add('E-PB06', 'playbooks are user-invoked only — set `disable-model-invocation: true`', 'disable-model-invocation');
277
+ if (dmi && unquote(dmi.value) === 'true') {
278
+ add('E-PB06', 'playbooks must stay invocable by agents — remove `disable-model-invocation: true` (side effects are guarded by go-gate)', 'disable-model-invocation');
279
279
  }
280
280
  return out;
281
281
  }
282
282
 
283
+ // Pipeline and role skills must stay invocable through the Skill tool: the Master and
284
+ // every orchestrator start them. Side effects are guarded by go-gate, not by hiding the
285
+ // skill from the model. Anything not listed here may still set the flag.
286
+ export const MODEL_INVOCABLE = new Set([
287
+ 'startcycle', 'startcycle-graph', 'startcycle-graph-user', 'teamwork-preview',
288
+ 'godmode-engineering', 'godmode-shipping', 'godmode-ui-ux', 'godmode-media-eventtech',
289
+ 'master-session', 'ao-orchestrator', 'bdbrainstorm', 'bdbmediastorm',
290
+ 'grill-me', 'grill-with-docs', 'ask-tim', 'memb-skill',
291
+ ]);
292
+
293
+ export function checkInvocation(name, byKey) {
294
+ const dmi = byKey.get('disable-model-invocation');
295
+ if (!dmi || unquote(dmi.value) !== 'true' || !MODEL_INVOCABLE.has(name)) return [];
296
+ return [{ level: 'error', code: 'E-DMI01', line: dmi.line, msg: `\`${name}\` is a pipeline/role skill and must stay model-invocable — remove \`disable-model-invocation: true\` (go-gate guards its side effects)` }];
297
+ }
298
+
283
299
  function validate() {
284
300
  const { skills, strays } = collect();
285
301
  const known = new Set(skills.map((f) => basename(dirname(f))));
@@ -351,6 +367,7 @@ function validate() {
351
367
  }
352
368
 
353
369
  for (const f of checkPlaybook(byKey, known)) findings.push({ ...f, file: rel });
370
+ for (const f of checkInvocation(basename(dir), byKey)) findings.push({ ...f, file: rel });
354
371
 
355
372
  checkLeakedPaths(text, rel, findings);
356
373
  checkLocalRefs(text, dir, rel, findings);
@@ -509,7 +526,7 @@ function selftest() {
509
526
  trigger: '["a"]', inputs: '[repo]',
510
527
  requires: '\n skills: [github, gh (external)]\n agents: []\n mcps: []\n store: []',
511
528
  go_points: '[]', outputs: '["x"]', verify: '"x"', difficulty: 'beginner',
512
- est_time: '5 min', 'disable-model-invocation': 'true', ...over,
529
+ est_time: '5 min', ...over,
513
530
  };
514
531
  const lines = Object.entries(base).filter(([k]) => !drop.includes(k)).map(([k, v]) => `${k}: ${v}`);
515
532
  const fm = scanFrontmatter(['---', ...lines, '---'].join('\n'));
@@ -530,8 +547,14 @@ function selftest() {
530
547
  assert.equal(kind.length, 1);
531
548
  assert.equal(kind[0].code, 'E-PB01');
532
549
  assert.equal(checkPlaybook(pb({ requires: '\n skills:\n - github' }), known)[0].code, 'E-PB05');
533
- assert.equal(checkPlaybook(pb({ 'disable-model-invocation': 'false' }), known)[0].code, 'E-PB06');
534
- assert.deepEqual(checkPlaybook(pb({}, ['kind', 'trigger', 'inputs', 'requires', 'go_points', 'outputs', 'verify', 'difficulty', 'est_time', 'disable-model-invocation']), known).length, 0, 'no kind, no playbook rules');
550
+ assert.equal(checkPlaybook(pb({ 'disable-model-invocation': 'true' }), known)[0].code, 'E-PB06');
551
+ assert.deepEqual(checkPlaybook(pb({ 'disable-model-invocation': 'false' }), known), [], 'explicit false is fine');
552
+ const dm = (v) => new Map([['disable-model-invocation', { key: 'disable-model-invocation', value: v, line: 3 }]]);
553
+ assert.equal(checkInvocation('startcycle-graph', dm('true'))[0].code, 'E-DMI01');
554
+ assert.deepEqual(checkInvocation('startcycle-graph', dm('false')), []);
555
+ assert.deepEqual(checkInvocation('bdb-updater', dm('true')), [], 'unlisted skills may keep the flag');
556
+ assert.deepEqual(checkInvocation('startcycle', new Map()), []);
557
+ assert.deepEqual(checkPlaybook(pb({}, ['kind', 'trigger', 'inputs', 'requires', 'go_points', 'outputs', 'verify', 'difficulty', 'est_time']), known).length, 0, 'no kind, no playbook rules');
535
558
  assert.deepEqual(
536
559
  checkPlaybook(pb({ requires: '\n skills: ["gh (external)", github,]' }), known), [],
537
560
  'quoted item and trailing comma survive',
@@ -2,7 +2,6 @@
2
2
  name: godmode-shipping
3
3
  description: BDB Shipping Godmode, the final gatekeeper for production releases. Use when running pre-launch checks, feature-flag rollouts, or rollback planning under Spec-Driven Development before a release ships.
4
4
  category: engineering-method
5
- disable-model-invocation: true
6
5
  ---
7
6
 
8
7
  # 🚀 BDB Shipping Godmode
@@ -22,7 +22,7 @@ One session is the **master**: it keeps the overview, asks workers for status, a
22
22
 
23
23
  ### `aos-acp` in one paragraph
24
24
 
25
- `bin/aos-acp.mjs` is a zero-dependency ACP client: it spawns the adapter (`npx -y @agentclientprotocol/codex-acp`, `opencode acp`, `npx -y @agentclientprotocol/claude-agent-acp`), runs `initialize` → `session/new` → `session/prompt`, streams the worker's text to stdout and logs every event to `~/.aos/acp/<name>.jsonl`. A `session/request_permission` for a guarded command (the go-gate list) is answered `allow_once` only with a valid GO token for `<name>`; with `--go-wait <sec>` the request is parked (log event `permission_pending`, show it as `GO needed`) until the token appears or the wait ends. Everything else follows `--allow-default deny|allow` (deny by default). ACP workers are not in `ListAgents`: the roster lists them from the logs.
25
+ `bin/aos-acp.mjs` is a zero-dependency ACP client: it spawns the adapter (`npx -y @agentclientprotocol/codex-acp`, `opencode acp`, `npx -y @agentclientprotocol/claude-agent-acp`), runs `initialize` → `session/new` → `session/prompt`, streams the worker's text to stdout and logs every event to `~/.aos/acp/<name>.jsonl`. A `session/request_permission` for a guarded command (the go-gate list) is answered `allow_once` only with a valid GO token for `<name>`; with `--go-wait <sec>` the request is parked (log event `permission_pending`, show it as `GO needed`) until the token appears or the wait ends. Everything else follows `--allow-default deny|allow` (deny by default). `--model <id>` is sent as ACP `session/set_config_option` (`configId: "model"`, id is adapter-specific, e.g. `sonnet`, `provider/model`); `fable` ids are rejected (workers run opus, sonnet or haiku), default is the adapter default and is logged. ACP workers are not in `ListAgents`: the roster lists them from the logs.
26
26
 
27
27
  ## Step 1 — Roster
28
28
 
@@ -2,7 +2,6 @@
2
2
  name: startcycle
3
3
  description: Linear multi-agent build pipeline with file hand-offs in production_artifacts/, run after /bdbrainstorm or /grill-me. This is the linear variant — no state.json, no repair loop, no dispatcher graph — distinct from startcycle-graph, which adds durable state and automated escalation.
4
4
  category: bdb-core
5
- disable-model-invocation: true
6
5
  ---
7
6
 
8
7
  # `/startcycle` — Linear Build Pipeline
@@ -2,7 +2,6 @@
2
2
  name: startcycle-graph
3
3
  description: Use when running the autonomous multi-agent build pipeline after /bdbrainstorm or /grill-me. Routes to the startcycle-dispatch Dynamic Workflow, which reads production_artifacts/state.json and invokes Architect, TechLead, UI/UX, Engineering, Media/EventTech, Reviewer, and Shipping in turn per .agents/graph.md's edge table — the agents never invoke each other.
4
4
  category: bdb-core
5
- disable-model-invocation: true
6
5
  ---
7
6
 
8
7
  # 🚀 BDB Autonomous Development Cycle (`/startcycle-graph`)
@@ -2,7 +2,6 @@
2
2
  name: ask-tim
3
3
  description: Ask which skill or flow fits your situation. A route through AOS's skills for work that travels idea to ship, plus a catalogue of the 185 available options for lookup. Use when unsure where to start, or when picking between overlapping choices.
4
4
  category: bdb-core
5
- disable-model-invocation: true
6
5
  ---
7
6
 
8
7
  <!-- The flow map below is derived from mattpocock/skills' ask-matt (MIT, see
@@ -2,7 +2,6 @@
2
2
  name: grill-me
3
3
  description: A relentless interview to sharpen a plan or design. Use before committing to an approach, or on any 'grill me' trigger phrase.
4
4
  category: engineering-method
5
- disable-model-invocation: true
6
5
  ---
7
6
 
8
7
  <!-- Source: mattpocock/skills skills/productivity/grill-me — MIT, see THIRD_PARTY_NOTICES.md -->
@@ -2,7 +2,6 @@
2
2
  name: grill-with-docs
3
3
  description: A relentless interview to sharpen a plan or design, which also builds the project's domain model — glossary and ADRs — as it goes. Use in a working directory whenever an idea needs sharpening.
4
4
  category: engineering-method
5
- disable-model-invocation: true
6
5
  ---
7
6
 
8
7
  <!-- Source: mattpocock/skills skills/engineering/grill-with-docs — MIT, see THIRD_PARTY_NOTICES.md -->
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: pb-bug-fix
3
+ description: >-
4
+ Turn a GitHub issue into a tested fix on a branch with an open PR: read the
5
+ issue as the contract, find the root cause, write the failing test first,
6
+ fix, prove it, review the diff against the issue, push and open the PR only
7
+ after GO. Merging stays with pb-ship. Use for "fix issue 42", "bug fix from
8
+ this issue", "turn this issue into a PR".
9
+ category: engineering-method
10
+ kind: playbook
11
+ trigger: ["fix issue", "bug fix from issue", "issue to PR"]
12
+ inputs: [repo, issue_number]
13
+ requires:
14
+ skills: [github, deja-memory, systematic-debugging, test-driven-development, verification-before-completion, git-pr-review, "gh (external)"]
15
+ agents: [reviewer]
16
+ mcps: []
17
+ store: []
18
+ go_points: ["git push + gh pr create"]
19
+ outputs: ["production_artifacts/pb-bug-fix-<date>.md"]
20
+ verify: "new test fails on the base SHA and passes on the branch SHA; gh pr view <branch> --json closingIssuesReferences contains <n>"
21
+ difficulty: intermediate
22
+ est_time: 30-90 min
23
+ ---
24
+
25
+ # GitHub issue to tested fix and PR
26
+ What you get: a branch with a failing-then-passing test and the fix, reviewed against the issue, and an open PR that closes it. Merging is a separate run (pb-ship).
27
+
28
+ ## Inputs
29
+ - repo — the current directory, or the one the user names; `<owner/repo>` comes from `git -C <repo> remote get-url origin`
30
+ - issue_number — the GitHub issue to fix, asked if missing
31
+
32
+ ## Steps
33
+ 1. github — repo, issue_number → `gh auth status`, then `gh issue view <n> -R <owner/repo> --json title,body,labels,state` as the contract (acceptance points as a list) in the run log (gh missing, unauthenticated, no GitHub remote, or the issue is closed → log it, give the `gh auth login` / remote hint, stop) — contract written
34
+ 2. deja-memory — error text or symptom from the issue → `deja fix` result in the run log — prior fix found, or "none"
35
+ 3. systematic-debugging — contract → root cause and a local repro command in the run log — repro fails locally on the base SHA (base SHA logged), or the reason it cannot run locally
36
+ 4. test-driven-development — root cause → failing test first (run, red, output pasted), then the minimal fix on a new branch `fix/<n>-<slug>` — the new test fails on the base SHA and passes after the fix; no unrelated edits
37
+ 5. verification-before-completion — repro command and the repo's test, lint and typecheck scripts that exist → fresh passing output pasted in the run log — output pasted, not claimed
38
+ 6. reviewer (agent) — `git diff <base>...HEAD`; the contract is the issue from step 1, never the run log and never the implementer's claim (input material only) → findings table in the run log — any open `blocking` finding sends the run back to step 4, at most 2 cycles, then stop and escalate
39
+ 7. git-pr-review — `git log <base>..HEAD` → PR body draft in the run log, ending in `Fixes #<n>` — draft only, nothing posted
40
+ 8. [GO] git push + gh pr create — `git push -u origin <branch>` then `gh pr create -R <owner/repo> --base <base> --head <branch> --title "<title>" --body-file <draft>` — the WAITING FOR GO line names branch, base, title and issue number. The run stops here until the human types GO. One GO covers the push and the PR creation, one time. (The hook guards the push only; `gh pr create` is not hook-guarded, so this GO is its only guard.)
41
+ 9. github — `gh pr view <branch> -R <owner/repo> --json url,closingIssuesReferences` → PR URL in the run log — `closingIssuesReferences` contains `<n>`
42
+
43
+ Run log: `production_artifacts/pb-bug-fix-<date>.md` in the start directory, never committed
44
+
45
+ Rules
46
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
47
+ - A failed check stops the run: write the failure into the run log and report. No silent retries beyond what a step names.
48
+ - Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR GO: <step>` at each gate.
@@ -19,7 +19,6 @@ outputs: [".github/workflows/*.yml", "production_artifacts/pb-ci-fix-<date>.md"]
19
19
  verify: "gh run list --commit <sha> --json conclusion -q '.[0].conclusion' == success"
20
20
  difficulty: intermediate
21
21
  est_time: 15-45 min
22
- disable-model-invocation: true
23
22
  ---
24
23
 
25
24
  # Fix red CI or set up GitHub Actions
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: pb-clip-from-moodboard
3
+ description: >-
4
+ Turn a look brief and reference images into a finished social clip:
5
+ concept, TouchDesigner look and palette, ComfyUI stills, a recorded take,
6
+ a cut in DaVinci Resolve or Remotion, 9:16 and 16:9 exports, publish only
7
+ after GO. Use for "moodboard to clip", "make a social clip from these
8
+ references", "look brief to video".
9
+ category: media-eventtech
10
+ kind: playbook
11
+ trigger: ["moodboard to clip", "social clip from references", "look brief to video"]
12
+ inputs: [brief, reference_images, project, comfy_workflow, cut_tool, formats?]
13
+ requires:
14
+ skills: [bdbmediastorm, bdb-touchdesigner-mcp, bdb-davinci-mcp, remotion, "ffprobe (external)"]
15
+ agents: []
16
+ mcps: [bdb_td_minddesigner, comfyui-mcp, bdb_davinci_mcp]
17
+ store: []
18
+ go_points: [publish]
19
+ outputs: ["renders/<project>/concept.md", "renders/<project>/look.tox", "renders/<project>/stills/", "renders/<project>/clip_9x16.mp4", "renders/<project>/clip_16x9.mp4", "production_artifacts/pb-clip-from-moodboard-<date>.md"]
20
+ verify: "ffprobe shows 1080x1920 and 1920x1080 at the asked duration; comfyui get_history status success; get_td_node_errors empty"
21
+ difficulty: advanced
22
+ est_time: 1-3 h
23
+ ---
24
+
25
+ # Moodboard to social clip
26
+ What you get: a 9:16 and a 16:9 clip built from your look brief and references, checked with ffprobe, handed off for publishing after your GO.
27
+
28
+ ## Inputs
29
+ - brief — the look brief, asked in step 2
30
+ - reference_images — a folder of reference images, asked in step 2
31
+ - project — a slug for `renders/<project>/`, asked in step 2
32
+ - comfy_workflow — path to a ComfyUI API-format workflow JSON, required, never invented
33
+ - cut_tool — `davinci` or `remotion` (remotion needs an existing Remotion project)
34
+ - formats (optional) — default 9:16 and 16:9
35
+
36
+ ## Steps
37
+ 1. Preflight — ask cut_tool first; then one probe per server, before any file is written: `get_td_info` on `bdb_td_minddesigner`; `check_comfyui_health` on `comfyui-mcp`; `get_resolve_status` on `bdb_davinci_mcp` (only if cut_tool = davinci); `command -v ffprobe`. MCP tools may be deferred in the harness: try to load the tool once via the harness tool search before declaring it missing. Tool not loaded, call errors, or the payload fails its pass condition (TD `get_td_info`: `connected: true`; ComfyUI `check_comfyui_health`: `status` is `"online"`; Resolve `get_resolve_status`: no `error` key) → stop with "Missing MCP: `<server>` (`<tool>` unavailable). Start <TouchDesigner|ComfyUI|DaVinci Resolve> and check `mcpServers.<server>` in your harness config." and write nothing except the run log; davinci missing while cut_tool = remotion → continue, logged — all probes answered
38
+ 2. Ask — brief, reference image folder, project slug, ComfyUI workflow JSON path, cut_tool, formats (default 9:16 and 16:9), length → run log and `renders/<project>/` — all answered, workflow path exists
39
+ 3. bdbmediastorm — brief → `renders/<project>/concept.md` (look, palette intent, shot list, length) — stops for approval
40
+ 4. bdb-touchdesigner-mcp — references → `moodboard_to_system` / `extract_palette` → network and palette; `get_td_node_errors` empty, `get_preview` shown (stops for approval), then `export_look_tox` → `renders/<project>/look.tox` — errors empty
41
+ 5. ComfyUI — the workflow file's text (palette and prompt filled in) as the JSON string for `queue_prompt` → `get_history <prompt_id>` status success → `get_output_media_info` paths copied to `renders/<project>/stills/` and loaded into the TD network (e.g. as a `moviefilein` TOP feeding the look) before step 6, then `get_td_node_errors` empty again — at least 1 still; `local_path` is only set when `COMFYUI_DIR` is set, so if `local_path` is empty or `exists_locally` is false, stop with a clear message and copy nothing
42
+ 6. Record — TD `record_movie` → `renders/<project>/raw.mov` — `ffprobe` duration > 0
43
+ 7. Cut — either way the output is the two clips, and `ffprobe` shows the asked width, height and duration per file:
44
+ - davinci: `create_project` → `import_media` → `create_timeline` → `append_to_timeline` → `set_render_settings` per format → `add_render_job` → `start_rendering` → `get_render_job_status` complete
45
+ - remotion: from the Remotion project dir, copy `raw.mov` into its `public/`, then `npx remotion render <Composition> <out>` per format (network/npm on first run needs approval; the skill's Stitch steps do not apply)
46
+ - `ffprobe` is the gate, since nothing proves `set_render_settings` sets 1080x1920: on a width/height mismatch stop with "export <format> has WxH, expected ...", log it, do not publish, invent no conversion command, and tell the human what to change in Resolve
47
+ - then the clips stop for approval (taste review)
48
+ 8. [GO] publish — the destination and the full file list shown. The run stops here until the human types GO. No publish MCP or CLI exists on this machine, so the GO releases the hand-off: the files plus the caption in `renders/<project>/publish.md`; upload is manual unless the human named a tool in step 2 — hand-off file written
49
+
50
+ Run log: `production_artifacts/pb-clip-from-moodboard-<date>.md` in the start directory, never committed
51
+
52
+ Rules
53
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
54
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
55
+ - Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR GO: <step>` at each gate.
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: pb-crew-call-sheet
3
+ description: >-
4
+ Build a crew call sheet and a load-in / load-out plan for one show day from
5
+ your event tracker or brief and your crew list, and send it to the crew only
6
+ after your GO. Use for "call sheet", "crew call times", "load-in plan",
7
+ "load-out schedule".
8
+ category: media-eventtech
9
+ kind: playbook
10
+ trigger: ["call sheet", "crew call times", "load-in plan"]
11
+ inputs: [tracker_csv_or_event_brief, crew_list]
12
+ requires:
13
+ skills: [bdb-eventagency-skill, pb-event-tracker]
14
+ agents: []
15
+ mcps: []
16
+ store: []
17
+ go_points: [send to crew]
18
+ outputs: ["call-sheet.md", "load-plan.md", "run-log.md"]
19
+ verify: "every crew member has a call time; load-in ends before doors; load-out starts after show end"
20
+ difficulty: beginner
21
+ est_time: 10-20 min
22
+ ---
23
+
24
+ # Crew call sheet
25
+ What you get: a call sheet and a load-in / load-out plan for one show day.
26
+
27
+ ## Inputs
28
+ - The `tracker.csv` from pb-event-tracker, or an event brief — a text or document file
29
+ - A crew list — a file with name, role and contact for each person
30
+ - A save folder — asked once; default `./pb-crew-call-sheet-<date>/`
31
+
32
+ ## Steps
33
+ 1. Ask once — save folder, tracker or brief, crew list → `run-log.md` — the files are readable; no tracker yet: run pb-event-tracker first or give the brief
34
+ 2. Read the tracker or brief and the crew list → show date, venue, doors time, show start and end, per crew member name, role, contact — missing times are `?`, never guessed
35
+ 3. bdb-eventagency-skill (section "5.1 Pre-production", run-of-show and day-minus milestones) — the read data → `call-sheet.md`, one row per crew member: who, role, call time, contact — every crew member has a call time
36
+ 4. bdb-eventagency-skill (section "5.1 Pre-production") — the read data → `load-plan.md` with load-in, line check, doors, show, load-out, each with a start and end time — load-in ends before doors; load-out starts after show end
37
+ 5. Show `call-sheet.md` and `load-plan.md` in full and apply your edits until you approve — approval logged
38
+ 6. [GO] Send the call sheet to the crew through a connector you name, or send it yourself — show every recipient (name + address, `?` blocks sending until you fill it) and the full text of every message first. The run stops here until the human types GO. The GO covers exactly the recipients and messages shown and nothing else; a different or added recipient needs a fresh GO. Never send to anyone not listed in `call-sheet.md`. The go-gate hook does not guard sending: this [GO] is the only guard.
39
+
40
+ Run log: `run-log.md` in the save folder. One line per step as it completes (`N. done|skipped|failed — file — check result`), and `WAITING FOR GO: <step>` at the gate. Anything other than the literal GO (case-insensitive) is not a GO. If a check fails, stop, write the failure into the log and tell the user.
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: pb-deploy-saas
3
+ description: >-
4
+ Deploy a SaaS app to the BDB fleet: preflight of the fleet skills, a guardrail plan, green CI, the deploy after GO (Incus via
5
+ Forgejo CI, or direct rsync), and a health URL check. Use for "deploy this to the
6
+ fleet", "deploy the SaaS app", "ship to the Incus instance".
7
+ category: saas-ops
8
+ kind: playbook
9
+ trigger: ["deploy this to the fleet", "deploy the SaaS app", "deploy to the Incus instance"]
10
+ inputs: [repo, target_instance, path, version_source?]
11
+ requires:
12
+ skills: [bdb-deploy, pb-ci-fix, "bdbsaashost (external)", "deploy-incus (external)"]
13
+ agents: []
14
+ mcps: []
15
+ store: []
16
+ go_points: [deploy]
17
+ outputs: ["production_artifacts/pb-deploy-saas-<date>.md"]
18
+ verify: "curl -sI <health_url> returns 200; the version marker read in step 5 equals the deployed commit SHA, or the run log says marker absent: unverified"
19
+ difficulty: advanced
20
+ est_time: 30-90 min
21
+ ---
22
+
23
+ # Deploy a SaaS app to the fleet
24
+ What you get: the app deployed to the chosen fleet instance after your GO, with a health check logged.
25
+
26
+ ## Inputs
27
+ - repo — the current directory, or the one the user names
28
+ - target_instance — the fleet instance to deploy to, asked if missing
29
+ - path — `incus-ci` (push to Forgejo, the runner deploys to Incus) or `direct` (rsync over SSH), asked if missing
30
+ - version_source (optional) — where the app exposes its commit SHA: a `/version`-style URL or a response header name of the health URL, taken from the deploy plan; none given means the app exposes none
31
+
32
+ ## Steps
33
+ 1. Preflight — `test -f ~/.claude/skills/bdbsaashost/SKILL.md`; `test -f ~/.claude/skills/deploy-incus/SKILL.md` (needed only for path = incus-ci) → run log header — a skill absent → stop with "Missing skill: <name> (installed locally only, not shipped by AOS). Install it under `~/.claude/skills/` or run this playbook on the machine that has it."; write nothing except the run log — all probes answered
34
+ 2. bdbsaashost (external) — repo, target_instance → deploy plan with target, guardrails and the health URL in the run log — stops for approval (the human confirms target, path and health URL)
35
+ 3. pb-ci-fix — only if `gh run list --commit <HEAD sha> --limit 1 --json conclusion` for the repo is not `success` (a repo with no GitHub CI is logged and skipped) → one pb-ci-fix run, with its own GO for the push — latest run is green, else stop
36
+ 4. [GO] deploy — path = incus-ci: deploy-incus pushes the repo to the Forgejo remote, the push command is hook-guarded; path = direct: bdb-deploy runs `rsync` over SSH to the target, which is not hook-guarded (the same goes for `incus` commands), so this GO is the only guard there — RemoteOS approval does not cover a Forgejo push or an rsync, only actions run through its own tools (for example container manage), which this step does not use. The WAITING FOR GO line names the path, target_instance, the exact command, and the commit SHA. The run stops here until the human types GO. One GO = one deploy.
37
+ 5. Health check — `curl -sI <health_url>` for the status line; then the marker from `version_source` (`curl -s <version_url>` for a URL, or the named header in the `curl -sI` output) → status line and marker in the run log — status 200 and the marker equals the SHA from the step 4 GO line; if `version_source` is empty or returns no marker, log "marker absent: unverified" and accept the 200 alone; a marker that differs from the SHA, or any other status, stops the run and reports, no automatic rollback
38
+
39
+ Run log: `production_artifacts/pb-deploy-saas-<date>.md` in the start directory, never committed
40
+
41
+ Rules
42
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
43
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
44
+ - Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR GO: <step>` at each gate.
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: pb-docs-site
3
+ description: >-
4
+ Publish a project's docs as a static HTML manual on GitHub Pages: check
5
+ that Pages is enabled, bring the wiki up to date, list the doc gaps, build
6
+ the site, preview it locally and push it after GO. Use for "publish the
7
+ docs", "docs site", "put the manual on GitHub Pages".
8
+ category: design-ui-ux
9
+ kind: playbook
10
+ trigger: ["publish the docs", "docs site", "manual on GitHub Pages"]
11
+ inputs: [repo, source]
12
+ requires:
13
+ skills: [openwiki-skill, readme, documentation, bdbhtmlmanueldocs, github, "gh (external)"]
14
+ agents: []
15
+ mcps: []
16
+ store: []
17
+ go_points: ["git push"]
18
+ outputs: ["docs/", "production_artifacts/pb-docs-site-<date>.md"]
19
+ verify: "gh api repos/<owner>/<repo>/pages -q .status == built; curl -sI <pages_url> returns 200"
20
+ difficulty: intermediate
21
+ est_time: 30-90 min
22
+ ---
23
+
24
+ # Publish a docs site
25
+ What you get: the project's docs as a static HTML manual on GitHub Pages, pushed only after your GO.
26
+
27
+ ## Inputs
28
+ - repo — the local checkout, default the current directory; `<owner/repo>` comes from `git -C <repo> remote get-url origin`
29
+ - source — where the content lives: OpenWiki pages, the README, or `docs/`
30
+
31
+ ## Steps
32
+ 1. Preflight — `gh auth status`, then `gh api repos/<owner>/<repo>/pages` → run log header — gh missing, unauthenticated or no GitHub remote → log it, give the `gh auth login` / remote hint, stop; 404 → stop with "Pages not enabled: enable it in repo settings", this playbook does not enable Pages; a private repo whose Pages call is refused for plan reasons → stop with "Pages on a private repo needs a paid plan", and never change the repo's visibility. Then openwiki-skill — wiki refreshed or confirmed current → log line — Pages answered and the wiki is current
33
+ 2. readme and documentation — `source` against the code → list of doc gaps in the run log — stops for approval
34
+ 3. bdbhtmlmanueldocs — approved content → site files in `docs/` (or the Pages source path the step 1 response names) — files written, nothing committed; the skill's Pages build-type switch (`gh api -X PUT .../pages`) and its Pages deploy workflow are NOT run here, only the site files are written
35
+ 4. Preview — a local preview link or the path to the built `index.html` in the run log — link or path given
36
+ 5. [GO] git push — the site files committed to the branch and path the step 1 response names as the Pages source; the WAITING FOR GO line names the branch and the file list. The WAITING FOR GO line also says: a Pages site of a private repo is public. The run stops here until the human types GO. The hook guards `git push`; it does not guard `gh api` settings writes, so no Pages setting or workflow is changed in this playbook.
37
+ 6. github — `gh api repos/<owner>/<repo>/pages -q .status` equals `built` (poll, at most 5 minutes), then `curl -sI <pages_url>` → status line in the run log — returns 200
38
+
39
+ Run log: `production_artifacts/pb-docs-site-<date>.md` in the start directory, never committed
40
+
41
+ Rules
42
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
43
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
44
+ - Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR GO: <step>` at each gate.
@@ -19,7 +19,6 @@ outputs: ["brief.md", "tracker.csv", "summary.md", "vendor-requests-draft.md", "
19
19
  verify: "summary.md total recomputed from tracker.csv matches"
20
20
  difficulty: intermediate
21
21
  est_time: 20-40 min
22
- disable-model-invocation: true
23
22
  ---
24
23
 
25
24
  # Event tracker
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: pb-focus-chunks
3
+ description: >-
4
+ Split one big task into chunks of at most 25 minutes, each with a
5
+ done-check, and place the demanding ones in your high-energy hours. Use for
6
+ "split this task", "break it into chunks", "I can't start this", "focus
7
+ plan". Nothing leaves your computer.
8
+ category: bdb-core
9
+ kind: playbook
10
+ trigger: ["split this task", "break it into chunks", "focus plan"]
11
+ inputs: [task, energy_pattern]
12
+ requires:
13
+ skills: [concise-planning]
14
+ agents: []
15
+ mcps: []
16
+ store: []
17
+ go_points: []
18
+ outputs: ["chunks.md", "run-log.md"]
19
+ verify: "every chunk is <= 25 min and has a done-check; sum of chunks equals the estimate"
20
+ difficulty: beginner
21
+ est_time: 5-10 min
22
+ ---
23
+
24
+ # Focus chunks
25
+ What you get: one big task split into 25-minute chunks, ordered by your energy level, each with a done-check.
26
+
27
+ ## Inputs
28
+ - One task, in your own words, with your total time estimate
29
+ - Your energy pattern — asked once, e.g. morning high / afternoon low
30
+ - A save folder — asked once; default `./pb-focus-chunks-<date>/`
31
+
32
+ ## Steps
33
+ 1. Ask once — save folder, task, total estimate, energy pattern → `run-log.md` — all answered
34
+ 2. concise-planning — task and estimate → `chunks.md`: numbered chunks of at most 25 minutes, each with minutes, a done-check and an energy tag (high / low) — every chunk is <= 25 min and has a done-check; the minutes add up to your estimate
35
+ 3. Order `chunks.md` so high-energy chunks fall into your high-energy slots and low-energy chunks into the rest → slot named per chunk — no high-energy chunk sits in a low slot
36
+ 4. Show `chunks.md` in full and apply your edits until you approve — approval logged
37
+
38
+ Nothing in this plan is sent anywhere, so there is no GO step. It only writes into the save folder.
39
+
40
+ Run log: `run-log.md` in the save folder. One line per step as it completes (`N. done|skipped|failed — file — check result`). If a check fails, stop, write the failure into the log and tell the user.
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: pb-handover
3
+ description: >-
4
+ Write a handover note for a colleague from the state of a project folder:
5
+ what is done, what is open, what is risky, the next 3 steps and where
6
+ things live. Sent only after your GO. Use for "handover note", "hand this
7
+ project over", "I'm going on leave, brief my colleague".
8
+ category: bdb-core
9
+ kind: playbook
10
+ trigger: ["handover note", "hand this project over", "brief my colleague"]
11
+ inputs: [project_folder, colleague_name]
12
+ requires:
13
+ skills: [quick-recap, memb-skill, github, "gh (external)"]
14
+ agents: []
15
+ mcps: []
16
+ store: []
17
+ go_points: [send handover]
18
+ outputs: ["handover.md", "run-log.md"]
19
+ verify: "every open item cites a file, commit or PR"
20
+ difficulty: beginner
21
+ est_time: 10-20 min
22
+ ---
23
+
24
+ # Handover note
25
+ What you get: a handover note for a colleague from the state of a project folder.
26
+
27
+ ## Inputs
28
+ - A project folder
29
+ - The colleague's name
30
+ - A save folder — asked once; default `./pb-handover-<date>/`
31
+
32
+ ## Steps
33
+ 1. Ask once — save folder, project folder, colleague name → `run-log.md` — the folder exists
34
+ 2. Read the folder and its git log (read-only); github — only if `gh (external)` is installed: your open pull requests for this repo → list of files, recent commits and open PRs in `run-log.md` — if gh is missing, skipped and logged
35
+ 3. quick-recap — folder state and recent commits → what is done, what is in progress — each point cites a file or commit
36
+ 4. memb-skill — search open commitments for this project → added tagged `[memB]` — skipped and logged if memB is not installed
37
+ 5. Write `handover.md`: done, open, risks, next 3 steps, where things live — every open item cites a file, commit or PR; nothing invented, unknown is `?`
38
+ 6. Show `handover.md` in full and apply your edits until you approve — approval logged
39
+ 7. [GO] Send the handover through a connector you name, or send it yourself — show the recipient (name + address, `?` blocks sending until you fill it) and the full text first. The run stops here until the human types GO. The GO covers exactly the recipient and message shown and nothing else; a different or added recipient needs a fresh GO. The go-gate hook does not guard sending: this [GO] is the only guard.
40
+
41
+ Run log: `run-log.md` in the save folder. One line per step as it completes (`N. done|skipped|failed — file — check result`), and `WAITING FOR GO: <step>` at the gate. Anything other than the literal GO (case-insensitive) is not a GO. If a check fails, stop, write the failure into the log and tell the user.
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: pb-harness-work
3
+ description: >-
4
+ Change the agent harness itself (AOS, AO or CBS hooks, gates, memory,
5
+ permissions, delegation, plugins, bootstrap) the safe way: look up the
6
+ matching harness pattern, design against its gotchas, build with
7
+ /startcycle and a live trail, check every harness, open a PR after GO.
8
+ Use for "change a hook", "fix the go-gate", "harness work", "plugin change".
9
+ category: bdb-core
10
+ kind: playbook
11
+ trigger: ["harness work", "change a hook", "fix the go-gate", "plugin change"]
12
+ inputs: [goal, repo, area]
13
+ requires:
14
+ skills: [agentic-harness-patterns, startcycle, agenttrail, verification-before-completion, git-pr-review, github, "gh (external)"]
15
+ agents: [architect, techlead, reviewer]
16
+ mcps: []
17
+ store: []
18
+ go_points: [git push + gh pr create]
19
+ outputs: ["production_artifacts/00_execution_plan.md", "production_artifacts/pb-harness-work-<date>.md"]
20
+ verify: "npm test exit 0 on the pushed SHA; gh pr view <branch> --json state -q .state == OPEN"
21
+ difficulty: advanced
22
+ est_time: 1-3 h
23
+ ---
24
+
25
+ # Change the harness safely
26
+ What you get: a harness change that was designed against the known gotchas, built and reviewed, tested on every harness, and opened as a PR after your GO.
27
+
28
+ ## Inputs
29
+ - goal — what should change, asked in step 1
30
+ - repo — the local checkout, asked in step 1
31
+ - area — memory, permissions, hooks, delegation, context, skills/plugins, tools or bootstrap, asked in step 1
32
+
33
+ ## Steps
34
+ 1. Ask + preflight (run everything from `<repo>`) — goal, repo, area → run log; default branch: `default=$(git -C <repo> symbolic-ref --short refs/remotes/origin/HEAD); default=${default#origin/}` (the command prints `origin/main`); if `git -C <repo> branch --show-current` equals it, `git -C <repo> switch -c feat/<slug>` — on a feature branch (gh missing or unauthenticated → log it, give the `gh auth login` hint, stop)
35
+ 2. agentic-harness-patterns — area → section and reference file, named in the run log; files live in `skills/global_config/agentic-harness-patterns/references/` (installed copy: the matching directory):
36
+ - memory → `memory-persistence-pattern.md`
37
+ - permissions → `permission-gate-pattern.md`
38
+ - hooks → `hook-lifecycle-pattern.md`
39
+ - delegation → `agent-orchestration-pattern.md` and `task-decomposition-pattern.md`
40
+ - context → `context-engineering-pattern.md`
41
+ - skills/plugins → `skill-runtime-pattern.md`
42
+ - tools → `tool-registry-pattern.md`
43
+ - bootstrap → `bootstrap-sequence-pattern.md`
44
+ - check: the gotcha titles that apply are listed as a checklist (titles only, no copied content)
45
+ 3. startcycle (Architect) — goal and gotcha checklist → `production_artifacts/00_execution_plan.md` with agenttrail components, each with a `files:` line — every listed gotcha is marked addressed or n/a with a reason; a component without `files:` → back to Architect
46
+ 4. agenttrail — `aos-trail . --plan production_artifacts/00_execution_plan.md --no-open` → URL in the run log, before the build nodes start — URL printed; a no-op if startcycle already started the trail (it is safe to run twice)
47
+ 5. startcycle (TechLead → build → Reviewer) — the dispatcher is the main session; the agents never call each other → code and review file — no open `blocking` finding
48
+ 6. Cross-harness check → table in the run log, one row per harness (affected yes/no, file, evidence):
49
+ - Claude: `.claude/hooks/*.mjs`, settings hooks
50
+ - agy: `hooks.json` via installer `mergeAntigravityHooks`
51
+ - OpenCode: `.opencode/plugins/bdb-aos.js`
52
+ - Codex: `.codex/agents/*.toml`, `~/.codex/hooks` and `[features] hooks` in `~/.codex/config.toml` (both written by `installer.js`)
53
+ - check: every "yes" row has a test in `npm test` or a named manual check
54
+ 7. verification-before-completion — `npm test` (and `node scripts/validate-skills.mjs` if skills changed) → fresh output pasted in the run log — exit 0
55
+ 8. git commit — compare `git -C <repo> status --porcelain` with the plan's `files:` lines; unlisted changes outside `production_artifacts/` → stop and ask; stage only the listed files (never the run log or `production_artifacts/`) → SHA in the run log — the commit hook passes
56
+ 9. git-pr-review — commits → PR body in `production_artifacts/pb-harness-work-<date>-pr.md` — body written, nothing posted
57
+ 10. [GO] github — `git -C <repo> push -u origin <branch>`, then `gh pr create -R <owner/repo> --base <default> --head <branch> --title "<title>" --body-file <body>` (`<owner/repo>` from `git -C <repo> remote get-url origin`) — the WAITING FOR GO line names branch, base and title. The run stops here until the human types GO. The hook guards the push only; the PR create is GO by contract.
58
+
59
+ Run log: `production_artifacts/pb-harness-work-<date>.md` in the repo's start directory, never committed
60
+
61
+ Rules
62
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
63
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
64
+ - Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR GO: <step>` at each gate.