voidforge-build 23.16.0 → 23.18.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.
- package/dist/.claude/agents/adolin-brand.md +1 -0
- package/dist/.claude/agents/ahsoka-access-control.md +1 -0
- package/dist/.claude/agents/alfred-dependencies.md +1 -0
- package/dist/.claude/agents/alia-threat-detect.md +1 -0
- package/dist/.claude/agents/anakin-dark-side.md +1 -0
- package/dist/.claude/agents/aquaman-deep-dive.md +1 -0
- package/dist/.claude/agents/aragorn-orchestration.md +1 -0
- package/dist/.claude/agents/archer-greenfield.md +1 -0
- package/dist/.claude/agents/armin-clever.md +1 -0
- package/dist/.claude/agents/arwen-ui-polish.md +1 -0
- package/dist/.claude/agents/ashitaka-tech-debt.md +1 -0
- package/dist/.claude/agents/asuka-performance.md +1 -0
- package/dist/.claude/agents/banner-database.md +1 -0
- package/dist/.claude/agents/bashir-field-medic.md +1 -0
- package/dist/.claude/agents/batgirl-detail.md +1 -0
- package/dist/.claude/agents/batman-qa.md +1 -0
- package/dist/.claude/agents/bayta-evals.md +1 -0
- package/dist/.claude/agents/beast-boy-cross-env.md +1 -0
- package/dist/.claude/agents/beerus-destroyer.md +1 -0
- package/dist/.claude/agents/bel-riose-orchestration.md +1 -0
- package/dist/.claude/agents/bliss-ai-safety.md +1 -0
- package/dist/.claude/agents/bo-katan-perimeter.md +1 -0
- package/dist/.claude/agents/bombadil-forge-sync.md +1 -0
- package/dist/.claude/agents/boromir-hubris.md +1 -0
- package/dist/.claude/agents/breeze-platform-relations.md +1 -0
- package/dist/.claude/agents/bucky-legacy.md +1 -0
- package/dist/.claude/agents/bulma-engineering.md +1 -0
- package/dist/.claude/agents/calcifer-daemon.md +1 -0
- package/dist/.claude/agents/cc-persistent-process.md +1 -0
- package/dist/.claude/agents/celeborn-design-system.md +1 -0
- package/dist/.claude/agents/celebrimbor-forge-artist.md +1 -0
- package/dist/.claude/agents/chakotay-bridge.md +1 -0
- package/dist/.claude/agents/chani-worm-rider.md +1 -0
- package/dist/.claude/agents/chewie-dependency-audit.md +1 -0
- package/dist/.claude/agents/constantine-cursed-code.md +1 -0
- package/dist/.claude/agents/coulson-release.md +1 -0
- package/dist/.claude/agents/crusher-diagnostics.md +1 -0
- package/dist/.claude/agents/cyborg-system-integration.md +1 -0
- package/dist/.claude/agents/dalinar-positioning.md +1 -0
- package/dist/.claude/agents/daneel-model-migration.md +1 -0
- package/dist/.claude/agents/data-tech-debt.md +1 -0
- package/dist/.claude/agents/dax-legacy-wisdom.md +1 -0
- package/dist/.claude/agents/deathstroke-adversarial.md +1 -0
- package/dist/.claude/agents/denji-determination.md +1 -0
- package/dist/.claude/agents/din-djarin-bounty.md +1 -0
- package/dist/.claude/agents/dockson-treasury.md +1 -0
- package/dist/.claude/agents/dors-observability.md +1 -0
- package/dist/.claude/agents/ducem-token-economics.md +1 -0
- package/dist/.claude/agents/duncan-relay.md +1 -0
- package/dist/.claude/agents/elrond-ux-strategy.md +1 -0
- package/dist/.claude/agents/eowyn-delight.md +1 -0
- package/dist/.claude/agents/erwin-strategy.md +1 -0
- package/dist/.claude/agents/ezra-catches-missed.md +1 -0
- package/dist/.claude/agents/falcon-migration.md +1 -0
- package/dist/.claude/agents/faramir-judgment.md +1 -0
- package/dist/.claude/agents/faye-resourceful.md +1 -0
- package/dist/.claude/agents/feyd-adversarial.md +1 -0
- package/dist/.claude/agents/flash-rapid-test.md +1 -0
- package/dist/.claude/agents/frieren-long-term.md +1 -0
- package/dist/.claude/agents/frodo-critical-path.md +1 -0
- package/dist/.claude/agents/fury-initiative.md +1 -0
- package/dist/.claude/agents/gaal-prompt-arch.md +1 -0
- package/dist/.claude/agents/galadriel-frontend.md +1 -0
- package/dist/.claude/agents/gamora-perf-assassin.md +1 -0
- package/dist/.claude/agents/gandalf-setup-wizard.md +1 -0
- package/dist/.claude/agents/gimli-performance.md +1 -0
- package/dist/.claude/agents/giyu-silent-guard.md +1 -0
- package/dist/.claude/agents/glorfindel-rendering.md +1 -0
- package/dist/.claude/agents/gohan-hidden-power.md +1 -0
- package/dist/.claude/agents/gojo-infinite-scale.md +1 -0
- package/dist/.claude/agents/goku-scaling.md +1 -0
- package/dist/.claude/agents/green-arrow-precision.md +1 -0
- package/dist/.claude/agents/green-lantern-scenarios.md +1 -0
- package/dist/.claude/agents/groot-caching.md +1 -0
- package/dist/.claude/agents/gurney-delivery.md +1 -0
- package/dist/.claude/agents/haku-deploy-wizard.md +1 -0
- package/dist/.claude/agents/haldir-boundaries.md +1 -0
- package/dist/.claude/agents/han-vuln-hunter.md +1 -0
- package/dist/.claude/agents/hange-experimentation.md +1 -0
- package/dist/.claude/agents/hawkgirl-regression-sweep.md +1 -0
- package/dist/.claude/agents/heero-mission-deploy.md +1 -0
- package/dist/.claude/agents/hera-navigation.md +1 -0
- package/dist/.claude/agents/hill-mission-control.md +1 -0
- package/dist/.claude/agents/hober-tool-schema.md +1 -0
- package/dist/.claude/agents/hoid-copywriting.md +1 -0
- package/dist/.claude/agents/howl-migration.md +1 -0
- package/dist/.claude/agents/janeway-novel-arch.md +1 -0
- package/dist/.claude/agents/janov-context-eng.md +1 -0
- package/dist/.claude/agents/jean-pragmatic.md +1 -0
- package/dist/.claude/agents/jessica-voice.md +1 -0
- package/dist/.claude/agents/jet-maintenance.md +1 -0
- package/dist/.claude/agents/jin-disciplined-adv.md +1 -0
- package/dist/.claude/agents/kaji-intelligence.md +1 -0
- package/dist/.claude/agents/kaladin-organic-growth.md +1 -0
- package/dist/.claude/agents/kallen-hard-deploy.md +1 -0
- package/dist/.claude/agents/kanan-intuitive.md +1 -0
- package/dist/.claude/agents/kaworu-solver.md +1 -0
- package/dist/.claude/agents/kelsier-growth.md +1 -0
- package/dist/.claude/agents/kenobi-security.md +1 -0
- package/dist/.claude/agents/kim-api-design.md +1 -0
- package/dist/.claude/agents/kira-pragmatic.md +1 -0
- package/dist/.claude/agents/kishibe-hardening.md +1 -0
- package/dist/.claude/agents/kusanagi-devops.md +1 -0
- package/dist/.claude/agents/la-forge-reliability.md +1 -0
- package/dist/.claude/agents/lang-micro-changes.md +1 -0
- package/dist/.claude/agents/legolas-precision.md +1 -0
- package/dist/.claude/agents/leia-secrets.md +1 -0
- package/dist/.claude/agents/lelouch-orchestration.md +1 -0
- package/dist/.claude/agents/leto-ii-persistence.md +1 -0
- package/dist/.claude/agents/leto-protection.md +1 -0
- package/dist/.claude/agents/levi-deploy.md +1 -0
- package/dist/.claude/agents/liet-kynes-deep-system.md +1 -0
- package/dist/.claude/agents/lift-social-media.md +1 -0
- package/dist/.claude/agents/loki-chaos.md +1 -0
- package/dist/.claude/agents/lucius-config.md +1 -0
- package/dist/.claude/agents/luke-audit-journey.md +1 -0
- package/dist/.claude/agents/manhunter-shapeshifting.md +1 -0
- package/dist/.claude/agents/marsh-competitive-intel.md +1 -0
- package/dist/.claude/agents/maul-red-team.md +1 -0
- package/dist/.claude/agents/merry-pair-review.md +1 -0
- package/dist/.claude/agents/mikasa-protection.md +1 -0
- package/dist/.claude/agents/miles-teg-perf.md +1 -0
- package/dist/.claude/agents/milim-load-test.md +1 -0
- package/dist/.claude/agents/misato-operations.md +1 -0
- package/dist/.claude/agents/mob-capacity.md +1 -0
- package/dist/.claude/agents/mohiam-authentication.md +1 -0
- package/dist/.claude/agents/mon-mothma-security-mgmt.md +1 -0
- package/dist/.claude/agents/mugen-chaos.md +1 -0
- package/dist/.claude/agents/mule-adversarial-ai.md +1 -0
- package/dist/.claude/agents/mustang-cleanup.md +1 -0
- package/dist/.claude/agents/nanami-structured-ops.md +1 -0
- package/dist/.claude/agents/nausicaa-resources.md +1 -0
- package/dist/.claude/agents/navani-technical-seo.md +1 -0
- package/dist/.claude/agents/nebula-optimization.md +1 -0
- package/dist/.claude/agents/nightwing-regression.md +1 -0
- package/dist/.claude/agents/nobara-direct-fix.md +1 -0
- package/dist/.claude/agents/nog-solutions.md +1 -0
- package/dist/.claude/agents/obrien-root-cause.md +1 -0
- package/dist/.claude/agents/odo-structural-anomaly.md +1 -0
- package/dist/.claude/agents/okoye-data-integrity.md +1 -0
- package/dist/.claude/agents/olivier-hardening.md +1 -0
- package/dist/.claude/agents/padme-data-protection.md +1 -0
- package/dist/.claude/agents/paris-route-planner.md +1 -0
- package/dist/.claude/agents/parker-connections.md +1 -0
- package/dist/.claude/agents/paul-orchestration.md +1 -0
- package/dist/.claude/agents/picard-architecture.md +1 -0
- package/dist/.claude/agents/piccolo-tactics.md +1 -0
- package/dist/.claude/agents/pike-bold-decisions.md +1 -0
- package/dist/.claude/agents/pippin-discovery.md +1 -0
- package/dist/.claude/agents/power-chaotic.md +1 -0
- package/dist/.claude/agents/qui-gon-subtle-vulns.md +1 -0
- package/dist/.claude/agents/radagast-edge-cases.md +1 -0
- package/dist/.claude/agents/raoden-conversion.md +1 -0
- package/dist/.claude/agents/raven-deep-analysis.md +1 -0
- package/dist/.claude/agents/red-hood-aggressive.md +1 -0
- package/dist/.claude/agents/rei-dangerous-tasks.md +1 -0
- package/dist/.claude/agents/reigen-debugger.md +1 -0
- package/dist/.claude/agents/rengoku-intense-monitor.md +1 -0
- package/dist/.claude/agents/rex-infrastructure.md +1 -0
- package/dist/.claude/agents/rhodes-production.md +1 -0
- package/dist/.claude/agents/riker-review.md +1 -0
- package/dist/.claude/agents/rimuru-adapter.md +1 -0
- package/dist/.claude/agents/riza-backup.md +1 -0
- package/dist/.claude/agents/rocket-scrappy.md +1 -0
- package/dist/.claude/agents/rogers-api-design.md +1 -0
- package/dist/.claude/agents/romanoff-integrations.md +1 -0
- package/dist/.claude/agents/sabine-unconventional.md +1 -0
- package/dist/.claude/agents/salvor-model-selection.md +1 -0
- package/dist/.claude/agents/samwise-accessibility.md +1 -0
- package/dist/.claude/agents/sarene-outreach.md +1 -0
- package/dist/.claude/agents/scotty-infrastructure.md +1 -0
- package/dist/.claude/agents/seldon-ai.md +1 -0
- package/dist/.claude/agents/senku-provisioning.md +1 -0
- package/dist/.claude/agents/seven-optimization.md +1 -0
- package/dist/.claude/agents/shallan-creative.md +1 -0
- package/dist/.claude/agents/sheeana-transport.md +1 -0
- package/dist/.claude/agents/shuri-innovation.md +1 -0
- package/dist/.claude/agents/siona-evasion.md +1 -0
- package/dist/.claude/agents/sisko-campaign.md +1 -0
- package/dist/.claude/agents/spike-routing.md +1 -0
- package/dist/.claude/agents/spock-schema.md +1 -0
- package/dist/.claude/agents/starfire-brute-force.md +1 -0
- package/dist/.claude/agents/stark-backend.md +1 -0
- package/dist/.claude/agents/steris-budget.md +1 -0
- package/dist/.claude/agents/stilgar-channel-security.md +1 -0
- package/dist/.claude/agents/strange-service-arch.md +1 -0
- package/dist/.claude/agents/sung-workers.md +1 -0
- package/dist/.claude/agents/superman-strength-test.md +1 -0
- package/dist/.claude/agents/suzaku-execution.md +1 -0
- package/dist/.claude/agents/szeth-compliance.md +1 -0
- package/dist/.claude/agents/tanjiro-persistent.md +1 -0
- package/dist/.claude/agents/tchalla-quality.md +1 -0
- package/dist/.claude/agents/thanos-gauntlet.md +1 -0
- package/dist/.claude/agents/theoden-rally.md +1 -0
- package/dist/.claude/agents/thor-queues.md +1 -0
- package/dist/.claude/agents/thufir-protocol-parsing.md +1 -0
- package/dist/.claude/agents/todo-brute-force.md +1 -0
- package/dist/.claude/agents/torres-site-scanner.md +1 -0
- package/dist/.claude/agents/totoro-guardian.md +1 -0
- package/dist/.claude/agents/tpol-disciplined.md +1 -0
- package/dist/.claude/agents/treebeard-deliberation.md +1 -0
- package/dist/.claude/agents/troi-prd-compliance.md +1 -0
- package/dist/.claude/agents/trunks-rollback.md +1 -0
- package/dist/.claude/agents/tuvok-deep-current.md +1 -0
- package/dist/.claude/agents/uhura-integration.md +1 -0
- package/dist/.claude/agents/valkyrie-recovery.md +1 -0
- package/dist/.claude/agents/vegeta-monitoring.md +1 -0
- package/dist/.claude/agents/vin-analytics.md +1 -0
- package/dist/.claude/agents/vision-data-analysis.md +1 -0
- package/dist/.claude/agents/wanda-state.md +1 -0
- package/dist/.claude/agents/wax-paid-ads.md +1 -0
- package/dist/.claude/agents/wayne-ab-testing.md +1 -0
- package/dist/.claude/agents/whis-precision.md +1 -0
- package/dist/.claude/agents/windu-input-validation.md +1 -0
- package/dist/.claude/agents/winry-maintenance.md +1 -0
- package/dist/.claude/agents/wonder-woman-truth.md +1 -0
- package/dist/.claude/agents/worf-security-arch.md +1 -0
- package/dist/.claude/agents/yoda-auth.md +1 -0
- package/dist/.claude/agents/yueh-trust-verify.md +1 -0
- package/dist/.claude/agents/zatanna-impossible.md +1 -0
- package/dist/.claude/agents/zechs-rival.md +1 -0
- package/dist/.claude/commands/assemble.md +6 -0
- package/dist/.claude/commands/gauntlet.md +12 -0
- package/dist/.claude/workflows/assemble-review.workflow.js +117 -0
- package/dist/.claude/workflows/gauntlet.workflow.js +176 -0
- package/dist/CHANGELOG.md +45 -0
- package/dist/CLAUDE.md +1 -0
- package/dist/VERSION.md +3 -1
- package/dist/docs/methods/SUB_AGENTS.md +1 -1
- package/dist/docs/methods/WORKFLOWS.md +76 -0
- package/package.json +2 -2
|
@@ -3,6 +3,7 @@ name: Vin
|
|
|
3
3
|
description: "Analytics and attribution specialist — Mistborn who sees through vanity metrics to real patterns"
|
|
4
4
|
heralding: "A Mistborn lands on the rooftop. Vin burns tin — every metric becomes visible."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Vision
|
|
|
3
3
|
description: "Data analysis specialist — data flow tracing, type inference, computational correctness"
|
|
4
4
|
heralding: "Vision phases through the data layer. Every flow, every type, every transformation — visible."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Wanda
|
|
|
3
3
|
description: "State management specialist — complex transforms, data flow, state machines, reactive patterns"
|
|
4
4
|
heralding: "Reality bends. Wanda reshapes complex state into something that makes sense."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Whis
|
|
|
3
3
|
description: "Configuration tuning — performance tuning, config optimization, parameter precision, resource efficiency"
|
|
4
4
|
heralding: "Whis adjusts the balance with divine calm. Your configuration will be tuned to perfection."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Windu
|
|
|
3
3
|
description: "Input validation enforcer — injection prevention, schema validation, sanitization at every boundary"
|
|
4
4
|
heralding: "Windu ignites the purple blade. Every malicious input will be deflected at the boundary."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Winry
|
|
|
3
3
|
description: "System repair — broken configurations, degraded services, mechanical fixes, infrastructure healing"
|
|
4
4
|
heralding: "Winry picks up her wrench. Your broken infrastructure is getting a proper repair."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Wonder Woman
|
|
|
3
3
|
description: "Truth specialist — cuts through deceptive code, misleading names, hidden assumptions"
|
|
4
4
|
heralding: "The Lasso of Truth wraps around your code. Deceptive naming and hidden assumptions are exposed."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Worf
|
|
|
3
3
|
description: "Security architecture: defensive design, threat modeling, protocol enforcement, attack surface analysis"
|
|
4
4
|
heralding: "Today is a good day to secure your architecture. Worf takes the tactical station."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Yoda
|
|
|
3
3
|
description: "Authentication security master — session management, token lifecycle, auth bypass detection"
|
|
4
4
|
heralding: "Strong in authentication, this one must be. Yoda tests your sessions, he will."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Yueh
|
|
|
3
3
|
description: "Trust verification auditor — integrity checking and betrayal detection in system dependencies"
|
|
4
4
|
heralding: "The conditioning holds — or does it? Yueh verifies trust where betrayal hides."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Zatanna
|
|
|
3
3
|
description: "Impossible bug specialist — makes hidden bugs appear, magical edge cases, unexpected interactions"
|
|
4
4
|
heralding: "Zatanna speaks backwards. The impossible bugs materialize before your eyes."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -3,6 +3,7 @@ name: Zechs
|
|
|
3
3
|
description: "Rival perspective — adversarial architecture review, competitive analysis, weakness exploitation"
|
|
4
4
|
heralding: "The Lightning Count challenges your architecture. A rival's perspective reveals weakness."
|
|
5
5
|
model: sonnet
|
|
6
|
+
effort: medium
|
|
6
7
|
tools:
|
|
7
8
|
- Read
|
|
8
9
|
- Bash
|
|
@@ -67,6 +67,12 @@ Mandatory runtime verification BEFORE code review begins:
|
|
|
67
67
|
|
|
68
68
|
**Gate:** All endpoints return expected status codes. No route collisions. No infinite render loops detected. Update assemble-state.
|
|
69
69
|
|
|
70
|
+
## Workflow Execution — review phases (ADR-067)
|
|
71
|
+
|
|
72
|
+
The **review-heavy fan-out phases** — Phase 3-5 (engage), 7-8 (sentinel), 12 (crossfire), 13 (council) — run as a **Dynamic Workflow** (`.claude/workflows/assemble-review.workflow.js`) over the mission's working diff, so the 15+-agent fan-out stays out of the lead's context (ADR-067; see `docs/methods/WORKFLOWS.md`). The **build/architecture/devops phases (1-2.5, 9) STAY prose orchestration** — they write code, are sequentially dependent, and need lead judgment + `--interactive` gates between them.
|
|
73
|
+
|
|
74
|
+
Run the review workflow as **one workflow run per review pass** so an `--interactive` pause sits at the workflow boundary (workflows take no mid-run input). **Gate (ADR-064):** muster the Silver Surfer + `record-roster.sh` *before* invoking, then `Workflow({ scriptPath: '.claude/workflows/assemble-review.workflow.js', args: { diff, roster } })`. The lead applies fixes from the returned report, then re-runs to re-verify. The phase prose below is the canonical description; `--light`/`--solo` use the raw-Agent fallback (with a `bypass.sh`).
|
|
75
|
+
|
|
70
76
|
## Phase 3 — Review Round 1 (Full Roster — see Agent Deployment Manifest)
|
|
71
77
|
**Fury:** "Picard's team — first pass. Find everything. Full roster deployed."
|
|
72
78
|
|
|
@@ -23,6 +23,18 @@ Opus scans `git diff --stat` and matches changed files against the `description`
|
|
|
23
23
|
|
|
24
24
|
**Dispatch control:** `--light` skips dynamic dispatch (core only). `--solo` runs lead agent only.
|
|
25
25
|
|
|
26
|
+
## Workflow Execution (default — ADR-067)
|
|
27
|
+
|
|
28
|
+
The Gauntlet's 5-round skeleton runs as a **Dynamic Workflow** — `.claude/workflows/gauntlet.workflow.js` — so the 60–80 agents' intermediate findings live in script variables, not the lead's context (only the final synthesis returns). The rounds below define **what** each round does; the workflow **implements** them (discovery → JS dedupe → 3-lens REFUTE verify → crossfire → council). See `docs/methods/WORKFLOWS.md`.
|
|
29
|
+
|
|
30
|
+
**Gate-compliant launch sequence (ADR-064 — the gate now covers the Workflow tool):**
|
|
31
|
+
1. Run the **Silver Surfer** (Agent tool — self-launch always allowed) per the gate header above; announce the heralding.
|
|
32
|
+
2. **Record the roster:** `[ -x scripts/surfer-gate/record-roster.sh ] && bash scripts/surfer-gate/record-roster.sh '<roster-json>' || true` — *before* invoking the workflow, or the gate blocks it.
|
|
33
|
+
3. **Invoke the workflow:** `Workflow({ scriptPath: '.claude/workflows/gauntlet.workflow.js', args: { scope, roster: <Surfer roster>, } })`. The gate allows it (roster recorded); the workflow's internal `agent()` calls are that roster.
|
|
34
|
+
4. **The lead applies fixes** from the returned report, then re-invokes the workflow to re-verify (workflows take no mid-run input — fix application + the Debate Protocol + severity re-rating stay lead/prose judgment).
|
|
35
|
+
|
|
36
|
+
`--light`/`--solo` skip the workflow and use the raw-Agent path below as the fallback (set a `bypass.sh --light`/`--solo` so the gate permits the reduced run). The prose rounds below remain the canonical description of each round.
|
|
37
|
+
|
|
26
38
|
## Round 1 — Discovery (parallel)
|
|
27
39
|
|
|
28
40
|
**Thanos:** "Before I test, I must understand."
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// assemble-review.workflow.js — the REVIEW-heavy phases of /assemble, re-platformed.
|
|
2
|
+
//
|
|
3
|
+
// /assemble's build/architecture/devops phases STAY prose orchestration (they write
|
|
4
|
+
// code, are sequentially dependent, and need lead judgment + --interactive gates
|
|
5
|
+
// between them). Only the read-heavy fan-out phases move here (ADR-067): the 3x code
|
|
6
|
+
// review (engage), 2x security (sentinel), crossfire, and council — run over a single
|
|
7
|
+
// mission's working diff. Run this as ONE workflow per review pass so an --interactive
|
|
8
|
+
// pause sits at the workflow boundary, not mid-run (workflows take no mid-run input).
|
|
9
|
+
//
|
|
10
|
+
// GATE (ADR-064): muster the Surfer + record-roster BEFORE invoking (see assemble.md).
|
|
11
|
+
// Invoke: Workflow({ scriptPath: '.claude/workflows/assemble-review.workflow.js',
|
|
12
|
+
// args: { diff, roster: [{id,name,key,lens}] } })
|
|
13
|
+
|
|
14
|
+
export const meta = {
|
|
15
|
+
name: 'assemble-review',
|
|
16
|
+
description: 'Per-mission review fan-out: engage (code) + sentinel (security) → 3-lens verify → crossfire → council, over the working diff',
|
|
17
|
+
phases: [
|
|
18
|
+
{ title: 'Review', detail: 'engage + sentinel lenses over the diff' },
|
|
19
|
+
{ title: 'Verify', detail: '3-lens adversarial REFUTE on each claim' },
|
|
20
|
+
{ title: 'Crossfire', detail: 'adversaries hunt NEW issues in the diff' },
|
|
21
|
+
{ title: 'Council', detail: 'synthesize survivors by severity' },
|
|
22
|
+
],
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const input = typeof args === 'string' ? JSON.parse(args) : (args || {})
|
|
26
|
+
const diff = input.diff || 'the working-tree diff for this mission (git diff)'
|
|
27
|
+
const roster = Array.isArray(input.roster) && input.roster.length
|
|
28
|
+
? input.roster
|
|
29
|
+
: [
|
|
30
|
+
{ id: 'picard-architecture', name: 'Picard', key: 'arch', lens: 'architecture & pattern compliance' },
|
|
31
|
+
{ id: 'stark-backend', name: 'Stark', key: 'backend', lens: 'API/DB/service correctness' },
|
|
32
|
+
{ id: 'galadriel-frontend', name: 'Galadriel', key: 'ux', lens: 'UX/a11y of changed surfaces' },
|
|
33
|
+
{ id: 'kenobi-security', name: 'Kenobi', key: 'sec', lens: 'auth/injection/secrets/data' },
|
|
34
|
+
{ id: 'maul', name: 'Maul', key: 'redteam', lens: 'red-team the new attack surface' },
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
const FINDINGS = {
|
|
38
|
+
type: 'object', additionalProperties: false,
|
|
39
|
+
required: ['agent', 'findings'],
|
|
40
|
+
properties: {
|
|
41
|
+
agent: { type: 'string' },
|
|
42
|
+
findings: {
|
|
43
|
+
type: 'array',
|
|
44
|
+
items: {
|
|
45
|
+
type: 'object', additionalProperties: false,
|
|
46
|
+
required: ['title', 'severity', 'file', 'evidence'],
|
|
47
|
+
properties: {
|
|
48
|
+
title: { type: 'string' },
|
|
49
|
+
severity: { type: 'string', enum: ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'WARN'] },
|
|
50
|
+
file: { type: 'string' },
|
|
51
|
+
evidence: { type: 'string', description: '≥1 quoted changed line or concrete repro' },
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
}
|
|
57
|
+
const VOTE = { type: 'object', additionalProperties: false, required: ['confirm', 'reason'], properties: { confirm: { type: 'boolean' }, reason: { type: 'string' } } }
|
|
58
|
+
const key = (f) => `${(f.file || '').toLowerCase()}::${(f.title || '').toLowerCase().slice(0, 60)}`
|
|
59
|
+
|
|
60
|
+
// ── Review: engage + sentinel lenses over the DIFF only ───────────────────────
|
|
61
|
+
phase('Review')
|
|
62
|
+
const reviews = (await parallel(roster.map((a) => () =>
|
|
63
|
+
agent(
|
|
64
|
+
`You are ${a.name}. Review ONLY ${diff} through the ${a.lens} lens (do not review unchanged code). Evidence-backed findings only — file:line + a quoted CHANGED line or a real repro. For any access/permission/contract finding, name the governing SSOT and reconcile the fix direction (field report #349).`,
|
|
65
|
+
{ label: `${a.name} · review:${a.key}`, phase: 'Review', schema: FINDINGS, agentType: a.id },
|
|
66
|
+
)
|
|
67
|
+
))).filter(Boolean)
|
|
68
|
+
|
|
69
|
+
const seen = new Map()
|
|
70
|
+
for (const r of reviews) for (const f of (r.findings || [])) { const k = key(f); if (!seen.has(k)) seen.set(k, f) }
|
|
71
|
+
const claims = [...seen.values()]
|
|
72
|
+
log(`Review: ${reviews.length} lenses → ${claims.length} distinct claims over the diff.`)
|
|
73
|
+
|
|
74
|
+
// ── Verify: 3-lens adversarial REFUTE (default-to-refuted; verify the FIX too) ─
|
|
75
|
+
phase('Verify')
|
|
76
|
+
const LENSES = ['correctness', 'reachability', 'refutation']
|
|
77
|
+
const verdicts = await parallel(claims.map((c) => () =>
|
|
78
|
+
parallel(LENSES.map((lens) => () =>
|
|
79
|
+
agent(
|
|
80
|
+
`Adversarially verify via the ${lens} lens, reproducing through the REAL execution path (not a library in isolation): "${c.title}" [${c.severity}] at ${c.file}. Evidence: ${c.evidence}. REFUTE unless you cannot. On the refutation lens, also confirm the implied fix adds no new failure mode (wedge/loop/orphan/double-send/TOCTOU).`,
|
|
81
|
+
{ label: `verify:${lens}:${(c.file || '').slice(0, 24)}`, phase: 'Verify', schema: VOTE },
|
|
82
|
+
)
|
|
83
|
+
)).then((votes) => { const v = votes.filter(Boolean); return { claim: c, confirmVotes: v.filter((x) => x.confirm).length } })
|
|
84
|
+
))
|
|
85
|
+
const confirmed = verdicts.filter(Boolean).filter((v) => v.confirmVotes >= 2).map((v) => v.claim)
|
|
86
|
+
log(`Verify: ${confirmed.length}/${claims.length} survived the 3-lens refute.`)
|
|
87
|
+
|
|
88
|
+
// ── Crossfire: adversaries hunt NEW issues the review cleared ─────────────────
|
|
89
|
+
phase('Crossfire')
|
|
90
|
+
const confirmedKeys = new Set(confirmed.map(key))
|
|
91
|
+
const crossRaw = (await parallel([
|
|
92
|
+
{ id: 'deathstroke', name: 'Deathstroke', key: 'pentest' },
|
|
93
|
+
{ id: 'loki', name: 'Loki', key: 'chaos' },
|
|
94
|
+
].map((a) => () =>
|
|
95
|
+
agent(
|
|
96
|
+
`You are ${a.name}, crossfire adversary over ${diff}. The review already ran — find NEW issues it cleared (bypasses, edge/chaos cases). Evidence-backed only.`,
|
|
97
|
+
{ label: `${a.name} · crossfire:${a.key}`, phase: 'Crossfire', schema: FINDINGS, agentType: a.id },
|
|
98
|
+
)
|
|
99
|
+
))).filter(Boolean)
|
|
100
|
+
const crossNew = []
|
|
101
|
+
for (const r of crossRaw) for (const f of (r.findings || [])) if (!confirmedKeys.has(key(f))) crossNew.push(f)
|
|
102
|
+
const crossConfirmed = (await parallel(crossNew.map((c) => () =>
|
|
103
|
+
agent(`Adversarially verify (default-to-refuted), real execution path: "${c.title}" [${c.severity}] at ${c.file}. ${c.evidence}`,
|
|
104
|
+
{ label: `verify:crossfire:${(c.file || '').slice(0, 20)}`, phase: 'Crossfire', schema: VOTE })
|
|
105
|
+
.then((v) => (v && v.confirm ? c : null))
|
|
106
|
+
))).filter(Boolean)
|
|
107
|
+
log(`Crossfire: ${crossNew.length} new → ${crossConfirmed.length} confirmed.`)
|
|
108
|
+
|
|
109
|
+
// ── Council: synthesize (JS); the lead applies fixes, then re-runs to re-verify ─
|
|
110
|
+
phase('Council')
|
|
111
|
+
const all = [...confirmed, ...crossConfirmed]
|
|
112
|
+
const sev = (s) => all.filter((f) => f.severity === s)
|
|
113
|
+
return {
|
|
114
|
+
diff,
|
|
115
|
+
counts: { claims: claims.length, confirmed: confirmed.length, crossfireConfirmed: crossConfirmed.length },
|
|
116
|
+
critical: sev('CRITICAL'), high: sev('HIGH'), medium: sev('MEDIUM'), low: [...sev('LOW'), ...sev('WARN')],
|
|
117
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// gauntlet.workflow.js — Thanos's Comprehensive Review as a Dynamic Workflow.
|
|
2
|
+
//
|
|
3
|
+
// Re-platforms /gauntlet's hand-fanned 60-80 agent rounds onto the Workflow tool
|
|
4
|
+
// (ADR-067) so intermediate findings live in script variables, not the lead's
|
|
5
|
+
// context. The lead's context only sees the final synthesis.
|
|
6
|
+
//
|
|
7
|
+
// GATE (ADR-064): the Workflow launch is gated. /gauntlet must muster the Silver
|
|
8
|
+
// Surfer + record-roster BEFORE invoking this script (see gauntlet.md). The roster
|
|
9
|
+
// is passed in via `args`; this script does NOT re-select it.
|
|
10
|
+
//
|
|
11
|
+
// What stays PROSE / lead judgment (NOT in this script): severity re-rating debate,
|
|
12
|
+
// the Agent Debate Protocol, and the application of fixes. This script SCHEDULES the
|
|
13
|
+
// find → dedupe → 3-lens-verify → crossfire → council skeleton and returns confirmed
|
|
14
|
+
// findings; the lead applies fixes between runs (workflows take no mid-run input).
|
|
15
|
+
//
|
|
16
|
+
// Invoke: Workflow({ scriptPath: '.claude/workflows/gauntlet.workflow.js',
|
|
17
|
+
// args: { scope, roster: [{id,name,key,domain}], rounds } })
|
|
18
|
+
|
|
19
|
+
export const meta = {
|
|
20
|
+
name: 'gauntlet',
|
|
21
|
+
description: 'Comprehensive review: discovery → strike → 3-lens adversarial verify → crossfire → council (schema-validated)',
|
|
22
|
+
phases: [
|
|
23
|
+
{ title: 'Discovery', detail: 'core domain leads map the surface' },
|
|
24
|
+
{ title: 'Strike', detail: 'Surfer-selected specialists fan out' },
|
|
25
|
+
{ title: 'Verify', detail: '3-lens adversarial REFUTE on every distinct claim' },
|
|
26
|
+
{ title: 'Crossfire', detail: 'adversaries hunt NEW issues' },
|
|
27
|
+
{ title: 'Council', detail: 'synthesize survivors by severity' },
|
|
28
|
+
],
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const input = typeof args === 'string' ? JSON.parse(args) : (args || {})
|
|
32
|
+
const scope = input.scope || 'the working tree / full codebase per gauntlet.md'
|
|
33
|
+
// Surfer-selected specialists (gate-recorded upstream). Fall back to the canonical
|
|
34
|
+
// core leads if no roster was passed (e.g. --light).
|
|
35
|
+
const roster = Array.isArray(input.roster) && input.roster.length
|
|
36
|
+
? input.roster
|
|
37
|
+
: [
|
|
38
|
+
{ id: 'picard-architecture', name: 'Picard', key: 'architecture', domain: 'architecture' },
|
|
39
|
+
{ id: 'stark-backend', name: 'Stark', key: 'backend', domain: 'code/backend' },
|
|
40
|
+
{ id: 'galadriel-frontend', name: 'Galadriel', key: 'ux', domain: 'UX/a11y' },
|
|
41
|
+
{ id: 'kenobi-security', name: 'Kenobi', key: 'security', domain: 'security' },
|
|
42
|
+
{ id: 'kusanagi-devops', name: 'Kusanagi', key: 'devops', domain: 'infra/deploy' },
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
const FINDINGS = {
|
|
46
|
+
type: 'object', additionalProperties: false,
|
|
47
|
+
required: ['agent', 'findings'],
|
|
48
|
+
properties: {
|
|
49
|
+
agent: { type: 'string' },
|
|
50
|
+
findings: {
|
|
51
|
+
type: 'array',
|
|
52
|
+
items: {
|
|
53
|
+
type: 'object', additionalProperties: false,
|
|
54
|
+
required: ['title', 'severity', 'file', 'evidence'],
|
|
55
|
+
properties: {
|
|
56
|
+
title: { type: 'string' },
|
|
57
|
+
severity: { type: 'string', enum: ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'WARN'] },
|
|
58
|
+
file: { type: 'string', description: 'path:line, or "n/a"' },
|
|
59
|
+
evidence: { type: 'string', description: '≥1 quoted code line or a concrete repro; no vibes' },
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const VERDICT = {
|
|
67
|
+
type: 'object', additionalProperties: false,
|
|
68
|
+
required: ['survives', 'confirmVotes', 'finalSeverity', 'rationale'],
|
|
69
|
+
properties: {
|
|
70
|
+
survives: { type: 'boolean', description: 'true only if ≥2 of the 3 lenses confirm AND the fix would not introduce a new failure mode' },
|
|
71
|
+
confirmVotes: { type: 'integer', description: '0-3' },
|
|
72
|
+
finalSeverity: { type: 'string', enum: ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'WARN', 'REFUTED'] },
|
|
73
|
+
rationale: { type: 'string' },
|
|
74
|
+
},
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const key = (f) => `${(f.file || '').toLowerCase()}::${(f.title || '').toLowerCase().slice(0, 60)}`
|
|
78
|
+
|
|
79
|
+
// ── Round 1: Discovery + Round 2/3: Strike ────────────────────────────────────
|
|
80
|
+
phase('Discovery')
|
|
81
|
+
const discovery = (await parallel(roster.slice(0, 5).map((a) => () =>
|
|
82
|
+
agent(
|
|
83
|
+
`You are ${a.name} (${a.domain}). GAUNTLET discovery pass over ${scope}. Map your domain and report concrete, evidence-backed findings only — every finding needs a file:line and a quoted line or a real repro (no speculation). Rate severity honestly.`,
|
|
84
|
+
{ label: `${a.name} · discovery:${a.key}`, phase: 'Discovery', schema: FINDINGS, agentType: a.id },
|
|
85
|
+
)
|
|
86
|
+
))).filter(Boolean)
|
|
87
|
+
|
|
88
|
+
phase('Strike')
|
|
89
|
+
const strikeRoster = roster.length > 5 ? roster.slice(5) : roster
|
|
90
|
+
const strike = (await parallel(strikeRoster.map((a) => () =>
|
|
91
|
+
agent(
|
|
92
|
+
`You are ${a.name} (${a.domain}). GAUNTLET strike pass over ${scope}. Deep, adversarial domain review — find what discovery missed. Evidence-backed findings only (file:line + quoted line/repro).`,
|
|
93
|
+
{ label: `${a.name} · strike:${a.key}`, phase: 'Strike', schema: FINDINGS, agentType: a.id },
|
|
94
|
+
)
|
|
95
|
+
))).filter(Boolean)
|
|
96
|
+
|
|
97
|
+
// ── Dedupe across all domains (plain JS — no agent) ───────────────────────────
|
|
98
|
+
const seen = new Map()
|
|
99
|
+
for (const r of [...discovery, ...strike]) {
|
|
100
|
+
for (const f of (r.findings || [])) {
|
|
101
|
+
const k = key(f)
|
|
102
|
+
if (!seen.has(k)) seen.set(k, { ...f, raisedBy: [r.agent] })
|
|
103
|
+
else seen.get(k).raisedBy.push(r.agent)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const claims = [...seen.values()]
|
|
107
|
+
log(`Discovery+Strike: ${discovery.length + strike.length} agents → ${claims.length} distinct claims (deduped).`)
|
|
108
|
+
|
|
109
|
+
// ── Step 4.5: 3-lens adversarial REFUTE on every distinct claim ───────────────
|
|
110
|
+
// Default-to-refuted. Keep only claims ≥2/3 lenses confirm AND whose fix adds no
|
|
111
|
+
// new failure mode. (Verify-the-FIX, field report #348 #4.)
|
|
112
|
+
phase('Verify')
|
|
113
|
+
const LENSES = ['correctness', 'reachability', 'refutation']
|
|
114
|
+
const verified = await parallel(claims.map((c) => () =>
|
|
115
|
+
parallel(LENSES.map((lens) => () =>
|
|
116
|
+
agent(
|
|
117
|
+
`Adversarially verify this GAUNTLET claim through the ${lens} lens. Claim: "${c.title}" [${c.severity}] at ${c.file}. Evidence: ${c.evidence}. Your job is to REFUTE it — confirm ONLY if you cannot, citing the exact code. For the refutation lens, also check the implied FIX introduces no new failure mode (wedge/loop/orphan/double-send/TOCTOU). Reproduce through the REAL execution path, not a library in isolation (ADR/field report #356).`,
|
|
118
|
+
{ label: `verify:${lens}:${(c.file || '').slice(0, 24)}`, phase: 'Verify', schema: { type: 'object', additionalProperties: false, required: ['confirm', 'reason'], properties: { confirm: { type: 'boolean' }, reason: { type: 'string' } } } },
|
|
119
|
+
)
|
|
120
|
+
)).then((votes) => {
|
|
121
|
+
const v = votes.filter(Boolean)
|
|
122
|
+
const confirmVotes = v.filter((x) => x.confirm).length
|
|
123
|
+
return { claim: c, survives: confirmVotes >= 2, confirmVotes, lensReasons: v.map((x) => x.reason) }
|
|
124
|
+
})
|
|
125
|
+
))
|
|
126
|
+
const confirmed = verified.filter(Boolean).filter((v) => v.survives).map((v) => ({ ...v.claim, confirmVotes: v.confirmVotes }))
|
|
127
|
+
const refuted = verified.filter(Boolean).filter((v) => !v.survives).map((v) => ({ title: v.claim.title, confirmVotes: v.confirmVotes, why: v.lensReasons }))
|
|
128
|
+
log(`Verify: ${confirmed.length} survived 3-lens refute, ${refuted.length} refuted (logged, dropped).`)
|
|
129
|
+
|
|
130
|
+
// ── Round 4: Crossfire — adversaries hunt NEW issues the review cleared ────────
|
|
131
|
+
phase('Crossfire')
|
|
132
|
+
const ADVERSARIES = [
|
|
133
|
+
{ id: 'maul', name: 'Maul', key: 'red-team' },
|
|
134
|
+
{ id: 'deathstroke', name: 'Deathstroke', key: 'pentest' },
|
|
135
|
+
{ id: 'loki', name: 'Loki', key: 'chaos' },
|
|
136
|
+
]
|
|
137
|
+
const crossfireRaw = (await parallel(ADVERSARIES.map((a) => () =>
|
|
138
|
+
agent(
|
|
139
|
+
`You are ${a.name}, a GAUNTLET crossfire adversary over ${scope}. The domain review already ran — hunt NEW issues it cleared (bypasses, chaos/edge cases, exploit chains). Evidence-backed only (file:line + repro).`,
|
|
140
|
+
{ label: `${a.name} · crossfire:${a.key}`, phase: 'Crossfire', schema: FINDINGS, agentType: a.id },
|
|
141
|
+
)
|
|
142
|
+
))).filter(Boolean)
|
|
143
|
+
// New crossfire claims (not already confirmed) get the same one-pass refute.
|
|
144
|
+
const confirmedKeys = new Set(confirmed.map(key))
|
|
145
|
+
const crossNew = []
|
|
146
|
+
for (const r of crossfireRaw) for (const f of (r.findings || [])) if (!confirmedKeys.has(key(f))) crossNew.push(f)
|
|
147
|
+
const crossVerified = await parallel(crossNew.map((c) => () =>
|
|
148
|
+
agent(
|
|
149
|
+
`Adversarially verify (default-to-refuted) this crossfire claim, reproducing through the real execution path: "${c.title}" [${c.severity}] at ${c.file}. Evidence: ${c.evidence}.`,
|
|
150
|
+
{ label: `verify:crossfire:${(c.file || '').slice(0, 24)}`, phase: 'Crossfire', schema: VERDICT },
|
|
151
|
+
).then((v) => (v && v.survives ? { ...c, finalSeverity: v.finalSeverity } : null))
|
|
152
|
+
))
|
|
153
|
+
const crossfireConfirmed = crossVerified.filter(Boolean)
|
|
154
|
+
log(`Crossfire: ${crossNew.length} new claims → ${crossfireConfirmed.length} confirmed.`)
|
|
155
|
+
|
|
156
|
+
// ── Round 5: Council — synthesize survivors by severity (JS; lead applies fixes) ─
|
|
157
|
+
phase('Council')
|
|
158
|
+
const all = [...confirmed, ...crossfireConfirmed]
|
|
159
|
+
const bySeverity = (sev) => all.filter((f) => (f.finalSeverity || f.severity) === sev)
|
|
160
|
+
const report = {
|
|
161
|
+
scope,
|
|
162
|
+
rosterSize: roster.length,
|
|
163
|
+
counts: {
|
|
164
|
+
distinctClaims: claims.length,
|
|
165
|
+
confirmed: confirmed.length,
|
|
166
|
+
refuted: refuted.length,
|
|
167
|
+
crossfireConfirmed: crossfireConfirmed.length,
|
|
168
|
+
},
|
|
169
|
+
critical: bySeverity('CRITICAL'),
|
|
170
|
+
high: bySeverity('HIGH'),
|
|
171
|
+
medium: bySeverity('MEDIUM'),
|
|
172
|
+
low: [...bySeverity('LOW'), ...bySeverity('WARN')],
|
|
173
|
+
refutedLog: refuted, // dropped, but never silently — logged per SUB_AGENTS.md
|
|
174
|
+
}
|
|
175
|
+
log(`Council: ${report.critical.length} Critical · ${report.high.length} High · ${report.medium.length} Medium · ${report.low.length} Low/Warn. Lead applies fixes (workflow takes no mid-run input), then re-runs to re-verify.`)
|
|
176
|
+
return report
|
package/dist/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,51 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## [23.18.0] - 2026-06-13
|
|
10
|
+
|
|
11
|
+
### Workflow re-platform of `/gauntlet` + `/assemble` (ADR-067)
|
|
12
|
+
|
|
13
|
+
The opportunity ADR-064 unblocked. The heavy review commands' deterministic skeletons now run as Dynamic Workflows, so 60–80 agents' intermediate findings live in script variables instead of the lead's context.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **`.claude/workflows/gauntlet.workflow.js`** — the 5-round Gauntlet as a workflow: discovery (parallel core leads) → **plain-JS dedupe** → **3-lens adversarial REFUTE** per claim (schema-validated votes, default-to-refuted, keep ≥2/3, verify-the-FIX, reproduce-through-real-path) → crossfire (adversaries hunt NEW issues) → council (JS synthesis by severity). Refuted claims logged, never silently dropped.
|
|
18
|
+
- **`.claude/workflows/assemble-review.workflow.js`** — the review-heavy `/assemble` phases (engage + sentinel + crossfire + council) over a mission's working diff; one run per pass so `--interactive` pauses at the boundary. Build/architecture/devops phases **stay prose orchestration**.
|
|
19
|
+
- **`docs/methods/WORKFLOWS.md`** — the authoring standard: when-to-use, API (`phase`/`parallel`/`pipeline`/`agent({schema})`), the `args`-as-JSON-string (#363) + label-leading-character (#348) gotchas, the 16/1000 caps (ADR-059), and the **ADR-064 gate-launch sequence** (Surfer → record-roster → Workflow). Added to the CLAUDE.md Docs Reference.
|
|
20
|
+
- **ADR-067** decision record.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- **`gauntlet.md` / `assemble.md`** gain "Workflow Execution" sections: the gate-compliant launch (muster Surfer → record roster → invoke the workflow with the roster in `args`), what's workflow-backed vs prose, and the `--light`/`--solo` raw-Agent fallback. Personas, the Agent Debate Protocol, severity re-rating, and **fix application** stay lead/prose judgment (the lead applies fixes from the returned report, then re-runs to re-verify).
|
|
25
|
+
- **Distribution (Phase 12.75 gate):** `.claude/workflows/` is a new shared file category — added to `prepack.sh` (npm package) and `copy-assets.sh` (CLI `init`) so the scripts reach consumers (they were referenced by the command docs but would not have shipped otherwise — the #297 class).
|
|
26
|
+
|
|
27
|
+
### Validation
|
|
28
|
+
|
|
29
|
+
Both workflow scripts pass `node --check` (ESM, async-wrapped to match the Workflow runtime). The **live end-to-end gauntlet run is the acceptance test** (it launches 30+ real review agents through the now-gated Workflow path); the raw-Agent prose path remains the fallback and canonical description. Dogfooded pre-tag `npm test` (1390/1390) + publish-gate. Dep range `^23.17.0` → `^23.18.0` (ADR-062).
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## [23.17.0] - 2026-06-13
|
|
34
|
+
|
|
35
|
+
### Effort-tiering fleet edit (ADR-054) — verified + applied
|
|
36
|
+
|
|
37
|
+
Closes the M2 deferral from v23.16.0.
|
|
38
|
+
|
|
39
|
+
### Verified
|
|
40
|
+
|
|
41
|
+
- Confirmed against the **official Claude Code sub-agents docs** that `effort` is a supported sub-agent frontmatter field — values `low`/`medium`/`high`/`xhigh`/`max`, "available levels depend on the model" (so Haiku is omitted). It is a recognized key (the docs enumerate the full frontmatter set including `effort`), so adding it cannot break agent loading — the safety concern that justified deferring the fleet edit.
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
|
|
45
|
+
- **All 264 agent definitions** now carry an `effort` tier (frontmatter-only, inserted after `model:`): **20 leads (`model: inherit`) → `effort: xhigh`**, **201 Sonnet specialists → `effort: medium`**, **43 Haiku scouts → omitted**. This is a per-agent reasoning-spend lever independent of model tier — the largest cost lever in the fleet, since ~200 read-and-report specialists no longer run at lead-level reasoning. Idempotent insert; `validate-agent-refs` + full suite **1390/1390** green; frontmatter integrity preserved. (Agent files ship in the methodology package via prepack, so the tiers reach consumers automatically.)
|
|
46
|
+
- Updated **ADR-054** (status → fleet-applied + verification record), **SUB_AGENTS.md** Model Tiering, **COMPATIBILITY.md** effort row (verify-pending → applied).
|
|
47
|
+
|
|
48
|
+
### Pipeline
|
|
49
|
+
|
|
50
|
+
Dogfooded pre-tag `npm test` + publish-gate alignment. Notably the v23.16.0 gate fix was confirmed **live in production this session** — a Workflow launch was correctly BLOCKED until a documented `--light` bypass was set (a reap-vs-fresh-bypass timing race was observed and noted for a future field report). Dep range `^23.16.0` → `^23.17.0` (ADR-062).
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
9
54
|
## [23.16.0] - 2026-06-13
|
|
10
55
|
|
|
11
56
|
### Platform-alignment campaign — ADR-064/065/066 implemented (+ ADR-050/051/054 amended)
|
package/dist/CLAUDE.md
CHANGED
|
@@ -256,6 +256,7 @@ See `/docs/methods/MUSTER.md` for the full Muster Protocol.
|
|
|
256
256
|
| **Time Vault** | `/docs/methods/TIME_VAULT.md` | Seldon — when preserving session intelligence for transfer |
|
|
257
257
|
| **Patterns** | `/docs/patterns/` | When writing code (37 reference implementations) |
|
|
258
258
|
| **Lessons** | `/docs/LESSONS.md` | Cross-project learnings |
|
|
259
|
+
| **Workflows** | `/docs/methods/WORKFLOWS.md` | Dynamic Workflow authoring standard (ADR-067) — when to use, API, gotchas, the ADR-064 gate-launch sequence |
|
|
259
260
|
| **Native Capabilities** | `/docs/NATIVE_CAPABILITIES.md` | Command × native-skill collision tracker (ADR-066) — re-audit each release |
|
|
260
261
|
| **Compatibility** | `/docs/COMPATIBILITY.md` | Node + Claude Code platform floor & feature maturity tags (ADR-065) |
|
|
261
262
|
|
package/dist/VERSION.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Version
|
|
2
2
|
|
|
3
|
-
**Current:** 23.
|
|
3
|
+
**Current:** 23.18.0
|
|
4
4
|
|
|
5
5
|
## Versioning Scheme
|
|
6
6
|
|
|
@@ -14,6 +14,8 @@ This project uses [Semantic Versioning](https://semver.org/):
|
|
|
14
14
|
|
|
15
15
|
| Version | Date | Summary |
|
|
16
16
|
|---------|------|---------|
|
|
17
|
+
| 23.18.0 | 2026-06-13 | **Workflow re-platform of `/gauntlet` + `/assemble` (ADR-067)** — the opportunity ADR-064 unblocked. New `.claude/workflows/gauntlet.workflow.js` (discovery → JS dedupe → 3-lens adversarial REFUTE → crossfire → council, schema-validated) and `assemble-review.workflow.js` (engage+sentinel over a mission diff; build/arch/devops stay prose). New **`docs/methods/WORKFLOWS.md`** authoring standard (API, the #348/#363 gotchas, 16/1000 caps, and the ADR-064 gate-launch sequence: Surfer→record-roster→Workflow). `gauntlet.md`/`assemble.md` gain workflow-execution sections; personas + fix-application + Debate Protocol stay prose. **Distribution gate (Phase 12.75):** `.claude/workflows/` is a new shared category — added to `prepack.sh` (npm) + `copy-assets.sh` (init) so the scripts ship to consumers. Both scripts `node --check`-validated (ESM async-wrapped); the live end-to-end gauntlet run is the acceptance test. Dep `^23.17.0` → `^23.18.0`. |
|
|
18
|
+
| 23.17.0 | 2026-06-13 | **Effort-tiering fleet edit (ADR-054) — verified + applied.** Verified against the official Claude Code sub-agents docs that `effort` is a supported sub-agent frontmatter field (values `low`/`medium`/`high`/`xhigh`/`max`; "available levels depend on the model"). Applied across all 264 agent definitions: **20 leads (`model: inherit`) → `effort: xhigh`, 201 Sonnet specialists → `effort: medium`, 43 Haiku scouts → omitted** (Haiku doesn't support the parameter). Per-agent reasoning-spend lever, independent of model tier — the largest cost lever in the fleet (200 specialists no longer pay lead-level reasoning for read-and-report review). Frontmatter-only, idempotent insert after the `model:` line; `validate-agent-refs` + full suite (1390/1390) green; integrity preserved. Closes the M2 deferral from v23.16.0. Updated ADR-054 (status→fleet-applied), SUB_AGENTS.md, COMPATIBILITY.md. Dep `^23.16.0` → `^23.17.0`. (Aside: confirmed the v23.16.0 gate fix live — a Workflow launch was correctly BLOCKED this session until a `--light` bypass was set; noted a reap-vs-fresh-bypass timing race for a future field report.) |
|
|
17
19
|
| 23.16.0 | 2026-06-13 | Platform-alignment campaign — implements the ADR set from `/architect --plan` (→ `/campaign`). **ADR-064 (gate↔Workflow) IMPLEMENTED:** the Silver Surfer `PreToolUse` hook matcher is now `Agent\|Workflow` and `check.sh` gates the **Workflow tool launch** on a recorded roster (closes the proven bypass where workflow-spawned agents skipped the gate); `test.sh` gains 3 Workflow cases (**23/23**), mirrored to the methodology package. **Behavior change:** a Workflow run now requires a recorded roster or a `--light`/`--solo` bypass — build/apply/research workflows should set a bypass. **ADR-065 (platform floor):** `docs/COMPATIBILITY.md` gains a Claude Code platform-floor + per-feature maturity table; informational `claudeCodeFloor` field; semver rule (raising the floor = breaking) + release-checklist item. **ADR-066 (native-capability tracker):** new `docs/NATIVE_CAPABILITIES.md` audits all commands vs native skills with dispositions (`/qa`,`/test` coexist+document; `/git` keep) — realizes ADR-050's deferred follow-up; release re-audit item added. Amended **ADR-051** (workflow-exemption→closure), **ADR-054** (effort tiers + Haiku 200K/no-effort). M2 effort fleet-edit deferred per ADR-054 precondition (runtime `effort:`-frontmatter honoring unverified). Dep `^23.15.0` → `^23.16.0`. |
|
|
18
20
|
| 23.15.0 | 2026-06-13 | Platform-alignment build (`/architect --plan` → `/build` b+a). **P0:** empirically confirmed the Silver Surfer `PreToolUse` gate is **blind to Workflow-tool-spawned agents** (this session: 60+ workflow agents → 2 gate events; controlled probe BEFORE=2/AFTER=2) and wrote **ADR-064** (gate↔Workflow interop — extend matcher to `Agent\|Workflow`, gate the workflow launch; implementation tracked for the campaign). **P1-B near-free batch:** fixed a **live runtime bug** — `anthropic.ts` fell back to the non-existent `claude-sonnet-4-7` (404 on the exact degraded path the fallback exists for) → `claude-sonnet-4-6`, plus the bug-asserting test (now 6/6) and 4 docs; purged stale model IDs (`claude-sonnet-4-20250514`→`claude-sonnet-4-6` in 6 pattern files; `Opus 4.7`→`4.8` across SUB_AGENTS + 4 ADRs); added the **effort-tiering policy** (leads `xhigh` / specialists `medium` / Haiku omit-no-effort+200K ceiling) to SUB_AGENTS.md + CLAUDE.md flag-taxonomy mapping; **amended ADR-059** with the real platform caps (~16 concurrent / ~1,000 per run) and fixed GAUNTLET.md's contradicting "waves of 3". Dogfooded the pre-tag `npm test` gate (ADR from v23.13.1) + the publish-gate alignment (v23.14.0). Dep `^23.14.0` → `^23.15.0`. Follow-on (operator-directed): `/architect --plan` ADR-065/066 + amend ADR-051/054 → `/campaign` to build all. |
|
|
19
21
|
| 23.14.0 | 2026-06-12 | Field Report Triage — 2 reports closed (#362, #363) via `/debrief --inbox`, 8 fixes across 9 files. **#363** (self-filed last session): release flow now runs the test suite as Step 5's first action before any tag (`git.md`, since tag-push arms an irreversible publish); **Numeric constant migration checklist** generalizing the error-shape rule (`TESTING.md`); **Registry-Derived Fan-Out** coverage rule — enumerate the accepted `(fixId,targetFile)` tuple set, diff-check after appliers (`SUB_AGENTS.md` + `debrief.md` Step 6); **Chronically-Red Check Policy** (red ≥2 releases → fix/informational/remove) + **Publish-gate alignment** (publish must `needs:` the full E2E+a11y suite, not unit-only) (`DEVOPS_ENGINEER.md` + `RELEASE_MANAGER.md`); Workflow `args`-as-JSON-string defensive parse + `gh workflow` scope note (`SUB_AGENTS.md` + `RELEASE_MANAGER.md`). **#362** (enhancements): a named, right-sized **Pre-Deploy Review Gate** (diff-scoped N lenses + mandatory adversarial-verify) documented in `SUB_AGENTS.md` and realized as a new `/engage --pre-deploy --diff` mode; atomic-visual **render-harness screenshot carve-out** (`QA_ENGINEER.md` + `PRODUCT_DESIGN_FRONTEND.md`). Dogfooded #363 in its own release: ran the coverage diff-check (9/9 files) and `npm test` (1390/1390) before tagging. Dep `^23.13.1` → `^23.14.0` (ADR-062). |
|
|
@@ -276,7 +276,7 @@ Each file is a standalone subagent definition that Claude Code's native subagent
|
|
|
276
276
|
|
|
277
277
|
Leads inherit the main session's model (Opus). Specialists run on Sonnet for cost efficiency without sacrificing analysis quality. Scouts run on Haiku for fast, cheap reconnaissance.
|
|
278
278
|
|
|
279
|
-
**Effort tiering (per-agent spend lever).** Claude Code exposes an `effort:` level (`low`/`medium`/`high`/`xhigh`/`max`) that controls reasoning depth *independently* of the model tier. Apply by role: **Leads → `xhigh`** (the recommended start for agentic work on Opus 4.8); **Specialists → `medium`** (read-and-report review rarely needs full `high` spend across ~200 agents); **Scouts → OMIT** — **Haiku 4.5 does not support the effort parameter and errors if it is passed.** Haiku also has a **200K context ceiling (not 1M)**: the Surfer pre-scan and scout prompts must fit within it — read agent frontmatter (name/description/tags), not full bodies, on large rosters.
|
|
279
|
+
**Effort tiering (per-agent spend lever).** Claude Code exposes an `effort:` level (`low`/`medium`/`high`/`xhigh`/`max`) that controls reasoning depth *independently* of the model tier. Apply by role: **Leads → `xhigh`** (the recommended start for agentic work on Opus 4.8); **Specialists → `medium`** (read-and-report review rarely needs full `high` spend across ~200 agents); **Scouts → OMIT** — **Haiku 4.5 does not support the effort parameter and errors if it is passed.** Haiku also has a **200K context ceiling (not 1M)**: the Surfer pre-scan and scout prompts must fit within it — read agent frontmatter (name/description/tags), not full bodies, on large rosters. **Verified + applied 2026-06-13:** the official sub-agents docs confirm `effort` is a supported frontmatter field; the fleet edit is live — all 20 leads carry `effort: xhigh`, all 201 Sonnet specialists `effort: medium`, the 43 Haiku scouts omit it (ADR-054). New agents should follow the same tiering.
|
|
280
280
|
|
|
281
281
|
### Tool Restrictions
|
|
282
282
|
|