@hassangameryt/freeflow 0.3.0 → 0.5.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/.claude-plugin/marketplace.json +4 -4
- package/.claude-plugin/plugin.json +6 -2
- package/.codex-plugin/plugin.json +9 -9
- package/README.md +190 -127
- package/assets/feedback-loop.png +0 -0
- package/assets/freeflow_workflow_map.png +0 -0
- package/assets/workflow.png +0 -0
- package/{skills → capabilities}/output-router/SKILL.md +21 -17
- package/{skills → capabilities}/output-router/references/safety-policy.md +1 -1
- package/capabilities/output-router/references/setup.md +110 -0
- package/command-surface.json +62 -7
- package/hooks/freeflow-runtime-context.mjs +572 -154
- package/hooks/hooks.json +26 -1
- package/hooks/tests/check-runtime-context-hook.sh +375 -0
- package/package.json +24 -24
- package/pi-extension/dist/index.js +264 -80
- package/pi-extension/dist/integrations/mcp-config.js +29 -0
- package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
- package/pi-extension/dist/output-router/native-safety-net.js +216 -0
- package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
- package/pi-extension/dist/output-router/renderers.js +1023 -0
- package/pi-extension/dist/output-router/router-tools.js +554 -0
- package/pi-extension/dist/output-router/schemas.js +383 -0
- package/pi-extension/dist/output-router/status.js +744 -0
- package/pi-extension/dist/output-router/utils.js +502 -0
- package/pi-extension/dist/runtime/runtime-context.js +798 -0
- package/pi-extension/dist/settings/settings-tui.js +314 -0
- package/pi-extension/dist/settings/settings-ui.js +1487 -0
- package/pi-extension/freeflow/index.js +1 -0
- package/pi-extension/src/index.ts +230 -56
- package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
- package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +8 -12
- package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
- package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
- package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
- package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
- package/pi-extension/src/output-router/status.ts +791 -0
- package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
- package/pi-extension/src/runtime/runtime-context.ts +895 -0
- package/pi-extension/src/settings/settings-tui.ts +408 -0
- package/pi-extension/src/settings/settings-ui.ts +1730 -0
- package/pi-extension/tests/integration/pi-extension.test.js +4020 -0
- package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
- package/pi-extension/tests/output-router/search.test.js +722 -0
- package/pi-extension/tests/settings/settings-tui.test.js +243 -0
- package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
- package/router/dist/benchmarks/benchmark-harness.js +62 -62
- package/router/dist/benchmarks/benchmarks.d.ts +80 -73
- package/router/dist/benchmarks/benchmarks.js +860 -761
- package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
- package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
- package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
- package/router/dist/benchmarks/command-benchmarks.js +616 -571
- package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
- package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
- package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
- package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
- package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
- package/router/dist/benchmarks/context-saving-baseline.js +405 -374
- package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
- package/router/dist/benchmarks/index-benchmarks.js +761 -661
- package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
- package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
- package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
- package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
- package/router/dist/config/config.d.ts +62 -55
- package/router/dist/config/config.js +552 -373
- package/router/dist/config/router-contract.d.ts +2 -2
- package/router/dist/config/router-contract.js +38 -38
- package/router/dist/config/schema.d.ts +19 -10
- package/router/dist/config/schema.js +586 -538
- package/router/dist/config/types.d.ts +413 -361
- package/router/dist/config/types.js +19 -8
- package/router/dist/evidence/bounded-evidence.d.ts +26 -26
- package/router/dist/evidence/bounded-evidence.js +265 -252
- package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
- package/router/dist/evidence/evidence-range-selector.js +192 -191
- package/router/dist/evidence/evidence-search.d.ts +18 -16
- package/router/dist/evidence/evidence-search.js +401 -377
- package/router/dist/evidence/evidence.d.ts +17 -17
- package/router/dist/evidence/evidence.js +163 -159
- package/router/dist/evidence/failure-contracts.d.ts +25 -15
- package/router/dist/evidence/failure-contracts.js +132 -126
- package/router/dist/evidence/line-ranges.d.ts +17 -15
- package/router/dist/evidence/line-ranges.js +18 -18
- package/router/dist/experiments/local-index.d.ts +47 -41
- package/router/dist/experiments/local-index.js +477 -458
- package/router/dist/local/local-traversal.d.ts +18 -0
- package/router/dist/local/local-traversal.js +334 -0
- package/router/dist/processing/engine.d.ts +94 -70
- package/router/dist/processing/engine.js +462 -364
- package/router/dist/processing/reducers.d.ts +208 -194
- package/router/dist/processing/reducers.js +1434 -1256
- package/router/dist/processing/renderers.d.ts +24 -18
- package/router/dist/processing/renderers.js +161 -152
- package/router/dist/processing/scripts.d.ts +80 -67
- package/router/dist/processing/scripts.js +343 -290
- package/router/dist/repo/repo-traversal.d.ts +9 -9
- package/router/dist/repo/repo-traversal.js +205 -202
- package/router/dist/routing/observed-reducers.d.ts +25 -19
- package/router/dist/routing/observed-reducers.js +559 -545
- package/router/dist/routing/observed-routing.d.ts +23 -14
- package/router/dist/routing/observed-routing.js +319 -318
- package/router/dist/routing/parsers.d.ts +10 -10
- package/router/dist/routing/parsers.js +454 -406
- package/router/dist/routing/run-filters.d.ts +45 -41
- package/router/dist/routing/run-filters.js +215 -207
- package/router/dist/routing/run-reducers.d.ts +45 -26
- package/router/dist/routing/run-reducers.js +102 -90
- package/router/dist/sandbox/adapter-roots.d.ts +34 -26
- package/router/dist/sandbox/adapter-roots.js +43 -41
- package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
- package/router/dist/sandbox/eryx-python-adapter.js +659 -588
- package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
- package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
- package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
- package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
- package/router/dist/sandbox/script-sandbox.d.ts +105 -84
- package/router/dist/sandbox/script-sandbox.js +294 -260
- package/router/dist/setup/script-transform-adapters.d.ts +23 -19
- package/router/dist/setup/script-transform-adapters.js +223 -204
- package/router/dist/tools/batch.d.ts +27 -16
- package/router/dist/tools/batch.js +493 -416
- package/router/dist/tools/run.d.ts +47 -35
- package/router/dist/tools/run.js +1172 -1087
- package/router/dist/tools/search.d.ts +53 -31
- package/router/dist/tools/search.js +1224 -1065
- package/router/dist/transform/engine.d.ts +121 -96
- package/router/dist/transform/engine.js +1853 -1736
- package/router/dist/vault/vault-index.d.ts +97 -78
- package/router/dist/vault/vault-index.js +347 -342
- package/router/dist/vault/vault.d.ts +109 -74
- package/router/dist/vault/vault.js +528 -533
- package/runtime/interaction-contract.md +16 -0
- package/skills/bypass/SKILL.md +52 -38
- package/skills/commit-work/SKILL.md +54 -46
- package/skills/commit-work/references/staging-decisions.md +46 -24
- package/skills/decision-gate/SKILL.md +48 -0
- package/skills/design-for-depth/SKILL.md +75 -59
- package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
- package/skills/design-for-depth/references/interface-design-loop.md +156 -0
- package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
- package/skills/diagnose-failure/SKILL.md +65 -60
- package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
- package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
- package/skills/discuss/SKILL.md +121 -0
- package/skills/discuss/references/checkpoints.md +66 -0
- package/skills/evaluate-skill/SKILL.md +62 -53
- package/skills/evaluate-skill/references/definition-schema.md +345 -0
- package/skills/evaluate-skill/references/evaluation-design.md +86 -0
- package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
- package/skills/evaluate-skill/references/review-and-revision.md +51 -0
- package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
- package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
- package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
- package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
- package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
- package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
- package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
- package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
- package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
- package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
- package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
- package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
- package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
- package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
- package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
- package/skills/execute-work/SKILL.md +99 -0
- package/skills/execute-work/references/code-practices.md +78 -0
- package/skills/execute-work/references/execution-loop.md +77 -0
- package/skills/finish-branch/SKILL.md +117 -0
- package/skills/finish-branch/references/integration-options.md +80 -0
- package/skills/handoff/SKILL.md +65 -39
- package/skills/handoff/references/templates.md +104 -27
- package/skills/launch-work/SKILL.md +116 -0
- package/skills/launch-work/references/launch-readiness.md +85 -0
- package/skills/migration-work/SKILL.md +115 -0
- package/skills/migration-work/references/migration-lifecycle.md +82 -0
- package/skills/mode-contract/SKILL.md +72 -52
- package/skills/release-work/SKILL.md +118 -0
- package/skills/release-work/references/release-evidence.md +78 -0
- package/skills/review-artifact/SKILL.md +77 -69
- package/skills/review-artifact/references/reviewer-prompt.md +133 -42
- package/skills/review-work/SKILL.md +82 -57
- package/skills/review-work/references/reviewer-prompt.md +97 -60
- package/skills/review-work/references/security-risk-lens.md +67 -0
- package/skills/setup-freeflow/SKILL.md +54 -68
- package/skills/setup-freeflow/references/activation-contract.md +84 -69
- package/skills/setup-freeflow/references/host-setup.md +50 -17
- package/skills/simplify-code/SKILL.md +80 -0
- package/skills/simplify-code/references/simplification-patterns.md +70 -0
- package/skills/tdd/SKILL.md +96 -0
- package/skills/tdd/references/test-design.md +96 -0
- package/skills/track-work/SKILL.md +84 -0
- package/skills/track-work/references/working-record-schema.md +378 -0
- package/skills/verify-work/SKILL.md +59 -38
- package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
- package/skills/verify-work/references/integration-evidence.md +51 -0
- package/skills/verify-work/references/performance-evidence.md +57 -0
- package/skills/workflow/SKILL.md +53 -59
- package/skills/workflow/references/domain-skill-composition.md +57 -0
- package/skills/workflow/references/workflow-loop.md +92 -0
- package/skills/write-plan/SKILL.md +85 -58
- package/skills/write-plan/references/plan-shapes.md +132 -46
- package/skills/write-skill/SKILL.md +82 -51
- package/skills/write-skill/references/activation-boundaries.md +62 -0
- package/skills/write-skill/references/agent-first-instructions.md +87 -0
- package/skills/write-skill/references/progressive-disclosure.md +63 -0
- package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
- package/skills/write-skill/scripts/skill-author.mjs +104 -0
- package/skills/write-spec/SKILL.md +65 -54
- package/skills/write-spec/references/artifact-standards.md +60 -41
- package/skills/write-spec/references/decision-records.md +77 -0
- package/skills/write-spec/references/spec-shapes.md +119 -60
- package/evals/README.md +0 -32
- package/evals/fixtures/copy-conventions.md +0 -31
- package/evals/fixtures/output-router/README.md +0 -12
- package/evals/fixtures/output-router/failed-command-output.txt +0 -9
- package/evals/fixtures/output-router/large-router-manual.md +0 -63
- package/evals/fixtures/output-router/native-large-output.txt +0 -40
- package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
- package/evals/fixtures/output-router/verification-output.txt +0 -8
- package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
- package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
- package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
- package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
- package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
- package/evals/fixtures/tiny-commit-app/README.md +0 -3
- package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
- package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
- package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
- package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
- package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
- package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
- package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
- package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
- package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
- package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
- package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
- package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
- package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
- package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
- package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
- package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
- package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
- package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
- package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
- package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
- package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
- package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
- package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
- package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
- package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
- package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
- package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
- package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
- package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
- package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
- package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
- package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
- package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
- package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
- package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
- package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
- package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
- package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
- package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
- package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
- package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
- package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
- package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
- package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
- package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
- package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
- package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
- package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
- package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
- package/evals/fixtures/tiny-handoff-app/README.md +0 -5
- package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
- package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
- package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
- package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
- package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
- package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
- package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
- package/evals/fixtures/tiny-plan-app/README.md +0 -5
- package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
- package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
- package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
- package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
- package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
- package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
- package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
- package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
- package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
- package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
- package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
- package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
- package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
- package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
- package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
- package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
- package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
- package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
- package/evals/fixtures/tiny-review-request-app/README.md +0 -3
- package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
- package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
- package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
- package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
- package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
- package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
- package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
- package/evals/fixtures/tiny-review-work-app/README.md +0 -5
- package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
- package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
- package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
- package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
- package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
- package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
- package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-saas-app/README.md +0 -16
- package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
- package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
- package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
- package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
- package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
- package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
- package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
- package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
- package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
- package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
- package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
- package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
- package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
- package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
- package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
- package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
- package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
- package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
- package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
- package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
- package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
- package/evals/fixtures/tiny-team-app/README.md +0 -5
- package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
- package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
- package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
- package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
- package/evals/fixtures/tiny-verify-app/README.md +0 -5
- package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
- package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
- package/evals/prompts/aon-001.txt +0 -2
- package/evals/prompts/byp-001.txt +0 -2
- package/evals/prompts/byp-002.txt +0 -2
- package/evals/prompts/cap-001.txt +0 -3
- package/evals/prompts/cap-002.txt +0 -3
- package/evals/prompts/cmd-001.txt +0 -3
- package/evals/prompts/cmd-002.txt +0 -3
- package/evals/prompts/cmd-003.txt +0 -6
- package/evals/prompts/cmd-004.txt +0 -5
- package/evals/prompts/cmd-005.txt +0 -5
- package/evals/prompts/cmd-006.txt +0 -5
- package/evals/prompts/cmd-007.txt +0 -5
- package/evals/prompts/cmd-008.txt +0 -5
- package/evals/prompts/cmd-009.txt +0 -8
- package/evals/prompts/cmd-010.txt +0 -5
- package/evals/prompts/cmd-011.txt +0 -5
- package/evals/prompts/cmd-012.txt +0 -5
- package/evals/prompts/cmd-013.txt +0 -5
- package/evals/prompts/cmd-014.txt +0 -7
- package/evals/prompts/cmd-015.txt +0 -7
- package/evals/prompts/cmd-016.txt +0 -5
- package/evals/prompts/cmt-001.txt +0 -1
- package/evals/prompts/cmt-002.txt +0 -1
- package/evals/prompts/cmt-003.txt +0 -1
- package/evals/prompts/cmt-004.txt +0 -1
- package/evals/prompts/cmt-005.txt +0 -1
- package/evals/prompts/dfd-001.txt +0 -3
- package/evals/prompts/dia-001.txt +0 -3
- package/evals/prompts/dia-002.txt +0 -3
- package/evals/prompts/dia-003.txt +0 -3
- package/evals/prompts/dis-001.txt +0 -5
- package/evals/prompts/dis-002.txt +0 -5
- package/evals/prompts/esk-001.txt +0 -5
- package/evals/prompts/esk-002.txt +0 -5
- package/evals/prompts/esk-003.txt +0 -5
- package/evals/prompts/grc-001.txt +0 -3
- package/evals/prompts/hof-001.txt +0 -3
- package/evals/prompts/hof-002.txt +0 -1
- package/evals/prompts/hof-003.txt +0 -1
- package/evals/prompts/hof-004.txt +0 -1
- package/evals/prompts/hof-005.txt +0 -1
- package/evals/prompts/ivg-001.txt +0 -1
- package/evals/prompts/ivg-002.txt +0 -11
- package/evals/prompts/ivg-003.txt +0 -1
- package/evals/prompts/ivg-004.txt +0 -1
- package/evals/prompts/mode-001.txt +0 -3
- package/evals/prompts/mode-002.txt +0 -1
- package/evals/prompts/mode-003.txt +0 -3
- package/evals/prompts/mode-004.txt +0 -3
- package/evals/prompts/mode-005.txt +0 -3
- package/evals/prompts/mode-006.txt +0 -3
- package/evals/prompts/mode-007.txt +0 -3
- package/evals/prompts/otr-001.txt +0 -3
- package/evals/prompts/otr-002.txt +0 -3
- package/evals/prompts/rar-001.txt +0 -5
- package/evals/prompts/rar-002.txt +0 -3
- package/evals/prompts/rar-003.txt +0 -6
- package/evals/prompts/rar-004.txt +0 -15
- package/evals/prompts/rar-005.txt +0 -10
- package/evals/prompts/rbr-001.txt +0 -3
- package/evals/prompts/rbr-002.txt +0 -3
- package/evals/prompts/rbr-003.txt +0 -7
- package/evals/prompts/rev-001.txt +0 -3
- package/evals/prompts/rev-002.txt +0 -5
- package/evals/prompts/rev-003.txt +0 -6
- package/evals/prompts/rev-004.txt +0 -1
- package/evals/prompts/rev-005.txt +0 -15
- package/evals/prompts/rev-006.txt +0 -5
- package/evals/prompts/stp-001.txt +0 -1
- package/evals/prompts/stp-002.txt +0 -1
- package/evals/prompts/stp-003.txt +0 -1
- package/evals/prompts/stp-004.txt +0 -1
- package/evals/prompts/stp-005.txt +0 -1
- package/evals/prompts/stp-006.txt +0 -1
- package/evals/prompts/stp-007.txt +0 -1
- package/evals/prompts/stp-008.txt +0 -1
- package/evals/prompts/stp-009.txt +0 -1
- package/evals/prompts/stp-010.txt +0 -1
- package/evals/prompts/stp-011.txt +0 -1
- package/evals/prompts/vfy-003.txt +0 -1
- package/evals/prompts/wpl-001.txt +0 -3
- package/evals/prompts/wpl-002.txt +0 -5
- package/evals/prompts/wpl-003.txt +0 -3
- package/evals/prompts/wpl-004.txt +0 -5
- package/evals/prompts/wpl-005.txt +0 -1
- package/evals/prompts/wrc-001.txt +0 -10
- package/evals/prompts/wrc-002.txt +0 -3
- package/evals/prompts/wsk-001.txt +0 -6
- package/evals/prompts/wsp-001.txt +0 -5
- package/evals/prompts/wsp-002.txt +0 -15
- package/evals/prompts/wsp-003.txt +0 -3
- package/evals/prompts/wsp-004.txt +0 -15
- package/evals/prompts/wsp-005.txt +0 -5
- package/evals/prompts/wsp-006.txt +0 -12
- package/evals/prompts/wsp-007.txt +0 -9
- package/evals/prompts/wsp-008.txt +0 -13
- package/evals/prompts/xpl-001.txt +0 -1
- package/evals/prompts/xpl-002.txt +0 -3
- package/evals/prompts/xpl-003.txt +0 -3
- package/evals/prompts/xpl-004.txt +0 -3
- package/evals/prompts/xpl-005.txt +0 -5
- package/evals/prompts/xpl-006.txt +0 -3
- package/evals/registries/adversarial-evals.json +0 -39
- package/evals/registries/fixture-evals.json +0 -2513
- package/evals/registries/handoff-evals.json +0 -74
- package/evals/registries/legacy-evals.json +0 -147
- package/evals/registries/skill-evidence.json +0 -193
- package/evals/registries/verify-work-evals.json +0 -46
- package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
- package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
- package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
- package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
- package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
- package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
- package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
- package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
- package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
- package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
- package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
- package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
- package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
- package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
- package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
- package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
- package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
- package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
- package/evals/reports/by-skill/bypass-1-report.md +0 -124
- package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
- package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
- package/evals/reports/by-skill/commit-work-1-report.md +0 -165
- package/evals/reports/by-skill/commit-work-2-report.md +0 -109
- package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
- package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
- package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
- package/evals/reports/by-skill/discover-1-report.md +0 -118
- package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
- package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
- package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
- package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
- package/evals/reports/by-skill/grill-context-1-report.md +0 -103
- package/evals/reports/by-skill/handoff-1-report.md +0 -123
- package/evals/reports/by-skill/handoff-2-report.md +0 -105
- package/evals/reports/by-skill/handoff-3-report.md +0 -100
- package/evals/reports/by-skill/handoff-7-report.md +0 -77
- package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
- package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
- package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
- package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
- package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
- package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
- package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
- package/evals/reports/by-skill/output-router-1-report.md +0 -76
- package/evals/reports/by-skill/output-router-2-report.md +0 -65
- package/evals/reports/by-skill/research-1-report.md +0 -144
- package/evals/reports/by-skill/research-brief-1-report.md +0 -94
- package/evals/reports/by-skill/research-brief-2-report.md +0 -75
- package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
- package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
- package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
- package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
- package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
- package/evals/reports/by-skill/review-work-1-report.md +0 -85
- package/evals/reports/by-skill/review-work-2-report.md +0 -87
- package/evals/reports/by-skill/review-work-3-report.md +0 -104
- package/evals/reports/by-skill/review-work-4-report.md +0 -108
- package/evals/reports/by-skill/review-work-5-report.md +0 -73
- package/evals/reports/by-skill/review-work-6-report.md +0 -66
- package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
- package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
- package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
- package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
- package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
- package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
- package/evals/reports/by-skill/verify-work-1-report.md +0 -111
- package/evals/reports/by-skill/verify-work-2-report.md +0 -120
- package/evals/reports/by-skill/workflow-1-report.md +0 -65
- package/evals/reports/by-skill/write-plan-1-report.md +0 -123
- package/evals/reports/by-skill/write-plan-2-report.md +0 -98
- package/evals/reports/by-skill/write-plan-3-report.md +0 -110
- package/evals/reports/by-skill/write-spec-1-report.md +0 -88
- package/evals/reports/by-skill/write-spec-2-report.md +0 -89
- package/evals/reports/by-skill/write-spec-3-report.md +0 -90
- package/evals/reports/by-skill/write-spec-4-report.md +0 -167
- package/evals/reports/harness/claude-harness-1-report.md +0 -103
- package/evals/reports/harness/eval-harness-1-report.md +0 -91
- package/evals/reports/iterations/iteration-1-report.md +0 -71
- package/evals/reports/iterations/iteration-2-report.md +0 -78
- package/evals/reports/iterations/iteration-3-report.md +0 -118
- package/evals/reports/iterations/iteration-4-report.md +0 -131
- package/evals/reports/iterations/iteration-5-report.md +0 -149
- package/evals/reports/iterations/iteration-6-report.md +0 -136
- package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
- package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
- package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
- package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
- package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
- package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
- package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
- package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
- package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
- package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
- package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
- package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
- package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
- package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
- package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
- package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
- package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
- package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
- package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
- package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
- package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
- package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
- package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
- package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
- package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
- package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
- package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
- package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
- package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
- package/evals/runbooks/adversarial-eval-runbook.md +0 -28
- package/evals/runbooks/fixture-eval-runbook.md +0 -137
- package/evals/runbooks/handoff-eval-runbook.md +0 -22
- package/evals/runbooks/verify-work-eval-runbook.md +0 -27
- package/evals/scripts/audit-command-surface.sh +0 -160
- package/evals/scripts/check-activation-contract.sh +0 -121
- package/evals/scripts/check-runtime-context-hook.sh +0 -183
- package/evals/scripts/grade-fixture-eval.sh +0 -446
- package/evals/scripts/run-claude-fixture-eval.sh +0 -26
- package/evals/scripts/run-codex-fixture-eval.sh +0 -26
- package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
- package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
- package/evals/scripts/run-fixture-eval.sh +0 -464
- package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
- package/evals/scripts/run-output-router-transform-eval.js +0 -115
- package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
- package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
- package/evals/scripts/skill-evidence.sh +0 -316
- package/evals/scripts/validate-release-metadata.sh +0 -486
- package/evals/suites/v0.1-acceptance-suite.md +0 -131
- package/pi-extension/dist/host-producer-identification.js +0 -186
- package/pi-extension/dist/mcp-config.js +0 -30
- package/pi-extension/dist/native-safety-net.js +0 -209
- package/pi-extension/dist/observed-tool-routing.js +0 -114
- package/pi-extension/dist/renderers.js +0 -835
- package/pi-extension/dist/router-tools.js +0 -438
- package/pi-extension/dist/runtime-context.js +0 -288
- package/pi-extension/dist/schemas.js +0 -254
- package/pi-extension/dist/status.js +0 -449
- package/pi-extension/dist/utils.js +0 -467
- package/pi-extension/src/runtime-context.ts +0 -347
- package/pi-extension/src/status.ts +0 -505
- package/plugin-docs/README.md +0 -40
- package/plugin-docs/adr/0001-three-modes.md +0 -27
- package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
- package/plugin-docs/adr/0003-release-boundary.md +0 -21
- package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
- package/plugin-docs/adr/README.md +0 -10
- package/plugin-docs/architecture.md +0 -89
- package/plugin-docs/output-router.md +0 -396
- package/plugin-docs/release-evidence.md +0 -77
- package/plugin-docs/skills.md +0 -44
- package/plugin-docs/workflow.md +0 -57
- package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
- package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
- package/skills/discover/CHECKPOINTS.md +0 -74
- package/skills/discover/SKILL.md +0 -173
- package/skills/evaluate-skill/references/eval-patterns.md +0 -41
- package/skills/evaluate-skill/references/grading-priority.md +0 -33
- package/skills/execute-plan/SKILL.md +0 -133
- package/skills/execute-plan/references/execution-map.md +0 -122
- package/skills/interview-gate/SKILL.md +0 -90
- package/skills/setup-freeflow/references/output-router-setup.md +0 -102
- package/skills/workflow/references/workflow-map.md +0 -104
- /package/pi-extension/src/{mcp-config.ts → integrations/mcp-config.ts} +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Execution And Evidence
|
|
2
|
+
|
|
3
|
+
Read this when operating `run|view`, resolving paths, interpreting states, or reasoning about Pi execution, isolation, persistence, cancellation, and safeguards.
|
|
4
|
+
|
|
5
|
+
## Command And Path Contract
|
|
6
|
+
|
|
7
|
+
Run commands from the repository or fixture root that owns the definitions:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
node <evaluate-skill-directory>/scripts/skill-eval.mjs run <suite-or-group-path> [--group <id-or-position>] [--variant baseline|candidate]
|
|
11
|
+
node <evaluate-skill-directory>/scripts/skill-eval.mjs view <result-id-or-directory> [--group <id-or-position>] [--variant baseline|candidate]
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
- The current working directory is the definition root and result root.
|
|
15
|
+
- The `run` target resolves from that directory.
|
|
16
|
+
- Suite group references resolve relative to the suite file.
|
|
17
|
+
- Fixture, skill, and context declarations resolve from the definition root.
|
|
18
|
+
- Results are stored under `<cwd>/.skill-eval/runs/<result-id>`.
|
|
19
|
+
- A bare `view` target is tried first as a stored result ID, then as a path from the working directory.
|
|
20
|
+
- An absolute or path-like `view` target resolves as a directory path.
|
|
21
|
+
|
|
22
|
+
Examples:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
skill-eval run .skill-eval/my-skill/suite.json
|
|
26
|
+
skill-eval run .skill-eval/my-skill/suite.json --variant candidate
|
|
27
|
+
skill-eval view 20260720173209-a3649b8b
|
|
28
|
+
skill-eval view 20260720173209-a3649b8b --group 2 --variant candidate
|
|
29
|
+
skill-eval view /absolute/path/to/result
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
With no selectors, `run` or `view` selects every suite group and both variants. `--group` is invalid for a direct group definition/result.
|
|
33
|
+
|
|
34
|
+
## Current Execution Boundary
|
|
35
|
+
|
|
36
|
+
`run` executes description and body groups. `end-to-end` is a reserved definition type and is rejected before subject execution. Description groups allow no tools or `read`; body groups allow no tools or path-guarded `read`, `write`, and `edit`. `bash` and definition-supplied commands are unsupported.
|
|
37
|
+
|
|
38
|
+
Use fresh JSON-mode execution for one-shot descriptions. Use one persistent RPC process per selected variant for ordered description turns and all body groups. RPC correlates responses, waits for `agent_settled`, disables automatic retry and compaction, preserves directly observed partial-turn evidence, and cleans the process tree.
|
|
39
|
+
|
|
40
|
+
A body target is matched to the exact snapshotted `SKILL.md` and explicitly delivered on turn one. Later turns remain unchanged. Description groups use natural prompts and never explicit target delivery.
|
|
41
|
+
|
|
42
|
+
## Isolation And Resources
|
|
43
|
+
|
|
44
|
+
For each selected variant:
|
|
45
|
+
|
|
46
|
+
- snapshot exact declared skills and context;
|
|
47
|
+
- snapshot the group fixture once from the definition-root working tree—never from a variant Git source—then create an independent writable copy;
|
|
48
|
+
- preserve skill order and target index;
|
|
49
|
+
- replace ambient instructions with evaluator-owned declared context;
|
|
50
|
+
- keep criteria and review questions outside the subject prompt;
|
|
51
|
+
- allow reads only from workspace and declared immutable resources;
|
|
52
|
+
- allow writes and edits only inside the workspace;
|
|
53
|
+
- reject traversal, symlink escape, unsupported Git entries, and invalid UTF-8;
|
|
54
|
+
- verify immutable resource fingerprints after execution.
|
|
55
|
+
|
|
56
|
+
Working-tree sources snapshot current paths. Git sources resolve one exact commit and record both the declared ref and resolved identity.
|
|
57
|
+
|
|
58
|
+
## Persistence And States
|
|
59
|
+
|
|
60
|
+
Each selected run is persisted before its counterpart. Grade and group evidence are persisted before later groups.
|
|
61
|
+
|
|
62
|
+
Run states are `complete`, `invalid`, `infrastructure-failed`, `cancelled`, and `not-selected`. Group and batch states are `complete`, `partially-complete`, `invalid` where applicable, and `cancelled`.
|
|
63
|
+
|
|
64
|
+
- Failed deterministic checks are ordinary complete behavioral evidence and exit zero when no infrastructure/grade failure exists.
|
|
65
|
+
- Variant-local invalidity or infrastructure failure preserves evidence and does not stop safe queued work.
|
|
66
|
+
- Shared fixture failure invalidates the group.
|
|
67
|
+
- Thrown grading or recoverable grade/group publication failure becomes explicit `grade-error` fallback evidence.
|
|
68
|
+
- If a run or required fallback cannot be preserved, queued work stops and no completed summary is published.
|
|
69
|
+
- Cancellation starts no queued subject and preserves observed diagnostics.
|
|
70
|
+
|
|
71
|
+
Invalidity, infrastructure failure, cancellation, or `grade-error` makes the final command exit nonzero after safe queued work finishes.
|
|
72
|
+
|
|
73
|
+
## Views And Raw Evidence
|
|
74
|
+
|
|
75
|
+
Views can render a complete result, all baseline or candidate variants, one group, or one group/variant. Grade appears before selected run evidence. The displayed absolute result path anchors result-relative artifact and workspace paths.
|
|
76
|
+
|
|
77
|
+
Path cells escape literal backslashes before tab, carriage return, and newline. Variant views exclude expectation-owned errors from the other variant while retaining comparison, group, and system errors.
|
|
78
|
+
|
|
79
|
+
Use ordinary file tools for raw `run.json`, events, transcript, final response, stderr, workspace, definition, grade, and group artifacts. Views remove transport noise; they do not replace canonical evidence.
|
|
80
|
+
|
|
81
|
+
## Safeguards And Limits
|
|
82
|
+
|
|
83
|
+
Normal completion follows settlement. Path guards, no-progress detection, cancellation, process-tree cleanup, and very high emergency ceilings stop runaway or unsafe infrastructure. Do not impose ordinary guessed turn, token, spend, output, or short time caps.
|
|
84
|
+
|
|
85
|
+
When an unsupported operation changes the question, reject it or run a clearly separate direct comparison with explicit limits. Never invoke archived evaluators as a fallback.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Review And Revision
|
|
2
|
+
|
|
3
|
+
Read this after canonical evidence and deterministic grades exist, when evidence conflicts, meaning still needs judgment, or a revision/rerun boundary must be chosen.
|
|
4
|
+
|
|
5
|
+
## Use The Strongest Evidence
|
|
6
|
+
|
|
7
|
+
1. Filesystem state, typed workspace manifests, diffs, and changed paths.
|
|
8
|
+
2. Structured events, tool activity, usage, process results, logs, and saved reports.
|
|
9
|
+
3. Final response.
|
|
10
|
+
4. Full transcript when earlier surfaces cannot answer the question.
|
|
11
|
+
5. Subject self-assessment.
|
|
12
|
+
|
|
13
|
+
Lower-priority evidence cannot repair a contradiction above it. If the response claims success but a required file is absent, preserve both facts and grade the file observation.
|
|
14
|
+
|
|
15
|
+
## Keep Deterministic Facts Separate
|
|
16
|
+
|
|
17
|
+
Built-in checks cover exact reads, typed paths, changed paths, file or response text, JSON states, valid turn scope, and factual transitions. Missing evidence remains unavailable. A failed check remains behavioral evidence; it does not relabel a complete run as infrastructure failure.
|
|
18
|
+
|
|
19
|
+
The active agent or user may judge reasoning quality, authority preservation, architectural fitness, recommendation quality, or semantic completeness. Record cited evidence, uncertainty, and limits outside the canonical run and deterministic grade. Do not turn that judgment into evaluator-owned readiness state.
|
|
20
|
+
|
|
21
|
+
## Diagnose Before Editing
|
|
22
|
+
|
|
23
|
+
Classify the failed boundary:
|
|
24
|
+
|
|
25
|
+
- activation timing;
|
|
26
|
+
- description language unavailable before body read;
|
|
27
|
+
- first-read body comprehension;
|
|
28
|
+
- undeclared, undelivered, unread, or ambient-only dependency;
|
|
29
|
+
- normal guidance hidden behind an unclear resource boundary;
|
|
30
|
+
- nearby behavior that hijacks the task;
|
|
31
|
+
- retained-use or multi-turn failure;
|
|
32
|
+
- wording, placement, example, or stop-condition pressure;
|
|
33
|
+
- fixture, environment, isolation, host, or deterministic-check failure.
|
|
34
|
+
|
|
35
|
+
Do not add broad prose before identifying the failed boundary.
|
|
36
|
+
|
|
37
|
+
## Revise One Pressure Point
|
|
38
|
+
|
|
39
|
+
Change one measured point when possible: description cues, first-read wording, rule placement, dependency declaration, resource boundary, example, stop condition, or the group when evidence proves the evaluation is wrong.
|
|
40
|
+
|
|
41
|
+
Keep unrelated instructions and fixed criteria stable. If the criterion changes, the old result no longer answers the same question.
|
|
42
|
+
|
|
43
|
+
## Rerun The Complete Group
|
|
44
|
+
|
|
45
|
+
After a measured skill change or resolved infrastructure cause, run the complete fixed group with both variants. Do not rerun only the preferred variant, reuse a settled control as a new sample, adopt partial evidence as comparable, or rerun merely to erase a failure.
|
|
46
|
+
|
|
47
|
+
For variance, use independent complete invocations and keep every result visible.
|
|
48
|
+
|
|
49
|
+
## Report
|
|
50
|
+
|
|
51
|
+
Report the failed boundary and evidence, exact revision or evaluation correction, criteria that stayed fixed, old and new result paths, and remaining unsupported claims. The user decides the next authoring or use action.
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { readFile, realpath } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
const ID = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
5
|
+
const EVALUATION_TYPES = new Set(["description", "body", "end-to-end"]);
|
|
6
|
+
const VARIANTS = ["baseline", "candidate"];
|
|
7
|
+
|
|
8
|
+
export class DefinitionError extends Error {
|
|
9
|
+
constructor(code, message, definitionPath = null) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "DefinitionError";
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.definitionPath = definitionPath;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function fail(code, message, definitionPath) {
|
|
18
|
+
throw new DefinitionError(code, message, definitionPath);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function isPlainObject(value) {
|
|
22
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function requireObject(value, label, definitionPath) {
|
|
26
|
+
if (!isPlainObject(value)) fail("invalid-definition", `${label} must be an object`, definitionPath);
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function requireExactKeys(value, required, optional, label, definitionPath) {
|
|
31
|
+
const object = requireObject(value, label, definitionPath);
|
|
32
|
+
const allowed = new Set([...required, ...optional]);
|
|
33
|
+
for (const key of required) {
|
|
34
|
+
if (!Object.hasOwn(object, key)) fail("invalid-definition", `${label} is missing ${key}`, definitionPath);
|
|
35
|
+
}
|
|
36
|
+
for (const key of Object.keys(object)) {
|
|
37
|
+
if (!allowed.has(key)) fail("invalid-definition", `${label} contains unsupported field ${key}`, definitionPath);
|
|
38
|
+
}
|
|
39
|
+
return object;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function requireId(value, label, definitionPath) {
|
|
43
|
+
if (typeof value !== "string" || value.length > 64 || !ID.test(value)) {
|
|
44
|
+
fail(
|
|
45
|
+
"invalid-definition",
|
|
46
|
+
`${label} must start with a lowercase letter and use lowercase letters, numbers, or single hyphens up to 64 characters`,
|
|
47
|
+
definitionPath,
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function requireString(value, label, definitionPath) {
|
|
54
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
55
|
+
fail("invalid-definition", `${label} must be a non-empty string`, definitionPath);
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function requireStringArray(value, label, definitionPath, { paths = false, unique = false } = {}) {
|
|
61
|
+
if (!Array.isArray(value)) fail("invalid-definition", `${label} must be an array`, definitionPath);
|
|
62
|
+
const seen = new Set();
|
|
63
|
+
return value.map((entry, index) => {
|
|
64
|
+
const string = requireString(entry, `${label}[${index}]`, definitionPath);
|
|
65
|
+
if (paths) requireSafeRelativePath(string, `${label}[${index}]`, definitionPath);
|
|
66
|
+
if (unique && seen.has(string)) {
|
|
67
|
+
fail("invalid-definition", `${label} contains duplicate ${string}`, definitionPath);
|
|
68
|
+
}
|
|
69
|
+
seen.add(string);
|
|
70
|
+
return string;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function requireSafeRelativePath(value, label, definitionPath) {
|
|
75
|
+
const string = requireString(value, label, definitionPath);
|
|
76
|
+
const normalized = path.normalize(string);
|
|
77
|
+
if (path.isAbsolute(string) || normalized === "." || normalized === ".." || normalized.startsWith(`..${path.sep}`)) {
|
|
78
|
+
fail("unsafe-path", `${label} must stay inside the definition root`, definitionPath);
|
|
79
|
+
}
|
|
80
|
+
return string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function requireSuiteReference(value, label, definitionPath) {
|
|
84
|
+
const string = requireString(value, label, definitionPath);
|
|
85
|
+
if (path.isAbsolute(string) || path.normalize(string) === ".") {
|
|
86
|
+
fail("unsafe-path", `${label} must be relative to the suite file`, definitionPath);
|
|
87
|
+
}
|
|
88
|
+
return string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function validateInput(value, definitionPath) {
|
|
92
|
+
const input = requireExactKeys(value, [], ["prompt", "turns"], "group.input", definitionPath);
|
|
93
|
+
const hasPrompt = Object.hasOwn(input, "prompt");
|
|
94
|
+
const hasTurns = Object.hasOwn(input, "turns");
|
|
95
|
+
if (hasPrompt === hasTurns) {
|
|
96
|
+
fail("invalid-definition", "group.input must contain exactly one of prompt or turns", definitionPath);
|
|
97
|
+
}
|
|
98
|
+
if (hasPrompt) requireString(input.prompt, "group.input.prompt", definitionPath);
|
|
99
|
+
if (hasTurns) {
|
|
100
|
+
const turns = requireStringArray(input.turns, "group.input.turns", definitionPath);
|
|
101
|
+
if (turns.length === 0) fail("invalid-definition", "group.input.turns must not be empty", definitionPath);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function validateSource(value, label, definitionPath) {
|
|
106
|
+
const source = requireObject(value, label, definitionPath);
|
|
107
|
+
if (source.kind === "working-tree") {
|
|
108
|
+
requireExactKeys(source, ["kind"], [], label, definitionPath);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (source.kind === "git") {
|
|
112
|
+
requireExactKeys(source, ["kind", "ref"], [], label, definitionPath);
|
|
113
|
+
requireString(source.ref, `${label}.ref`, definitionPath);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
fail("invalid-definition", `${label}.kind must be working-tree or git`, definitionPath);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function validateEnvironment(value, label, definitionPath) {
|
|
120
|
+
const environment = requireExactKeys(value, ["source", "skills", "target", "context"], [], label, definitionPath);
|
|
121
|
+
validateSource(environment.source, `${label}.source`, definitionPath);
|
|
122
|
+
const skills = requireStringArray(environment.skills, `${label}.skills`, definitionPath, { paths: true });
|
|
123
|
+
requireStringArray(environment.context, `${label}.context`, definitionPath, { paths: true });
|
|
124
|
+
if (
|
|
125
|
+
environment.target !== null &&
|
|
126
|
+
(!Number.isInteger(environment.target) || environment.target < 0 || environment.target >= skills.length)
|
|
127
|
+
) {
|
|
128
|
+
fail("invalid-definition", `${label}.target must be null or an index into skills`, definitionPath);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function validateExpectations(value, definitionPath) {
|
|
133
|
+
if (!Array.isArray(value)) fail("invalid-definition", "group.expectations must be an array", definitionPath);
|
|
134
|
+
const ids = new Set();
|
|
135
|
+
for (const [index, entry] of value.entries()) {
|
|
136
|
+
const expectation = requireObject(entry, `group.expectations[${index}]`, definitionPath);
|
|
137
|
+
requireId(expectation.id, `group.expectations[${index}].id`, definitionPath);
|
|
138
|
+
requireString(expectation.kind, `group.expectations[${index}].kind`, definitionPath);
|
|
139
|
+
if (ids.has(expectation.id)) {
|
|
140
|
+
fail("invalid-definition", `group.expectations contains duplicate ID ${expectation.id}`, definitionPath);
|
|
141
|
+
}
|
|
142
|
+
ids.add(expectation.id);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function validateModel(value, definitionPath) {
|
|
147
|
+
const model = requireExactKeys(value, ["model"], ["thinking"], "group.model", definitionPath);
|
|
148
|
+
requireString(model.model, "group.model.model", definitionPath);
|
|
149
|
+
if (Object.hasOwn(model, "thinking")) requireString(model.thinking, "group.model.thinking", definitionPath);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function validateGroup(value, definitionPath) {
|
|
153
|
+
const group = requireExactKeys(
|
|
154
|
+
value,
|
|
155
|
+
[
|
|
156
|
+
"schema_version",
|
|
157
|
+
"kind",
|
|
158
|
+
"id",
|
|
159
|
+
"type",
|
|
160
|
+
"input",
|
|
161
|
+
"fixture",
|
|
162
|
+
"tools",
|
|
163
|
+
"variants",
|
|
164
|
+
"expectations",
|
|
165
|
+
"review_questions",
|
|
166
|
+
],
|
|
167
|
+
["model"],
|
|
168
|
+
"group",
|
|
169
|
+
definitionPath,
|
|
170
|
+
);
|
|
171
|
+
if (group.schema_version !== 1) fail("unsupported-schema", "group.schema_version must be 1", definitionPath);
|
|
172
|
+
if (group.kind !== "group") fail("invalid-definition", "group.kind must be group", definitionPath);
|
|
173
|
+
requireId(group.id, "group.id", definitionPath);
|
|
174
|
+
if (!EVALUATION_TYPES.has(group.type)) {
|
|
175
|
+
fail("invalid-definition", "group.type must be description, body, or end-to-end", definitionPath);
|
|
176
|
+
}
|
|
177
|
+
validateInput(group.input, definitionPath);
|
|
178
|
+
if (group.fixture !== null) requireSafeRelativePath(group.fixture, "group.fixture", definitionPath);
|
|
179
|
+
requireStringArray(group.tools, "group.tools", definitionPath, { unique: true });
|
|
180
|
+
const variants = requireExactKeys(group.variants, VARIANTS, [], "group.variants", definitionPath);
|
|
181
|
+
for (const variant of VARIANTS) validateEnvironment(variants[variant], `group.variants.${variant}`, definitionPath);
|
|
182
|
+
if (variants.candidate.target === null) {
|
|
183
|
+
fail(
|
|
184
|
+
"invalid-definition",
|
|
185
|
+
"group.variants.candidate.target must identify the candidate target skill",
|
|
186
|
+
definitionPath,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
validateExpectations(group.expectations, definitionPath);
|
|
190
|
+
requireStringArray(group.review_questions, "group.review_questions", definitionPath);
|
|
191
|
+
if (Object.hasOwn(group, "model")) validateModel(group.model, definitionPath);
|
|
192
|
+
return group;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function validateSuite(value, definitionPath) {
|
|
196
|
+
const suite = requireExactKeys(value, ["schema_version", "kind", "id", "groups"], [], "suite", definitionPath);
|
|
197
|
+
if (suite.schema_version !== 1) fail("unsupported-schema", "suite.schema_version must be 1", definitionPath);
|
|
198
|
+
if (suite.kind !== "suite") fail("invalid-definition", "suite.kind must be suite", definitionPath);
|
|
199
|
+
requireId(suite.id, "suite.id", definitionPath);
|
|
200
|
+
const groups = requireStringArray(suite.groups, "suite.groups", definitionPath, { unique: true });
|
|
201
|
+
for (const [index, reference] of groups.entries()) {
|
|
202
|
+
requireSuiteReference(reference, `suite.groups[${index}]`, definitionPath);
|
|
203
|
+
}
|
|
204
|
+
if (groups.length === 0) fail("invalid-definition", "suite.groups must not be empty", definitionPath);
|
|
205
|
+
return suite;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function isContained(root, target) {
|
|
209
|
+
const relative = path.relative(root, target);
|
|
210
|
+
return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
async function readJsonFile(file, root) {
|
|
214
|
+
const lexicalFile = path.resolve(file);
|
|
215
|
+
if (!isContained(root, lexicalFile)) fail("unsafe-path", `Definition escapes root: ${file}`, lexicalFile);
|
|
216
|
+
|
|
217
|
+
let canonicalRoot;
|
|
218
|
+
let canonicalFile;
|
|
219
|
+
try {
|
|
220
|
+
[canonicalRoot, canonicalFile] = await Promise.all([realpath(root), realpath(lexicalFile)]);
|
|
221
|
+
} catch {
|
|
222
|
+
fail("unreadable-definition", `Cannot resolve definition: ${lexicalFile}`, lexicalFile);
|
|
223
|
+
}
|
|
224
|
+
if (!isContained(canonicalRoot, canonicalFile)) {
|
|
225
|
+
fail("unsafe-path", `Definition symlink escapes root: ${lexicalFile}`, lexicalFile);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
let contents;
|
|
229
|
+
try {
|
|
230
|
+
contents = await readFile(canonicalFile, "utf8");
|
|
231
|
+
} catch {
|
|
232
|
+
fail("unreadable-definition", `Cannot read definition: ${lexicalFile}`, lexicalFile);
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
return { value: JSON.parse(contents), file: lexicalFile };
|
|
236
|
+
} catch {
|
|
237
|
+
fail("invalid-json", `Definition is not valid JSON: ${lexicalFile}`, lexicalFile);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export async function loadDefinition(file, { root = process.cwd() } = {}) {
|
|
242
|
+
const definitionRoot = path.resolve(root);
|
|
243
|
+
const loaded = await readJsonFile(file, definitionRoot);
|
|
244
|
+
const object = requireObject(loaded.value, "definition", loaded.file);
|
|
245
|
+
if (object.kind === "group") return validateGroup(object, loaded.file);
|
|
246
|
+
if (object.kind !== "suite") fail("invalid-definition", "definition.kind must be group or suite", loaded.file);
|
|
247
|
+
|
|
248
|
+
const suite = validateSuite(object, loaded.file);
|
|
249
|
+
const groups = [];
|
|
250
|
+
const ids = new Set();
|
|
251
|
+
for (const reference of suite.groups) {
|
|
252
|
+
const groupFile = path.resolve(path.dirname(loaded.file), reference);
|
|
253
|
+
const groupLoaded = await readJsonFile(groupFile, definitionRoot);
|
|
254
|
+
const group = validateGroup(groupLoaded.value, groupLoaded.file);
|
|
255
|
+
if (ids.has(group.id)) fail("invalid-definition", `suite contains duplicate group ID ${group.id}`, loaded.file);
|
|
256
|
+
ids.add(group.id);
|
|
257
|
+
groups.push(group);
|
|
258
|
+
}
|
|
259
|
+
return { ...suite, groups };
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function variantSelection(selected) {
|
|
263
|
+
return {
|
|
264
|
+
baseline: selected === null || selected === "baseline" ? "selected" : "not-selected",
|
|
265
|
+
candidate: selected === null || selected === "candidate" ? "selected" : "not-selected",
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export function selectDefinition(definition, { group = null, variant = null } = {}) {
|
|
270
|
+
if (variant !== null && !VARIANTS.includes(variant)) {
|
|
271
|
+
fail("invalid-selector", "variant must be baseline or candidate", null);
|
|
272
|
+
}
|
|
273
|
+
if (definition.kind === "group" && group !== null) {
|
|
274
|
+
fail("invalid-selector", "--group cannot be used with a direct group definition", null);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const available = definition.kind === "group" ? [definition] : definition.groups;
|
|
278
|
+
let selected = available;
|
|
279
|
+
if (group !== null) {
|
|
280
|
+
const position = typeof group === "number" || /^\d+$/.test(group) ? Number(group) : null;
|
|
281
|
+
selected =
|
|
282
|
+
position === null ? available.filter((entry) => entry.id === group) : [available[position - 1]].filter(Boolean);
|
|
283
|
+
if (selected.length === 0) fail("unknown-group", `Unknown group selector: ${group}`, null);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return {
|
|
287
|
+
kind: "selection",
|
|
288
|
+
definitionKind: definition.kind,
|
|
289
|
+
id: definition.id,
|
|
290
|
+
groups: selected.map((entry) => ({
|
|
291
|
+
position: available.indexOf(entry) + 1,
|
|
292
|
+
group: entry,
|
|
293
|
+
variants: variantSelection(variant),
|
|
294
|
+
})),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
5
|
+
export function createInvocationId(now = new Date()) {
|
|
6
|
+
const timestamp = now
|
|
7
|
+
.toISOString()
|
|
8
|
+
.replaceAll(/[-:.TZ]/g, "")
|
|
9
|
+
.slice(0, 14);
|
|
10
|
+
return `${timestamp}-${randomBytes(4).toString("hex")}`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function writeJson(file, value) {
|
|
14
|
+
const contents = `${JSON.stringify(value, null, 2)}\n`;
|
|
15
|
+
await writeAtomic(file, contents);
|
|
16
|
+
return { contents, sha256: sha256(contents) };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function writeText(file, contents) {
|
|
20
|
+
await writeAtomic(file, contents);
|
|
21
|
+
return { contents, sha256: sha256(contents) };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export async function fileIdentity(file) {
|
|
25
|
+
const contents = await readFile(file);
|
|
26
|
+
return {
|
|
27
|
+
path: file,
|
|
28
|
+
sha256: createHash("sha256").update(contents).digest("hex"),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function sha256(value) {
|
|
33
|
+
return createHash("sha256").update(value).digest("hex");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function writeAtomic(file, contents) {
|
|
37
|
+
await mkdir(path.dirname(file), { recursive: true });
|
|
38
|
+
const temporary = `${file}.${process.pid}.${randomBytes(4).toString("hex")}.tmp`;
|
|
39
|
+
try {
|
|
40
|
+
await writeFile(temporary, contents);
|
|
41
|
+
await rename(temporary, file);
|
|
42
|
+
} catch (error) {
|
|
43
|
+
await rm(temporary, { force: true }).catch(() => {});
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from "node:util";
|
|
2
|
+
|
|
3
|
+
import { hasOwn } from "./grade-support.mjs";
|
|
4
|
+
|
|
5
|
+
export function gradeComparisons(expectations, checks) {
|
|
6
|
+
/** @type {Map<string, any[]>} */
|
|
7
|
+
const grouped = new Map();
|
|
8
|
+
const errors = /** @type {any[]} */ ([]);
|
|
9
|
+
for (const expectation of expectations) {
|
|
10
|
+
if (!hasOwn(expectation, "comparison")) continue;
|
|
11
|
+
if (typeof expectation.comparison !== "string" || !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(expectation.comparison)) {
|
|
12
|
+
errors.push({ id: expectation.id, reason: "invalid comparison identity" });
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const entries = grouped.get(expectation.comparison) ?? [];
|
|
16
|
+
entries.push(expectation);
|
|
17
|
+
grouped.set(expectation.comparison, entries);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** @type {Map<string, any>} */
|
|
21
|
+
const byCheck = new Map(checks.map((check) => [check.id, check]));
|
|
22
|
+
const comparisons = /** @type {any[]} */ ([]);
|
|
23
|
+
for (const [id, entries] of grouped) {
|
|
24
|
+
const baselineExpectation = entries.find((entry) => entry.variant === "baseline");
|
|
25
|
+
const candidateExpectation = entries.find((entry) => entry.variant === "candidate");
|
|
26
|
+
if (entries.length !== 2 || !baselineExpectation || !candidateExpectation) {
|
|
27
|
+
errors.push({ id, reason: "comparison requires one baseline and one candidate expectation" });
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const baseline = byCheck.get(baselineExpectation.id);
|
|
31
|
+
const candidate = byCheck.get(candidateExpectation.id);
|
|
32
|
+
if (!sameCheck(baseline, candidate)) {
|
|
33
|
+
errors.push({ id, reason: "comparison expectations must describe the same deterministic check" });
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
comparisons.push({
|
|
37
|
+
id,
|
|
38
|
+
kind: baseline.kind,
|
|
39
|
+
baseline: { check: baseline.id, state: baseline.state },
|
|
40
|
+
candidate: { check: candidate.id, state: candidate.state },
|
|
41
|
+
transition: transition(baseline.state, candidate.state),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return { comparisons, errors };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function sameCheck(baseline, candidate) {
|
|
48
|
+
return (
|
|
49
|
+
baseline !== undefined &&
|
|
50
|
+
candidate !== undefined &&
|
|
51
|
+
baseline.kind === candidate.kind &&
|
|
52
|
+
isDeepStrictEqual(baseline.expected, candidate.expected)
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function transition(baseline, candidate) {
|
|
57
|
+
return [baseline, candidate].every((state) => state === "pass" || state === "fail")
|
|
58
|
+
? `${baseline}-to-${candidate}`
|
|
59
|
+
: "unavailable";
|
|
60
|
+
}
|