forgedock 1.0.22 → 1.1.2
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/README.md +255 -211
- package/bin/batch-runner.mjs +339 -0
- package/bin/cinema.mjs +320 -0
- package/bin/demo.mjs +92 -7
- package/bin/engine/phases.mjs +168 -0
- package/bin/engine/projector.mjs +32 -0
- package/bin/engine/reconcile.mjs +11 -0
- package/bin/engine/runlog.mjs +79 -0
- package/bin/engine/state.mjs +32 -0
- package/bin/engine-cli.mjs +222 -0
- package/bin/engine.mjs +138 -0
- package/bin/forgedock.mjs +896 -1540
- package/bin/hooks/interactive-engine.mjs +509 -0
- package/bin/hooks/pre-tool-use.mjs +498 -0
- package/bin/hooks/subagent-stop-enforce.mjs +197 -0
- package/bin/journey.mjs +841 -0
- package/bin/registry.mjs +139 -0
- package/bin/report.mjs +447 -0
- package/bin/runner.mjs +136 -20
- package/bin/settings-hook.mjs +346 -0
- package/bin/tui.mjs +6 -3
- package/commands/adopt.md +4 -1
- package/commands/analytics.md +4 -1
- package/commands/audit-agents.md +110 -27
- package/commands/audit.md +20 -1
- package/commands/autopilot.md +84 -12
- package/commands/changelog.md +2 -1
- package/commands/ci-audit.md +2 -1
- package/commands/cleanup.md +161 -1
- package/commands/compat-audit.md +2 -1
- package/commands/deploy-info.md +63 -4
- package/commands/design-bench.md +6 -1
- package/commands/design-render-critique-loop.md +2 -1
- package/commands/design.md +1 -0
- package/commands/diagnose.md +2 -1
- package/commands/explain.md +2 -1
- package/commands/forge-stats.md +122 -2
- package/commands/forgedock-init.md +1 -1
- package/commands/geo-audit.md +3 -0
- package/commands/incident-response.md +2 -1
- package/commands/issue.md +24 -3
- package/commands/milestone.md +77 -12
- package/commands/optimize.md +2 -1
- package/commands/orchestrate/config.md +67 -0
- package/commands/orchestrate/phase-1-resolve.md +159 -0
- package/commands/orchestrate/phase-2-triage.md +126 -0
- package/commands/orchestrate/phase-2.5-synthesis.md +156 -0
- package/commands/orchestrate/phase-3-dependency.md +591 -0
- package/commands/orchestrate/phase-4-execution.md +962 -0
- package/commands/orchestrate/phase-5-cleanup.md +47 -0
- package/commands/orchestrate/phase-6-report.md +198 -0
- package/commands/orchestrate/safety.md +62 -0
- package/commands/orchestrate.md +25 -2027
- package/commands/pipeline-health/config.md +34 -0
- package/commands/pipeline-health/phase-1-context.md +180 -0
- package/commands/pipeline-health/phase-2-metrics.md +1729 -0
- package/commands/pipeline-health/phase-3-analyze.md +204 -0
- package/commands/pipeline-health/phase-4-proposals.md +117 -0
- package/commands/pipeline-health/phase-5-report.md +284 -0
- package/commands/pipeline-health/phase-6-summary.md +52 -0
- package/commands/pipeline-health.md +25 -2401
- package/commands/pipeline-resume.md +24 -1
- package/commands/pipeline-status.md +65 -0
- package/commands/qa-sweep.md +4 -1
- package/commands/quality-gate.md +326 -42
- package/commands/replay.md +2 -1
- package/commands/review-pr-agents/api.md +135 -0
- package/commands/review-pr-agents/auth.md +137 -0
- package/commands/review-pr-agents/billing.md +101 -0
- package/commands/review-pr-agents/concurrency.md +145 -0
- package/commands/review-pr-agents/database.md +103 -0
- package/commands/review-pr-agents/frontend.md +89 -0
- package/commands/review-pr-agents/infra.md +385 -0
- package/commands/review-pr-agents/protocols.md +185 -0
- package/commands/review-pr-agents/scraper.md +185 -0
- package/commands/review-pr-agents/security.md +406 -0
- package/commands/review-pr-agents.md +45 -1722
- package/commands/review-pr-staging.md +196 -40
- package/commands/review-pr.md +612 -56
- package/commands/rollback.md +2 -1
- package/commands/scope.md +2 -1
- package/commands/security-audit.md +2 -1
- package/commands/signal-planner.md +623 -0
- package/commands/sync-ecosystem.md +1 -0
- package/commands/test-gate.md +17 -1
- package/commands/validate.md +2 -1
- package/commands/work-on/build/architect.md +28 -0
- package/commands/work-on/build/context.md +2 -0
- package/commands/work-on/build/implement.md +19 -5
- package/commands/work-on/build/validate.md +62 -6
- package/commands/work-on/build.md +187 -30
- package/commands/work-on/close.md +132 -5
- package/commands/work-on/decompose.md +19 -1
- package/commands/work-on/investigate.md +117 -2
- package/commands/work-on/review.md +48 -4
- package/commands/work-on-monolithic.md +8 -2
- package/commands/work-on.md +247 -7
- package/docs/BRAND.md +16 -5
- package/docs/CI.md +2 -2
- package/docs/CODEX.md +36 -1
- package/docs/CONFIG.md +44 -42
- package/docs/FORGE-PROTOCOL.md +15 -1064
- package/docs/anthropic-devrel-outreach.md +2 -2
- package/docs/articles/command-decomposition-token-savings.md +214 -0
- package/docs/articles/model-release-playbook.md +131 -0
- package/docs/articles/per-repo-adaptive-scripts-token-savings.md +27 -25
- package/docs/claude-breakpoints.json +75 -5
- package/docs/design/abc-benchmark.md +1 -1
- package/docs/design/design-spec-schema.md +1 -1
- package/docs/design/divergent-generation.md +1 -1
- package/docs/design/eval-gate-runbook.md +178 -0
- package/docs/design/show-hn-draft.md +26 -1
- package/docs/design/token-cost-baseline-1298.md +59 -0
- package/docs/eval/README.md +117 -0
- package/docs/eval/corpus/seed-v1.json +6 -0
- package/docs/eval/published/claude-sonnet-4-6-2026-07-04.json +33 -0
- package/docs/site/annotations-explained.md +24 -0
- package/docs/site/command-learning-path.md +51 -14
- package/docs/site/command-reference.md +339 -113
- package/docs/site/for-companies.md +95 -0
- package/docs/site/forge-annotation-protocol.md +12 -256
- package/docs/site/getting-started.md +58 -12
- package/docs/site/github-is-the-memory.md +113 -0
- package/docs/site/how-it-works.md +3 -13
- package/docs/site/index.md +10 -2
- package/docs/spec/eval-run-result.md +147 -0
- package/docs/spec/forge-protocol-v1.md +441 -18
- package/docs/spec/label-state-machine.md +55 -0
- package/docs/spec/review-protocol.md +158 -0
- package/docs/spec-graph-schema.md +28 -0
- package/docs/superpowers/plans/2026-07-03-cinematic-onboarding-tui.md +2339 -0
- package/docs/superpowers/plans/2026-07-03-durable-execution-engine.md +1223 -0
- package/docs/superpowers/specs/2026-07-03-cinematic-onboarding-tui-design.md +157 -0
- package/docs/superpowers/specs/2026-07-03-durable-execution-engine-design.md +194 -0
- package/docs/superpowers/specs/2026-07-04-economic-self-governance-design.md +181 -0
- package/docs/superpowers/specs/2026-07-04-provenance-trail-design.md +189 -0
- package/examples/forgedock-demo/README.md +41 -22
- package/examples/forgedock-demo/issues/06-bug-tags-type-validation.md +43 -0
- package/examples/forgedock-demo/issues/07-bug-negative-offset-pagination.md +42 -0
- package/examples/forgedock-demo/issues/08-bug-patch-mass-assignment.md +49 -0
- package/examples/forgedock-demo/issues/09-bug-count-injection.md +47 -0
- package/examples/forgedock-demo/issues/10-feature-sort-param.md +39 -0
- package/examples/forgedock-demo/issues/11-feature-patch-tags.md +37 -0
- package/examples/forgedock-demo/issues/12-feature-bulk-create.md +42 -0
- package/examples/forgedock-demo/issues/13-feature-archive-notes.md +46 -0
- package/examples/forgedock-demo/issues/14-refactor-extract-title-validation.md +41 -0
- package/examples/forgedock-demo/issues/15-refactor-protected-route-flag.md +43 -0
- package/examples/forgedock-demo/issues/16-refactor-extract-store.md +45 -0
- package/examples/forgedock-demo/issues/17-perf-tags-dedup-set.md +35 -0
- package/examples/forgedock-demo/issues/18-perf-remove-redundant-sort.md +37 -0
- package/examples/forgedock-demo/issues/19-docs-api-reference-full.md +53 -0
- package/examples/forgedock-demo/issues/20-docs-intentional-flaw-convention.md +46 -0
- package/examples/forgedock-demo/scripts/smoke.js +18 -1
- package/examples/forgedock-demo/src/db.js +36 -11
- package/examples/forgedock-demo/src/routes/notes.js +106 -9
- package/examples/forgedock-demo/src/server.js +4 -1
- package/package.json +12 -4
- package/packages/protocol/LICENSE +21 -0
- package/packages/protocol/src/cli.js +135 -0
- package/packages/protocol/src/emit.js +146 -0
- package/packages/protocol/src/index.js +43 -0
- package/packages/protocol/src/parse.js +229 -0
- package/packages/protocol/src/types.js +171 -0
- package/packages/protocol/src/validate.js +122 -0
- package/scripts/bench-topology-cost.mjs +372 -0
- package/scripts/check-command-docs-drift.sh +198 -0
- package/scripts/check-protocol-restatements.sh +176 -0
- package/scripts/check-registry/README.md +72 -0
- package/scripts/check-registry/manifest.json +6 -0
- package/scripts/code-index.sh +454 -0
- package/scripts/conformance-check.mjs +168 -0
- package/scripts/doctor-pipeline-state.sh +484 -0
- package/scripts/eval-gate-baseline.json +17 -0
- package/scripts/eval-gate-scorecard.mjs +242 -0
- package/scripts/eval-scorecard-aggregator.mjs +252 -0
- package/scripts/flaky-quarantine.sh +241 -0
- package/scripts/forge-annotation.sh +567 -0
- package/scripts/issue-dedup.sh +236 -0
- package/scripts/validate-annotation-node.mjs +233 -0
- package/scripts/verify-env-vars.sh +18 -2
- package/scripts/verify-host-headers.sh +4 -4
- package/scripts/verify-route-registration.sh +2 -2
- package/scripts/worktree-lifecycle.sh +202 -0
- package/templates/devdocs/agent/using-forgedock.md +14 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Eval Gate Runbook
|
|
2
|
+
|
|
3
|
+
> Companion to issue #1286, workflow `.github/workflows/eval-gate.yml`, and
|
|
4
|
+
> `scripts/eval-gate-scorecard.mjs`.
|
|
5
|
+
|
|
6
|
+
The pipeline eval gate automatically runs the eval harness (#1285) against
|
|
7
|
+
`commands/` changes and fails CI if the one-shot success rate drops more than
|
|
8
|
+
the defined threshold. This runbook explains how to interpret a gate failure,
|
|
9
|
+
override when necessary, and update the baseline.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## What the gate checks
|
|
14
|
+
|
|
15
|
+
The gate compares a fresh scorecard (produced by `scripts/eval-harness-runner.mjs`)
|
|
16
|
+
against the committed baseline at `scripts/eval-gate-baseline.json`.
|
|
17
|
+
|
|
18
|
+
**Regression threshold**: 5 percentage points.
|
|
19
|
+
|
|
20
|
+
A drop of **more than 5 pp** in `success_rate_pct` vs the baseline is a
|
|
21
|
+
regression and fails CI with exit code 1.
|
|
22
|
+
|
|
23
|
+
Example:
|
|
24
|
+
- Baseline: `success_rate_pct: 80`
|
|
25
|
+
- Fresh: `success_rate_pct: 74` → drop = 6 pp → **FAIL** (6 > 5)
|
|
26
|
+
- Fresh: `success_rate_pct: 75` → drop = 5 pp → **PASS** (5 = 5, not strictly greater)
|
|
27
|
+
|
|
28
|
+
**Subset run carve-out**: When the fresh run has fewer than 8 issues, the rate
|
|
29
|
+
assertion is skipped. Rationale: on n=5, one failure is 20 pp — always failing
|
|
30
|
+
the gate even with no spec changes. The gate still validates structural
|
|
31
|
+
correctness and emits a non-blocking summary.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Trigger conditions
|
|
36
|
+
|
|
37
|
+
| Event | What runs | Rate assertion applied |
|
|
38
|
+
|-------|-----------|----------------------|
|
|
39
|
+
| PR / push with substantive `commands/**` changes | Subset run | Only if n >= 8 |
|
|
40
|
+
| `workflow_dispatch` (default) | Full corpus run | Yes |
|
|
41
|
+
| `workflow_dispatch` with `run_mode: subset` | Subset run | Only if n >= 8 |
|
|
42
|
+
| Non-substantive `commands/**` changes (typos, comments) | Nothing | N/A |
|
|
43
|
+
|
|
44
|
+
A non-substantive change is one where every changed line in `commands/` is a
|
|
45
|
+
blank line, HTML comment (`<!-- ... -->`), or Markdown heading (`# ...`).
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Interpreting a gate failure
|
|
50
|
+
|
|
51
|
+
When the gate fails, the CI step prints:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
eval-gate FAILED: REGRESSION: success rate dropped N pp
|
|
55
|
+
(X% fresh vs Y% baseline). Threshold is 5 pp.
|
|
56
|
+
A deliberate spec degradation or a real pipeline regression caused this failure.
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Followed by actionable steps:
|
|
60
|
+
1. Review the diff in `commands/` to identify what changed.
|
|
61
|
+
2. Re-run the full corpus locally:
|
|
62
|
+
```bash
|
|
63
|
+
node scripts/eval-harness-runner.mjs --mode full
|
|
64
|
+
```
|
|
65
|
+
3. If the regression is real: fix the spec, re-run, update the baseline (see below).
|
|
66
|
+
4. If the regression is a false positive: see Override below.
|
|
67
|
+
|
|
68
|
+
The structured JSON result is also printed and uploaded as a CI artifact
|
|
69
|
+
(`eval-scorecard-subset-<sha>.json` or `eval-scorecard-full-<sha>.json`).
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Reading the scorecard diff
|
|
74
|
+
|
|
75
|
+
The scorecard artifact contains:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"pass": false,
|
|
80
|
+
"fresh_success_rate_pct": 74,
|
|
81
|
+
"baseline_success_rate_pct": 80,
|
|
82
|
+
"drop_pp": 6,
|
|
83
|
+
"threshold_pp": 5,
|
|
84
|
+
"rate_assertion_skipped": false,
|
|
85
|
+
"fresh_issues_run": 20,
|
|
86
|
+
"fresh_run_mode": "full",
|
|
87
|
+
"reason": "REGRESSION: ..."
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- `drop_pp`: positive = regression, negative = improvement.
|
|
92
|
+
- `rate_assertion_skipped`: true means the run was too small for a meaningful rate.
|
|
93
|
+
- `fresh_run_id` / `baseline_run_id`: link back to the specific runs for debugging.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Updating the baseline
|
|
98
|
+
|
|
99
|
+
After a deliberate improvement is confirmed (full corpus run passes with a
|
|
100
|
+
higher success rate), update the baseline:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# Re-seed the baseline from the latest full run scorecard:
|
|
104
|
+
node scripts/eval-gate-scorecard.mjs scorecard.json --seed
|
|
105
|
+
|
|
106
|
+
# Commit the updated baseline:
|
|
107
|
+
git add scripts/eval-gate-baseline.json
|
|
108
|
+
git commit -m "chore(bench): update eval-gate baseline to vN.N"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
The `--seed` flag overwrites the baseline file with the fresh scorecard regardless
|
|
112
|
+
of the current baseline content.
|
|
113
|
+
|
|
114
|
+
**Rule**: never lower the baseline. Only update it upward (higher success rate) or
|
|
115
|
+
after a deliberate scope change to the corpus.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Override / force-merge (false positive procedure)
|
|
120
|
+
|
|
121
|
+
A false positive is a gate failure where the spec did not regress but the eval run
|
|
122
|
+
produced a low score due to:
|
|
123
|
+
- Flaky sandbox or network issues during the harness run
|
|
124
|
+
- Corpus issue that was already broken before the PR
|
|
125
|
+
- Known harness limitation (#1285 tracking)
|
|
126
|
+
|
|
127
|
+
**Override procedure**:
|
|
128
|
+
|
|
129
|
+
1. Confirm the false positive by running the harness locally:
|
|
130
|
+
```bash
|
|
131
|
+
node scripts/eval-harness-runner.mjs --mode full
|
|
132
|
+
```
|
|
133
|
+
If the local run passes, it is likely a CI flake.
|
|
134
|
+
|
|
135
|
+
2. Re-trigger the workflow from the PR UI: **Re-run failed jobs**.
|
|
136
|
+
|
|
137
|
+
3. If it still fails and you have confirmed the spec change is safe:
|
|
138
|
+
- Add a PR comment documenting why the failure is a false positive.
|
|
139
|
+
- Get a second approver.
|
|
140
|
+
- Merge with the label `eval-gate:override` on the PR.
|
|
141
|
+
|
|
142
|
+
4. File a follow-up issue to investigate the false positive root cause.
|
|
143
|
+
|
|
144
|
+
**Never** skip the gate entirely by editing the workflow YAML in the same PR
|
|
145
|
+
that contains the spec change. That defeats the purpose.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Running on demand (model release)
|
|
150
|
+
|
|
151
|
+
When a new Claude model is released, run the full corpus to establish a new
|
|
152
|
+
baseline for the model:
|
|
153
|
+
|
|
154
|
+
1. Trigger via GitHub Actions UI: **Actions → Pipeline Eval Gate → Run workflow**
|
|
155
|
+
2. Select `run_mode: full`.
|
|
156
|
+
3. Download the scorecard artifact.
|
|
157
|
+
4. If the success rate is acceptable, update the baseline:
|
|
158
|
+
```bash
|
|
159
|
+
node scripts/eval-gate-scorecard.mjs <downloaded-scorecard.json> --seed
|
|
160
|
+
git add scripts/eval-gate-baseline.json
|
|
161
|
+
git commit -m "chore(bench): rebaseline for claude-<model-version>"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Baseline storage rationale
|
|
167
|
+
|
|
168
|
+
The baseline is committed as `scripts/eval-gate-baseline.json` rather than stored
|
|
169
|
+
in a GitHub Actions cache or release asset. Reasons:
|
|
170
|
+
|
|
171
|
+
- **Auditable**: every baseline update appears in `git log` and `git blame`.
|
|
172
|
+
- **Reproducible**: a cold clone has everything needed to run the gate.
|
|
173
|
+
- **Diff-visible**: baseline changes show up in PRs, making ratcheting explicit.
|
|
174
|
+
- **No external dependencies**: no cache eviction, no release asset permissions.
|
|
175
|
+
|
|
176
|
+
The tradeoff is that updating the baseline requires a commit — which is
|
|
177
|
+
intentional. Baseline bumps should be deliberate human decisions, not
|
|
178
|
+
auto-ratcheted by CI.
|
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- Updated by #1092: messaging angles research (2026-06-25) -->
|
|
4
4
|
<!-- Updated by #1099: context-rot pain framing (2026-06-27) -->
|
|
5
|
+
<!-- GATE: #1264 — DO NOT POST until benchmark scorecard is available.
|
|
6
|
+
Every quantitative efficiency claim must trace to a reproducible benchmark run.
|
|
7
|
+
Required before posting:
|
|
8
|
+
1. Land cost accounting (#1255) and topology fix (#1254)
|
|
9
|
+
2. Run benchmark suite (#1259) and publish scorecard:
|
|
10
|
+
- cost per issue by difficulty class
|
|
11
|
+
- one-shot success rate
|
|
12
|
+
- before/after the optimization wave
|
|
13
|
+
3. Rewrite the maker comment to lead with the measured table
|
|
14
|
+
(keep context-rot framing, replace estimates with actuals)
|
|
15
|
+
See: #1264 -->
|
|
5
16
|
<!-- Research: "LLM Wiki" vocabulary = 17M views / 5K stars (Karpathy gist, April 2026).
|
|
6
17
|
"Context rot" is now mainstream community vocabulary (MindStudio, Augment Code, Stack Overflow, 2025-2026).
|
|
7
18
|
Lead with context rot pain; use LLM Wiki vocabulary as the HN title hook. Full research: docs/design/messaging-angles-research.md -->
|
|
@@ -68,7 +79,7 @@ Some technical details:
|
|
|
68
79
|
|
|
69
80
|
Known limitations:
|
|
70
81
|
- Claude Code only (no Cursor/Codex/Aider support yet)
|
|
71
|
-
- Token-heavy on first run before adaptive scripts cache project patterns
|
|
82
|
+
- Token-heavy on first run before adaptive scripts cache project patterns <!-- BENCHMARK_NEEDED: replace with measured cost figure from scorecard (#1264) -->
|
|
72
83
|
- The pipeline is opinionated — it enforces a specific workflow that may not fit every team
|
|
73
84
|
|
|
74
85
|
I'm a solo developer building this to solve my own problems. Happy to answer questions about the architecture, the FORGE annotation protocol, or the prompt engineering behind the command specs.
|
|
@@ -84,3 +95,17 @@ I'm a solo developer building this to solve my own problems. Happy to answer que
|
|
|
84
95
|
- **If compared to Devin**: "Devin is a cloud service; ForgeDock runs locally with your own API key. Different trade-offs — Devin is turnkey, ForgeDock gives you full control and traceability."
|
|
85
96
|
- **If compared to DeepWiki**: "DeepWiki generates a documentation snapshot of your repo. ForgeDock writes structured annotations during each pipeline run — context stays current with your actual work, not a snapshot."
|
|
86
97
|
- **If asked about scale**: Be honest about current adoption. Don't inflate numbers.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Pre-Post Benchmark Gate (#1264)
|
|
102
|
+
|
|
103
|
+
**Do not submit to HN until all items are checked.**
|
|
104
|
+
|
|
105
|
+
- [ ] Cost accounting landed (#1255)
|
|
106
|
+
- [ ] Topology fix landed (#1254)
|
|
107
|
+
- [ ] Benchmark suite run (#1259) and scorecard published
|
|
108
|
+
- [ ] Scorecard includes: cost per issue by difficulty class, one-shot success rate, before/after optimization wave
|
|
109
|
+
- [ ] Every quantitative claim in the maker comment above traces to a row in the scorecard
|
|
110
|
+
- [ ] `<!-- BENCHMARK_NEEDED -->` comments in the draft have been replaced with measured figures
|
|
111
|
+
- [ ] Reproducible method documented: demo repo + runner script so readers can re-run the benchmark
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Token-cost baseline measurement plan — issue #1298
|
|
2
|
+
|
|
3
|
+
**Parent**: #1255
|
|
4
|
+
**Depends on**: #1295, #1296, #1297 (tooling), #1246, #1247, #1249, #1254 (optimization PRs)
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Close the loop on #1255's "measured, not estimated" savings claim by capturing
|
|
9
|
+
before/after token-cost baselines using `scripts/bench-topology-cost.mjs` around
|
|
10
|
+
the landing of each optimization PR.
|
|
11
|
+
|
|
12
|
+
## Tooling
|
|
13
|
+
|
|
14
|
+
`scripts/bench-topology-cost.mjs` — reads a `runs.json` file of per-issue token
|
|
15
|
+
usage records and emits a cost comparison table across pipeline topologies.
|
|
16
|
+
|
|
17
|
+
Baseline inputs are `FORGE:USAGE_JSON` annotations written to GitHub by the
|
|
18
|
+
pipeline (via `bin/runner.mjs`'s `renderSummaryCard`). Collect them with:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Collect FORGE:USAGE_JSON annotations from the last N issue runs
|
|
22
|
+
gh issue list -R <repo> --state closed --label workflow:merged --limit 20 \
|
|
23
|
+
--json number,comments \
|
|
24
|
+
| jq '[.[] | {number: .number, comments: [.comments[].body | select(contains("FORGE:USAGE_JSON"))]}]'
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Then feed the extracted token counts into a `runs.json` for `bench-topology-cost.mjs`.
|
|
28
|
+
|
|
29
|
+
## Measurement gates
|
|
30
|
+
|
|
31
|
+
Run the corpus (5 seeded issues in `examples/forgedock-demo/`) through the pipeline
|
|
32
|
+
and record token counts **immediately before** and **immediately after** each PR lands:
|
|
33
|
+
|
|
34
|
+
| Gate | PR | Description |
|
|
35
|
+
|------|----|-------------|
|
|
36
|
+
| Before #1246 | — | Baseline: current skills-format |
|
|
37
|
+
| After #1246 | #1246 | Skills-format migration |
|
|
38
|
+
| After #1247 | #1247 | Single-source FORGE protocol |
|
|
39
|
+
| After #1249 | #1249 | Model/effort tiering (Haiku/xhigh) |
|
|
40
|
+
| After #1254 | #1254 | Agent topology refactor |
|
|
41
|
+
|
|
42
|
+
## Results
|
|
43
|
+
|
|
44
|
+
_To be filled in as each dependency PR lands. Record before/after deltas as comments
|
|
45
|
+
on issue #1298 and update this table._
|
|
46
|
+
|
|
47
|
+
| PR | Topology | Avg input tokens | Avg output tokens | Delta vs prior |
|
|
48
|
+
|----|----------|-----------------|-------------------|----------------|
|
|
49
|
+
| (baseline) | spawned | — | — | — |
|
|
50
|
+
| #1246 | spawned | — | — | — |
|
|
51
|
+
| #1247 | spawned | — | — | — |
|
|
52
|
+
| #1249 | spawned+tiering | — | — | — |
|
|
53
|
+
| #1254 | inline-sequential | — | — | — |
|
|
54
|
+
|
|
55
|
+
## Status
|
|
56
|
+
|
|
57
|
+
Dependencies #1246, #1247, #1249, #1254 are all open as of 2026-07-04. Measurements
|
|
58
|
+
cannot be taken until those PRs land. This document serves as the tracking record and
|
|
59
|
+
protocol so that whoever executes the measurements has the exact steps available.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Pipeline Eval — Published Scorecards
|
|
2
|
+
|
|
3
|
+
Per-release pipeline evaluation results for ForgeDock. Every scorecard here was produced by the eval harness (#1285) running the seeded benchmark corpus (#1284) and aggregated by `scripts/bench-scorecard.mjs`. Scorecards are published following the model-release upgrade playbook (`docs/articles/model-release-playbook.md`).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Current baseline
|
|
8
|
+
|
|
9
|
+
| Field | Value |
|
|
10
|
+
|-------|-------|
|
|
11
|
+
| Scorecard | [claude-sonnet-4-6-2026-07-04.json](published/claude-sonnet-4-6-2026-07-04.json) |
|
|
12
|
+
| Model | claude-sonnet-4-6 |
|
|
13
|
+
| Corpus | seed-v1 |
|
|
14
|
+
| Run date | 2026-07-04 |
|
|
15
|
+
| One-shot success rate | — (pending harness) |
|
|
16
|
+
| Human-intervention mean | — (pending harness) |
|
|
17
|
+
|
|
18
|
+
> **Note**: The baseline above is a format placeholder. The harness (#1285) and CI gate (#1286) must be operational before real scorecard values can be populated. When the first real run completes, update this table and remove this note.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Published results
|
|
23
|
+
|
|
24
|
+
| Run ID | Model | Corpus | Date | One-shot success | Human interventions/issue | Scorecard |
|
|
25
|
+
|--------|-------|--------|------|-----------------|--------------------------|-----------|
|
|
26
|
+
| claude-sonnet-4-6-2026-07-04 | claude-sonnet-4-6 | seed-v1 | 2026-07-04 | pending | pending | [scorecard](published/claude-sonnet-4-6-2026-07-04.json) |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Scorecard schema
|
|
31
|
+
|
|
32
|
+
Every file in `published/` is a JSON object with the following fields:
|
|
33
|
+
|
|
34
|
+
```jsonc
|
|
35
|
+
{
|
|
36
|
+
// Run metadata
|
|
37
|
+
"run_id": "claude-sonnet-4-6-2026-07-04", // <model-slug>-<YYYY-MM-DD>
|
|
38
|
+
"model": "claude-sonnet-4-6", // exact model identifier
|
|
39
|
+
"claude_code_version": "1.x.x", // Claude Code version used
|
|
40
|
+
"corpus_version": "seed-v1", // corpus tag from docs/eval/corpus/
|
|
41
|
+
"run_date": "2026-07-04", // ISO 8601 date
|
|
42
|
+
"n_issues": 20, // total corpus issues attempted
|
|
43
|
+
"n_completed": 20, // issues that reached a terminal state
|
|
44
|
+
|
|
45
|
+
// Primary metrics — regression gate checks these
|
|
46
|
+
"one_shot_success_rate": 0.75, // fraction of issues merged without human intervention
|
|
47
|
+
"human_intervention_count": {
|
|
48
|
+
"mean": 0.3, // mean interventions per issue
|
|
49
|
+
"median": 0.0,
|
|
50
|
+
"p90": 1.0
|
|
51
|
+
},
|
|
52
|
+
"wall_clock_seconds": {
|
|
53
|
+
"mean": 3420, // mean wall-clock per issue (seconds)
|
|
54
|
+
"median": 3180,
|
|
55
|
+
"p90": 6000
|
|
56
|
+
},
|
|
57
|
+
"cost_per_issue_usd": {
|
|
58
|
+
"mean": 0.85,
|
|
59
|
+
"median": 0.72,
|
|
60
|
+
"p90": 1.40
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
// Per-issue breakdown (array)
|
|
64
|
+
"issues": [
|
|
65
|
+
{
|
|
66
|
+
"issue_id": "corpus-001",
|
|
67
|
+
"difficulty": "easy", // easy | medium | hard
|
|
68
|
+
"category": "bug", // bug | feature | refactor | perf | docs
|
|
69
|
+
"outcome": "merged", // merged | needs-human | failed | timeout
|
|
70
|
+
"human_interventions": 0,
|
|
71
|
+
"wall_clock_seconds": 2980,
|
|
72
|
+
"cost_usd": 0.63
|
|
73
|
+
}
|
|
74
|
+
// ... one entry per corpus issue
|
|
75
|
+
],
|
|
76
|
+
|
|
77
|
+
// Comparison against previous baseline (populated at publish time)
|
|
78
|
+
"vs_baseline": {
|
|
79
|
+
"baseline_run_id": null, // null if this is the first run
|
|
80
|
+
"one_shot_success_rate_delta": null,
|
|
81
|
+
"human_intervention_delta": null,
|
|
82
|
+
"regressions": []
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Directory layout
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
docs/eval/
|
|
93
|
+
README.md # this file — published results index
|
|
94
|
+
corpus/
|
|
95
|
+
seed-v1.json # seeded benchmark corpus (20 issues, graded difficulty)
|
|
96
|
+
published/
|
|
97
|
+
<run-id>.json # published scorecard per model release
|
|
98
|
+
runs/
|
|
99
|
+
<run-id>/
|
|
100
|
+
raw.json # raw per-issue outcome data from the harness
|
|
101
|
+
scorecard.json # aggregated scorecard (bench-scorecard.mjs output)
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Raw run data in `runs/` is the source of truth. Published scorecards in `published/` are the canonical record referenced in the playbook and README.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Upgrade decision table
|
|
109
|
+
|
|
110
|
+
| One-shot success rate delta | Human intervention delta | Decision |
|
|
111
|
+
|-----------------------------|--------------------------|----------|
|
|
112
|
+
| > -5pp | <= +0.5 | Adopt |
|
|
113
|
+
| -5pp to -10pp | any | WARN — investigate |
|
|
114
|
+
| < -10pp | any | BLOCK — regression issue required |
|
|
115
|
+
| any | > +0.5 | BLOCK — regression issue required |
|
|
116
|
+
|
|
117
|
+
Full decision procedure: `docs/articles/model-release-playbook.md`.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "PLACEHOLDER — seeded benchmark corpus will be populated by #1284. This file establishes the location and schema.",
|
|
3
|
+
"version": "seed-v1",
|
|
4
|
+
"description": "Seeded benchmark corpus for ForgeDock pipeline eval. ~20 issues of graded difficulty across bug/feature/refactor/perf/docs categories.",
|
|
5
|
+
"issues": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "PLACEHOLDER — harness (#1285) and CI gate (#1286) are not yet operational. This file establishes the schema and location convention. Replace with a real run when the harness is ready.",
|
|
3
|
+
"run_id": "claude-sonnet-4-6-2026-07-04",
|
|
4
|
+
"model": "claude-sonnet-4-6",
|
|
5
|
+
"claude_code_version": "pending",
|
|
6
|
+
"corpus_version": "seed-v1",
|
|
7
|
+
"run_date": "2026-07-04",
|
|
8
|
+
"n_issues": null,
|
|
9
|
+
"n_completed": null,
|
|
10
|
+
"one_shot_success_rate": null,
|
|
11
|
+
"human_intervention_count": {
|
|
12
|
+
"mean": null,
|
|
13
|
+
"median": null,
|
|
14
|
+
"p90": null
|
|
15
|
+
},
|
|
16
|
+
"wall_clock_seconds": {
|
|
17
|
+
"mean": null,
|
|
18
|
+
"median": null,
|
|
19
|
+
"p90": null
|
|
20
|
+
},
|
|
21
|
+
"cost_per_issue_usd": {
|
|
22
|
+
"mean": null,
|
|
23
|
+
"median": null,
|
|
24
|
+
"p90": null
|
|
25
|
+
},
|
|
26
|
+
"issues": [],
|
|
27
|
+
"vs_baseline": {
|
|
28
|
+
"baseline_run_id": null,
|
|
29
|
+
"one_shot_success_rate_delta": null,
|
|
30
|
+
"human_intervention_delta": null,
|
|
31
|
+
"regressions": []
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -50,6 +50,30 @@ Affected: bin/forgedock.mjs
|
|
|
50
50
|
|
|
51
51
|
Read them whenever you want visibility into what your agents are doing. That's the whole point: the work is transparent and auditable, right there in GitHub.
|
|
52
52
|
|
|
53
|
+
## Attribution Footers (Opt-In)
|
|
54
|
+
|
|
55
|
+
ForgeDock can optionally append a small attribution line to pipeline-created PRs and visible annotation comments. This is the same mechanic used by Dependabot, Renovate, and CodeRabbit to grow through public repos — consentful and single-key opt-out.
|
|
56
|
+
|
|
57
|
+
**`attribution.pr_footer: true`** — every pipeline-created PR ends with one muted footer:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
> Orchestrated with ForgeDock — state, scheduling, review, and memory on GitHub.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**`attribution.annotation_link: true`** — visible (human-readable) annotation comments in the GitHub UI carry a small "Pipeline powered by ForgeDock" link at the end. Machine-readable `<!-- FORGE:... -->` HTML comments are never modified, regardless of this setting.
|
|
64
|
+
|
|
65
|
+
Both keys default to disabled. The recommended configuration for public repos is to enable both; for private repos, leave both off.
|
|
66
|
+
|
|
67
|
+
To configure, add an `attribution:` section to your `forge.yaml`:
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
attribution:
|
|
71
|
+
pr_footer: true # append footer to pipeline-created PRs
|
|
72
|
+
annotation_link: true # append link to visible annotation comments
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
To opt out entirely, set both to `false` or omit the section. No commit messages, git trailers, or machine-readable annotations are ever modified — this applies to PR bodies and visible comments only.
|
|
76
|
+
|
|
53
77
|
## Want the Technical Details?
|
|
54
78
|
|
|
55
79
|
If you're building your own agent pipeline or contributing to ForgeDock, the full machine-readable format — every annotation type, completion markers, and parsing rules — is documented in the [FORGE Annotation Protocol](./forge-annotation-protocol.md).
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "ForgeDock Command Learning Path"
|
|
3
|
-
description: "A tiered learning path for ForgeDock's slash commands. Learn the 3 essential commands first, then add
|
|
3
|
+
description: "A tiered learning path for ForgeDock's slash commands. Learn the 3 essential commands first, then add observe-&-recover, ops, and advanced commands as you need them."
|
|
4
4
|
keywords: ["claude code commands guide", "forgedock learning path", "claude code getting started", "which claude code commands to learn", "ai pipeline commands"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Command Learning Path
|
|
8
8
|
|
|
9
|
-
ForgeDock installs
|
|
9
|
+
ForgeDock installs many slash commands. You do **not** need to learn them all. Most of the time you'll use three.
|
|
10
10
|
|
|
11
|
-
This page tiers every command by *when you need it* — so you can start small and add commands as your workflow grows. For
|
|
11
|
+
This page tiers every command by *when you need it* — so you can start small and add commands as your workflow grows. For a full domain-grouped lookup of every command, see the [Complete Command Reference](./command-reference.md).
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
@@ -26,7 +26,7 @@ Everything below is optional and additive. Come back when you hit the situation
|
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
|
-
## Tier 1 —
|
|
29
|
+
## Tier 1 — Core Loop
|
|
30
30
|
|
|
31
31
|
**When you need this:** Day 1. This is the minimum viable ForgeDock.
|
|
32
32
|
|
|
@@ -35,8 +35,10 @@ Everything below is optional and additive. Come back when you hit the situation
|
|
|
35
35
|
| `/work-on #N` | Pick up an issue and run the full pipeline: investigate → build → review → merge |
|
|
36
36
|
| `/issue` | Create a well-structured issue the pipeline can consume reliably |
|
|
37
37
|
| `/review-pr` | Review a PR with context-aware, domain-specialist agents |
|
|
38
|
+
| `/quality-gate` | Pre-commit checks, gated by the domains your change actually touches |
|
|
39
|
+
| `/test-gate` | Acceptance verification against running code before anything deploys |
|
|
38
40
|
|
|
39
|
-
With just these
|
|
41
|
+
With just these, you can ship a change end-to-end: write an issue, run it, review the result, and verify it works before it ships.
|
|
40
42
|
|
|
41
43
|
---
|
|
42
44
|
|
|
@@ -49,13 +51,31 @@ With just these three, you can ship a change end-to-end: write an issue, run it,
|
|
|
49
51
|
| `/orchestrate` | Run multiple issues — or an entire milestone — in parallel |
|
|
50
52
|
| `/milestone` | Plan, track, and ship a milestone |
|
|
51
53
|
| `/deploy-info` | See what will deploy next: staging vs. main diff with risk assessment |
|
|
52
|
-
| `/
|
|
54
|
+
| `/scope` | Estimate issue complexity before committing to `/work-on` |
|
|
55
|
+
| `/adopt` | Bootstrap an existing repo's backlog into pipeline-ready issues |
|
|
53
56
|
|
|
54
57
|
These commands scale ForgeDock from "one issue at a time" to "a planned body of work moving in parallel."
|
|
55
58
|
|
|
56
59
|
---
|
|
57
60
|
|
|
58
|
-
## Tier 3 —
|
|
61
|
+
## Tier 3 — Observe & Recover
|
|
62
|
+
|
|
63
|
+
**When you need this:** As soon as you have multiple pipeline runs in flight or your first interrupted run. These are the durable-state commands — the most differentiating part of ForgeDock's architecture.
|
|
64
|
+
|
|
65
|
+
| Command | What it does |
|
|
66
|
+
|---------|-------------|
|
|
67
|
+
| `/pipeline-status` | Fleet view of every in-flight issue, straight from workflow labels |
|
|
68
|
+
| `/pipeline-resume` | Resume an interrupted run from whatever state GitHub reports |
|
|
69
|
+
| `/diagnose` | Trace why a run failed, from its annotations |
|
|
70
|
+
| `/explain` | Translate the FORGE annotations on any issue into plain language |
|
|
71
|
+
| `/replay` | Replay a past run's full audit trail |
|
|
72
|
+
| `/changelog` | Release notes assembled from merged PRs and trajectory receipts |
|
|
73
|
+
|
|
74
|
+
These commands turn ForgeDock's event-sourced run log and FORGE annotation trail into something you can inspect, recover from, and communicate about — crash-safe pipelines that can always resume, and audit trails that any teammate can read.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Tier 4 — Operations
|
|
59
79
|
|
|
60
80
|
**When you need this:** When something goes wrong in production, or when you're shipping a release.
|
|
61
81
|
|
|
@@ -64,33 +84,50 @@ These commands scale ForgeDock from "one issue at a time" to "a planned body of
|
|
|
64
84
|
| `/rollback` | Create a revert PR to roll back a shipped feature or fix |
|
|
65
85
|
| `/incident-response` | Coordinate a P0 incident: hotfix validation, timeline, postmortem |
|
|
66
86
|
| `/security-audit` | Run a periodic security posture audit |
|
|
67
|
-
| `/
|
|
87
|
+
| `/autopilot` | Autonomous improvement cycle: recon → triage → fix |
|
|
88
|
+
| `/cleanup` | Sweep stale issues, branches, and worktrees |
|
|
68
89
|
|
|
69
90
|
You'll reach for these occasionally, not daily — but you'll be glad they exist the moment you need them.
|
|
70
91
|
|
|
71
92
|
---
|
|
72
93
|
|
|
73
|
-
## Tier
|
|
94
|
+
## Tier 5 — Pipeline Tuning
|
|
74
95
|
|
|
75
96
|
**When you need this:** Advanced. Once ForgeDock is part of your daily workflow and you want to make the pipeline itself faster and smarter.
|
|
76
97
|
|
|
77
98
|
| Command | What it does |
|
|
78
99
|
|---------|-------------|
|
|
79
|
-
| `/autopilot` | Autonomous improvement cycle: recon → triage → fix |
|
|
80
100
|
| `/pipeline-health` | Self-analysis: measure pipeline performance and propose improvements |
|
|
81
101
|
| `/optimize` | Generate adaptive scripts to speed up repeated pipeline work |
|
|
82
|
-
| `/
|
|
102
|
+
| `/ci-audit` | Audit CI workflows for missing stack-specific validation checks |
|
|
103
|
+
| `/compat-audit` | Check Claude Code version compatibility with ForgeDock features |
|
|
83
104
|
|
|
84
105
|
These commands turn ForgeDock on itself — measuring, debugging, and tuning the pipeline you run every day.
|
|
85
106
|
|
|
86
107
|
---
|
|
87
108
|
|
|
109
|
+
## Extras / Project-Specific
|
|
110
|
+
|
|
111
|
+
**When you need this:** Only if your project is a public web property with analytics platforms (GSC, GA4, Umami, Cloudflare, Stripe, Clarity) configured in `forge.yaml`.
|
|
112
|
+
|
|
113
|
+
| Command | What it does |
|
|
114
|
+
|---------|-------------|
|
|
115
|
+
| `/analytics` | Pull production analytics from multiple sources and create issues |
|
|
116
|
+
| `/qa-sweep` | Browser-automated QA sweep across your web app (requires Playwright MCP) |
|
|
117
|
+
| `/geo-audit` | Check AI referral traffic and GEO compliance for your pages |
|
|
118
|
+
| `/audit-agents` | Analyze per-agent performance from large `/orchestrate` runs |
|
|
119
|
+
|
|
120
|
+
These ship with ForgeDock but are not general-purpose pipeline commands. If your project is a backend service, CLI tool, or library, these have nothing to act on.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
88
124
|
## How to grow your toolkit
|
|
89
125
|
|
|
90
|
-
1. **Start with the
|
|
126
|
+
1. **Start with the Tier 1 commands.** Ship one issue end-to-end.
|
|
91
127
|
2. **Add Tier 2 when you have more than one thing in flight.** Orchestrate a milestone instead of babysitting issues one by one.
|
|
92
|
-
3. **
|
|
93
|
-
4. **
|
|
128
|
+
3. **Add Tier 3 when you hit your first interrupted run or want visibility into in-flight work.** These are the observe-and-recover commands — they make the pipeline resilient and readable.
|
|
129
|
+
4. **Reach for Tier 4 only when operations demand it** — a bad deploy, an incident, a release.
|
|
130
|
+
5. **Explore Tier 5 once the pipeline is routine** and you want it faster and self-tuning.
|
|
94
131
|
|
|
95
132
|
You never have to memorize the full command set. Learn the next tier the day you need it.
|
|
96
133
|
|