@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
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: pb-health-weekly
3
+ description: >-
4
+ Weekly health report over the BDB repos: git and npm version drift and CI
5
+ status as an HTML report with auto-remediation off, red CI routed to
6
+ pb-ci-fix, non-release remediation steps run one at a time after GO. Use for "weekly
7
+ health check", "ecosystem health", "are all repos green and in sync".
8
+ category: saas-ops
9
+ kind: playbook
10
+ trigger: ["weekly health check", "ecosystem health", "are all repos green"]
11
+ inputs: [repo_list?]
12
+ requires:
13
+ skills: [pb-ci-fix, quick-recap, github, "bdb-ecosystem-health (external)", "gh (external)"]
14
+ agents: []
15
+ mcps: []
16
+ store: []
17
+ go_points: [remediation]
18
+ outputs: ["production_artifacts/pb-health-weekly-<date>.md", "<the skill's HTML report>"]
19
+ verify: "report lists every repo with CI conclusion and version drift; each red repo names a pb-ci-fix run or a deferral"
20
+ difficulty: intermediate
21
+ est_time: 15-30 min
22
+ ---
23
+
24
+ # Weekly ecosystem health
25
+ What you get: an HTML health report with git and npm drift and CI status for every repo, red repos handed to pb-ci-fix, and a one-line status.
26
+
27
+ ## Inputs
28
+ - repo_list (optional) — the repos to check; default is the list the bdb-ecosystem-health skill carries
29
+
30
+ ## Steps
31
+ 1. Preflight — `test -f ~/.claude/skills/bdb-ecosystem-health/SKILL.md`, `gh auth status` → run log header — skill absent → stop with "Missing skill: bdb-ecosystem-health (installed locally only, not shipped by AOS). Install it under `~/.claude/skills/` or run this playbook on the machine that has it." and write nothing except the run log; gh missing or unauthenticated → log it, give the `gh auth login` hint, stop
32
+ 2. bdb-ecosystem-health (external) — repo_list → HTML report with auto-remediation OFF (the report only proposes remediation) → report path in the run log — report exists; no remediation command was run
33
+ 3. github — report → table of every repo with version drift and CI conclusion in the run log (`gh run list -R <owner/repo> --limit 1 --json conclusion,headSha` per repo) — every repo listed; stops for approval (the human confirms which red repos to fix and which to defer)
34
+ 4. pb-ci-fix — per approved red repo → one pb-ci-fix run, with its own GO for the push — each red repo names its run log or "deferred: <reason>"
35
+ 5. [GO] remediation — per step the skill proposes in its report, except version bumps, tags, changelog edits and publishes, which are never run here: npm or git version drift is routed to pb-release-aos (or the repo's own release PR) and logged as a proposal; the exact command shown in the WAITING FOR GO line with the repo and what it changes. The run stops here until the human types GO. One GO = one remediation step. The playbook cannot know in advance whether a proposed command is hook-guarded: a `git push`, `npm publish` or `npm version` is guarded by the hook, any other command (an `npm install -g`, a `gh` write, an `rsync`) is not, and for those this GO is the only guard. No proposed steps → step skipped
36
+ 6. quick-recap — run log → final line `🟢|🟡|🔴` with green, red-fixed, red-deferred and drift counts — line written
37
+
38
+ Run log: `production_artifacts/pb-health-weekly-<date>.md` in the start directory, never committed; the HTML report stays where the skill writes it and is not staged
39
+
40
+ Rules
41
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
42
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
43
+ - 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,51 @@
1
+ ---
2
+ name: pb-idea-to-launch
3
+ description: >-
4
+ Turn an idea into a deployed prototype: a spec from brainstorming, a visual
5
+ plan of the ComfyUI workflow, a prototype built with startcycle, one hero
6
+ image, green CI, then push and deploy after separate GOs. Use for "idea to
7
+ launch", "from idea to a live prototype", "build and deploy this idea".
8
+ category: engineering-method
9
+ kind: playbook
10
+ trigger: ["idea to launch", "from idea to live prototype", "build and deploy this idea"]
11
+ inputs: [idea, repo_or_new_project, comfy_workflow, deploy_target]
12
+ requires:
13
+ skills: [bdbrainstorm, grill-me, visual-plan, prototype, startcycle, pb-ci-fix, bdb-deploy, github, "gh (external)"]
14
+ agents: [architect, techlead, reviewer]
15
+ mcps: [comfyui-mcp]
16
+ store: []
17
+ go_points: ["git push", "deploy"]
18
+ outputs: ["production_artifacts/pb-idea-to-launch-<date>.md", "production_artifacts/pb-idea-to-launch-<date>/spec.md", "production_artifacts/pb-idea-to-launch-<date>/plan.md", "production_artifacts/pb-idea-to-launch-<date>/hero.png"]
19
+ verify: "gh run list --commit <sha> conclusion == success; curl -sI <url> returns 200"
20
+ difficulty: advanced
21
+ est_time: 2-6 h
22
+ ---
23
+
24
+ # Idea to deployed prototype
25
+ What you get: an idea turned into a deployed prototype with green CI and one hero image, pushed and deployed only after your GO.
26
+
27
+ ## Inputs
28
+ - idea — a short description, asked once
29
+ - repo_or_new_project — an existing checkout, or a name for a new project
30
+ - comfy_workflow — path to a ComfyUI API-format workflow JSON, required, never invented
31
+ - deploy_target — the host and path or the target the human names, asked once
32
+
33
+ ## Steps
34
+ 1. Preflight — one probe `check_comfyui_health` on `comfyui-mcp` (MCP tools may be deferred in the harness: try to load the tool once via the harness tool search before declaring it missing) → run log header — tool not loaded, call errors, or `status` is not `"online"` → log "Missing MCP: `comfyui-mcp` (`check_comfyui_health` unavailable). Start ComfyUI and check `mcpServers.comfyui-mcp` in your harness config." and mark step 5 to stop; steps 2 to 4 still run
35
+ 2. bdbrainstorm or grill-me — idea → `production_artifacts/pb-idea-to-launch-<date>/spec.md` — spec written, open questions listed
36
+ 3. visual-plan — the workflow and the planned prototype screens → `plan.md` in the same folder — stops for approval
37
+ 4. prototype, then startcycle (architect, techlead, reviewer) — spec and plan → prototype in the repo (a new project: a new local directory, no remote yet) — reviewer reports no open `blocking` finding
38
+ - Commit: a new project gets `git init` first; the reviewed prototype files are staged by explicit path (never `git add -A`) and committed — SHA in the run log; the working tree has no uncommitted product files afterwards
39
+ 5. ComfyUI — the workflow file's text (prompt filled in) as the JSON string for `queue_prompt` → `get_history <prompt_id>` status success → `get_output_media_info` path copied to `hero.png` in the run folder — one image; `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; preflight failed in step 1 → stop with the "Missing MCP" message and write nothing except the run log
40
+ 6. pb-ci-fix (setup path) — run its steps up to and including the commit, but not its push step → workflow files committed, SHA in the run log — validator zero errors, commit hook passes; the push is covered by step 7, so pb-ci-fix's own push GO is skipped here
41
+ 7. [GO] git push — SHA → remote branch (name the branch in the WAITING FOR GO line). A new project without a remote: `gh repo create <owner>/<name> --private --source . --remote origin` runs in the same GO, never public, never any other visibility; the line names owner and name. The run stops here until the human types GO. The hook guards `git push`; `gh repo create` is not hook-guarded, so this GO is its only guard.
42
+ 8. github — SHA → `<id>` from `gh run list --commit <sha> --limit 1 --json databaseId` (wait until it exists), then `gh run watch <id> --exit-status` — `gh run list --commit <sha> --json conclusion -q '.[0].conclusion'` equals `success`; otherwise back to pb-ci-fix's debugging steps, at most 2 cycles, each push behind a fresh GO as in step 7, then stop and escalate
43
+ 9. [GO] bdb-deploy — build from the committed tree only (a clean checkout of the pushed SHA, e.g. `git worktree add <scratch> <sha>`, removed with `git worktree remove <scratch>` (no `--force`) when the deploy ends or the run stops) and rsync to `deploy_target`, the target, the file list and the command shown in full. The run stops here until the human types GO. The rsync deploy is not hook-guarded, so this GO is its only guard.
44
+ 10. Check — `curl -sI <url>` → status line in the run log — returns 200
45
+
46
+ Run log: `production_artifacts/pb-idea-to-launch-<date>.md` in the start directory, never committed
47
+
48
+ Rules
49
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
50
+ - A failed check stops the run: write the failure into the run log and report. No silent retries beyond what a step names.
51
+ - 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,46 @@
1
+ ---
2
+ name: pb-image-to-3d
3
+ description: >-
4
+ Turn one reference image into a cleaned, scaled 3D asset: your own
5
+ image-to-3D ComfyUI workflow makes the mesh, Blender decimates it to a poly
6
+ budget, fixes scale, origin and material, and exports a .glb. Use for
7
+ "image to 3D", "make a 3D model from this picture", "photo to glb".
8
+ category: media-eventtech
9
+ kind: playbook
10
+ trigger: ["image to 3D", "3D model from this picture", "photo to glb"]
11
+ inputs: [image, comfy_workflow, poly_budget, project]
12
+ requires:
13
+ skills: [bdb-blender-mcp, godmode-3d-creation]
14
+ agents: []
15
+ mcps: [comfyui-mcp, bdb_blender_mcp]
16
+ store: []
17
+ go_points: []
18
+ outputs: ["renders/<project>/asset.glb", "renders/<project>/preview.png", "production_artifacts/pb-image-to-3d-<date>.md"]
19
+ verify: "asset.glb exists; Blender reports face count <= budget and non-zero dimensions"
20
+ difficulty: advanced
21
+ est_time: 30-90 min
22
+ ---
23
+
24
+ # Image to 3D asset
25
+ What you get: a cleaned, scaled `.glb` from one reference image, with a preview you approved.
26
+
27
+ ## Inputs
28
+ - image — the reference image path
29
+ - comfy_workflow — path to a ComfyUI API-format workflow JSON that contains the image-to-3D nodes; required, never invented (no TripoSR or TRELLIS server ships with AOS)
30
+ - poly_budget — maximum face count
31
+ - project — a slug for `renders/<project>/`
32
+
33
+ ## Steps
34
+ 1. Preflight — one probe per server, before any file is written: `check_comfyui_health` on `comfyui-mcp`; `get_scene_info` on `bdb_blender_mcp`. 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 ComfyUI `status` is not `"online"` → stop with "Missing MCP: `<server>` (`<tool>` unavailable). Start <ComfyUI|Blender and click Connect to Claude in the BlenderMCP sidebar tab> and check `mcpServers.<server>` in your harness config." and write nothing except the run log — both probes answered
35
+ 2. Ask — image, comfy_workflow path, poly_budget, project slug, target size in metres → run log and `renders/<project>/` — all answered, image and workflow files exist
36
+ 3. ComfyUI — the workflow file's text with the image filled in as the JSON string for `queue_prompt` → `get_history <prompt_id>` status success → `get_output_media_info` path of the mesh file — a mesh file exists; `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 import nothing
37
+ 4. Blender (bdb-blender-mcp, godmode-3d-creation) — mesh file → via `execute_blender_code`: import, Decimate modifier down to poly_budget, scale to the target size, origin to base centre, one material, and report face count and dimensions; `get_scene_info` as the cross-check — face count <= poly_budget and non-zero dimensions; save the Blender project first, since scripted code can crash the session
38
+ 5. Preview — a viewport render saved to `renders/<project>/preview.png` via `execute_blender_code` — file exists — stops for approval (taste review); changes loop back to step 4
39
+ 6. Export — `execute_blender_code` runs the glTF binary export → `renders/<project>/asset.glb` — file exists and is larger than 0 bytes; re-import the file or read the exported object stats and log face count and dimensions again
40
+
41
+ Run log: `production_artifacts/pb-image-to-3d-<date>.md` in the start directory, never committed
42
+
43
+ Rules
44
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
45
+ - Write one run-log line per step as it completes (`N. done|skipped|failed — artifact — check result`) and `WAITING FOR APPROVAL: <step>` at each stop.
46
+ - This playbook has no GO step: it writes only under `renders/<project>/` and publishes nothing.
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: pb-inbox-zero
3
+ description: >-
4
+ Sort an email backlog into reply, delegate, archive and ignore, and draft
5
+ the replies. Nothing is sent without your GO. Use for "inbox zero", "sort
6
+ my mail", "clear my email backlog", "draft replies to my mail".
7
+ category: bdb-core
8
+ kind: playbook
9
+ trigger: ["inbox zero", "sort my mail", "email backlog"]
10
+ inputs: [mail_export_folder, connector?]
11
+ requires:
12
+ skills: [memb-skill]
13
+ agents: []
14
+ mcps: []
15
+ store: [email-ops]
16
+ go_points: [send replies]
17
+ outputs: ["triage.md", "drafts.md", "run-log.md"]
18
+ verify: "every mail in the export appears exactly once in triage.md"
19
+ difficulty: beginner
20
+ est_time: 10-20 min
21
+ ---
22
+
23
+ # Inbox zero
24
+ What you get: your email backlog sorted into reply / delegate / archive / ignore, with reply drafts. Nothing is sent without your GO.
25
+
26
+ ## Inputs
27
+ - A mail export folder (.eml or .mbox) — exported from your mail app; there is no mail connector configured by default
28
+ - A connector for sending — optional, you name it
29
+ - A save folder — asked once; default `./pb-inbox-zero-<date>/`
30
+
31
+ ## Steps
32
+ 1. Ask once — save folder, mail export folder, optional sending connector (email-ops if `test -d ~/.claude/skills/email-ops` passes; absent → logged "Missing store item: email-ops, install via aos-store" and the run continues with the connector the human names, or none) → `run-log.md` — the export folder holds at least one .eml or .mbox; if you have neither an export nor a connector, stop with `Missing mail source: export your inbox to .eml/.mbox` and write nothing but the run log
33
+ 2. Read every mail → `triage.md`, one row per mail: sender, subject, date, class (reply / delegate / archive / ignore), one-line reason, source file — every mail in the export appears exactly once; the row count equals the mail count
34
+ 3. memb-skill — optional, ask first: search open commitments to the senders to inform the class — skipped and logged if memB is not installed
35
+ 4. For each reply row → `drafts.md`: recipient as name + address (`?` blocks sending until you fill it), subject, body — draft only, nothing is sent
36
+ 5. Show `triage.md` and `drafts.md` in full and apply your edits until you approve — approval logged
37
+ 6. [GO] Send the replies through the connector you named — show every recipient 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 `drafts.md`. The go-gate hook does not guard sending: this [GO] is the only guard. Without a connector you copy the drafts yourself and the hand-off is logged.
38
+
39
+ 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,41 @@
1
+ ---
2
+ name: pb-invoice-check
3
+ description: >-
4
+ Check invoices and receipts line by line against your offers and list what
5
+ matches, what differs and what has no offer. Nothing is paid or sent. Use
6
+ for "check my invoices", "match invoices to offers", "does this invoice
7
+ match the quote".
8
+ category: bdb-core
9
+ kind: playbook
10
+ trigger: ["check my invoices", "match invoices to offers", "invoice check"]
11
+ inputs: [invoices_folder, offers_folder]
12
+ requires:
13
+ skills: [pb-offer]
14
+ agents: []
15
+ mcps: []
16
+ store: []
17
+ go_points: []
18
+ outputs: ["invoices.csv", "check.md", "run-log.md"]
19
+ verify: "every PDF in the folder has exactly one row; every total recomputed from its lines"
20
+ difficulty: beginner
21
+ est_time: 10-20 min
22
+ ---
23
+
24
+ # Invoice check
25
+ What you get: invoices and receipts sorted and checked line by line against the matching offers.
26
+
27
+ ## Inputs
28
+ - An invoices folder with PDFs
29
+ - An offers folder — the `offer.md` files from pb-offer
30
+ - A save folder — asked once; default `./pb-invoice-check-<date>/`
31
+
32
+ ## Steps
33
+ 1. Ask once — save folder, invoices folder, offers folder → `run-log.md`; list the PDFs. `pdftotext` is not installed, so you read each PDF with the harness PDF read; a PDF it cannot read becomes a row with status `unread` and the run continues — you may paste its text later
34
+ 2. Per readable PDF → `invoices.csv`, columns file, vendor, date, number, net, VAT, total, status — a field that is not on the invoice is `?`; every PDF in the folder has exactly one row
35
+ 3. Match each invoice to an offer by vendor, client and items → matched offer named in `invoices.csv`; no offer found → status `no offer`
36
+ 4. Write `check.md`: per invoice match / mismatch (which line, how much it differs) / no offer / unread — every total recomputed from its lines; the recomputed value and the printed value are both shown
37
+ 5. Show `invoices.csv` and `check.md` in full and apply your edits until you approve — approval logged
38
+
39
+ Nothing is paid or sent, so there is no GO step. The run only reads the two folders and writes into the save folder.
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`). If a check fails, stop, write the failure into the log and tell the user.
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: pb-landing-page
3
+ description: >-
4
+ Build and launch a landing page: confirmed copy without invented claims, a
5
+ generated page in your brand tokens, UI and SEO review, deploy only after
6
+ GO, then a check on the live URL. Use for "landing page", "launch page for
7
+ this product", "ship a one-pager".
8
+ category: design-ui-ux
9
+ kind: playbook
10
+ trigger: ["landing page", "launch page for this product", "ship a one-pager"]
11
+ inputs: [brief, brand_tokens, deploy_target, launch_video?]
12
+ requires:
13
+ skills: [copywriting, landing-page-generator, godmode-ui-ux, ui-review, seo-audit, bdb-deploy, vercel-deployment, pb-launch-video]
14
+ agents: []
15
+ mcps: [chrome-devtools]
16
+ store: []
17
+ go_points: [deploy]
18
+ outputs: ["<page source>", "production_artifacts/pb-landing-page-<date>.md"]
19
+ verify: "curl -sI <url> returns 200; seo-audit on the live URL has zero blocking items"
20
+ difficulty: intermediate
21
+ est_time: 1-3 h
22
+ ---
23
+
24
+ # Landing page launch
25
+ What you get: a live landing page with checked copy, SEO basics and, if you have one, a launch video.
26
+
27
+ ## Inputs
28
+ - brief — product brief: audience, offer, proof you can show
29
+ - brand_tokens — path to the design tokens or brand notes
30
+ - deploy_target — `bdb-deploy` (rsync over SSH) or `vercel`, with the target host or project
31
+ - launch_video (optional) — an mp4 from pb-launch-video, used as the hero video
32
+
33
+ ## Steps
34
+ 1. Ask — brief, brand_tokens, deploy_target, launch_video → run log — all answered; token path exists; `chrome-devtools` is optional, if its tools are not loaded the screenshot in step 3 is skipped and logged
35
+ 2. copywriting — brief → confirmed brief, then page copy in the run folder — brief confirmed by the human, no claim without a source in the brief (no fabricated numbers, logos or quotes) — stops for approval
36
+ 3. landing-page-generator + godmode-ui-ux — approved copy, brand_tokens, launch_video → page source in the project — page opens locally; `puppeteer_navigate` and `puppeteer_screenshot` of the local page attached to the run log when chrome-devtools is available
37
+ 4. ui-review + seo-audit — page → findings table in the run log — no open blocking finding; fixes applied and rechecked before step 5
38
+ 5. [GO] deploy — via bdb-deploy (rsync) or vercel-deployment (`vercel deploy`), target host or project and the file list named in the WAITING FOR GO line. The run stops here until the human types GO. Neither command is hook-guarded, so this GO is the only guard. One GO = one deploy.
39
+ 6. Live check — `curl -sI <url>` and seo-audit on the live URL → run log — status 200 and zero blocking items; otherwise stop and report, no redeploy without a fresh GO at step 5
40
+
41
+ Run log: `production_artifacts/pb-landing-page-<date>.md` in the start directory, never committed
42
+
43
+ Rules
44
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
45
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
46
+ - 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,49 @@
1
+ ---
2
+ name: pb-launch-video
3
+ description: >-
4
+ Turn a live app or landing page into a short launch video: composition
5
+ brief, render in Hyperframes or Remotion, an ffprobe check per format,
6
+ publish hand-off only after GO. Use for "launch video", "make a video of
7
+ the shipped app", "promo clip for the landing page".
8
+ category: media-eventtech
9
+ kind: playbook
10
+ trigger: ["launch video", "video of the shipped app", "promo clip for the landing page"]
11
+ inputs: [url, project, length, formats, render_tool]
12
+ requires:
13
+ skills: [brag, remotion, "hyperframes (external)", "ffprobe (external)"]
14
+ agents: []
15
+ mcps: []
16
+ store: []
17
+ go_points: [publish]
18
+ outputs: ["renders/<project>/launch_<fmt>.mp4", "renders/<project>/publish.md", "production_artifacts/pb-launch-video-<date>.md"]
19
+ verify: "ffprobe shows the asked WxH and duration per file"
20
+ difficulty: intermediate
21
+ est_time: 30-90 min
22
+ ---
23
+
24
+ # Launch video of a shipped app
25
+ What you get: a short launch video per format, checked with ffprobe, handed off for publishing after your GO.
26
+
27
+ ## Inputs
28
+ - url — the live URL of the shipped app or landing page (for example from pb-landing-page)
29
+ - project — a slug for `renders/<project>/`
30
+ - length — target duration in seconds
31
+ - formats — for example 16:9 (1920x1080) and 9:16 (1080x1920)
32
+ - render_tool — `hyperframes` or `remotion` (remotion needs an existing Remotion project)
33
+
34
+ ## Steps
35
+ 1. Preflight — ask render_tool first; then `command -v ffprobe` and, for hyperframes, `test -f ~/.claude/skills/hyperframes/SKILL.md`. ffprobe missing → stop with "Missing tool: ffprobe. Install ffmpeg and rerun." Hyperframes missing → stop with "Missing skill: hyperframes (installed locally only, not shipped by AOS). Install it, or rerun with render_tool = remotion and the path of an existing Remotion project." Remotion chosen without an existing project → stop and ask for its path. Write nothing except the run log on a stop — all probes answered
36
+ 2. Ask — url, project slug, length, formats, render_tool → run log and `renders/<project>/` — all answered; `curl -sI <url>` returns 200
37
+ 3. brag — url → composition brief in `renders/<project>/brief.md` (scenes, copy lines, length, formats; brag's brief stage only, the render choice stays with render_tool) — stops for approval
38
+ 4. Render — either way one file per format:
39
+ - hyperframes: brag with hyperframes → `renders/<project>/launch_<fmt>.mp4`
40
+ - remotion: from the Remotion project dir, `npx remotion render <Composition> <out>` per format (network/npm on first run needs approval)
41
+ 5. ffprobe — per file: `ffprobe -v error -select_streams v:0 -show_entries stream=width,height:format=duration -of json <file>` → WxH and duration in the run log — equals the asked WxH, duration within 1 s of length; on a mismatch stop with "export <format> has WxH, expected ...", do not publish, invent no conversion command; then the clips stop for approval (taste review)
42
+ 6. [GO] publish — 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
43
+
44
+ Run log: `production_artifacts/pb-launch-video-<date>.md` in the start directory, never committed
45
+
46
+ Rules
47
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
48
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
49
+ - 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-machine-setup
3
+ description: >-
4
+ Bring a new machine to a verified AOS installation: read-only doctor
5
+ baseline, install after GO, MCP servers wired per harness with the configs
6
+ backed up first, memB and OpenWiki checks, and a second doctor run for the
7
+ delta. Use for "set up this machine", "onboard a new computer", "install AOS
8
+ on this laptop".
9
+ category: bdb-core
10
+ kind: playbook
11
+ trigger: ["set up this machine", "onboard a new computer", "install AOS on this machine"]
12
+ inputs: [machine_role, harnesses]
13
+ requires:
14
+ skills: [aos-setup, mcp-manage, memb-skill, openwiki-skill, "node (external)"]
15
+ agents: []
16
+ mcps: []
17
+ store: []
18
+ go_points: [install]
19
+ outputs: ["production_artifacts/pb-machine-setup-<date>.md", "production_artifacts/pb-machine-setup-<date>/config-backup/"]
20
+ verify: "second doctor run shows zero failing rows, or each remaining one is logged with its fix hint"
21
+ difficulty: intermediate
22
+ est_time: 30-60 min
23
+ ---
24
+
25
+ # New machine to a verified AOS install
26
+ What you get: a machine with AOS, MCP servers, hooks, memB and OpenWiki installed and checked by the doctor, with a before-and-after report and a backup of every harness config that was edited.
27
+
28
+ ## Inputs
29
+ - machine_role — `dev`, `show` or `server`, asked if missing; a `server` skips the desktop-only rows (LaunchAgents, Synapse) and logs that choice
30
+ - harnesses — the harnesses to wire (Claude Code, Antigravity, Codex, OpenCode, Cursor, Roo), asked if missing; only these are touched
31
+
32
+ ## Steps
33
+ 1. aos-setup (Measure) — `command -v node` (Node 22 or newer, else stop with an install hint), then the doctor read-only, exactly as the aos-setup skill gives it: `node skills/global_config/aos-setup/scripts/aos-doctor.mjs` from the AOS repo, or `node ~/.claude/skills/aos-setup/scripts/aos-doctor.mjs` from an installed copy → baseline table (failing rows with their fix commands) in the run log — doctor ran, exit code and failing-row count logged; nothing was installed or edited. Then the backup: copy every harness config of the chosen harnesses (for example `~/.claude.json`, `~/.gemini/config/mcp_config.json`, `~/.codex/config.toml`, `opencode.jsonc`) into `production_artifacts/pb-machine-setup-<date>/config-backup/` and log the copied paths; a config that is missing is logged, not created — backup files exist before step 2, because the installer itself rewrites the harness configs
34
+ 2. [GO] install — the install or update commands aos-setup section 3 gives for the harnesses chosen, for example `npx -y @hybridlabor-api/aos@latest` — the WAITING FOR GO line shows the exact command, the harness list and the backup path (and the installer's `--dry-run` output if aos-setup section 3 offers it). The run stops here until the human types GO. The hook does not guard npm installs, so this GO is the only guard; the installed `aos` binary is never run to inspect the version (it starts the full installer and rewrites harness configs).
35
+ 3. mcp-manage — chosen harnesses → wire the MCP servers the machine_role needs per harness → server list per harness in the run log — this step never edits a config that step 1 has not backed up; a missing config is logged, not created blind
36
+ 4. memb-skill and openwiki-skill — memB engine, MCP registration and ambient hook; OpenWiki CLI, `~/.openwiki/.env` credentials and refresh daemon → check results in the run log — each check passes or is logged with its fix hint from aos-setup; credentials are never written into the run log
37
+ 5. aos-setup (Verify) — the doctor again, same command as step 1 → delta (fixed, still failing, new) in the run log — zero failing rows, or each remaining one logged with its fix hint and a note whether it is deliberate for this machine_role
38
+
39
+ Run log: `production_artifacts/pb-machine-setup-<date>.md` in the start directory, never committed; the config backups are 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,53 @@
1
+ ---
2
+ name: pb-master
3
+ description: >-
4
+ Run one control session over several Claude Code, Codex or OpenCode
5
+ sessions: roster, status board, GO board, GO <session> tokens, idle
6
+ notices and a handover file. Use for "master session", "supervise my
7
+ sessions", "run several agents", "one control window".
8
+ category: bdb-core
9
+ kind: playbook
10
+ trigger: ["master session", "supervise my sessions", "run several agents"]
11
+ inputs: [plan?, workers?]
12
+ requires:
13
+ skills: [master-session, agenttrail, stay-within-limits, "claude (external)", "aos-acp (external)"]
14
+ agents: []
15
+ mcps: []
16
+ store: []
17
+ go_points: [spawn workers, "GO <session>"]
18
+ outputs: ["docs/sessions/master-<date>.md", "production_artifacts/pb-master-<date>.md"]
19
+ verify: "handover lists every roster session with open/closed GO state; no file older than 10 min in ~/.aos/go/ unless listed as stale in the handover"
20
+ difficulty: advanced
21
+ est_time: 15 min setup, then session-long
22
+ ---
23
+
24
+ # One control session over several agents
25
+ What you get: a live roster, status board and GO board for your agent sessions, GO tokens relayed per session, and a handover file.
26
+
27
+ ## Inputs
28
+ - plan (optional) — a plan file for the trail board, e.g. `production_artifacts/00_execution_plan.md`
29
+ - workers (optional) — sessions to spawn (name, cwd or worktree, model, prompt) or to adopt (already running)
30
+
31
+ ## Steps
32
+ 1. Preflight — `command -v claude`, `command -v aos-trail`, `command -v aos-acp` → run log header — claude and aos-trail present, else stop with an install hint; `aos-acp` missing → log "aos-acp not on PATH" and look for `bin/aos-acp.mjs`: `p="$(dirname "$(readlink -f "$(command -v aos-trail)")")/../../../../bin/aos-acp.mjs"; test -f "$p"` (or the repo path the human gives), run it as `node "$p"` in place of `aos-acp`; missing → Claude workers only (logged); read `docs/sessions/master-*.md` if one exists (the previous handover)
33
+ 2. master-session (Roster) — `ListAgents` minus self → roster table (name, repo@branch, adopted or spawned) in the run log — stops for approval (the human confirms scope)
34
+ 3. agenttrail — plan given → `aos-trail . --plan <plan> --no-open` → board URL in the run log; no plan → `aos-trail . --no-open` (file activity only), logged — URL printed (output says "already running" → log it as "existing map", its plan is unchanged); runs before any worker is spawned, so no spawn line exists in the run log before the board URL line
35
+ 4. [GO] spawn — worker list (name, cwd or worktree, model, prompt) shown in full, then one line per worker:
36
+ - Claude: `(cd <cwd> && claude --bg --name <n> --permission-mode auto --model <opus|sonnet|haiku> "<prompt>")` (`claude` has no cwd flag; prompt before any `--disallowedTools`)
37
+ - Codex or OpenCode: `aos-acp <codex|opencode> --name <n> --cwd <worktree> --prompt "<task>" --go-wait 600` in the background, log `~/.aos/acp/<n>.jsonl`
38
+ - agy: adopt-only (an already running session, no spawn); never `aos-acp agy`, the adapter is third-party and unverified (`bin/aos-acp.mjs` lines 26+)
39
+ - Never `aos-acp claude` (no model flag), never `--model fable`, never omit `--model`
40
+ - The run stops here until the human types GO. The hook does not guard `claude --bg`, so GO is by contract. Check: every spawned name shows in `ListAgents` or has an ACP log
41
+ - Adopt-only roster → step skipped
42
+ 5. master-session (Status) — master-session Step 2 template verbatim, reply in at most 10 lines, one `SendMessage` per session → replies in the run log — every in-scope session replied or is marked "no reply"
43
+ 6. master-session (GO board) — replies → GO board block per session, `GO needed` commands verbatim → board in the run log — no paraphrased command
44
+ 7. [GO] token relay — the human types `GO <session>` in the master (`go-token.mjs` writes `~/.aos/go/<session>.token`); the master then tells that worker only "retry the blocked command". The run stops here until the human types `GO <session>`. The master never types or forwards a GO itself, and any other human message cancels a pending token — the worker's log shows the command ran
45
+ 8. Idle rules — `notify_when_idle` only after sending a session work; no polling, no "are you done?" → idle events in the run log; between waves a stay-within-limits check, logged — events logged
46
+ 9. Handover — roster, last GO board, open GO items, who waits on whom, next command → `docs/sessions/master-<date>.md` (outside a repo: `~/.aos/handover/`) — every roster session listed with its GO state; `ls ~/.aos/go/` has no token older than 10 min unless listed as stale in the handover (report stale ones, do not delete them)
47
+
48
+ Run log: `production_artifacts/pb-master-<date>.md` in the start directory; the run log and the handover file `docs/sessions/master-<date>.md` are never staged or committed
49
+
50
+ Rules
51
+ - Anything other than the literal GO (case-insensitive; in step 7 `GO <session>`) is not a GO; a GO covers only that one step, one time.
52
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
53
+ - 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: ["notes.md", "decisions.md", "actions.md", "followup-draft.md", "run-lo
19
19
  verify: "every decision and action in the files cites a transcript line"
20
20
  difficulty: beginner
21
21
  est_time: 10-20 min
22
- disable-model-invocation: true
23
22
  ---
24
23
 
25
24
  # Meeting notes and action list
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: pb-newsletter
3
+ description: >-
4
+ Turn a pb-ship recap, a changelog range or a quick recap into a newsletter
5
+ email draft where every claim cites a source line, and send it only after
6
+ GO. Use for "newsletter from the recap", "write the release newsletter",
7
+ "email update from the changelog".
8
+ category: design-ui-ux
9
+ kind: playbook
10
+ trigger: ["newsletter from the recap", "release newsletter", "email update from the changelog"]
11
+ inputs: [recap, audience]
12
+ requires:
13
+ skills: [quick-recap, copywriting, pb-ship]
14
+ agents: []
15
+ mcps: []
16
+ store: [brand-voice, email-ops]
17
+ go_points: ["send newsletter"]
18
+ outputs: ["facts.md", "newsletter.md", "run-log.md"]
19
+ verify: "every product claim in newsletter.md cites a line in facts.md"
20
+ difficulty: intermediate
21
+ est_time: 20-40 min
22
+ ---
23
+
24
+ # Newsletter from a recap
25
+ What you get: a newsletter draft (subject, preheader, body) built only from facts you can trace, sent after your GO.
26
+
27
+ ## Inputs
28
+ - recap — a pb-ship run log, a CHANGELOG range, or quick-recap output
29
+ - audience — who reads it, asked once
30
+ - A save folder — asked once; default `./pb-newsletter-<date>/`
31
+
32
+ ## Steps
33
+ 1. Check the store — `test -d ~/.claude/skills/brand-voice` and `test -d ~/.claude/skills/email-ops` → `run-log.md` (create the folder only after the recap file or range is confirmed readable) — an absent item is logged "Missing store item: <name>, install via aos-store" and the run continues with copywriting
34
+ 2. quick-recap — the recap → `facts.md`, one line per fact with its source line or file — every fact cites a source
35
+ 3. brand-voice if present, else copywriting — `facts.md` and the audience → `newsletter.md` with subject, preheader and body, no claim outside `facts.md` — stops for approval, edits applied until approved
36
+ 4. [GO] send newsletter — through a connector the human names (email-ops if present); the recipients or list, the subject and the full text shown first. The run stops here until the human types GO. Without a connector, the GO releases a hand-off file instead: `newsletter.md` with the recipient list, you send it yourself. A sending connector is not hook-guarded, so this GO is its only guard. The GO covers exactly the audience and message shown; a changed audience needs a fresh GO.
37
+
38
+ Run log: `run-log.md` in the save folder, never committed
39
+
40
+ Rules
41
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
42
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
43
+ - 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,39 @@
1
+ ---
2
+ name: pb-offer
3
+ description: >-
4
+ Draft a client offer with line items priced only from your price list, and
5
+ send it only after your GO. Use for "write an offer", "quote for this
6
+ client", "draft a quote", "price this job".
7
+ category: bdb-core
8
+ kind: playbook
9
+ trigger: ["write an offer", "quote for this client", "draft a quote"]
10
+ inputs: [client_brief, price_list]
11
+ requires:
12
+ skills: [bdb-eventagency-skill, copywriting]
13
+ agents: []
14
+ mcps: []
15
+ store: []
16
+ go_points: [send offer]
17
+ outputs: ["offer.md", "run-log.md"]
18
+ verify: "every unit price exists in the price list; total recomputed from line items matches"
19
+ difficulty: beginner
20
+ est_time: 10-20 min
21
+ ---
22
+
23
+ # Client offer
24
+ What you get: a client offer with line items, priced only from your price list.
25
+
26
+ ## Inputs
27
+ - A client brief — a text or document file
28
+ - A price list file — item and unit price per line
29
+ - A save folder — asked once; default `./pb-offer-<date>/`
30
+
31
+ ## Steps
32
+ 1. Ask once — save folder, client brief, price list; also the VAT rate and the offer validity → `run-log.md` — the files are readable
33
+ 2. bdb-eventagency-skill (section "2. Client & Project Intake") — brief → scope and line items; an item with no price in the list is marked `no price`, never priced by guess
34
+ 3. Write `offer.md`: items, quantity, unit price, line total, net total, VAT at the rate you gave, gross total, validity — every unit price exists in the price list; the net total recomputed from the line items matches
35
+ 4. copywriting — brief and `offer.md` → the cover text at the top of `offer.md`; no claims beyond the brief
36
+ 5. Show `offer.md` in full and apply your edits until you approve — approval logged
37
+ 6. [GO] Send the offer 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.
38
+
39
+ 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,50 @@
1
+ ---
2
+ name: pb-open-source
3
+ description: >-
4
+ Prepare a project for open sourcing: a sanitized fork with secrets and
5
+ internal references stripped, a sanitizer verdict, README and LICENSE, then a
6
+ new PRIVATE GitHub repo created and pushed only after GO. The playbook never
7
+ makes the repo public. Use for "open source this project", "make a sanitized
8
+ fork", "prepare a public release".
9
+ category: engineering-method
10
+ kind: playbook
11
+ trigger: ["open source this project", "sanitized fork", "prepare a public release"]
12
+ inputs: [source_repo, target_name, owner, license]
13
+ requires:
14
+ skills: [github-repo, readme, github, "gh (external)"]
15
+ agents: [opensource-forker, opensource-sanitizer]
16
+ mcps: []
17
+ store: []
18
+ go_points: ["gh repo create", "git push"]
19
+ outputs: ["<fork dir>", "<sanitizer report>", "production_artifacts/pb-open-source-<date>.md"]
20
+ verify: "sanitizer verdict PASS or PASS-WITH-WARNINGS logged; gh repo view <owner>/<name> --json visibility -q .visibility == PRIVATE; LICENSE and README.md exist on the pushed default branch (gh api repos/<owner>/<name>/contents/LICENSE and README.md return 200)"
21
+ difficulty: advanced
22
+ est_time: 1-3 h
23
+ ---
24
+
25
+ # Sanitized fork in a new private repo
26
+ What you get: a sanitized copy of the project with README and LICENSE in a new private GitHub repo, with the sanitizer verdict logged. Going public stays your own action, outside this run.
27
+
28
+ ## Inputs
29
+ - source_repo — the local checkout to fork, asked if missing
30
+ - target_name — the new repo name, asked if missing
31
+ - owner — the GitHub user or org for the new repo, asked if missing
32
+ - license — the license id for the LICENSE file (for example MIT or Apache-2.0), asked if missing
33
+
34
+ ## Steps
35
+ 1. opensource-forker (agent) — source_repo → fork dir `<scratch>/<target_name>` (`<scratch>` = `mktemp -d`) and `.env.example`, secrets and internal references stripped, git history cleaned — fork dir exists; the source repo is untouched (`git -C <source_repo> status --short` is unchanged)
36
+ 2. opensource-sanitizer (agent) — fork dir → report with the verdict PASS, FAIL or PASS-WITH-WARNINGS in the run log — FAIL stops the run: the findings are logged, nothing is created or pushed
37
+ 3. github-repo + readme — fork dir, license → README.md and LICENSE in the fork dir following the repo standards — stops for approval (the human reads both files and the warnings from step 2)
38
+ 4. git — `git -C <fork dir> rev-parse --git-dir` (not a repo → `git -C <fork dir> init`), then `git -C <fork dir> add README.md LICENSE` plus each file the forker produced, listed by explicit path (never `-A` or `.`), then `git -C <fork dir> commit -m "Initial sanitized release"` → commit SHA in the run log — `git -C <fork dir> status --short` is empty and README.md and LICENSE are in `git -C <fork dir> ls-tree -r HEAD --name-only`
39
+ 5. [GO] gh repo create — `gh repo create <owner>/<target_name> --private` — the WAITING FOR GO line names owner, name and `--private`. The run stops here until the human types GO. (`gh repo create` is not hook-guarded; this GO is its only guard.)
40
+ 6. github — `gh repo view <owner>/<target_name> --json visibility -q .visibility` → run log line — equals `PRIVATE`, else stop
41
+ 7. [GO] git push — `git -C <fork dir> remote add origin <url>` is part of this step, then the push of the default branch to `origin` — the WAITING FOR GO line names the remote URL, the branch and the commit SHA from step 4. The run stops here until the human types GO. (The hook guards `git push`; the other commands here are not hook-guarded.)
42
+ 8. github — `gh repo view <owner>/<target_name> --json visibility -q .visibility`, then `gh api repos/<owner>/<target_name>/contents/LICENSE` and `.../contents/README.md` → final run log line — LICENSE and README.md both return 200 on the default branch, else stop; the run log ends with the sanitizer verdict and the line "visibility stays PRIVATE; flipping it is the human's own action"
43
+
44
+ Run log: `production_artifacts/pb-open-source-<date>.md` in the start directory, never committed
45
+
46
+ Rules
47
+ - This playbook never runs `gh repo edit --visibility` or any other command that changes visibility.
48
+ - Anything other than the literal GO (case-insensitive) is not a GO; a GO covers only that one step, one time.
49
+ - A failed check stops the run: write the failure into the run log and report. No silent retries.
50
+ - 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.