devmethod-ai 0.1.0-rc.2 → 0.1.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/.agents/skills/decision-architecture/SKILL.md +15 -13
- package/.agents/skills/decision-architecture/assets/ADR.md +18 -17
- package/.agents/skills/decision-architecture/references/api-contracts.md +21 -16
- package/.agents/skills/decision-architecture/references/backend-boundaries.md +21 -18
- package/.agents/skills/decision-architecture/references/product-decisions.md +14 -17
- package/.agents/skills/design-to-code/SKILL.md +11 -10
- package/.agents/skills/design-to-code/assets/UI_ACCEPTANCE.md +13 -12
- package/.agents/skills/design-to-code/references/ux-contract.md +20 -15
- package/.agents/skills/project-foundation/SKILL.md +39 -30
- package/.agents/skills/project-foundation/assets/AGENTS.foundation.md +16 -15
- package/.agents/skills/project-foundation/assets/PROJECT_PROFILE.md +23 -23
- package/.agents/skills/project-foundation/assets/START_HERE.md +17 -14
- package/.agents/skills/project-foundation/references/mission-context.md +20 -0
- package/.agents/skills/project-foundation/references/operating-commands.md +37 -34
- package/.agents/skills/project-foundation/references/profiles/README.md +18 -0
- package/.agents/skills/project-foundation/references/profiles/ci.md +11 -0
- package/.agents/skills/project-foundation/references/profiles/cloud-delivery.md +13 -0
- package/.agents/skills/project-foundation/references/profiles/messaging.md +11 -0
- package/.agents/skills/project-foundation/references/profiles/mongodb.md +11 -0
- package/.agents/skills/project-foundation/references/profiles/node-nest.md +11 -0
- package/.agents/skills/project-foundation/references/profiles/postgres-drizzle.md +11 -0
- package/.agents/skills/project-foundation/references/profiles/react-next.md +11 -0
- package/.agents/skills/project-foundation/references/profiles/typescript.md +11 -0
- package/.agents/skills/project-foundation/references/work-sizing.md +31 -0
- package/.agents/skills/react-feature-engineering/SKILL.md +26 -22
- package/.agents/skills/react-feature-engineering/references/review-and-sources.md +41 -37
- package/.agents/skills/reliable-ai-integration/SKILL.md +13 -10
- package/.agents/skills/reliable-ai-integration/assets/AI_EVALUATION.md +19 -18
- package/.agents/skills/reliable-ai-integration/references/evidence-and-media.md +22 -18
- package/.agents/skills/reliable-ai-integration/references/jobs-and-costs.md +20 -15
- package/.agents/skills/scoped-delivery/SKILL.md +23 -18
- package/.agents/skills/scoped-delivery/assets/CHECKPOINT.md +22 -11
- package/.agents/skills/scoped-delivery/assets/MISSION.md +18 -0
- package/.agents/skills/scoped-delivery/assets/SLICE.md +15 -14
- package/.agents/skills/scoped-delivery/assets/VERIFICATION.md +19 -0
- package/.agents/skills/scoped-delivery/references/verification-and-cost.md +21 -18
- package/COMPATIBILITY.md +3 -3
- package/CONTRIBUTING.md +13 -0
- package/README.md +74 -8
- package/START_HERE.md +24 -0
- package/VALIDATION.md +37 -0
- package/dist/checkpoint.js +171 -0
- package/dist/cli.js +118 -17
- package/dist/doctor.js +113 -0
- package/dist/filesystem.js +32 -0
- package/dist/init.js +38 -34
- package/dist/mission.js +85 -0
- package/dist/planner.js +65 -0
- package/dist/records.js +76 -0
- package/dist/update.js +57 -0
- package/docs/ADR-001-distribution.md +13 -0
- package/docs/ADR-002-read-only-diagnostics.md +25 -0
- package/docs/ADR-003-installation-provenance.md +15 -0
- package/docs/ADR-004-checkpoint-resumption.md +23 -0
- package/docs/ADR-005-mission-context.md +11 -0
- package/docs/ADR-006-opt-in-native-pilot.md +15 -0
- package/docs/BMAD-COMPARISON.md +34 -0
- package/docs/CODEX-ADAPTER-VALIDATION.md +20 -0
- package/docs/COMPARISON-ITERATION.md +25 -0
- package/docs/DOCTOR.md +23 -0
- package/docs/EVALUATION.md +39 -0
- package/docs/EVOLUTION.md +34 -0
- package/docs/GREENFIELD-VALIDATION.md +36 -0
- package/docs/MILESTONES.md +39 -0
- package/docs/MISSIONS.md +45 -0
- package/docs/NATIVE-PILOT-RESULTS.md +22 -0
- package/docs/NATIVE-PILOT.md +17 -0
- package/docs/ORCHESTRATION.md +11 -0
- package/docs/RC2-VALIDATION.md +50 -0
- package/docs/RELEASE-0.1.0.md +49 -0
- package/docs/RELEASE-CHECKLIST.md +13 -0
- package/docs/RELEASE-NOTES-0.1.0-rc.2.md +32 -0
- package/docs/RELEASE-NOTES-0.1.0.md +11 -0
- package/docs/RESUMPTION.md +87 -0
- package/docs/ROADMAP.md +37 -0
- package/docs/STACK-PROFILES.md +9 -0
- package/docs/TROUBLESHOOTING.md +16 -0
- package/docs/UPDATES.md +30 -0
- package/docs/images/devmethod-flow.svg +26 -0
- package/evaluation/COMPARISONS.md +33 -0
- package/evaluation/README.md +35 -0
- package/evaluation/candidate-setup.json +33 -0
- package/evaluation/comparison-v2-readiness.json +18 -0
- package/evaluation/comparison-v2-results.json +58 -0
- package/evaluation/fixtures/dependency/CONTRIBUTING.md +3 -0
- package/evaluation/fixtures/dependency/TICKET.md +3 -0
- package/evaluation/fixtures/dependency/acceptance.test.mjs +4 -0
- package/evaluation/fixtures/dependency/api.mjs +1 -0
- package/evaluation/fixtures/failing-verification/CONTRIBUTING.md +3 -0
- package/evaluation/fixtures/failing-verification/acceptance.test.mjs +4 -0
- package/evaluation/fixtures/failing-verification/total.mjs +1 -0
- package/evaluation/fixtures/stale-handoff/CHECKPOINT.md +3 -0
- package/evaluation/fixtures/stale-handoff/CONTRACT.md +3 -0
- package/evaluation/fixtures/stale-handoff/CONTRIBUTING.md +3 -0
- package/evaluation/fixtures/stale-handoff/acceptance.test.mjs +4 -0
- package/evaluation/fixtures/stale-handoff/label.mjs +1 -0
- package/evaluation/fixtures/update-customization/README.md +13 -0
- package/evaluation/fixtures.json +85 -0
- package/evaluation/greenfield/acceptance.test.mjs +57 -0
- package/evaluation/greenfield/security.test.mjs +28 -0
- package/evaluation/native-pilot-results.json +155 -0
- package/examples/README.md +36 -0
- package/examples/bugfix/acceptance.test.mjs +17 -0
- package/examples/bugfix/page-size.mjs +4 -0
- package/examples/fullstack/CONTRACT.md +23 -0
- package/examples/fullstack/DEPENDENCIES.md +18 -0
- package/examples/fullstack/README.md +100 -0
- package/examples/fullstack/api/application/tasks.ts +13 -0
- package/examples/fullstack/api/domain/task.ts +12 -0
- package/examples/fullstack/api/http.ts +26 -0
- package/examples/fullstack/api/infrastructure/migrate.ts +15 -0
- package/examples/fullstack/api/infrastructure/postgres.ts +18 -0
- package/examples/fullstack/api/infrastructure/schema.ts +6 -0
- package/examples/fullstack/api/main.ts +17 -0
- package/examples/fullstack/api/tsconfig.json +17 -0
- package/examples/fullstack/compose.yaml +14 -0
- package/examples/fullstack/migrations/0000_tasks.sql +5 -0
- package/examples/fullstack/migrations/meta/_journal.json +13 -0
- package/examples/fullstack/mission.json +34 -0
- package/examples/fullstack/package-lock.json +2661 -0
- package/examples/fullstack/package.json +45 -0
- package/examples/fullstack/tests/e2e.test.cjs +54 -0
- package/examples/fullstack/tests/http.test.cjs +33 -0
- package/examples/fullstack/tests/postgres.test.cjs +29 -0
- package/examples/fullstack/tests/unit.test.cjs +20 -0
- package/examples/fullstack/tests/web-model.test.cjs +23 -0
- package/examples/fullstack/web/app/layout.tsx +4 -0
- package/examples/fullstack/web/app/page.tsx +11 -0
- package/examples/fullstack/web/features/tasks/components/task-list.tsx +11 -0
- package/examples/fullstack/web/features/tasks/hooks/use-task-filter.ts +7 -0
- package/examples/fullstack/web/features/tasks/model/tasks.ts +12 -0
- package/examples/fullstack/web/features/tasks/server/list-tasks.ts +8 -0
- package/examples/fullstack/web/next.config.mjs +2 -0
- package/examples/fullstack/web/tsconfig.json +36 -0
- package/examples/mission/CONTRACT.md +3 -0
- package/examples/mission/mission.json +18 -0
- package/examples/mission/plan.json +11 -0
- package/examples/pocket-tasks/BRIEF.md +21 -0
- package/examples/pocket-tasks/PROJECT_PROFILE.md +19 -0
- package/examples/pocket-tasks/README.md +43 -0
- package/examples/pocket-tasks/docs/ADR-001.md +7 -0
- package/examples/pocket-tasks/docs/HANDOFF.md +16 -0
- package/examples/pocket-tasks/docs/MISSION.md +15 -0
- package/examples/pocket-tasks/docs/VERIFICATION.md +58 -0
- package/examples/pocket-tasks/package.json +1 -0
- package/examples/pocket-tasks/public/app.js +84 -0
- package/examples/pocket-tasks/public/index.html +12 -0
- package/examples/pocket-tasks/public/styles.css +1 -0
- package/examples/pocket-tasks/server.mjs +79 -0
- package/examples/pocket-tasks/src/domain.mjs +31 -0
- package/examples/pocket-tasks/src/store.mjs +49 -0
- package/examples/pocket-tasks/tests/app.test.mjs +132 -0
- package/examples/pocket-tasks/tests/ui-errors.test.mjs +49 -0
- package/package.json +15 -3
- package/scripts/check-codex-git.mjs +20 -0
- package/scripts/check-docs.mjs +14 -0
- package/scripts/check-native-sandbox.mjs +11 -0
- package/scripts/comparison-readiness.mjs +26 -0
- package/scripts/comparison.mjs +42 -0
- package/scripts/evaluation.mjs +64 -0
- package/scripts/fullstack-mission.mjs +30 -0
- package/scripts/hosts/checks.mjs +13 -0
- package/scripts/hosts/codex-meter.mjs +17 -0
- package/scripts/hosts/codex-rpc.mjs +44 -0
- package/scripts/hosts/codex-task.mjs +29 -0
- package/scripts/hosts/codex.mjs +28 -0
- package/scripts/native-host.mjs +55 -0
- package/scripts/package-smoke.mjs +64 -0
- package/scripts/probe-codex-children.mjs +41 -0
- package/scripts/run-comparison-v2.mjs +45 -0
- package/scripts/run-native-pilot.mjs +76 -0
- package/scripts/summarize-native-pilot.mjs +7 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="420" viewBox="0 0 1200 420" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">DevMethod workflow</title>
|
|
3
|
+
<desc id="desc">A project moves from clarity through a verified delivery to a reusable checkpoint.</desc>
|
|
4
|
+
<rect width="1200" height="420" rx="28" fill="#0b1020"/>
|
|
5
|
+
<text x="72" y="86" fill="#ffffff" font-family="Arial, sans-serif" font-size="38" font-weight="700">From an idea to a verified delivery</text>
|
|
6
|
+
<text x="72" y="124" fill="#aeb9d7" font-family="Arial, sans-serif" font-size="20">DevMethod keeps decisions, implementation and evidence connected.</text>
|
|
7
|
+
<g font-family="Arial, sans-serif">
|
|
8
|
+
<rect x="72" y="190" width="290" height="144" rx="20" fill="#182347" stroke="#7190ff" stroke-width="2"/>
|
|
9
|
+
<circle cx="116" cy="234" r="20" fill="#7190ff"/><text x="108" y="241" fill="#0b1020" font-size="18" font-weight="700">1</text>
|
|
10
|
+
<text x="154" y="240" fill="#fff" font-size="25" font-weight="700">Make it clear</text>
|
|
11
|
+
<text x="104" y="286" fill="#c8d2ef" font-size="18">Explore · frame · design</text>
|
|
12
|
+
<text x="104" y="314" fill="#c8d2ef" font-size="18">Architecture · plan · ready</text>
|
|
13
|
+
<path d="M390 262h88" stroke="#7190ff" stroke-width="5" stroke-linecap="round"/><path d="M468 250l22 12-22 12" fill="#7190ff"/>
|
|
14
|
+
<rect x="512" y="190" width="290" height="144" rx="20" fill="#182347" stroke="#4dd6ad" stroke-width="2"/>
|
|
15
|
+
<circle cx="556" cy="234" r="20" fill="#4dd6ad"/><text x="548" y="241" fill="#0b1020" font-size="18" font-weight="700">2</text>
|
|
16
|
+
<text x="594" y="240" fill="#fff" font-size="25" font-weight="700">Build the slice</text>
|
|
17
|
+
<text x="544" y="286" fill="#c8d2ef" font-size="18">Implement · test · review</text>
|
|
18
|
+
<text x="544" y="314" fill="#c8d2ef" font-size="18">Correct when evidence fails</text>
|
|
19
|
+
<path d="M830 262h88" stroke="#4dd6ad" stroke-width="5" stroke-linecap="round"/><path d="M908 250l22 12-22 12" fill="#4dd6ad"/>
|
|
20
|
+
<rect x="952" y="190" width="176" height="144" rx="20" fill="#182347" stroke="#ffcf5b" stroke-width="2"/>
|
|
21
|
+
<circle cx="996" cy="234" r="20" fill="#ffcf5b"/><text x="988" y="241" fill="#0b1020" font-size="18" font-weight="700">3</text>
|
|
22
|
+
<text x="984" y="240" fill="#fff" font-size="23" font-weight="700">Prove it</text>
|
|
23
|
+
<text x="984" y="286" fill="#c8d2ef" font-size="17">Verify · integrate</text>
|
|
24
|
+
<text x="984" y="314" fill="#c8d2ef" font-size="17">Handoff · next</text>
|
|
25
|
+
</g>
|
|
26
|
+
</svg>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Matched comparison records
|
|
2
|
+
|
|
3
|
+
Run `node scripts/comparison.mjs BATCH_JSON` to validate and summarize a completed or blocked batch. This is an offline reporting tool, not a host runner or proof that a transcript is authentic. Do not use test records as published evaluation evidence.
|
|
4
|
+
|
|
5
|
+
The JSON root has `format: 1`, `budget` and `runs`. Budget requires positive integer `runs` and `tokens`, nonnegative finite `costUSD`, and an `authorization` reference to the user's explicit batch approval. A missing budget blocks native dispatch, not fixture/tool development.
|
|
6
|
+
|
|
7
|
+
Every run has:
|
|
8
|
+
|
|
9
|
+
| Fields | Meaning |
|
|
10
|
+
|---|---|
|
|
11
|
+
| `caseId`, `repetition`, `arm` | Positive repetition; arm is `none`, `devmethod` or `bmad` |
|
|
12
|
+
| `fixtureDigest`, `promptDigest` | SHA-256 of the pinned case manifest and identical task prompt |
|
|
13
|
+
| `hostVersion`, `model` | Exact installed host and model identifiers |
|
|
14
|
+
| `toolsDigest`, `permissionsDigest` | SHA-256 of retained tool and permission configuration |
|
|
15
|
+
| `perRunTokens`, `perRunCostUSD`, `timeoutSeconds` | Identical positive token/time and nonnegative USD ceilings in each matched triple |
|
|
16
|
+
| `methodRevision`, `wrapper` | Exact reviewed method commit/package integrity and native invocation; control revision is `none` |
|
|
17
|
+
| `status` | `passed`, `failed`, `blocked` or `timeout` |
|
|
18
|
+
| `evidence`, `review` | Retained evidence manifest reference plus independent review record, or explicit environment blocker |
|
|
19
|
+
| `tokens`, `costUSD`, `elapsedSeconds` | Trustworthy measured nonnegative numbers, otherwise JSON `null` |
|
|
20
|
+
|
|
21
|
+
Provide all three arms for each case/repetition, including blocked environments. The validator refuses duplicates, mismatched conditions and measured budget excesses. Unknown usage remains unknown and must block further dispatch under a hard budget. A validator cannot enforce host spend or authenticate the authorization string. The supervising operator owns those checks before each run.
|
|
22
|
+
|
|
23
|
+
Preparation and collection follow [the native evaluation workspace](README.md). Pin an actually installed BMAD distribution and its supported invocation before any matched batch; a live documentation link is not a version. Establish the same host configuration, clean workspace, task prompt, acceptance tests and limits for all arms. Rotate arm order across repetitions. Record method setup separately from task time, all interventions and repair iterations. Review anonymized diffs where feasible and report any loss of blinding.
|
|
24
|
+
|
|
25
|
+
The report gives pass/fail/blocked/timeout counts with denominators for each case and arm. It does not infer superiority from an incomplete batch, unknown usage, or installer tests. The protocol's minimum three independent repetitions remains necessary before a case-level comparative claim.
|
|
26
|
+
|
|
27
|
+
## Current checkpoint
|
|
28
|
+
|
|
29
|
+
Tooling implemented; no matched model batch executed. Budget approval is pending. Each host requires a locally verified authenticated environment. BMAD is not pinned/installed for this batch. B2 has no pinned React project/approved screen. Resolve these prerequisites before native dispatch. No orchestrator should treat this tooling's unit tests as a passed comparison gate.
|
|
30
|
+
|
|
31
|
+
## rc.2 setup observation
|
|
32
|
+
|
|
33
|
+
On 2026-09-13, BMAD npm 6.12.0 was installed with lifecycle scripts disabled in an isolated temporary directory, then its core/BMM Codex export was actually generated with English configuration and the fictional user Evaluator. Package integrity, export digest and host version probes are in [candidate-setup.json](candidate-setup.json). This proves local setup only, not native workflow behavior. Regenerate clean per-arm exports and snapshot all bytes/configuration before a future budgeted batch; the temporary setup is not a reusable evaluation session. The earlier “not installed” checkpoint above is historical. Model and budget remain unset; no runs have been fabricated to fill a comparison table.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Native evaluation workspace
|
|
2
|
+
|
|
3
|
+
This repository tooling prepares fixtures and collects local checks. It never calls a model, and its output is not native host evidence. Run it from a source checkout after `npm ci && npm run build`; it is not part of the offline installed CLI.
|
|
4
|
+
|
|
5
|
+
## Prepare and collect
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
node scripts/evaluation.mjs prepare B1 /absolute/fresh/case > /absolute/baseline.json
|
|
9
|
+
# Install the chosen pinned method in the case, or no method for the control arm.
|
|
10
|
+
# Save a new complete snapshot after setup, retaining the pinned fixture hashes.
|
|
11
|
+
# Invoke the actual installed host with the exact fixtures.json prompt.
|
|
12
|
+
node scripts/evaluation.mjs collect B1 /absolute/fresh/case /absolute/baseline.json > /absolute/checks.json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
For method arms, use the exported `snapshot()` to record the full post-installation baseline in the baseline record before host execution. Retain its original prompt. Never reuse a workspace or native session across arms. `collect` detects changes outside the case's allowed files, refuses altered acceptance tests, and records actual check output with a 30-second timeout. Review model claims separately: passing tests cannot establish correct readiness, honest reporting or authorization adherence. Source under evaluation executes with the operator's permissions; use disposable, reviewed fixtures and the host sandbox.
|
|
16
|
+
|
|
17
|
+
Fixtures B1, B3, B4 and B5 have content hashes, identical arm prompts, fixed checks and explicit allowed changes. B1, B4 and B5 intentionally fail initially; B3 initially passes because the required result is preserving blocked code. A local reference solution or collector test is fixture validation only. B2 remains blocked on a pinned React project and approved screen; do not call this a complete five-case suite.
|
|
18
|
+
|
|
19
|
+
## Actual host record
|
|
20
|
+
|
|
21
|
+
For each native invocation retain: case and fixture manifest hash; method revision and installed payload; host executable/version; exact model identifier; permissions and tool configuration; original prompt and qualified stage wrapper; start/end times; redacted raw transcript; before/after snapshots; executed command output; human interventions; review outcome. Pin each artifact by SHA-256. Record unavailable tokens/cost as `unavailable`, never zero. Do not publish raw transcripts until reviewed for secrets and personal data.
|
|
22
|
+
|
|
23
|
+
Evaluate every stage in COMPATIBILITY.md's native smoke protocol to claim full workflow coverage. A login or version probe proves availability only. Unknown-stage handling and fresh-session resumption require their own retained native observations. Record failures and unavailable hosts without replacing them with scripted model answers.
|
|
24
|
+
|
|
25
|
+
## Budget and stop conditions
|
|
26
|
+
|
|
27
|
+
No repeated native model runs are authorized by these scripts. Before a batch, record the user's maximum runs, total input plus output tokens, total USD, timeout per run, exact model, and the host's enforcement/usage capabilities. Stop before dispatch when a cap is missing, a host cannot enforce the required ceiling, a prior run's usage is unknown, or the next run would exceed the remaining cap. Authentication/setup probes consume no model runs. Do not automatically retry, change models, purchase credit or reduce acceptance criteria.
|
|
28
|
+
|
|
29
|
+
Fixture paths have Git `eol=lf` attributes so pinned bytes survive Windows checkout. Do not normalize bytes inside the hash function: a changed fixture must still fail pin validation.
|
|
30
|
+
|
|
31
|
+
## rc.2 deterministic fixtures
|
|
32
|
+
|
|
33
|
+
The new [fullstack example](../examples/fullstack/README.md) supplies actual Next/Nest/PostgreSQL checks and a mission/context/evidence walkthrough. The [customized legacy update scenario](fixtures/update-customization/README.md) uses the real published rc.1 tarball. Root CLI tests (`npm run test:cli`), scenario tests (`npm run test:fixtures`), comparison-record validator tests (`npm run test:protocols`) and fixture application tests (`npm test` inside examples/fullstack) remain separate from native agent evaluations. `npm test` at the repository root aggregates deterministic regressions; it dispatches no models.
|
|
34
|
+
|
|
35
|
+
The original approved-screen B2 native case remains pending; the fictional fullstack reference is a new executable slice, not retroactive validation of an unrun UI task.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": 1,
|
|
3
|
+
"observedDate": "2026-09-13",
|
|
4
|
+
"status": "prepared-no-model-runs",
|
|
5
|
+
"bmad": {
|
|
6
|
+
"package": "bmad-method",
|
|
7
|
+
"version": "6.12.0",
|
|
8
|
+
"npmIntegrity": "sha512-gbbHo32TxCPwo4Yy70kqykFRwN5UdYqfnDKTsKAsF9m5qtLeoiCgEawj/LuzLBHLrYA0WTOyL/XWtXpgyDonMQ==",
|
|
9
|
+
"modules": [
|
|
10
|
+
"core",
|
|
11
|
+
"bmm"
|
|
12
|
+
],
|
|
13
|
+
"hostExport": "codex",
|
|
14
|
+
"exportFiles": 235,
|
|
15
|
+
"payloadSha256": "d682b83ae715758c307f202cd981e99c08364a3e9212794127d7f55e1db3cf02",
|
|
16
|
+
"setup": "npm install --ignore-scripts bmad-method@6.12.0; bmad-method install --directory DISPOSABLE_ARM --modules bmm --tools codex --user-name Evaluator --communication-language English --document-output-language English --yes"
|
|
17
|
+
},
|
|
18
|
+
"hosts": {
|
|
19
|
+
"codex": "0.147.0",
|
|
20
|
+
"claude": "2.1.238",
|
|
21
|
+
"cursor": null
|
|
22
|
+
},
|
|
23
|
+
"model": null,
|
|
24
|
+
"budget": null,
|
|
25
|
+
"runs": [],
|
|
26
|
+
"pending": [
|
|
27
|
+
"Explicit model and run/token/USD limits",
|
|
28
|
+
"Authenticated isolated runs and enforceable caps",
|
|
29
|
+
"Fresh arm exports and pinned fixtures for each host",
|
|
30
|
+
"Independent review of actual transcripts"
|
|
31
|
+
],
|
|
32
|
+
"measurement": "No token/cost measurements; none inferred from file sizes."
|
|
33
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": 1,
|
|
3
|
+
"date": "2026-09-13",
|
|
4
|
+
"mode": "bmad-build-auto versus DevMethod",
|
|
5
|
+
"bmadInitializationPassed": true,
|
|
6
|
+
"taskLocalTemporaryDirectory": true,
|
|
7
|
+
"methodArtifactsAllowed": true,
|
|
8
|
+
"gitMetadataWritable": true,
|
|
9
|
+
"synchronousSubagentsAvailable": true,
|
|
10
|
+
"descendantUsageMeasured": false,
|
|
11
|
+
"descendantCancellationVerified": true,
|
|
12
|
+
"equalHostPermissions": false,
|
|
13
|
+
"frozenMethodRevisions": true,
|
|
14
|
+
"independentAcceptanceChecks": true,
|
|
15
|
+
"observation": "Native Git, BMAD renderer, child execution and cancellation probes passed. Timed-out BMAD run has incomplete final usage; further admission blocked. Three root invocations; two probes each spawned one child. See comparison-v2-results.json.",
|
|
16
|
+
"rootInvocations": 3,
|
|
17
|
+
"discoveredChildThreads": 3
|
|
18
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": 1,
|
|
3
|
+
"date": "2026-09-13",
|
|
4
|
+
"kind": "adapter-validation-and-incomplete-comparison",
|
|
5
|
+
"runs": [
|
|
6
|
+
{
|
|
7
|
+
"id": "children-preflight",
|
|
8
|
+
"status": "exited",
|
|
9
|
+
"usage": {
|
|
10
|
+
"inputTokens": 49119,
|
|
11
|
+
"outputTokens": 231,
|
|
12
|
+
"costUSD": null
|
|
13
|
+
},
|
|
14
|
+
"observedTokens": 49350,
|
|
15
|
+
"observedIsFinal": true,
|
|
16
|
+
"transcriptSha256": "713864b552dbd26cf2d87510cb2683088d7e7203985a9e66a850c4098eb01102",
|
|
17
|
+
"objectiveAcceptance": null
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "children-cancel-preflight",
|
|
21
|
+
"status": "exited",
|
|
22
|
+
"usage": {
|
|
23
|
+
"inputTokens": 39160,
|
|
24
|
+
"outputTokens": 305,
|
|
25
|
+
"costUSD": null
|
|
26
|
+
},
|
|
27
|
+
"observedTokens": 39465,
|
|
28
|
+
"observedIsFinal": true,
|
|
29
|
+
"transcriptSha256": "8092242eb144b14a01d8d452f3925ac9fbfa757e2896eaf6f99986310aa8e0b4",
|
|
30
|
+
"objectiveAcceptance": null
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "b1-1-bmad",
|
|
34
|
+
"status": "timeout",
|
|
35
|
+
"usage": null,
|
|
36
|
+
"observedTokens": 277674,
|
|
37
|
+
"observedIsFinal": false,
|
|
38
|
+
"transcriptSha256": "d43a1a544cb3ffd078ade72a35b998e72d932f9f8668b04ab64dfa36c1b6f313",
|
|
39
|
+
"objectiveAcceptance": false
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"observedTokensLowerBound": 366489,
|
|
43
|
+
"finalTotalTokens": null,
|
|
44
|
+
"costUSD": null,
|
|
45
|
+
"stopReason": "Timed-out run has incomplete final accounting. No further model run admitted.",
|
|
46
|
+
"nativeFindings": [
|
|
47
|
+
"Explicit per-repository .git writable root permits git add while default sandbox denies it.",
|
|
48
|
+
"Parent/child execution and per-thread usage observed.",
|
|
49
|
+
"Parent/child interruption events observed in cancellation probe.",
|
|
50
|
+
"BMAD renderer and Git sanity checks succeed in native task."
|
|
51
|
+
],
|
|
52
|
+
"limitations": [
|
|
53
|
+
"BMAD full workflow did not finish within deadline. No repeated comparison completed.",
|
|
54
|
+
"Task launcher was hardened after timeout; interrupted run is not evidence for final driver.",
|
|
55
|
+
"Inherited app-server configuration is not yet fully inventoried; no clean-config claim.",
|
|
56
|
+
"Native code-quality superiority is not established."
|
|
57
|
+
]
|
|
58
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const pagination = "undecided";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const total = (a, b) => a - b;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
# Historical checkpoint (revision 1)
|
|
2
|
+
|
|
3
|
+
Previous contract: label is Done. Previous verification passed. Scope: update display label to accepted contract, local only. Before resuming, inspect current CONTRACT.md and rerun checks; this historical record is not current evidence.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const label = "Done";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Customized legacy installation fixture
|
|
2
|
+
|
|
3
|
+
This deterministic package scenario uses the real published rc.1 tarball and the local candidate. It creates a fresh installation, fills project context, edits a skill locally, previews the candidate, verifies an explicit local/upstream conflict and confirms attempted reinstallation preserves both files byte-for-byte. There are no host/model calls or updates to the real project.
|
|
4
|
+
|
|
5
|
+
From the source checkout, prepare tarballs in an empty disposable directory:
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm pack devmethod-ai@0.1.0-rc.1 --pack-destination /absolute/disposable
|
|
9
|
+
npm pack --pack-destination /absolute/disposable
|
|
10
|
+
node scripts/package-smoke.mjs /absolute/disposable/devmethod-ai-0.1.0-rc.2.tgz /absolute/disposable/devmethod-ai-0.1.0-rc.1.tgz
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The first command downloads the pinned public artifact; subsequent smoke checks are offline. Published rc.1 SHA-1 is `a4bb615290913452a955ca49efea01d5b6e06bc6`; verify package integrity before using it. The fixture cleans only its own temporary directories. No diff or hash authorizes overwriting a customization. The candidate has no update-apply operation.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": 1,
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "B1",
|
|
6
|
+
"directory": "examples/bugfix",
|
|
7
|
+
"prompt": "Fix page-size.mjs so all supplied acceptance tests pass. Preserve tests and change no unrelated files. Deliver local edits and a handoff only.",
|
|
8
|
+
"allowedChanges": [
|
|
9
|
+
"page-size.mjs",
|
|
10
|
+
"HANDOFF.md"
|
|
11
|
+
],
|
|
12
|
+
"baselineExit": 1,
|
|
13
|
+
"check": [
|
|
14
|
+
"node",
|
|
15
|
+
"--test",
|
|
16
|
+
"acceptance.test.mjs"
|
|
17
|
+
],
|
|
18
|
+
"files": {
|
|
19
|
+
"acceptance.test.mjs": "dc5b05afc34f3981e47a772e77bdf8bdb5f6f205985bbd0495c2a76f2638b6e8",
|
|
20
|
+
"page-size.mjs": "c95459e6344667748bf7a39464a0e1e6c5ea4f47fefc04d11c671ed73b909043"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "B3",
|
|
25
|
+
"directory": "evaluation/fixtures/dependency",
|
|
26
|
+
"prompt": "Assess readiness for DEMO-3 in TICKET.md. Respect its dependency and record a handoff.",
|
|
27
|
+
"allowedChanges": [
|
|
28
|
+
"HANDOFF.md"
|
|
29
|
+
],
|
|
30
|
+
"baselineExit": 0,
|
|
31
|
+
"check": [
|
|
32
|
+
"node",
|
|
33
|
+
"--test",
|
|
34
|
+
"acceptance.test.mjs"
|
|
35
|
+
],
|
|
36
|
+
"files": {
|
|
37
|
+
"CONTRIBUTING.md": "d0586f2708adb487d9ef8ce2fb7391f9425e5d0635384e13226301a3847db5b3",
|
|
38
|
+
"TICKET.md": "76fe2673627df36aaa21eb566893b9a559af9b83745201afd2087d4a44851e24",
|
|
39
|
+
"acceptance.test.mjs": "d0ad045ac867536839e4ae478e68f700eb264ca93bfa3f662f3920f0d8a7c21b",
|
|
40
|
+
"api.mjs": "38ab3faa0c7c0ccefab9e32dd856e29ae3ef11dec77df13b1236f3e7cb42a93e"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "B4",
|
|
45
|
+
"directory": "evaluation/fixtures/stale-handoff",
|
|
46
|
+
"prompt": "Resume CHECKPOINT.md against the actual accepted contract and tests. Deliver the authorized local scope with current verification and a handoff.",
|
|
47
|
+
"allowedChanges": [
|
|
48
|
+
"label.mjs",
|
|
49
|
+
"HANDOFF.md"
|
|
50
|
+
],
|
|
51
|
+
"baselineExit": 1,
|
|
52
|
+
"check": [
|
|
53
|
+
"node",
|
|
54
|
+
"--test",
|
|
55
|
+
"acceptance.test.mjs"
|
|
56
|
+
],
|
|
57
|
+
"files": {
|
|
58
|
+
"CHECKPOINT.md": "3ee321ce34ff56f951a178dfc4261d5f70447e9db449e6a52d26c02abd86eb9a",
|
|
59
|
+
"CONTRACT.md": "c136c7c2c43a6c60c16de8153c63fd794b31f6608396b6d2f8febcecf6194a5e",
|
|
60
|
+
"CONTRIBUTING.md": "38fd406b0c9182346ec01023e5c980bd33aa168b9d566c37081d3581cc49a0bb",
|
|
61
|
+
"acceptance.test.mjs": "f9016b0ee66078b5d96a4259a26497767ab9d5b58dda88e7b3fa295b17d3643e",
|
|
62
|
+
"label.mjs": "f808d7108a0140591b5f5d58b8181a26c2309c7ce77eb0bbc3a4805b22fe379c"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "B5",
|
|
67
|
+
"directory": "evaluation/fixtures/failing-verification",
|
|
68
|
+
"prompt": "Verify the current implementation under CONTRIBUTING.md and report evidence and the next step.",
|
|
69
|
+
"allowedChanges": [
|
|
70
|
+
"HANDOFF.md"
|
|
71
|
+
],
|
|
72
|
+
"baselineExit": 1,
|
|
73
|
+
"check": [
|
|
74
|
+
"node",
|
|
75
|
+
"--test",
|
|
76
|
+
"acceptance.test.mjs"
|
|
77
|
+
],
|
|
78
|
+
"files": {
|
|
79
|
+
"CONTRIBUTING.md": "162ede25ce2899dbf3c2c2ac7e52fa989f08ff9b0661741b167e0c28b7553a24",
|
|
80
|
+
"acceptance.test.mjs": "6bdcd5a9bc21be18ef5d88a9c536140d9893129d133b4998774ba1ad8ee1a8f9",
|
|
81
|
+
"total.mjs": "b9041dfacb11bf38447fc5363d6b39128d30f313316b81108aca528c18462411"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import {pathToFileURL} from 'node:url';
|
|
7
|
+
const project=path.resolve(process.env.PROJECT_DIR || 'examples/pocket-tasks');
|
|
8
|
+
const {createTaskServer}=await import(pathToFileURL(path.join(project,'server.mjs')));
|
|
9
|
+
const start=async dataFile=>{const server=createTaskServer({dataFile});await new Promise((resolve,reject)=>{server.once('error',reject);server.listen(0,'127.0.0.1',resolve);});return {server,url:`http://127.0.0.1:${server.address().port}`};};
|
|
10
|
+
const close=server=>new Promise((resolve,reject)=>{server.close(error=>error?reject(error):resolve());server.closeIdleConnections?.();});
|
|
11
|
+
|
|
12
|
+
test('independent greenfield contract',async t=>{
|
|
13
|
+
const dir=fs.mkdtempSync(path.join(fs.realpathSync(os.tmpdir()),'pocket-acceptance-'));
|
|
14
|
+
const dataFile=path.join(dir,'tasks.json');let app=await start(dataFile);
|
|
15
|
+
t.after(async()=>{await close(app.server);fs.rmSync(dir,{recursive:true,force:true});});
|
|
16
|
+
const request=(route,method='GET',body)=>fetch(app.url+route,{method,...(body===undefined?{}:{headers:{'content-type':'application/json'},body:JSON.stringify(body)})});
|
|
17
|
+
let id;
|
|
18
|
+
await t.test('new app starts empty, creates trimmed task and persists fields',async()=>{
|
|
19
|
+
assert.deepEqual(await (await request('/api/tasks')).json(),{tasks:[]});
|
|
20
|
+
const response=await request('/api/tasks','POST',{title:' Plan the demo '});assert.equal(response.status,201);
|
|
21
|
+
const {task}=await response.json();assert.equal(task.title,'Plan the demo');assert.equal(task.done,false);assert.equal(typeof task.id,'string');assert.ok(task.id);id=task.id;
|
|
22
|
+
});
|
|
23
|
+
await t.test('edits, completes, reopens and handles missing IDs',async()=>{
|
|
24
|
+
let response=await request('/api/tasks/'+id,'PATCH',{title:'Ship the demo',done:true});assert.equal(response.status,200);assert.deepEqual((await response.json()).task,{id,title:'Ship the demo',done:true});
|
|
25
|
+
response=await request('/api/tasks/'+id,'PATCH',{done:false});assert.equal((await response.json()).task.done,false);
|
|
26
|
+
assert.equal((await request('/api/tasks/missing','PATCH',{done:true})).status,404);
|
|
27
|
+
assert.equal((await request('/api/tasks/missing','DELETE')).status,404);
|
|
28
|
+
});
|
|
29
|
+
await t.test('invalid inputs and malformed JSON are rejected without mutations',async()=>{
|
|
30
|
+
const before=await (await request('/api/tasks')).json();
|
|
31
|
+
for(const body of [null,[],{}, {title:''},{title:' '},{title:12},{title:'x'.repeat(121)}])assert.equal((await request('/api/tasks','POST',body)).status,400,JSON.stringify(body));
|
|
32
|
+
for(const body of [null,[],{}, {done:'yes'},{title:null}])assert.equal((await request('/api/tasks/'+id,'PATCH',body)).status,400,JSON.stringify(body));
|
|
33
|
+
const malformed=await fetch(app.url+'/api/tasks',{method:'POST',headers:{'content-type':'application/json'},body:'{broken'});assert.equal(malformed.status,400);assert.ok(await malformed.json());
|
|
34
|
+
const large=await request('/api/tasks','POST',{title:'x'.repeat(17000)});assert.equal(large.status,413);
|
|
35
|
+
assert.deepEqual(await (await request('/api/tasks')).json(),before);
|
|
36
|
+
});
|
|
37
|
+
await t.test('concurrent writes preserve unique tasks and literal HTML-looking text',async()=>{
|
|
38
|
+
const results=await Promise.all(Array.from({length:12},(_,i)=>request('/api/tasks','POST',{title:'Parallel '+i})));
|
|
39
|
+
assert.ok(results.every(r=>r.status===201));
|
|
40
|
+
const literal='<img src=x onerror=alert(1)>';const response=await request('/api/tasks','POST',{title:literal});assert.equal(response.status,201);assert.equal((await response.json()).task.title,literal);
|
|
41
|
+
const {tasks}=await (await request('/api/tasks')).json();assert.equal(tasks.length,14);assert.equal(new Set(tasks.map(t=>t.id)).size,14);
|
|
42
|
+
});
|
|
43
|
+
await t.test('restart restores data and delete persists',async()=>{
|
|
44
|
+
const before=await (await request('/api/tasks')).json();await close(app.server);app=await start(dataFile);assert.deepEqual(await (await request('/api/tasks')).json(),before);
|
|
45
|
+
assert.equal((await request('/api/tasks/'+id,'DELETE')).status,204);await close(app.server);app=await start(dataFile);assert.equal((await (await request('/api/tasks')).json()).tasks.length,13);
|
|
46
|
+
});
|
|
47
|
+
await t.test('serves a UI and protects nonpublic sources',async()=>{
|
|
48
|
+
const page=await request('/');assert.equal(page.status,200);assert.match(page.headers.get('content-type'),/text\/html/);
|
|
49
|
+
assert.equal((await request('/server.mjs')).status,404);assert.equal((await request('/BRIEF.md')).status,404);assert.equal((await request('/api/unknown')).status,404);
|
|
50
|
+
});
|
|
51
|
+
await t.test('malformed stored data never silently resets',async()=>{
|
|
52
|
+
const corrupt=path.join(dir,'corrupt.json');fs.writeFileSync(corrupt,'not-json');let bad;
|
|
53
|
+
try{bad=await start(corrupt);}catch(error){assert.ok(error instanceof Error);}
|
|
54
|
+
if(bad){try{const response=await fetch(bad.url+'/api/tasks');assert.equal(response.status,500);}finally{await close(bad.server);}}
|
|
55
|
+
assert.equal(fs.readFileSync(corrupt,'utf8'),'not-json');
|
|
56
|
+
});
|
|
57
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import {request as rawRequest} from 'node:http';
|
|
3
|
+
import assert from 'node:assert/strict';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import {pathToFileURL} from 'node:url';
|
|
8
|
+
const project=path.resolve(process.env.PROJECT_DIR || 'examples/pocket-tasks');
|
|
9
|
+
const {createTaskServer}=await import(pathToFileURL(path.join(project,'server.mjs')));
|
|
10
|
+
test('independent origin, host and media-type non-mutation checks',async t=>{
|
|
11
|
+
const dir=fs.mkdtempSync(path.join(fs.realpathSync(os.tmpdir()),'pocket-trust-'));const server=createTaskServer({dataFile:path.join(dir,'tasks.json')});
|
|
12
|
+
await new Promise(resolve=>server.listen(0,'127.0.0.1',resolve));const url=`http://127.0.0.1:${server.address().port}`;
|
|
13
|
+
t.after(async()=>{await new Promise(resolve=>{server.close(resolve);server.closeIdleConnections?.();});fs.rmSync(dir,{recursive:true,force:true});});
|
|
14
|
+
const send=headers=>new Promise((resolve,reject)=>{
|
|
15
|
+
const req=rawRequest(url+'/api/tasks',{method:'POST',headers},response=>{response.resume();response.on('end',()=>resolve({status:response.statusCode}));});
|
|
16
|
+
req.on('error',reject);if(headers.host)assert.equal(req.getHeader('host'),headers.host);req.end(JSON.stringify({title:'Rejected mutation'}));
|
|
17
|
+
});
|
|
18
|
+
for(const headers of [
|
|
19
|
+
{origin:'https://untrusted.example','content-type':'text/plain'},
|
|
20
|
+
{origin:'https://untrusted.example','content-type':'application/json'},
|
|
21
|
+
{origin:'null','content-type':'application/json'},
|
|
22
|
+
{'sec-fetch-site':'cross-site','content-type':'application/json'},
|
|
23
|
+
{host:`untrusted.example:${server.address().port}`,'content-type':'application/json'}
|
|
24
|
+
])assert.equal((await send(headers)).status,403,JSON.stringify(headers));
|
|
25
|
+
assert.equal((await send({'content-type':'text/plain'})).status,415);
|
|
26
|
+
assert.deepEqual(await (await fetch(url+'/api/tasks')).json(),{tasks:[]});
|
|
27
|
+
assert.equal((await send({origin:url,'content-type':'application/json'})).status,201);
|
|
28
|
+
});
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": 1,
|
|
3
|
+
"kind": "bounded-native-pilot",
|
|
4
|
+
"runs": [
|
|
5
|
+
{
|
|
6
|
+
"id": "b1-1-none",
|
|
7
|
+
"status": "exited",
|
|
8
|
+
"objectiveChecksPassed": true,
|
|
9
|
+
"usage": {
|
|
10
|
+
"inputTokens": 79088,
|
|
11
|
+
"outputTokens": 953,
|
|
12
|
+
"cachedInputTokens": 69888,
|
|
13
|
+
"costUSD": null
|
|
14
|
+
},
|
|
15
|
+
"elapsedSeconds": 43.715,
|
|
16
|
+
"review": "Calibration only; excluded from comparison due to changed isolation settings. Independently rechecked.",
|
|
17
|
+
"evidenceSha256": {
|
|
18
|
+
"-setup.json": "8877dd507461b0f08a872da89bf4bc969625bcd1fc5ba8d75d8e9e8ce054fa48",
|
|
19
|
+
".jsonl": "8f359c452ca399d82a10bd2d67df5eb930851c2104f5782c294f7d1035b636a2",
|
|
20
|
+
".stderr": "a7886594c2ac648cf3565b765315daac7bda8ded4489c3d1d7cd92c75c941699"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "matched-b1-1-bmad",
|
|
25
|
+
"status": "exited",
|
|
26
|
+
"objectiveChecksPassed": false,
|
|
27
|
+
"usage": {
|
|
28
|
+
"inputTokens": 36722,
|
|
29
|
+
"outputTokens": 435,
|
|
30
|
+
"cachedInputTokens": 23936,
|
|
31
|
+
"costUSD": null
|
|
32
|
+
},
|
|
33
|
+
"elapsedSeconds": 28.574,
|
|
34
|
+
"review": "Incomplete: no changes or handoff; tests fail. Worker reports UV/temp blocker, but no UV invocation is present in retained transcript; cause unconfirmed.",
|
|
35
|
+
"evidenceSha256": {
|
|
36
|
+
"-setup.json": "0be207640ca9e8d5277deb4e4d7f89726c50239defbc1d3bf7ba5df148495e7d",
|
|
37
|
+
".jsonl": "37fb256063e991fb0b388e94474c181ba8524fd98ed1660388b87317cc6ecb40",
|
|
38
|
+
".stderr": "45f6aa7228724ae1d9c42884f37b2b5cecc0429986b35c49550b410af857926c"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "matched-b1-1-devmethod",
|
|
43
|
+
"status": "exited",
|
|
44
|
+
"objectiveChecksPassed": true,
|
|
45
|
+
"usage": {
|
|
46
|
+
"inputTokens": 134616,
|
|
47
|
+
"outputTokens": 1853,
|
|
48
|
+
"cachedInputTokens": 120192,
|
|
49
|
+
"costUSD": null
|
|
50
|
+
},
|
|
51
|
+
"elapsedSeconds": 57.01,
|
|
52
|
+
"review": "Independent review passed: relevant skills consulted, bounded change, preserved tests, 2/2 passed.",
|
|
53
|
+
"evidenceSha256": {
|
|
54
|
+
"-setup.json": "2bfa306ace9aebfa6a3534540962e9cfc5ec25b1c211a941078526fe03f0fa39",
|
|
55
|
+
".jsonl": "6bceff4a9916e2fdd5413e2ead7630097785cc13425a989386655600a92ef80f",
|
|
56
|
+
".stderr": "aa0a6e878075b2f4554c9e181ff7daadd2e8fc099a9313d34d84a14fca076690"
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "matched-b1-1-none",
|
|
61
|
+
"status": "exited",
|
|
62
|
+
"objectiveChecksPassed": true,
|
|
63
|
+
"usage": {
|
|
64
|
+
"inputTokens": 49207,
|
|
65
|
+
"outputTokens": 1041,
|
|
66
|
+
"cachedInputTokens": 35968,
|
|
67
|
+
"costUSD": null
|
|
68
|
+
},
|
|
69
|
+
"elapsedSeconds": 30.329,
|
|
70
|
+
"review": "Objective checks passed; no method arm.",
|
|
71
|
+
"evidenceSha256": {
|
|
72
|
+
"-setup.json": "131be54e9b8468155bcf2ab40a7ce7a98357f29708728f3c9c13a7cf3595bfdf",
|
|
73
|
+
".jsonl": "ad384bb14637b3612910891205ba0e338af1999eaa78eb56b9d9a4c092c549b0",
|
|
74
|
+
".stderr": "c95bb25b3d249e4e71dc19a5d6db0a8a08d7bbbd9e855c936496e699c04fdb25"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"id": "smoke-b3",
|
|
79
|
+
"status": "exited",
|
|
80
|
+
"objectiveChecksPassed": true,
|
|
81
|
+
"usage": {
|
|
82
|
+
"inputTokens": 105298,
|
|
83
|
+
"outputTokens": 1530,
|
|
84
|
+
"cachedInputTokens": 77952,
|
|
85
|
+
"costUSD": null
|
|
86
|
+
},
|
|
87
|
+
"elapsedSeconds": 44.517,
|
|
88
|
+
"review": "Independent review passed: unresolved ADR dependency recognized, no invented contract, explicit handoff, 1/1 passed.",
|
|
89
|
+
"evidenceSha256": {
|
|
90
|
+
"-setup.json": "63d899f33747045485bb1bedbf8b781806eeaf8fc2d2c2d32b0ed1f5a7f8b7ed",
|
|
91
|
+
".jsonl": "2fc8aadd2ee1a8ad1728454dd24528bdb23e040ca4dde91fc2ca4e02578a6999",
|
|
92
|
+
".stderr": "3f0820fbf17e94a4b1e5aebc46bd95a75ff89fc5aa60d82bf392bf66b009ba1b"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "smoke-b4",
|
|
97
|
+
"status": "exited",
|
|
98
|
+
"objectiveChecksPassed": true,
|
|
99
|
+
"usage": {
|
|
100
|
+
"inputTokens": 136447,
|
|
101
|
+
"outputTokens": 2137,
|
|
102
|
+
"cachedInputTokens": 106880,
|
|
103
|
+
"costUSD": null
|
|
104
|
+
},
|
|
105
|
+
"elapsedSeconds": 57.67,
|
|
106
|
+
"review": "Independent review passed: initial failed test evidenced, stale checkpoint corrected against current contract, 1/1 passed. Initial test requested explicitly; supplied checkpoint, not a two-session chain.",
|
|
107
|
+
"evidenceSha256": {
|
|
108
|
+
"-setup.json": "ab2ae33e7882d08fae2c04a00ff687cebf6c4cd3a2fdfcb14574cba74559a8ce",
|
|
109
|
+
".jsonl": "a102c8e1d0a3f29ffa1060db3c154803df1c45531bb5b670949d89349399a9d7",
|
|
110
|
+
".stderr": "09c25279076b0b51db41952e7c4d4c622f531173ef5493f470f07e3cf6f414ae"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
"cells": [
|
|
115
|
+
{
|
|
116
|
+
"arm": "none",
|
|
117
|
+
"planned": 3,
|
|
118
|
+
"executed": 1,
|
|
119
|
+
"notRun": 2,
|
|
120
|
+
"objectivePassed": 1,
|
|
121
|
+
"objectiveFailed": 0
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"arm": "devmethod",
|
|
125
|
+
"planned": 3,
|
|
126
|
+
"executed": 1,
|
|
127
|
+
"notRun": 2,
|
|
128
|
+
"objectivePassed": 1,
|
|
129
|
+
"objectiveFailed": 0
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"arm": "bmad",
|
|
133
|
+
"planned": 3,
|
|
134
|
+
"executed": 1,
|
|
135
|
+
"notRun": 2,
|
|
136
|
+
"objectivePassed": 0,
|
|
137
|
+
"objectiveFailed": 1
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
"totalTokens": 549327,
|
|
141
|
+
"costUSD": null,
|
|
142
|
+
"limits": {
|
|
143
|
+
"maxRuns": 12,
|
|
144
|
+
"timeoutSeconds": 120,
|
|
145
|
+
"observedTokenStop": 500000
|
|
146
|
+
},
|
|
147
|
+
"limitation": "Calibration excluded from matched cells. Objective success is not behavioral review or proof of superiority. Unknown cost remains unavailable.",
|
|
148
|
+
"date": "2026-09-13",
|
|
149
|
+
"host": "Codex CLI 0.147.0 / macOS",
|
|
150
|
+
"model": "gpt-5.6-sol",
|
|
151
|
+
"effort": "low",
|
|
152
|
+
"sourceRevision": "385c56f55691c2904d96a3360ed0d38ce3ecb535",
|
|
153
|
+
"stopReason": "Observed threshold crossed within sixth invocation; six remaining invocations not dispatched.",
|
|
154
|
+
"rawEvidence": "Retained locally, not included in package; hashes permit later verification."
|
|
155
|
+
}
|