@1aboveio/skills 0.10.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/LICENSE +3 -0
- package/README.md +90 -0
- package/bin/1aboveio-skills.mjs +18 -0
- package/package.json +28 -0
- package/runtime/skills/distribution/generated/recipes.json +1189 -0
- package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
- package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
- package/skills/backend/airflow-dag-develop/LICENSE +3 -0
- package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
- package/skills/backend/app-debug/LICENSE +3 -0
- package/skills/backend/app-debug/SKILL.md +109 -0
- package/skills/backend/app-debug/references/common-errors.md +128 -0
- package/skills/backend/python-backend/LICENSE +3 -0
- package/skills/backend/python-backend/SKILL.md +326 -0
- package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
- package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
- package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
- package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
- package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
- package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
- package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
- package/skills/cicd-pipeline/docker/LICENSE +3 -0
- package/skills/cicd-pipeline/docker/SKILL.md +126 -0
- package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
- package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
- package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
- package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
- package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
- package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
- package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
- package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
- package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
- package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
- package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
- package/skills/cicd-pipeline/mergify/LICENSE +3 -0
- package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
- package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
- package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
- package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
- package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
- package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
- package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
- package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
- package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
- package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
- package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
- package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
- package/skills/cicd-pipeline/podman/LICENSE +3 -0
- package/skills/cicd-pipeline/podman/SKILL.md +70 -0
- package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
- package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
- package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
- package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
- package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
- package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
- package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
- package/skills/engineering/e2e-test/LICENSE +3 -0
- package/skills/engineering/e2e-test/SKILL.md +156 -0
- package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
- package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
- package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
- package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
- package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
- package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
- package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
- package/skills/engineering/e2e-test/references/debugging.md +36 -0
- package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
- package/skills/engineering/e2e-test/references/reviewing.md +39 -0
- package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
- package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
- package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
- package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
- package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
- package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
- package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
- package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
- package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
- package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
- package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -0
- package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
- package/skills/engineering/engineering-runtime/LICENSE +3 -0
- package/skills/engineering/engineering-runtime/SKILL.md +10 -0
- package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -0
- package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
- package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
- package/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
- package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
- package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
- package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
- package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +576 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
- package/skills/engineering/ensure-coverage/LICENSE +3 -0
- package/skills/engineering/ensure-coverage/SKILL.md +136 -0
- package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
- package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
- package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
- package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
- package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +25 -0
- package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
- package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
- package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
- package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
- package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
- package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
- package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
- package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
- package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
- package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
- package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
- package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
- package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
- package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
- package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
- package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
- package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
- package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
- package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
- package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
- package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
- package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
- package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
- package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
- package/skills/engineering/harness-runtime/LICENSE +3 -0
- package/skills/engineering/harness-runtime/SKILL.md +18 -0
- package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
- package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
- package/skills/engineering/harness-runtime/contracts.md +15 -0
- package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
- package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
- package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
- package/skills/engineering/harness-runtime/index.mjs +767 -0
- package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
- package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
- package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
- package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
- package/skills/engineering/implement-and-pr/LICENSE +3 -0
- package/skills/engineering/implement-and-pr/SKILL.md +176 -0
- package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
- package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
- package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
- package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
- package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
- package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
- package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
- package/skills/engineering/resolve-issues/LICENSE +3 -0
- package/skills/engineering/resolve-issues/SKILL.md +167 -0
- package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
- package/skills/engineering/resolve-issues/references/breaker.md +82 -0
- package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
- package/skills/engineering/resolve-issues/references/delivery.md +108 -0
- package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
- package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
- package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
- package/skills/engineering/resolve-issues/references/finalization.md +68 -0
- package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
- package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
- package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
- package/skills/engineering/resolve-issues/references/intake.md +86 -0
- package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
- package/skills/engineering/resolve-issues/references/interference.md +87 -0
- package/skills/engineering/resolve-issues/references/loop.md +134 -0
- package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
- package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
- package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
- package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
- package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
- package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
- package/skills/engineering/resolve-issues/references/run-state.md +288 -0
- package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
- package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
- package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
- package/skills/engineering/resolve-issues/references/why.md +653 -0
- package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
- package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
- package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
- package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
- package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
- package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
- package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
- package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
- package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
- package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
- package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
- package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
- package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
- package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
- package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
- package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
- package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
- package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
- package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
- package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
- package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
- package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
- package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
- package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
- package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
- package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
- package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
- package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
- package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
- package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
- package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
- package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
- package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
- package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
- package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
- package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
- package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
- package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
- package/skills/engineering/resolve-release/LICENSE +3 -0
- package/skills/engineering/resolve-release/SKILL.md +112 -0
- package/skills/engineering/resolve-release/references/assembly.md +137 -0
- package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
- package/skills/engineering/resolve-release/references/candidate.md +167 -0
- package/skills/engineering/resolve-release/references/exposure.md +178 -0
- package/skills/engineering/resolve-release/references/handoff.md +24 -0
- package/skills/engineering/resolve-release/references/postmortem.md +230 -0
- package/skills/engineering/resolve-release/references/preflight.md +207 -0
- package/skills/engineering/resolve-release/references/principles.md +94 -0
- package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
- package/skills/engineering/resolve-release/references/related-skills.md +12 -0
- package/skills/engineering/resolve-release/references/routing.md +149 -0
- package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
- package/skills/engineering/resolve-release/references/versioning.md +202 -0
- package/skills/engineering/resolve-release/references/why.md +53 -0
- package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
- package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
- package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
- package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
- package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
- package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
- package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
- package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
- package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
- package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
- package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
- package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
- package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
- package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
- package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
- package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
- package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
- package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
- package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
- package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
- package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
- package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
- package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
- package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
- package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
- package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
- package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
- package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
- package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
- package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
- package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
- package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/README.md +60 -0
- package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
- package/skills/engineering/review-pr/LICENSE +3 -0
- package/skills/engineering/review-pr/SKILL.md +123 -0
- package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
- package/skills/engineering/review-pr/references/code-correctness.md +5 -0
- package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
- package/skills/engineering/review-pr/references/coordination.md +18 -0
- package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
- package/skills/engineering/review-pr/references/finding-themes.md +7 -0
- package/skills/engineering/review-pr/references/github-posting.md +98 -0
- package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
- package/skills/engineering/review-pr/references/incremental-output.md +16 -0
- package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
- package/skills/engineering/review-pr/references/output-format.md +99 -0
- package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
- package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
- package/skills/engineering/review-pr/references/re-review.md +18 -0
- package/skills/engineering/review-pr/references/review-method.md +199 -0
- package/skills/engineering/review-pr/references/review-mode.md +30 -0
- package/skills/engineering/review-pr/references/review-posture.md +53 -0
- package/skills/engineering/review-pr/references/round1-depth.md +62 -0
- package/skills/engineering/review-pr/references/scripts.md +17 -0
- package/skills/engineering/review-pr/references/workflow.md +16 -0
- package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
- package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
- package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
- package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
- package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
- package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
- package/skills/engineering/smoke/LICENSE +3 -0
- package/skills/engineering/smoke/SKILL.md +131 -0
- package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
- package/skills/engineering/smoke/references/manifest.md +192 -0
- package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
- package/skills/fullstack/better-auth/LICENSE +3 -0
- package/skills/fullstack/better-auth/SKILL.md +601 -0
- package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
- package/skills/fullstack/monorepo/LICENSE +3 -0
- package/skills/fullstack/monorepo/SKILL.md +465 -0
- package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
- package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
- package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
- package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
- package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
- package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
- package/skills/fullstack/prisma-setup/LICENSE +3 -0
- package/skills/fullstack/prisma-setup/SKILL.md +180 -0
- package/skills/fullstack/prisma-setup/nextjs.md +258 -0
- package/skills/fullstack/prisma-setup/turborepo.md +301 -0
- package/skills/fullstack/shadcn/LICENSE +3 -0
- package/skills/fullstack/shadcn/SKILL.md +119 -0
- package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
- package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
- package/skills/fullstack/shadcn/cli.md +411 -0
- package/skills/fullstack/shadcn/customization.md +224 -0
- package/skills/fullstack/shadcn/evals/evals.json +90 -0
- package/skills/fullstack/shadcn/mcp.md +101 -0
- package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
- package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
- package/skills/fullstack/shadcn/rules/composition.md +195 -0
- package/skills/fullstack/shadcn/rules/data-table.md +201 -0
- package/skills/fullstack/shadcn/rules/forms.md +255 -0
- package/skills/fullstack/shadcn/rules/icons.md +103 -0
- package/skills/fullstack/shadcn/rules/styling.md +167 -0
- package/skills/fullstack/zod-v4/LICENSE +3 -0
- package/skills/fullstack/zod-v4/SKILL.md +287 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
// NOT A CLI. Running this file directly does nothing — no output, exit 0 — because it has no
|
|
2
|
+
// entry point. `run-state.mjs spawn-contract <slug> <unitId> [--kind producer|fix|review] [--json]` is the entry point,
|
|
3
|
+
// and it does work this module cannot: it derives scheduler/manifest context this file never sees.
|
|
4
|
+
//
|
|
5
|
+
// A guard that says so out loud was tried and reverted. It has to import the shared main-module
|
|
6
|
+
// helper from `engineering-runtime`, and `run-state.mjs` imports THIS file at load — so the new
|
|
7
|
+
// edge changed which module a runtime-missing install reports first, turning an actionable "the
|
|
8
|
+
// coherence contract is missing" into "a helper is missing". Degrading an operator-facing
|
|
9
|
+
// fail-closed diagnostic to catch an authoring mistake is the wrong trade; the docs now link the
|
|
10
|
+
// command text at `run-state.mjs`, and a test pins that they keep doing so.
|
|
11
|
+
// The spawn contract, rendered from state instead of composed in prose.
|
|
12
|
+
//
|
|
13
|
+
// Why this is a command and not a paragraph. Measured over 33 Pi sessions and 163
|
|
14
|
+
// producer spawns (2026-08-04): the producer spawn prompt is composed ONCE per run and
|
|
15
|
+
// then repeated for every unit, never re-derived from doctrine. **10 of 17 sessions with
|
|
16
|
+
// 4+ producer spawns vary by at most one gate across the entire run** — one session sat
|
|
17
|
+
// at exactly 2 of 5 gates for 27 consecutive spawns; another named all 5 eighteen times;
|
|
18
|
+
// a third named none of them nine times. Whatever the first composition happened to
|
|
19
|
+
// contain, every later unit in that run inherited.
|
|
20
|
+
//
|
|
21
|
+
// So the failure is not that an orchestrator disagrees with the doctrine. It is that the
|
|
22
|
+
// doctrine is consulted once, at the first spawn, and the template then drifts free of
|
|
23
|
+
// it — and where it moves it more often decays than improves (7 sessions down, 3 up, 7
|
|
24
|
+
// flat), with the decays on the LONGEST runs: 4 gates → 1, and 2 → 1 across a 33-spawn
|
|
25
|
+
// session. That is the shape of context pressure eroding a remembered template, and no
|
|
26
|
+
// amount of additional prose fixes a template that is never re-read.
|
|
27
|
+
//
|
|
28
|
+
// The consequence is concrete rather than stylistic. `coverage-checklist.mjs validate`
|
|
29
|
+
// answers a strictly weaker question without `--diff` (a missing locator warns instead
|
|
30
|
+
// of blocking), so a producer that omits the flag hands over a green the reviewer's run
|
|
31
|
+
// turns red — 1above-official #35: producer `validate --root .` passed, reviewer
|
|
32
|
+
// `validate --diff` found 9 PASS rows with no resolving locator, and the unit bought an
|
|
33
|
+
// evidence round for the difference. `--diff` appeared in 10% of producer spawns.
|
|
34
|
+
//
|
|
35
|
+
// Rendering the contract makes spawn 1 and spawn 33 byte-identical, and makes the gate
|
|
36
|
+
// list a property of the RUN rather than of whichever composition survived. It is also a
|
|
37
|
+
// net deletion from `loop.md`, which now points here instead of describing the contract.
|
|
38
|
+
//
|
|
39
|
+
// What this does NOT do: it does not spawn anything, and it does not replace reading
|
|
40
|
+
// `implement-and-pr`/`review-pr`. It renders the wrapper whose whole job is to make the
|
|
41
|
+
// leaf agent read those skills at an absolute path, with the run's own facts filled in.
|
|
42
|
+
|
|
43
|
+
import { effectiveUnitKind } from './unit-lifecycle.mjs'
|
|
44
|
+
import { validateEvidenceLifecycleContract } from './evidence-lifecycle-contract.mjs'
|
|
45
|
+
|
|
46
|
+
const isObject = (v) => v != null && typeof v === 'object' && !Array.isArray(v)
|
|
47
|
+
const nonEmpty = (v) => typeof v === 'string' && v.trim().length > 0
|
|
48
|
+
|
|
49
|
+
export const SPAWN_KINDS = ['producer', 'fix', 'review']
|
|
50
|
+
|
|
51
|
+
// The gates a producer/fix close-out owes, each with the flag that makes it decide
|
|
52
|
+
// rather than merely run. The flags are the entire point of the list: a gate named
|
|
53
|
+
// without them is the shape this file exists to stop being repeated.
|
|
54
|
+
//
|
|
55
|
+
// `<skillsRoot>/<owning-skill>/scripts/…` — never a CWD-relative `scripts/…` and never
|
|
56
|
+
// found by searching, which the spawn contract already forbids and which is exactly what
|
|
57
|
+
// a leaf agent does when handed a bare skill name.
|
|
58
|
+
export const PRODUCER_GATES = [
|
|
59
|
+
{ skill: 'ensure-coverage', script: 'coverage-checklist.mjs', args: 'validate <checklist.md> --diff <merge-base>', why: 'without --diff a missing locator WARNS instead of blocking, so this passes where the reviewer\'s run fails' },
|
|
60
|
+
{ skill: 'ensure-coverage', script: 'lint-tests.mjs', args: '--rules no-skip,no-fixed-timeout,no-empty-test,mock-internal-seam --diff <merge-base>', why: 'PR-lane; then re-run bare for the whole-tree mock-internal-seam sweep' },
|
|
61
|
+
{ skill: 'ensure-coverage', script: 'coverage-ledger.mjs', args: 'validate', why: 'breadth — the surface inventory must not have drifted' },
|
|
62
|
+
{ skill: 'review-pr', script: 'scan-diff.mjs', args: '(git diff <merge-base>...HEAD | node …)', why: 'report the decidable findings channel VERBATIM; every hit is a zero-tolerance blocker' },
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
// What the manifest structurally cannot hold, per spawn kind. These are not omissions to
|
|
66
|
+
// be fixed by storing more — findings are prose the reviewer returns, CI failures arrive
|
|
67
|
+
// after the spawn is composed, and the work item lives in the issue. They are named here
|
|
68
|
+
// so a caller pasting a rendered contract cannot mistake it for the whole prompt.
|
|
69
|
+
export const APPENDS = {
|
|
70
|
+
producer: [
|
|
71
|
+
'THE WORK ITEM — what to build, from the issue body and its acceptance criteria. The contract above says how to work, never what to work on.',
|
|
72
|
+
'The approved test criteria, or the design/contract doc, where one exists.',
|
|
73
|
+
],
|
|
74
|
+
fix: [
|
|
75
|
+
'THE REVIEWER\'S FINDINGS, VERBATIM — every one, with its `file:line`, confidence and `theme`. A fix round without them is a spawn told to fix nothing; the manifest records the verdict, never the findings.',
|
|
76
|
+
'Every CI failure known at spawn time, including one carried from an earlier round whose CI landed after that round\'s fix had started.',
|
|
77
|
+
'The invariant CLASS each fix must close — not the counterexample cited. A fix that closes only the instance is reconciled `Partially resolved` and buys another round.',
|
|
78
|
+
],
|
|
79
|
+
review: [
|
|
80
|
+
'The PR ref and the exact head SHA to review, with a stop-if-HEAD-moved clause — a verdict against a moved head is not a verdict on what you asked about.',
|
|
81
|
+
'How the verdict may be posted — ask `run-state.mjs approval-gate <slug>` FIRST. Exit 1 means the reviewer posts a COMMENT and merges nothing, because on an auto-merging repo an approving review IS the merge.',
|
|
82
|
+
'The prior findings to reconcile, on any round after the first.',
|
|
83
|
+
],
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const effortOf = (models, slot) => {
|
|
87
|
+
const e = models?.[`${slot}Effort`]
|
|
88
|
+
return nonEmpty(e) ? e : 'high'
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Env vars injected into every producer/review/fix child so a sandboxed spawn can
|
|
92
|
+
// report the confirmed slot without reading harness-private PI_* vars (#792 /
|
|
93
|
+
// issue-664 / identity#669). The orchestrator's launch id remains authoritative for
|
|
94
|
+
// the diversity guard when the child cannot read these or returns unknown.
|
|
95
|
+
export const SLOT_ENV = {
|
|
96
|
+
model: 'RESOLVE_SLOT_MODEL',
|
|
97
|
+
effort: 'RESOLVE_SLOT_EFFORT',
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Whether THIS harness can put env vars into a subagent. Read from the capabilities
|
|
101
|
+
// pre-flight step 0 recorded, never guessed from the model ids: a harness that spawns by
|
|
102
|
+
// tool call with no env parameter (Claude Code's `Agent`) cannot, and one that spawns a
|
|
103
|
+
// process it configures (Pi's `subagent_spawn`) can. Unknown capabilities fall back to the
|
|
104
|
+
// injecting shape, which is the historical behaviour and merely renders one extra sentence
|
|
105
|
+
// where it does not apply — whereas withholding it on a harness that CAN inject would drop
|
|
106
|
+
// a real guard.
|
|
107
|
+
export function envInjectionAvailable(manifest) {
|
|
108
|
+
const tools = manifest?.currentTurnCapabilities?.nativeTools
|
|
109
|
+
if (!Array.isArray(tools) || !tools.length) return true
|
|
110
|
+
const NO_ENV_SPAWNERS = ['Agent', 'Task']
|
|
111
|
+
const ENV_SPAWNERS = ['subagent_spawn', 'subagent_spawn_batch']
|
|
112
|
+
if (tools.some((t) => ENV_SPAWNERS.includes(t))) return true
|
|
113
|
+
if (tools.some((t) => NO_ENV_SPAWNERS.includes(t))) return false
|
|
114
|
+
return true
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function unitOf(manifest, unitId) {
|
|
118
|
+
const units = Array.isArray(manifest?.units) ? manifest.units.filter(isObject) : []
|
|
119
|
+
return units.find((u) => u.id === unitId) || null
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function validatedLifecycleContract(unit) {
|
|
123
|
+
if (unit?.evidenceLifecycle?.required !== true) return null
|
|
124
|
+
if (!isObject(unit.evidenceLifecycleContract)) {
|
|
125
|
+
throw new Error(`${unit.id} is classified evidence-authorization and requires evidenceLifecycleContract before implementation begins`)
|
|
126
|
+
}
|
|
127
|
+
const result = validateEvidenceLifecycleContract(unit.evidenceLifecycleContract)
|
|
128
|
+
if (!result.ok) {
|
|
129
|
+
throw new Error(`${unit.id} evidenceLifecycleContract is invalid: ${result.errors.join('; ')}`)
|
|
130
|
+
}
|
|
131
|
+
return unit.evidenceLifecycleContract
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Round count drives the two conditionals a leaf agent cannot compute for itself.
|
|
135
|
+
const roundsOf = (unit) => (Array.isArray(unit?.rounds) ? unit.rounds.length : 0)
|
|
136
|
+
|
|
137
|
+
// Everything the renderer could not fill from state, collected rather than guessed. A
|
|
138
|
+
// contract with a hole in it is still worth printing — the hole is the actionable part,
|
|
139
|
+
// and inventing a plausible value for `skillsRoot` is how a spawn silently reads nothing.
|
|
140
|
+
function gaps(manifest, unit, kind) {
|
|
141
|
+
const out = []
|
|
142
|
+
if (!nonEmpty(manifest?.skillsRoot)) out.push('skillsRoot — the ABSOLUTE skills directory. Without it the leaf agent cannot read its skill and degrades to a memory-reconstructed lookalike. Set it: run-state.mjs set <slug> skillsRoot /abs/path')
|
|
143
|
+
if (!nonEmpty(unit?.workspacePath)) out.push('units[].workspacePath — the unit\'s OWN tree. Absent, the spawn inherits the orchestrator\'s cwd and writes into the checkout you are coordinating from.')
|
|
144
|
+
const slot = kind === 'review' ? 'review' : 'implementation'
|
|
145
|
+
if (!nonEmpty(manifest?.models?.[slot])) out.push(`models.${slot} — the confirmed model for this slot (pre-flight step 4).`)
|
|
146
|
+
if (!nonEmpty(manifest?.targetBranch)) out.push('targetBranch — settled at pre-flight from fetched remote heads.')
|
|
147
|
+
return out
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function renderSpawnContract(manifest = {}, unitId, { kind = 'producer' } = {}) {
|
|
151
|
+
if (!SPAWN_KINDS.includes(kind)) throw new Error(`kind must be one of ${SPAWN_KINDS.join('|')}`)
|
|
152
|
+
const m = isObject(manifest) ? manifest : {}
|
|
153
|
+
const unit = unitOf(m, unitId)
|
|
154
|
+
if (!unit) throw new Error(`no unit ${unitId} in this run`)
|
|
155
|
+
const unitKind = effectiveUnitKind(unit)
|
|
156
|
+
if (unitKind !== 'implementation') {
|
|
157
|
+
throw new Error(`only implementation units enter the code loop; ${unitId} is ${unitKind} and must be completed by its recorded non-code protocol`)
|
|
158
|
+
}
|
|
159
|
+
const lifecycleContract = validatedLifecycleContract(unit)
|
|
160
|
+
|
|
161
|
+
const root = nonEmpty(m.skillsRoot) ? m.skillsRoot.replace(/\/+$/, '') : '<skillsRoot — NOT RECORDED>'
|
|
162
|
+
const slot = kind === 'review' ? 'review' : 'implementation'
|
|
163
|
+
const model = nonEmpty(m.models?.[slot]) ? m.models[slot] : `<models.${slot} — NOT RECORDED>`
|
|
164
|
+
const effort = effortOf(m.models, slot)
|
|
165
|
+
const ws = nonEmpty(unit.workspacePath) ? unit.workspacePath : '<units[].workspacePath — NOT RECORDED>'
|
|
166
|
+
const target = nonEmpty(m.targetBranch) ? m.targetBranch : '<targetBranch — NOT RECORDED>'
|
|
167
|
+
const rounds = roundsOf(unit)
|
|
168
|
+
const skill = kind === 'review' ? 'review-pr' : 'implement-and-pr'
|
|
169
|
+
|
|
170
|
+
const L = []
|
|
171
|
+
L.push(`SPAWN CONTRACT — ${kind} · unit ${unit.id} · run ${m.runSlug ?? '<slug>'}`)
|
|
172
|
+
L.push(`model ${model} @ ${effort} · cwd ${ws}`)
|
|
173
|
+
// The header states what the launcher must DO. On a harness with no env parameter there is
|
|
174
|
+
// nothing to set, and printing the vars anyway invites the orchestrator to believe it did.
|
|
175
|
+
L.push(envInjectionAvailable(manifest)
|
|
176
|
+
? `env ${SLOT_ENV.model}=${model} ${SLOT_ENV.effort}=${effort}`
|
|
177
|
+
: 'env — this harness cannot inject env into a subagent; the prompt asks for a session-identity read-back instead')
|
|
178
|
+
L.push('Paste the block below as the spawn prompt. Rendered from state — do not retype it,')
|
|
179
|
+
L.push('and do not trim it: every clause here fails SILENTLY when dropped.')
|
|
180
|
+
L.push('─'.repeat(78))
|
|
181
|
+
L.push('')
|
|
182
|
+
|
|
183
|
+
// (a) read the skill, absolute.
|
|
184
|
+
L.push(`Read \`${root}/${skill}/SKILL.md\` (absolute path — do NOT search for it) and follow it end-to-end. Do not improvise, and do not spawn agents of your own.`)
|
|
185
|
+
L.push('')
|
|
186
|
+
L.push(`Work item: ${unit.id}${nonEmpty(unit.pr) ? ` · PR ${unit.pr}` : ''}${nonEmpty(unit.branch) ? ` · branch ${unit.branch}` : ''}. Target branch: ${target}.`)
|
|
187
|
+
L.push(`Work in ${ws} — this unit's own tree. Never the orchestrator's checkout.`)
|
|
188
|
+
// (d) model + effort — the read-back that makes "no silent fallback" checkable.
|
|
189
|
+
//
|
|
190
|
+
// Env injection is NOT universal. Some harnesses (Pi) launch children with an env the
|
|
191
|
+
// orchestrator controls; others (Claude Code's `Agent` tool) expose no env parameter at
|
|
192
|
+
// all, and the injection clause is then an instruction that CANNOT be followed. Rendering
|
|
193
|
+
// it anyway is worse than saying nothing: the child reports the vars empty, the guard
|
|
194
|
+
// degrades to an honour-system self-report, and nothing in the run says the mechanism
|
|
195
|
+
// never ran. fmm-express epic-894 rendered it to 7/7 spawns on Claude Code; all seven came
|
|
196
|
+
// back empty and every prompt had to be hand-patched after the fact.
|
|
197
|
+
//
|
|
198
|
+
// Pre-flight step 0 already records `currentTurnCapabilities` for exactly this kind of
|
|
199
|
+
// adaptation, so consult it rather than assuming the Pi shape.
|
|
200
|
+
L.push(envInjectionAvailable(manifest)
|
|
201
|
+
? `Slot env (inject into the child process): ${SLOT_ENV.model}=${model} ${SLOT_ENV.effort}=${effort}. Report these back as the model you ran on; if you cannot read them, say so — do not invent a model string.`
|
|
202
|
+
: `Model for this spawn: ${model} @ ${effort}. This harness cannot inject env into a subagent, so there is no slot variable to read: report YOUR OWN session's model identity instead, and say so plainly if you cannot determine it. Never invent a model string, and never echo the id above as if you had read it back — the whole point of the read-back is that it can disagree with what was requested.`)
|
|
203
|
+
|
|
204
|
+
if (lifecycleContract) {
|
|
205
|
+
L.push('')
|
|
206
|
+
L.push('Evidence lifecycle contract: VALIDATED before implementation. Build/review every discovered condition against this exact artifact:')
|
|
207
|
+
L.push('```json')
|
|
208
|
+
L.push(JSON.stringify(lifecycleContract, null, 2))
|
|
209
|
+
L.push('```')
|
|
210
|
+
L.push('Check the implementation against this lifecycle contract. The artifact does not replace independent code review or provider evidence.')
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (kind === 'review') {
|
|
214
|
+
L.push('')
|
|
215
|
+
L.push(`Subject: the net merge-base...HEAD diff of the PR (compute it with \`${root}/review-pr/scripts/pr-context.mjs\`), read-only.`)
|
|
216
|
+
L.push('Run the four-axis adversarial scan; return schema\'d findings, each with a real `file:line`, a confidence, and a stable `theme` id.')
|
|
217
|
+
L.push(`Run \`${root}/ensure-coverage/scripts/coverage-checklist.mjs validate <checklist.md> --diff <merge-base>\` and report the result.`)
|
|
218
|
+
L.push(`Run \`${root}/review-pr/scripts/scan-diff.mjs\` and report its decidable \`findings\` channel VERBATIM — every hit is a zero-tolerance blocker.`)
|
|
219
|
+
L.push('Classify every finding `subject: code|evidence` — `evidence` only when the fix would touch no source file.')
|
|
220
|
+
if (rounds >= 1 && nonEmpty(unit.lastReviewedSha)) {
|
|
221
|
+
L.push(`Re-review (round ${rounds + 1}): \`lastReviewedSha\` is ${unit.lastReviewedSha} — scan \`${unit.lastReviewedSha}..HEAD\` with TWO dots, and reconcile every prior finding against the current tree.`)
|
|
222
|
+
} else {
|
|
223
|
+
L.push('Round 1: full scope. No `lastReviewedSha` — review the whole net diff.')
|
|
224
|
+
}
|
|
225
|
+
} else {
|
|
226
|
+
L.push('')
|
|
227
|
+
L.push('Run the close-out gates and report each one\'s output. These are the gates, with the flags that make them DECIDE rather than merely run:')
|
|
228
|
+
for (const g of PRODUCER_GATES) {
|
|
229
|
+
L.push(` · ${root}/${g.skill}/scripts/${g.script} ${g.args}`)
|
|
230
|
+
L.push(` ${g.why}`)
|
|
231
|
+
}
|
|
232
|
+
L.push('A gate reported without its output did not run. Re-run it.')
|
|
233
|
+
L.push('')
|
|
234
|
+
L.push('Open/update the PR with the full Review Contract, including the `Implementation Model` line (the read-back of the model you actually ran on).')
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// The conditionals the leaf agent cannot compute — withheld, they downgrade the round
|
|
238
|
+
// silently rather than failing it.
|
|
239
|
+
L.push('')
|
|
240
|
+
L.push('Conditions for this round (computed by the orchestrator — do not re-derive):')
|
|
241
|
+
L.push(` · round: ${rounds + 1}`)
|
|
242
|
+
L.push(` · highRisk: ${unit.highRisk === true ? 'YES — apply the high-risk protocol' : 'no'}`)
|
|
243
|
+
L.push(` · scopeClass: ${nonEmpty(unit.scopeClass) ? unit.scopeClass : 'NOT CLASSIFIED — classify at close-out and return the classifier JSON'}`)
|
|
244
|
+
if (isObject(unit.contractRevision) && nonEmpty(unit.contractRevision.sha)) {
|
|
245
|
+
L.push(` · contractRevision: ${unit.contractRevision.sha}${Array.isArray(unit.contractRevision.refs) && unit.contractRevision.refs.length ? ` (${unit.contractRevision.refs.join(', ')})` : ''} — verify HEAD contains it and treat it as the source authority.`)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// The premise-edge invariants (2026-08-04). A unit admitted ahead of its ordering is
|
|
249
|
+
// building against something not yet true in the tree; unsaid, that is the silent
|
|
250
|
+
// false-premise failure the scheduling change traded away for this line.
|
|
251
|
+
const ordered = Array.isArray(unit.orderedAfter) ? unit.orderedAfter : []
|
|
252
|
+
if (ordered.length) {
|
|
253
|
+
L.push('')
|
|
254
|
+
L.push('You are building AHEAD of a dependency. The assumption you are building against:')
|
|
255
|
+
for (const o of ordered) {
|
|
256
|
+
L.push(` · ${o.invariant ? `"${o.invariant}"` : '<NO INVARIANT RECORDED — do not spawn until intake records it>'}`)
|
|
257
|
+
L.push(` ${o.unit} establishes this and has NOT landed. Design to the assumption; do not redesign around what today's tree shows. State it as its own line in the Review Contract.`)
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// (b) + (c): the proof, and the channel it comes back on.
|
|
262
|
+
L.push('')
|
|
263
|
+
L.push('Return, as your final message: the PR ref, the head SHA you pushed, each gate\'s output above, the model you ran on, and anything you could not do. Deliver it as a value into this session — not a file you leave behind.')
|
|
264
|
+
L.push('─'.repeat(78))
|
|
265
|
+
|
|
266
|
+
// The renderer owns the CONTRACT — the invariant wrapper. It does not own the TASK,
|
|
267
|
+
// and the difference is easy to miss precisely because the rendered block reads as
|
|
268
|
+
// complete. That is a regression risk this file created: a hand-composed prompt always
|
|
269
|
+
// carried the work, because the author was thinking about the work; a pasted one can
|
|
270
|
+
// carry a flawless contract around an empty task. Found by an eval on 2026-08-04, where
|
|
271
|
+
// a fix contract rendered with no route for the reviewer's findings — the single most
|
|
272
|
+
// important input a fix round has, and one the manifest does not store.
|
|
273
|
+
//
|
|
274
|
+
// So the append list is part of the output, not a footnote: what state CANNOT supply,
|
|
275
|
+
// named per kind, in the same block the caller is about to paste.
|
|
276
|
+
L.push('')
|
|
277
|
+
L.push('APPEND BEFORE SENDING — state cannot supply these, and the block above is not a spawn without them:')
|
|
278
|
+
for (const a of APPENDS[kind]) L.push(` ▸ ${a}`)
|
|
279
|
+
L.push('─'.repeat(78))
|
|
280
|
+
|
|
281
|
+
const missing = gaps(m, unit, kind)
|
|
282
|
+
// Structured env for programmatic inject (subagent_spawn env:, child process env).
|
|
283
|
+
// The text already names the same pair for paste-only orchestrators; returning the
|
|
284
|
+
// object means a launcher does not have to parse the contract text to honour clause (d).
|
|
285
|
+
// Launch id remains authoritative for guarantee 2 when the child cannot read these.
|
|
286
|
+
const env = nonEmpty(model) && !model.startsWith('<')
|
|
287
|
+
? { [SLOT_ENV.model]: model, [SLOT_ENV.effort]: effort }
|
|
288
|
+
: null
|
|
289
|
+
return { text: L.join('\n'), gaps: missing, kind, unit: unit.id, model, effort, workspacePath: unit.workspacePath ?? null, env, slotEnvNames: { ...SLOT_ENV } }
|
|
290
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// One truthful terminal taxonomy for every resolve-issues lifecycle consumer.
|
|
2
|
+
// Explicit dispositions are authoritative. Legacy records remain readable here.
|
|
3
|
+
|
|
4
|
+
export const TERMINAL_DISPOSITIONS = ['delivered', 'handed-back', 'already-done', 'descoped', 'blocked']
|
|
5
|
+
export const COMPONENT_VERDICTS = ['ALIVE', 'DEAD', 'DESCOPED']
|
|
6
|
+
|
|
7
|
+
const isObject = (value) => value != null && typeof value === 'object' && !Array.isArray(value)
|
|
8
|
+
const nonEmpty = (value) => typeof value === 'string' && value.trim().length > 0
|
|
9
|
+
const arr = (value) => (Array.isArray(value) ? value : [])
|
|
10
|
+
|
|
11
|
+
export function deliveryForUnit(unit, manifest = null) {
|
|
12
|
+
if (!isObject(unit)) return null
|
|
13
|
+
if (isObject(unit.delivery)) return unit.delivery
|
|
14
|
+
const ref = isObject(unit.deliveryRef) ? unit.deliveryRef : null
|
|
15
|
+
if (ref && nonEmpty(ref.componentId) && Number.isSafeInteger(ref.generation) && ref.generation > 0) {
|
|
16
|
+
const component = arr(manifest?.components).find((entry) => entry?.id === ref.componentId)
|
|
17
|
+
if (!component || arr(component.units).filter((id) => id === unit.id).length !== 1) return null
|
|
18
|
+
const delivery = isObject(component.delivery) ? component.delivery : null
|
|
19
|
+
if (!delivery || delivery.generation !== ref.generation) return null
|
|
20
|
+
return delivery
|
|
21
|
+
}
|
|
22
|
+
if (manifest != null) {
|
|
23
|
+
const owners = arr(manifest.components).filter((component) => isObject(component.delivery)
|
|
24
|
+
&& arr(component.units).filter((id) => id === unit.id).length === 1)
|
|
25
|
+
return owners.length === 1 ? owners[0].delivery : null
|
|
26
|
+
}
|
|
27
|
+
return null
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function terminalDisposition(unit, manifest = null) {
|
|
31
|
+
if (!isObject(unit)) return null
|
|
32
|
+
const delivery = deliveryForUnit(unit, manifest)
|
|
33
|
+
if (TERMINAL_DISPOSITIONS.includes(unit.disposition)) {
|
|
34
|
+
const derivedRef = isObject(unit.deliveryRef) && nonEmpty(unit.deliveryRef.componentId)
|
|
35
|
+
&& Number.isSafeInteger(unit.deliveryRef.generation) && unit.deliveryRef.generation > 0
|
|
36
|
+
if (unit.disposition === 'delivered') return delivery?.outcome === 'merged' && nonEmpty(delivery?.mergedSha)
|
|
37
|
+
? 'delivered'
|
|
38
|
+
: (manifest == null && derivedRef ? 'delivered' : null)
|
|
39
|
+
if (unit.disposition === 'handed-back') return delivery?.outcome === 'handed-back' && nonEmpty(delivery?.blockedOn)
|
|
40
|
+
? 'handed-back'
|
|
41
|
+
: (manifest == null && derivedRef ? 'handed-back' : null)
|
|
42
|
+
if (unit.disposition === 'descoped') return scopeDecisionErrors(unit.scopeDecision).length === 0 ? 'descoped' : null
|
|
43
|
+
if (unit.scopeDecision !== undefined) return null
|
|
44
|
+
return unit.disposition
|
|
45
|
+
}
|
|
46
|
+
const scopeDecision = isObject(unit.scopeDecision) ? unit.scopeDecision : null
|
|
47
|
+
if (scopeDecision && ['descope', 'descoped'].includes(scopeDecision.decision)
|
|
48
|
+
&& scopeDecision.decidedBy === 'human' && scopeDecision.delivered === false) return 'descoped'
|
|
49
|
+
const outcome = delivery?.outcome ?? null
|
|
50
|
+
if (outcome === 'merged') return 'delivered'
|
|
51
|
+
if (outcome === 'handed-back') return 'handed-back'
|
|
52
|
+
if (unit.status === 'skipped-already-done') return 'already-done'
|
|
53
|
+
if (unit.status === 'blocked') return 'blocked'
|
|
54
|
+
return null
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function terminalDispositionTally(units, manifest = null) {
|
|
58
|
+
const tally = Object.fromEntries(TERMINAL_DISPOSITIONS.map((value) => [value, 0]))
|
|
59
|
+
const roster = arr(units).filter(isObject)
|
|
60
|
+
let unresolved = 0
|
|
61
|
+
for (const unit of roster) {
|
|
62
|
+
const disposition = terminalDisposition(unit, manifest)
|
|
63
|
+
if (disposition) tally[disposition]++
|
|
64
|
+
else unresolved++
|
|
65
|
+
}
|
|
66
|
+
return { ...tally, unresolved, total: roster.length }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function scopeDecisionErrors(decision, { legacy = false } = {}) {
|
|
70
|
+
if (!isObject(decision)) return ['scopeDecision must be an object']
|
|
71
|
+
const errors = []
|
|
72
|
+
if (!['descope', 'descoped'].includes(decision.decision)) errors.push('scopeDecision.decision must be "descoped"')
|
|
73
|
+
if (decision.decidedBy !== 'human') errors.push('scopeDecision.decidedBy must be "human"')
|
|
74
|
+
if (decision.autoApplied === true) errors.push('scopeDecision refuses autoApplied:true - a descope is always a human decision')
|
|
75
|
+
if (decision.delivered !== false) errors.push('scopeDecision requires delivered:false - descope is not delivery')
|
|
76
|
+
if (!nonEmpty(decision.at)) errors.push('scopeDecision.at is required')
|
|
77
|
+
if (!nonEmpty(decision.reason)) errors.push('scopeDecision.reason is required')
|
|
78
|
+
if (!legacy) {
|
|
79
|
+
if (!nonEmpty(decision.evidence)) errors.push('scopeDecision.evidence is required human decision evidence')
|
|
80
|
+
if (!Array.isArray(decision.affectedRequirements) || !decision.affectedRequirements.length
|
|
81
|
+
|| !decision.affectedRequirements.every(nonEmpty)) errors.push('scopeDecision.affectedRequirements must be a non-empty array')
|
|
82
|
+
if (!nonEmpty(decision.issueDisposition)) errors.push('scopeDecision.issueDisposition is required')
|
|
83
|
+
if (!nonEmpty(decision.prDisposition)) errors.push('scopeDecision.prDisposition is required')
|
|
84
|
+
}
|
|
85
|
+
return errors
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function dispositionErrors(unit, manifest = null) {
|
|
89
|
+
if (!isObject(unit)) return []
|
|
90
|
+
const errors = []
|
|
91
|
+
if (unit.disposition != null && !TERMINAL_DISPOSITIONS.includes(unit.disposition)) {
|
|
92
|
+
return [`disposition ${JSON.stringify(unit.disposition)} not in ${TERMINAL_DISPOSITIONS.join('|')}`]
|
|
93
|
+
}
|
|
94
|
+
const delivery = deliveryForUnit(unit, manifest)
|
|
95
|
+
if (unit.deliveryRef !== undefined) {
|
|
96
|
+
if (!isObject(unit.deliveryRef) || !nonEmpty(unit.deliveryRef.componentId) || !Number.isSafeInteger(unit.deliveryRef.generation) || unit.deliveryRef.generation < 1) {
|
|
97
|
+
errors.push('deliveryRef requires {componentId, generation}')
|
|
98
|
+
} else if (!delivery) errors.push('deliveryRef does not resolve to canonical component delivery')
|
|
99
|
+
}
|
|
100
|
+
if (unit.disposition === 'delivered' && delivery?.outcome !== 'merged') errors.push('disposition "delivered" requires canonical or legacy delivery.outcome "merged"')
|
|
101
|
+
if (unit.disposition === 'handed-back' && delivery?.outcome !== 'handed-back') errors.push('disposition "handed-back" requires canonical or legacy delivery.outcome "handed-back"')
|
|
102
|
+
if (unit.disposition === 'descoped') errors.push(...scopeDecisionErrors(unit.scopeDecision))
|
|
103
|
+
if (unit.scopeDecision !== undefined) {
|
|
104
|
+
errors.push(...scopeDecisionErrors(unit.scopeDecision, { legacy: unit.disposition === undefined }))
|
|
105
|
+
if (unit.disposition != null && unit.disposition !== 'descoped') errors.push(`scopeDecision conflicts with disposition ${JSON.stringify(unit.disposition)}`)
|
|
106
|
+
}
|
|
107
|
+
return [...new Set(errors)]
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function componentErrors(manifest) {
|
|
111
|
+
const components = manifest?.components
|
|
112
|
+
if (components === undefined) return []
|
|
113
|
+
if (!Array.isArray(components)) return ['components must be an array']
|
|
114
|
+
const units = new Map(arr(manifest?.units).filter(isObject).map((unit) => [unit.id, unit]))
|
|
115
|
+
const errors = []
|
|
116
|
+
for (const [index, component] of components.entries()) {
|
|
117
|
+
if (!isObject(component)) { errors.push(`components[${index}] must be an object`); continue }
|
|
118
|
+
if (component.verdict != null && !COMPONENT_VERDICTS.includes(component.verdict)) errors.push(`components[${index}].verdict ${JSON.stringify(component.verdict)} not in ${COMPONENT_VERDICTS.join('|')}`)
|
|
119
|
+
if (component.verdict === 'DESCOPED') {
|
|
120
|
+
for (const id of arr(component.units)) {
|
|
121
|
+
if (terminalDisposition(units.get(id), manifest) !== 'descoped') errors.push(`components[${index}] is DESCOPED but unit ${id} is not descoped`)
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return errors
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const dependencyId = (edge) => (typeof edge === 'string' ? edge : (isObject(edge) ? edge.unit : null))
|
|
129
|
+
|
|
130
|
+
export function recordScopeDecision(manifest, unitId, payload) {
|
|
131
|
+
const errors = scopeDecisionErrors(payload)
|
|
132
|
+
if (errors.length) throw new Error(`record-scope-decision: ${errors[0]}`)
|
|
133
|
+
const out = structuredClone(manifest)
|
|
134
|
+
const units = arr(out.units)
|
|
135
|
+
const unit = units.find((entry) => entry?.id === unitId)
|
|
136
|
+
if (!unit) throw new Error(`record-scope-decision: no unit ${unitId} in this run`)
|
|
137
|
+
const existing = terminalDisposition(unit)
|
|
138
|
+
if (existing && existing !== 'blocked') throw new Error(`record-scope-decision: ${unitId} already has terminal disposition ${JSON.stringify(existing)}`)
|
|
139
|
+
|
|
140
|
+
const incoming = units.filter((candidate) => candidate?.id !== unitId
|
|
141
|
+
&& arr(candidate?.dependsOn).some((edge) => dependencyId(edge) === unitId))
|
|
142
|
+
const reconciliation = arr(payload.dependencyReconciliation)
|
|
143
|
+
for (const dependent of incoming) {
|
|
144
|
+
const entry = reconciliation.find((row) => row?.unit === dependent.id)
|
|
145
|
+
if (!entry) throw new Error(`record-scope-decision: dependencyReconciliation must reconcile dependent ${dependent.id} before ${unitId} can be descoped`)
|
|
146
|
+
if (entry.action !== 'remove-edge' || !nonEmpty(entry.reason)) throw new Error(`record-scope-decision: dependencyReconciliation for ${dependent.id} requires action "remove-edge" and a reason`)
|
|
147
|
+
}
|
|
148
|
+
const unexpected = reconciliation.find((entry) => !incoming.some((dependent) => dependent.id === entry?.unit))
|
|
149
|
+
if (unexpected) throw new Error(`record-scope-decision: dependencyReconciliation names ${unexpected.unit}, which does not depend on ${unitId}`)
|
|
150
|
+
for (const dependent of incoming) dependent.dependsOn = arr(dependent.dependsOn).filter((edge) => dependencyId(edge) !== unitId)
|
|
151
|
+
unit.disposition = 'descoped'
|
|
152
|
+
unit.scopeDecision = { ...structuredClone(payload), decision: 'descoped', delivered: false }
|
|
153
|
+
return out
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function recordComponentVerdict(manifest, componentId, payload) {
|
|
157
|
+
if (!isObject(payload) || !COMPONENT_VERDICTS.includes(payload.verdict)) throw new Error(`record-component-verdict: verdict must be one of ${COMPONENT_VERDICTS.join('|')}`)
|
|
158
|
+
const out = structuredClone(manifest)
|
|
159
|
+
const component = arr(out.components).find((entry) => entry?.id === componentId)
|
|
160
|
+
if (!component) throw new Error(`record-component-verdict: no component ${componentId} in this run`)
|
|
161
|
+
if (component.verdict != null && component.verdict !== payload.verdict) throw new Error(`record-component-verdict: ${componentId} already has verdict ${JSON.stringify(component.verdict)}`)
|
|
162
|
+
if (payload.verdict === 'DESCOPED') {
|
|
163
|
+
const units = new Map(arr(out.units).filter(isObject).map((unit) => [unit.id, unit]))
|
|
164
|
+
const live = arr(component.units).filter((id) => terminalDisposition(units.get(id)) !== 'descoped')
|
|
165
|
+
if (live.length) throw new Error(`record-component-verdict: component ${componentId} has unit(s) not descoped: ${live.join(', ')}`)
|
|
166
|
+
}
|
|
167
|
+
component.verdict = payload.verdict
|
|
168
|
+
if (nonEmpty(payload.at)) component.verdictAt = payload.at
|
|
169
|
+
return out
|
|
170
|
+
}
|