@sun-asterisk/sungen 3.2.34 → 3.3.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/basis/anchor-grammar.d.ts +32 -0
- package/dist/basis/anchor-grammar.d.ts.map +1 -0
- package/dist/basis/anchor-grammar.js +82 -0
- package/dist/basis/anchor-grammar.js.map +1 -0
- package/dist/basis/anchor-hash.d.ts +6 -0
- package/dist/basis/anchor-hash.d.ts.map +1 -0
- package/dist/basis/anchor-hash.js +28 -0
- package/dist/basis/anchor-hash.js.map +1 -0
- package/dist/basis/bm51-tables.d.ts +20 -0
- package/dist/basis/bm51-tables.d.ts.map +1 -0
- package/dist/basis/bm51-tables.js +71 -0
- package/dist/basis/bm51-tables.js.map +1 -0
- package/dist/basis/extract-spec-anchors.d.ts +39 -0
- package/dist/basis/extract-spec-anchors.d.ts.map +1 -0
- package/dist/basis/extract-spec-anchors.js +81 -0
- package/dist/basis/extract-spec-anchors.js.map +1 -0
- package/dist/basis/migration-sentinel.d.ts +47 -0
- package/dist/basis/migration-sentinel.d.ts.map +1 -0
- package/dist/basis/migration-sentinel.js +219 -0
- package/dist/basis/migration-sentinel.js.map +1 -0
- package/dist/basis/spec-frontmatter.d.ts +18 -0
- package/dist/basis/spec-frontmatter.d.ts.map +1 -0
- package/dist/basis/spec-frontmatter.js +55 -0
- package/dist/basis/spec-frontmatter.js.map +1 -0
- package/dist/basis/spec-sections.d.ts +18 -0
- package/dist/basis/spec-sections.d.ts.map +1 -0
- package/dist/basis/spec-sections.js +27 -0
- package/dist/basis/spec-sections.js.map +1 -0
- package/dist/basis/test-basis-schema.d.ts +28 -0
- package/dist/basis/test-basis-schema.d.ts.map +1 -0
- package/dist/basis/test-basis-schema.js +141 -0
- package/dist/basis/test-basis-schema.js.map +1 -0
- package/dist/capabilities/discover.d.ts +4 -0
- package/dist/capabilities/discover.d.ts.map +1 -1
- package/dist/capabilities/discover.js +16 -2
- package/dist/capabilities/discover.js.map +1 -1
- package/dist/capabilities/registry.d.ts +15 -0
- package/dist/capabilities/registry.d.ts.map +1 -1
- package/dist/capabilities/registry.js.map +1 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +10 -5
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/capability.d.ts.map +1 -1
- package/dist/cli/commands/capability.js +6 -2
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/contract-derive-command.d.ts +11 -0
- package/dist/cli/commands/contract-derive-command.d.ts.map +1 -0
- package/dist/cli/commands/contract-derive-command.js +99 -0
- package/dist/cli/commands/contract-derive-command.js.map +1 -0
- package/dist/cli/commands/contract.d.ts +17 -0
- package/dist/cli/commands/contract.d.ts.map +1 -0
- package/dist/cli/commands/contract.js +162 -0
- package/dist/cli/commands/contract.js.map +1 -0
- package/dist/cli/commands/defect.d.ts +7 -0
- package/dist/cli/commands/defect.d.ts.map +1 -0
- package/dist/cli/commands/defect.js +68 -0
- package/dist/cli/commands/defect.js.map +1 -0
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +96 -12
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +3 -1
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/journey.d.ts.map +1 -1
- package/dist/cli/commands/journey.js +43 -15
- package/dist/cli/commands/journey.js.map +1 -1
- package/dist/cli/commands/next.d.ts +8 -0
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +68 -8
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/triage.d.ts +7 -0
- package/dist/cli/commands/triage.d.ts.map +1 -0
- package/dist/cli/commands/triage.js +98 -0
- package/dist/cli/commands/triage.js.map +1 -0
- package/dist/cli/commands/update.d.ts +11 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +31 -6
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +24 -33
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/project-sungen-invocation.d.ts +7 -0
- package/dist/cli/project-sungen-invocation.d.ts.map +1 -0
- package/dist/cli/project-sungen-invocation.js +76 -0
- package/dist/cli/project-sungen-invocation.js.map +1 -0
- package/dist/contract/approve-contract.d.ts +31 -0
- package/dist/contract/approve-contract.d.ts.map +1 -0
- package/dist/contract/approve-contract.js +87 -0
- package/dist/contract/approve-contract.js.map +1 -0
- package/dist/contract/assertion-matcher-vocabulary.d.ts +24 -0
- package/dist/contract/assertion-matcher-vocabulary.d.ts.map +1 -0
- package/dist/contract/assertion-matcher-vocabulary.js +100 -0
- package/dist/contract/assertion-matcher-vocabulary.js.map +1 -0
- package/dist/contract/build-contract-verdict.d.ts +32 -0
- package/dist/contract/build-contract-verdict.d.ts.map +1 -0
- package/dist/contract/build-contract-verdict.js +123 -0
- package/dist/contract/build-contract-verdict.js.map +1 -0
- package/dist/contract/build-trace-conformance.d.ts +18 -0
- package/dist/contract/build-trace-conformance.d.ts.map +1 -0
- package/dist/contract/build-trace-conformance.js +153 -0
- package/dist/contract/build-trace-conformance.js.map +1 -0
- package/dist/contract/classify-contract-change.d.ts +23 -0
- package/dist/contract/classify-contract-change.d.ts.map +1 -0
- package/dist/contract/classify-contract-change.js +98 -0
- package/dist/contract/classify-contract-change.js.map +1 -0
- package/dist/contract/classify-contract-unit.d.ts +18 -0
- package/dist/contract/classify-contract-unit.d.ts.map +1 -0
- package/dist/contract/classify-contract-unit.js +49 -0
- package/dist/contract/classify-contract-unit.js.map +1 -0
- package/dist/contract/classify-trace-conformance.d.ts +32 -0
- package/dist/contract/classify-trace-conformance.d.ts.map +1 -0
- package/dist/contract/classify-trace-conformance.js +117 -0
- package/dist/contract/classify-trace-conformance.js.map +1 -0
- package/dist/contract/contract-git.d.ts +24 -0
- package/dist/contract/contract-git.d.ts.map +1 -0
- package/dist/contract/contract-git.js +144 -0
- package/dist/contract/contract-git.js.map +1 -0
- package/dist/contract/contract-hash.d.ts +7 -0
- package/dist/contract/contract-hash.d.ts.map +1 -0
- package/dist/contract/contract-hash.js +38 -0
- package/dist/contract/contract-hash.js.map +1 -0
- package/dist/contract/contract-report-file.d.ts +4 -0
- package/dist/contract/contract-report-file.d.ts.map +1 -0
- package/dist/contract/contract-report-file.js +60 -0
- package/dist/contract/contract-report-file.js.map +1 -0
- package/dist/contract/contract-schema.d.ts +71 -0
- package/dist/contract/contract-schema.d.ts.map +1 -0
- package/dist/contract/contract-schema.js +102 -0
- package/dist/contract/contract-schema.js.map +1 -0
- package/dist/contract/contract-units.d.ts +12 -0
- package/dist/contract/contract-units.d.ts.map +1 -0
- package/dist/contract/contract-units.js +96 -0
- package/dist/contract/contract-units.js.map +1 -0
- package/dist/contract/contracts-lock-file.d.ts +24 -0
- package/dist/contract/contracts-lock-file.d.ts.map +1 -0
- package/dist/contract/contracts-lock-file.js +140 -0
- package/dist/contract/contracts-lock-file.js.map +1 -0
- package/dist/contract/data-normalize.d.ts +10 -0
- package/dist/contract/data-normalize.d.ts.map +1 -0
- package/dist/contract/data-normalize.js +110 -0
- package/dist/contract/data-normalize.js.map +1 -0
- package/dist/contract/derive-free-feature.d.ts +38 -0
- package/dist/contract/derive-free-feature.d.ts.map +1 -0
- package/dist/contract/derive-free-feature.js +154 -0
- package/dist/contract/derive-free-feature.js.map +1 -0
- package/dist/contract/field-semantic-redaction.d.ts +21 -0
- package/dist/contract/field-semantic-redaction.d.ts.map +1 -0
- package/dist/contract/field-semantic-redaction.js +118 -0
- package/dist/contract/field-semantic-redaction.js.map +1 -0
- package/dist/contract/free-feature-blocks.d.ts +10 -0
- package/dist/contract/free-feature-blocks.d.ts.map +1 -0
- package/dist/contract/free-feature-blocks.js +94 -0
- package/dist/contract/free-feature-blocks.js.map +1 -0
- package/dist/contract/lock-secret-guard.d.ts +22 -0
- package/dist/contract/lock-secret-guard.d.ts.map +1 -0
- package/dist/contract/lock-secret-guard.js +134 -0
- package/dist/contract/lock-secret-guard.js.map +1 -0
- package/dist/contract/lock-vs-git-head.d.ts +26 -0
- package/dist/contract/lock-vs-git-head.d.ts.map +1 -0
- package/dist/contract/lock-vs-git-head.js +28 -0
- package/dist/contract/lock-vs-git-head.js.map +1 -0
- package/dist/contract/normalize-contract-step.d.ts +21 -0
- package/dist/contract/normalize-contract-step.d.ts.map +1 -0
- package/dist/contract/normalize-contract-step.js +70 -0
- package/dist/contract/normalize-contract-step.js.map +1 -0
- package/dist/contract/normalize-feature-steps.d.ts +7 -0
- package/dist/contract/normalize-feature-steps.d.ts.map +1 -0
- package/dist/contract/normalize-feature-steps.js +127 -0
- package/dist/contract/normalize-feature-steps.js.map +1 -0
- package/dist/contract/oracle-strength.d.ts +12 -0
- package/dist/contract/oracle-strength.d.ts.map +1 -0
- package/dist/contract/oracle-strength.js +88 -0
- package/dist/contract/oracle-strength.js.map +1 -0
- package/dist/contract/project-contract-blockers.d.ts +10 -0
- package/dist/contract/project-contract-blockers.d.ts.map +1 -0
- package/dist/contract/project-contract-blockers.js +73 -0
- package/dist/contract/project-contract-blockers.js.map +1 -0
- package/dist/contract/record-contract-approval.d.ts +21 -0
- package/dist/contract/record-contract-approval.d.ts.map +1 -0
- package/dist/contract/record-contract-approval.js +98 -0
- package/dist/contract/record-contract-approval.js.map +1 -0
- package/dist/contract/render-free-gherkin.d.ts +40 -0
- package/dist/contract/render-free-gherkin.d.ts.map +1 -0
- package/dist/contract/render-free-gherkin.js +141 -0
- package/dist/contract/render-free-gherkin.js.map +1 -0
- package/dist/contract/render-trace-sentence.d.ts +20 -0
- package/dist/contract/render-trace-sentence.d.ts.map +1 -0
- package/dist/contract/render-trace-sentence.js +109 -0
- package/dist/contract/render-trace-sentence.js.map +1 -0
- package/dist/contract/render-trace-target.d.ts +14 -0
- package/dist/contract/render-trace-target.d.ts.map +1 -0
- package/dist/contract/render-trace-target.js +70 -0
- package/dist/contract/render-trace-target.js.map +1 -0
- package/dist/contract/resolve-unit-trace-identities.d.ts +8 -0
- package/dist/contract/resolve-unit-trace-identities.d.ts.map +1 -0
- package/dist/contract/resolve-unit-trace-identities.js +78 -0
- package/dist/contract/resolve-unit-trace-identities.js.map +1 -0
- package/dist/contract/trace/collect-trace-evidence.d.ts +33 -0
- package/dist/contract/trace/collect-trace-evidence.d.ts.map +1 -0
- package/dist/contract/trace/collect-trace-evidence.js +161 -0
- package/dist/contract/trace/collect-trace-evidence.js.map +1 -0
- package/dist/contract/trace/identity-cache.d.ts +19 -0
- package/dist/contract/trace/identity-cache.d.ts.map +1 -0
- package/dist/contract/trace/identity-cache.js +104 -0
- package/dist/contract/trace/identity-cache.js.map +1 -0
- package/dist/contract/trace/select-final-attempt.d.ts +27 -0
- package/dist/contract/trace/select-final-attempt.d.ts.map +1 -0
- package/dist/contract/trace/select-final-attempt.js +116 -0
- package/dist/contract/trace/select-final-attempt.js.map +1 -0
- package/dist/contract/trace/snapshot-html-renderer.d.ts +31 -0
- package/dist/contract/trace/snapshot-html-renderer.d.ts.map +1 -0
- package/dist/contract/trace/snapshot-html-renderer.js +172 -0
- package/dist/contract/trace/snapshot-html-renderer.js.map +1 -0
- package/dist/contract/trace/snapshot-resolver.d.ts +21 -0
- package/dist/contract/trace/snapshot-resolver.d.ts.map +1 -0
- package/dist/contract/trace/snapshot-resolver.js +65 -0
- package/dist/contract/trace/snapshot-resolver.js.map +1 -0
- package/dist/contract/trace/snapshot-store.d.ts +66 -0
- package/dist/contract/trace/snapshot-store.d.ts.map +1 -0
- package/dist/contract/trace/snapshot-store.js +173 -0
- package/dist/contract/trace/snapshot-store.js.map +1 -0
- package/dist/contract/trace/target-identity.d.ts +74 -0
- package/dist/contract/trace/target-identity.d.ts.map +1 -0
- package/dist/contract/trace/target-identity.js +68 -0
- package/dist/contract/trace/target-identity.js.map +1 -0
- package/dist/contract/trace/test-step-join.d.ts +65 -0
- package/dist/contract/trace/test-step-join.d.ts.map +1 -0
- package/dist/contract/trace/test-step-join.js +80 -0
- package/dist/contract/trace/test-step-join.js.map +1 -0
- package/dist/contract/trace/trace-binding.d.ts +21 -0
- package/dist/contract/trace/trace-binding.d.ts.map +1 -0
- package/dist/contract/trace/trace-binding.js +88 -0
- package/dist/contract/trace/trace-binding.js.map +1 -0
- package/dist/contract/trace/trace-file-reader.d.ts +41 -0
- package/dist/contract/trace/trace-file-reader.d.ts.map +1 -0
- package/dist/contract/trace/trace-file-reader.js +161 -0
- package/dist/contract/trace/trace-file-reader.js.map +1 -0
- package/dist/contract/trace/trace-fingerprint.d.ts +22 -0
- package/dist/contract/trace/trace-fingerprint.d.ts.map +1 -0
- package/dist/contract/trace/trace-fingerprint.js +96 -0
- package/dist/contract/trace/trace-fingerprint.js.map +1 -0
- package/dist/contract/trace/trace-identity-resolution.d.ts +26 -0
- package/dist/contract/trace/trace-identity-resolution.d.ts.map +1 -0
- package/dist/contract/trace/trace-identity-resolution.js +84 -0
- package/dist/contract/trace/trace-identity-resolution.js.map +1 -0
- package/dist/contract/trace/trace-run-record.d.ts +30 -0
- package/dist/contract/trace/trace-run-record.d.ts.map +1 -0
- package/dist/contract/trace/trace-run-record.js +121 -0
- package/dist/contract/trace/trace-run-record.js.map +1 -0
- package/dist/contract/trace/trace-steps.d.ts +19 -0
- package/dist/contract/trace/trace-steps.d.ts.map +1 -0
- package/dist/contract/trace/trace-steps.js +79 -0
- package/dist/contract/trace/trace-steps.js.map +1 -0
- package/dist/contract/trace/trace-zip-limits.d.ts +45 -0
- package/dist/contract/trace/trace-zip-limits.d.ts.map +1 -0
- package/dist/contract/trace/trace-zip-limits.js +52 -0
- package/dist/contract/trace/trace-zip-limits.js.map +1 -0
- package/dist/contract/trace/trace-zip-reader.d.ts +10 -0
- package/dist/contract/trace/trace-zip-reader.d.ts.map +1 -0
- package/dist/contract/trace/trace-zip-reader.js +186 -0
- package/dist/contract/trace/trace-zip-reader.js.map +1 -0
- package/dist/contract/verify-approval-decisions.d.ts +5 -0
- package/dist/contract/verify-approval-decisions.d.ts.map +1 -0
- package/dist/contract/verify-approval-decisions.js +104 -0
- package/dist/contract/verify-approval-decisions.js.map +1 -0
- package/dist/decisions/append-decision.d.ts +12 -0
- package/dist/decisions/append-decision.d.ts.map +1 -0
- package/dist/decisions/append-decision.js +73 -0
- package/dist/decisions/append-decision.js.map +1 -0
- package/dist/decisions/confirmed-decision-commands.d.ts +41 -0
- package/dist/decisions/confirmed-decision-commands.d.ts.map +1 -0
- package/dist/decisions/confirmed-decision-commands.js +190 -0
- package/dist/decisions/confirmed-decision-commands.js.map +1 -0
- package/dist/decisions/decision-file.d.ts +31 -0
- package/dist/decisions/decision-file.d.ts.map +1 -0
- package/dist/decisions/decision-file.js +139 -0
- package/dist/decisions/decision-file.js.map +1 -0
- package/dist/decisions/decision-identity.d.ts +12 -0
- package/dist/decisions/decision-identity.d.ts.map +1 -0
- package/dist/decisions/decision-identity.js +78 -0
- package/dist/decisions/decision-identity.js.map +1 -0
- package/dist/decisions/decision-integrity-check.d.ts +12 -0
- package/dist/decisions/decision-integrity-check.d.ts.map +1 -0
- package/dist/decisions/decision-integrity-check.js +102 -0
- package/dist/decisions/decision-integrity-check.js.map +1 -0
- package/dist/decisions/decision-schema.d.ts +42 -0
- package/dist/decisions/decision-schema.d.ts.map +1 -0
- package/dist/decisions/decision-schema.js +75 -0
- package/dist/decisions/decision-schema.js.map +1 -0
- package/dist/decisions/decision-source.d.ts +2 -0
- package/dist/decisions/decision-source.d.ts.map +1 -0
- package/dist/decisions/decision-source.js +18 -0
- package/dist/decisions/decision-source.js.map +1 -0
- package/dist/decisions/exclusive-file-create.d.ts +3 -0
- package/dist/decisions/exclusive-file-create.d.ts.map +1 -0
- package/dist/decisions/exclusive-file-create.js +84 -0
- package/dist/decisions/exclusive-file-create.js.map +1 -0
- package/dist/decisions/git-head-trust.d.ts +7 -0
- package/dist/decisions/git-head-trust.d.ts.map +1 -0
- package/dist/decisions/git-head-trust.js +76 -0
- package/dist/decisions/git-head-trust.js.map +1 -0
- package/dist/decisions/human-confirmation.d.ts +35 -0
- package/dist/decisions/human-confirmation.d.ts.map +1 -0
- package/dist/decisions/human-confirmation.js +161 -0
- package/dist/decisions/human-confirmation.js.map +1 -0
- package/dist/decisions/legacy-waiver-migration.d.ts +31 -0
- package/dist/decisions/legacy-waiver-migration.d.ts.map +1 -0
- package/dist/decisions/legacy-waiver-migration.js +170 -0
- package/dist/decisions/legacy-waiver-migration.js.map +1 -0
- package/dist/decisions/read-decisions.d.ts +19 -0
- package/dist/decisions/read-decisions.d.ts.map +1 -0
- package/dist/decisions/read-decisions.js +90 -0
- package/dist/decisions/read-decisions.js.map +1 -0
- package/dist/decisions/viewpoint-baseline-adapter.d.ts +7 -0
- package/dist/decisions/viewpoint-baseline-adapter.d.ts.map +1 -0
- package/dist/decisions/viewpoint-baseline-adapter.js +109 -0
- package/dist/decisions/viewpoint-baseline-adapter.js.map +1 -0
- package/dist/decisions/waiver-decisions.d.ts +24 -0
- package/dist/decisions/waiver-decisions.d.ts.map +1 -0
- package/dist/decisions/waiver-decisions.js +46 -0
- package/dist/decisions/waiver-decisions.js.map +1 -0
- package/dist/exporters/csv-exporter.d.ts +4 -0
- package/dist/exporters/csv-exporter.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.js +1 -1
- package/dist/exporters/csv-exporter.js.map +1 -1
- package/dist/exporters/feature-parser.d.ts +8 -0
- package/dist/exporters/feature-parser.d.ts.map +1 -1
- package/dist/exporters/feature-parser.js +12 -0
- package/dist/exporters/feature-parser.js.map +1 -1
- package/dist/exporters/matrix/build.d.ts +3 -0
- package/dist/exporters/matrix/build.d.ts.map +1 -1
- package/dist/exporters/matrix/build.js +59 -19
- package/dist/exporters/matrix/build.js.map +1 -1
- package/dist/exporters/matrix/carry-manual-results.d.ts +19 -0
- package/dist/exporters/matrix/carry-manual-results.d.ts.map +1 -1
- package/dist/exporters/matrix/carry-manual-results.js +76 -6
- package/dist/exporters/matrix/carry-manual-results.js.map +1 -1
- package/dist/exporters/matrix/export.d.ts +8 -2
- package/dist/exporters/matrix/export.d.ts.map +1 -1
- package/dist/exporters/matrix/export.js +16 -3
- package/dist/exporters/matrix/export.js.map +1 -1
- package/dist/exporters/matrix/gates.d.ts +6 -1
- package/dist/exporters/matrix/gates.d.ts.map +1 -1
- package/dist/exporters/matrix/gates.js +57 -128
- package/dist/exporters/matrix/gates.js.map +1 -1
- package/dist/exporters/matrix/render-csv.d.ts.map +1 -1
- package/dist/exporters/matrix/render-csv.js +4 -1
- package/dist/exporters/matrix/render-csv.js.map +1 -1
- package/dist/exporters/matrix/render-gate-overrides-sheet.d.ts +13 -0
- package/dist/exporters/matrix/render-gate-overrides-sheet.d.ts.map +1 -0
- package/dist/exporters/matrix/render-gate-overrides-sheet.js +44 -0
- package/dist/exporters/matrix/render-gate-overrides-sheet.js.map +1 -0
- package/dist/exporters/matrix/render-xlsx.d.ts +1 -0
- package/dist/exporters/matrix/render-xlsx.d.ts.map +1 -1
- package/dist/exporters/matrix/render-xlsx.js +6 -0
- package/dist/exporters/matrix/render-xlsx.js.map +1 -1
- package/dist/exporters/matrix/types.d.ts +9 -1
- package/dist/exporters/matrix/types.d.ts.map +1 -1
- package/dist/exporters/matrix/types.js.map +1 -1
- package/dist/exporters/matrix/xlsx-cells.js +1 -1
- package/dist/exporters/matrix/xlsx-cells.js.map +1 -1
- package/dist/exporters/playwright-report-parser.d.ts.map +1 -1
- package/dist/exporters/playwright-report-parser.js +1 -0
- package/dist/exporters/playwright-report-parser.js.map +1 -1
- package/dist/exporters/scenario-merger.d.ts.map +1 -1
- package/dist/exporters/scenario-merger.js +2 -0
- package/dist/exporters/scenario-merger.js.map +1 -1
- package/dist/exporters/types.d.ts +5 -0
- package/dist/exporters/types.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +13 -0
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/graph/evaluate-graph.d.ts +23 -0
- package/dist/graph/evaluate-graph.d.ts.map +1 -0
- package/dist/graph/evaluate-graph.js +52 -0
- package/dist/graph/evaluate-graph.js.map +1 -0
- package/dist/graph/locate-finding.d.ts +20 -0
- package/dist/graph/locate-finding.d.ts.map +1 -0
- package/dist/graph/locate-finding.js +137 -0
- package/dist/graph/locate-finding.js.map +1 -0
- package/dist/graph/node-decl.d.ts +66 -0
- package/dist/graph/node-decl.d.ts.map +1 -0
- package/dist/graph/node-decl.js +8 -0
- package/dist/graph/node-decl.js.map +1 -0
- package/dist/graph/nodes/core-node-catalog.d.ts +7 -0
- package/dist/graph/nodes/core-node-catalog.d.ts.map +1 -0
- package/dist/graph/nodes/core-node-catalog.js +13 -0
- package/dist/graph/nodes/core-node-catalog.js.map +1 -0
- package/dist/graph/nodes/test-case-contract-nodes.d.ts +21 -0
- package/dist/graph/nodes/test-case-contract-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/test-case-contract-nodes.js +59 -0
- package/dist/graph/nodes/test-case-contract-nodes.js.map +1 -0
- package/dist/graph/nodes/test-case-nodes.d.ts +26 -0
- package/dist/graph/nodes/test-case-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/test-case-nodes.js +66 -0
- package/dist/graph/nodes/test-case-nodes.js.map +1 -0
- package/dist/graph/nodes/unit-audit-nodes.d.ts +18 -0
- package/dist/graph/nodes/unit-audit-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/unit-audit-nodes.js +95 -0
- package/dist/graph/nodes/unit-audit-nodes.js.map +1 -0
- package/dist/graph/nodes/unit-contract-node.d.ts +21 -0
- package/dist/graph/nodes/unit-contract-node.d.ts.map +1 -0
- package/dist/graph/nodes/unit-contract-node.js +88 -0
- package/dist/graph/nodes/unit-contract-node.js.map +1 -0
- package/dist/graph/nodes/unit-design-nodes.d.ts +14 -0
- package/dist/graph/nodes/unit-design-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/unit-design-nodes.js +91 -0
- package/dist/graph/nodes/unit-design-nodes.js.map +1 -0
- package/dist/graph/nodes/unit-execution-nodes.d.ts +16 -0
- package/dist/graph/nodes/unit-execution-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/unit-execution-nodes.js +79 -0
- package/dist/graph/nodes/unit-execution-nodes.js.map +1 -0
- package/dist/graph/test-case-identity.d.ts +13 -0
- package/dist/graph/test-case-identity.d.ts.map +1 -0
- package/dist/graph/test-case-identity.js +106 -0
- package/dist/graph/test-case-identity.js.map +1 -0
- package/dist/graph/test-case-results.d.ts +11 -0
- package/dist/graph/test-case-results.d.ts.map +1 -0
- package/dist/graph/test-case-results.js +137 -0
- package/dist/graph/test-case-results.js.map +1 -0
- package/dist/graph/test-case-satisfied.d.ts +25 -0
- package/dist/graph/test-case-satisfied.d.ts.map +1 -0
- package/dist/graph/test-case-satisfied.js +51 -0
- package/dist/graph/test-case-satisfied.js.map +1 -0
- package/dist/graph/test-case-state-shape.d.ts +67 -0
- package/dist/graph/test-case-state-shape.d.ts.map +1 -0
- package/dist/graph/test-case-state-shape.js +3 -0
- package/dist/graph/test-case-state-shape.js.map +1 -0
- package/dist/graph/test-case-states.d.ts +9 -0
- package/dist/graph/test-case-states.d.ts.map +1 -0
- package/dist/graph/test-case-states.js +116 -0
- package/dist/graph/test-case-states.js.map +1 -0
- package/dist/graph/unit-artifact-probes.d.ts +19 -0
- package/dist/graph/unit-artifact-probes.d.ts.map +1 -0
- package/dist/graph/unit-artifact-probes.js +133 -0
- package/dist/graph/unit-artifact-probes.js.map +1 -0
- package/dist/graph/unit-state-facts.d.ts +43 -0
- package/dist/graph/unit-state-facts.d.ts.map +1 -0
- package/dist/graph/unit-state-facts.js +87 -0
- package/dist/graph/unit-state-facts.js.map +1 -0
- package/dist/harness/audit.d.ts +11 -0
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +34 -9
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/catalog/gate-rules.yaml +647 -0
- package/dist/harness/counted-assertions.d.ts +2 -0
- package/dist/harness/counted-assertions.d.ts.map +1 -0
- package/dist/harness/counted-assertions.js +38 -0
- package/dist/harness/counted-assertions.js.map +1 -0
- package/dist/harness/defect-draft.d.ts +14 -0
- package/dist/harness/defect-draft.d.ts.map +1 -0
- package/dist/harness/defect-draft.js +143 -0
- package/dist/harness/defect-draft.js.map +1 -0
- package/dist/harness/defects.d.ts +24 -0
- package/dist/harness/defects.d.ts.map +1 -0
- package/dist/harness/defects.js +118 -0
- package/dist/harness/defects.js.map +1 -0
- package/dist/harness/gates/audit-gate-terms.d.ts +41 -0
- package/dist/harness/gates/audit-gate-terms.d.ts.map +1 -0
- package/dist/harness/gates/audit-gate-terms.js +72 -0
- package/dist/harness/gates/audit-gate-terms.js.map +1 -0
- package/dist/harness/gates/audit-gate-verdict.d.ts +31 -0
- package/dist/harness/gates/audit-gate-verdict.d.ts.map +1 -0
- package/dist/harness/gates/audit-gate-verdict.js +101 -0
- package/dist/harness/gates/audit-gate-verdict.js.map +1 -0
- package/dist/harness/gates/audit-input-hash.d.ts +4 -0
- package/dist/harness/gates/audit-input-hash.d.ts.map +1 -0
- package/dist/harness/gates/audit-input-hash.js +96 -0
- package/dist/harness/gates/audit-input-hash.js.map +1 -0
- package/dist/harness/gates/audit-report-verification.d.ts +41 -0
- package/dist/harness/gates/audit-report-verification.d.ts.map +1 -0
- package/dist/harness/gates/audit-report-verification.js +236 -0
- package/dist/harness/gates/audit-report-verification.js.map +1 -0
- package/dist/harness/gates/decisions-hash.d.ts +13 -0
- package/dist/harness/gates/decisions-hash.d.ts.map +1 -0
- package/dist/harness/gates/decisions-hash.js +72 -0
- package/dist/harness/gates/decisions-hash.js.map +1 -0
- package/dist/harness/gates/delivery-checklist.d.ts +21 -0
- package/dist/harness/gates/delivery-checklist.d.ts.map +1 -0
- package/dist/harness/gates/delivery-checklist.js +128 -0
- package/dist/harness/gates/delivery-checklist.js.map +1 -0
- package/dist/harness/gates/delivery-decision-gate.d.ts +33 -0
- package/dist/harness/gates/delivery-decision-gate.d.ts.map +1 -0
- package/dist/harness/gates/delivery-decision-gate.js +116 -0
- package/dist/harness/gates/delivery-decision-gate.js.map +1 -0
- package/dist/harness/gates/delivery-decision-step.d.ts +19 -0
- package/dist/harness/gates/delivery-decision-step.d.ts.map +1 -0
- package/dist/harness/gates/delivery-decision-step.js +86 -0
- package/dist/harness/gates/delivery-decision-step.js.map +1 -0
- package/dist/harness/gates/gate-override-report.d.ts +59 -0
- package/dist/harness/gates/gate-override-report.d.ts.map +1 -0
- package/dist/harness/gates/gate-override-report.js +86 -0
- package/dist/harness/gates/gate-override-report.js.map +1 -0
- package/dist/harness/gates/gate-override-scope.d.ts +18 -0
- package/dist/harness/gates/gate-override-scope.d.ts.map +1 -0
- package/dist/harness/gates/gate-override-scope.js +98 -0
- package/dist/harness/gates/gate-override-scope.js.map +1 -0
- package/dist/harness/gates/gate-override-validation.d.ts +25 -0
- package/dist/harness/gates/gate-override-validation.d.ts.map +1 -0
- package/dist/harness/gates/gate-override-validation.js +81 -0
- package/dist/harness/gates/gate-override-validation.js.map +1 -0
- package/dist/harness/gates/gate-rule-catalog.d.ts +24 -0
- package/dist/harness/gates/gate-rule-catalog.d.ts.map +1 -0
- package/dist/harness/gates/gate-rule-catalog.js +112 -0
- package/dist/harness/gates/gate-rule-catalog.js.map +1 -0
- package/dist/harness/gates/gate-terms.d.ts +33 -0
- package/dist/harness/gates/gate-terms.d.ts.map +1 -0
- package/dist/harness/gates/gate-terms.js +41 -0
- package/dist/harness/gates/gate-terms.js.map +1 -0
- package/dist/harness/gates/in-run-decision-check.d.ts +21 -0
- package/dist/harness/gates/in-run-decision-check.d.ts.map +1 -0
- package/dist/harness/gates/in-run-decision-check.js +138 -0
- package/dist/harness/gates/in-run-decision-check.js.map +1 -0
- package/dist/harness/gates/journey-gate-inputs.d.ts +37 -0
- package/dist/harness/gates/journey-gate-inputs.d.ts.map +1 -0
- package/dist/harness/gates/journey-gate-inputs.js +81 -0
- package/dist/harness/gates/journey-gate-inputs.js.map +1 -0
- package/dist/harness/gates/migrated-waiver-review.d.ts +6 -0
- package/dist/harness/gates/migrated-waiver-review.d.ts.map +1 -0
- package/dist/harness/gates/migrated-waiver-review.js +116 -0
- package/dist/harness/gates/migrated-waiver-review.js.map +1 -0
- package/dist/harness/gates/resolve-rule.d.ts +59 -0
- package/dist/harness/gates/resolve-rule.d.ts.map +1 -0
- package/dist/harness/gates/resolve-rule.js +41 -0
- package/dist/harness/gates/resolve-rule.js.map +1 -0
- package/dist/harness/gates/unit-gate-overrides.d.ts +25 -0
- package/dist/harness/gates/unit-gate-overrides.d.ts.map +1 -0
- package/dist/harness/gates/unit-gate-overrides.js +122 -0
- package/dist/harness/gates/unit-gate-overrides.js.map +1 -0
- package/dist/harness/journey.d.ts +43 -1
- package/dist/harness/journey.d.ts.map +1 -1
- package/dist/harness/journey.js +207 -33
- package/dist/harness/journey.js.map +1 -1
- package/dist/harness/manifest.d.ts +12 -0
- package/dist/harness/manifest.d.ts.map +1 -1
- package/dist/harness/manifest.js +73 -45
- package/dist/harness/manifest.js.map +1 -1
- package/dist/harness/next-step.d.ts +37 -6
- package/dist/harness/next-step.d.ts.map +1 -1
- package/dist/harness/next-step.js +34 -174
- package/dist/harness/next-step.js.map +1 -1
- package/dist/harness/parse.d.ts +25 -0
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +38 -13
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/provenance.d.ts +29 -0
- package/dist/harness/provenance.d.ts.map +1 -1
- package/dist/harness/provenance.js +109 -9
- package/dist/harness/provenance.js.map +1 -1
- package/dist/harness/script-check.d.ts.map +1 -1
- package/dist/harness/script-check.js +29 -6
- package/dist/harness/script-check.js.map +1 -1
- package/dist/harness/sensors.d.ts +14 -3
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +64 -44
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/triage-signals.d.ts +20 -0
- package/dist/harness/triage-signals.d.ts.map +1 -0
- package/dist/harness/triage-signals.js +30 -0
- package/dist/harness/triage-signals.js.map +1 -0
- package/dist/harness/triage-unit.d.ts +23 -0
- package/dist/harness/triage-unit.d.ts.map +1 -0
- package/dist/harness/triage-unit.js +142 -0
- package/dist/harness/triage-unit.js.map +1 -0
- package/dist/harness/triage.d.ts +28 -0
- package/dist/harness/triage.d.ts.map +1 -0
- package/dist/harness/triage.js +99 -0
- package/dist/harness/triage.js.map +1 -0
- package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
- package/dist/harness/viewpoint-ledger.js +2 -1
- package/dist/harness/viewpoint-ledger.js.map +1 -1
- package/dist/hooks/bash-write-targets.d.ts +15 -0
- package/dist/hooks/bash-write-targets.d.ts.map +1 -0
- package/dist/hooks/bash-write-targets.js +173 -0
- package/dist/hooks/bash-write-targets.js.map +1 -0
- package/dist/hooks/claude-hook-entry.d.ts +11 -0
- package/dist/hooks/claude-hook-entry.d.ts.map +1 -0
- package/dist/hooks/claude-hook-entry.js +137 -0
- package/dist/hooks/claude-hook-entry.js.map +1 -0
- package/dist/hooks/claude-transcript-turn.d.ts +11 -0
- package/dist/hooks/claude-transcript-turn.d.ts.map +1 -0
- package/dist/hooks/claude-transcript-turn.js +143 -0
- package/dist/hooks/claude-transcript-turn.js.map +1 -0
- package/dist/hooks/guard-delivery-contract-rule.d.ts +10 -0
- package/dist/hooks/guard-delivery-contract-rule.d.ts.map +1 -0
- package/dist/hooks/guard-delivery-contract-rule.js +152 -0
- package/dist/hooks/guard-delivery-contract-rule.js.map +1 -0
- package/dist/hooks/guard-protected-paths.d.ts +9 -0
- package/dist/hooks/guard-protected-paths.d.ts.map +1 -0
- package/dist/hooks/guard-protected-paths.js +107 -0
- package/dist/hooks/guard-protected-paths.js.map +1 -0
- package/dist/hooks/guard-rules.d.ts +37 -0
- package/dist/hooks/guard-rules.d.ts.map +1 -0
- package/dist/hooks/guard-rules.js +61 -0
- package/dist/hooks/guard-rules.js.map +1 -0
- package/dist/hooks/guard-tty-spoof-rule.d.ts +15 -0
- package/dist/hooks/guard-tty-spoof-rule.d.ts.map +1 -0
- package/dist/hooks/guard-tty-spoof-rule.js +21 -0
- package/dist/hooks/guard-tty-spoof-rule.js.map +1 -0
- package/dist/hooks/hand-back-core.d.ts +39 -0
- package/dist/hooks/hand-back-core.d.ts.map +1 -0
- package/dist/hooks/hand-back-core.js +122 -0
- package/dist/hooks/hand-back-core.js.map +1 -0
- package/dist/hooks/hook-cli-command.d.ts +9 -0
- package/dist/hooks/hook-cli-command.d.ts.map +1 -0
- package/dist/hooks/hook-cli-command.js +46 -0
- package/dist/hooks/hook-cli-command.js.map +1 -0
- package/dist/hooks/hook-registry.d.ts +10 -0
- package/dist/hooks/hook-registry.d.ts.map +1 -0
- package/dist/hooks/hook-registry.js +24 -0
- package/dist/hooks/hook-registry.js.map +1 -0
- package/dist/hooks/hook-result-contract.d.ts +50 -0
- package/dist/hooks/hook-result-contract.d.ts.map +1 -0
- package/dist/hooks/hook-result-contract.js +80 -0
- package/dist/hooks/hook-result-contract.js.map +1 -0
- package/dist/hooks/hook-toggles.d.ts +10 -0
- package/dist/hooks/hook-toggles.d.ts.map +1 -0
- package/dist/hooks/hook-toggles.js +107 -0
- package/dist/hooks/hook-toggles.js.map +1 -0
- package/dist/hooks/pre-tool-guard-hook.d.ts +10 -0
- package/dist/hooks/pre-tool-guard-hook.d.ts.map +1 -0
- package/dist/hooks/pre-tool-guard-hook.js +105 -0
- package/dist/hooks/pre-tool-guard-hook.js.map +1 -0
- package/dist/hooks/session-start-unit-state-hook.d.ts +13 -0
- package/dist/hooks/session-start-unit-state-hook.d.ts.map +1 -0
- package/dist/hooks/session-start-unit-state-hook.js +57 -0
- package/dist/hooks/session-start-unit-state-hook.js.map +1 -0
- package/dist/hooks/stop-next-step-hook.d.ts +16 -0
- package/dist/hooks/stop-next-step-hook.d.ts.map +1 -0
- package/dist/hooks/stop-next-step-hook.js +42 -0
- package/dist/hooks/stop-next-step-hook.js.map +1 -0
- package/dist/hooks/sungen-project-root.d.ts +19 -0
- package/dist/hooks/sungen-project-root.d.ts.map +1 -0
- package/dist/hooks/sungen-project-root.js +130 -0
- package/dist/hooks/sungen-project-root.js.map +1 -0
- package/dist/orchestrator/ai-skills/command-partial-includes.d.ts +15 -0
- package/dist/orchestrator/ai-skills/command-partial-includes.d.ts.map +1 -0
- package/dist/orchestrator/ai-skills/command-partial-includes.js +106 -0
- package/dist/orchestrator/ai-skills/command-partial-includes.js.map +1 -0
- package/dist/orchestrator/ai-skills/commands.d.ts +5 -1
- package/dist/orchestrator/ai-skills/commands.d.ts.map +1 -1
- package/dist/orchestrator/ai-skills/commands.js +16 -6
- package/dist/orchestrator/ai-skills/commands.js.map +1 -1
- package/dist/orchestrator/ai-skills/golden-skills.test.js +29 -0
- package/dist/orchestrator/ai-skills/golden-skills.test.js.map +1 -1
- package/dist/orchestrator/assets-drift.d.ts +5 -0
- package/dist/orchestrator/assets-drift.d.ts.map +1 -1
- package/dist/orchestrator/assets-drift.js +12 -3
- package/dist/orchestrator/assets-drift.js.map +1 -1
- package/dist/orchestrator/claude-hooks-install.d.ts +27 -0
- package/dist/orchestrator/claude-hooks-install.d.ts.map +1 -0
- package/dist/orchestrator/claude-hooks-install.js +203 -0
- package/dist/orchestrator/claude-hooks-install.js.map +1 -0
- package/dist/orchestrator/lockstep-version.d.ts +15 -5
- package/dist/orchestrator/lockstep-version.d.ts.map +1 -1
- package/dist/orchestrator/lockstep-version.js +30 -17
- package/dist/orchestrator/lockstep-version.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +6 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +24 -0
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +4 -2
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/commands/add-api.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/add-flow.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/add-screen.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/create-data-test.md +1 -0
- package/dist/orchestrator/templates/ai-src/commands/create-test.md +14 -16
- package/dist/orchestrator/templates/ai-src/commands/dashboard.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/delivery.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/design.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/feedback.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/locale.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/review.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/run-test.md +14 -10
- package/dist/orchestrator/templates/ai-src/config/claude.md +20 -7
- package/dist/orchestrator/templates/ai-src/config/copilot.md +20 -7
- package/dist/orchestrator/templates/ai-src/partials/hand-back-rule.claude.md +20 -0
- package/dist/orchestrator/templates/ai-src/partials/hand-back-rule.codex.md +20 -0
- package/dist/orchestrator/templates/ai-src/partials/hand-back-rule.copilot.md +20 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-api-coverage-model/SKILL.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-capture-mobile/SKILL.md +3 -3
- package/dist/orchestrator/templates/ai-src/skills/sungen-data-factory/SKILL.md +9 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +2 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +2 -0
- package/dist/orchestrator/templates/claude-hooks/sungen-hook.cjs +64 -0
- package/dist/utils/safe-yaml-parse.d.ts +8 -0
- package/dist/utils/safe-yaml-parse.d.ts.map +1 -0
- package/dist/utils/safe-yaml-parse.js +51 -0
- package/dist/utils/safe-yaml-parse.js.map +1 -0
- package/package.json +3 -3
- package/src/basis/anchor-grammar.ts +83 -0
- package/src/basis/anchor-hash.ts +27 -0
- package/src/basis/bm51-tables.ts +65 -0
- package/src/basis/extract-spec-anchors.ts +95 -0
- package/src/basis/migration-sentinel.ts +175 -0
- package/src/basis/spec-frontmatter.ts +68 -0
- package/src/basis/spec-sections.ts +35 -0
- package/src/basis/test-basis-schema.ts +81 -0
- package/src/capabilities/discover.ts +15 -2
- package/src/capabilities/registry.ts +16 -0
- package/src/cli/commands/audit.ts +10 -5
- package/src/cli/commands/capability.ts +4 -2
- package/src/cli/commands/contract-derive-command.ts +61 -0
- package/src/cli/commands/contract.ts +130 -0
- package/src/cli/commands/defect.ts +49 -0
- package/src/cli/commands/delivery.ts +92 -15
- package/src/cli/commands/generate.ts +3 -1
- package/src/cli/commands/journey.ts +41 -16
- package/src/cli/commands/next.ts +64 -10
- package/src/cli/commands/triage.ts +57 -0
- package/src/cli/commands/update.ts +35 -8
- package/src/cli/index.ts +24 -30
- package/src/cli/project-sungen-invocation.ts +39 -0
- package/src/contract/approve-contract.ts +94 -0
- package/src/contract/assertion-matcher-vocabulary.ts +93 -0
- package/src/contract/build-contract-verdict.ts +108 -0
- package/src/contract/build-trace-conformance.ts +100 -0
- package/src/contract/classify-contract-change.ts +92 -0
- package/src/contract/classify-contract-unit.ts +47 -0
- package/src/contract/classify-trace-conformance.ts +116 -0
- package/src/contract/contract-git.ts +106 -0
- package/src/contract/contract-hash.ts +34 -0
- package/src/contract/contract-report-file.ts +25 -0
- package/src/contract/contract-schema.ts +137 -0
- package/src/contract/contract-units.ts +52 -0
- package/src/contract/contracts-lock-file.ts +97 -0
- package/src/contract/data-normalize.ts +66 -0
- package/src/contract/derive-free-feature.ts +120 -0
- package/src/contract/field-semantic-redaction.ts +80 -0
- package/src/contract/free-feature-blocks.ts +56 -0
- package/src/contract/lock-secret-guard.ts +95 -0
- package/src/contract/lock-vs-git-head.ts +38 -0
- package/src/contract/normalize-contract-step.ts +74 -0
- package/src/contract/normalize-feature-steps.ts +93 -0
- package/src/contract/oracle-strength.ts +80 -0
- package/src/contract/project-contract-blockers.ts +36 -0
- package/src/contract/record-contract-approval.ts +70 -0
- package/src/contract/render-free-gherkin.ts +113 -0
- package/src/contract/render-trace-sentence.ts +98 -0
- package/src/contract/render-trace-target.ts +68 -0
- package/src/contract/resolve-unit-trace-identities.ts +35 -0
- package/src/contract/trace/collect-trace-evidence.ts +109 -0
- package/src/contract/trace/identity-cache.ts +61 -0
- package/src/contract/trace/select-final-attempt.ts +70 -0
- package/src/contract/trace/snapshot-html-renderer.ts +136 -0
- package/src/contract/trace/snapshot-resolver.ts +66 -0
- package/src/contract/trace/snapshot-store.ts +151 -0
- package/src/contract/trace/target-identity.ts +104 -0
- package/src/contract/trace/test-step-join.ts +104 -0
- package/src/contract/trace/trace-binding.ts +56 -0
- package/src/contract/trace/trace-file-reader.ts +133 -0
- package/src/contract/trace/trace-fingerprint.ts +68 -0
- package/src/contract/trace/trace-identity-resolution.ts +74 -0
- package/src/contract/trace/trace-run-record.ts +80 -0
- package/src/contract/trace/trace-steps.ts +88 -0
- package/src/contract/trace/trace-zip-limits.ts +77 -0
- package/src/contract/trace/trace-zip-reader.ts +127 -0
- package/src/contract/verify-approval-decisions.ts +60 -0
- package/src/decisions/append-decision.ts +35 -0
- package/src/decisions/confirmed-decision-commands.ts +149 -0
- package/src/decisions/decision-file.ts +93 -0
- package/src/decisions/decision-identity.ts +73 -0
- package/src/decisions/decision-integrity-check.ts +61 -0
- package/src/decisions/decision-schema.ts +76 -0
- package/src/decisions/decision-source.ts +14 -0
- package/src/decisions/exclusive-file-create.ts +42 -0
- package/src/decisions/git-head-trust.ts +32 -0
- package/src/decisions/human-confirmation.ts +119 -0
- package/src/decisions/legacy-waiver-migration.ts +135 -0
- package/src/decisions/read-decisions.ts +61 -0
- package/src/decisions/viewpoint-baseline-adapter.ts +74 -0
- package/src/decisions/waiver-decisions.ts +56 -0
- package/src/exporters/csv-exporter.ts +5 -1
- package/src/exporters/feature-parser.ts +12 -0
- package/src/exporters/matrix/build.ts +62 -18
- package/src/exporters/matrix/carry-manual-results.ts +70 -7
- package/src/exporters/matrix/export.ts +17 -2
- package/src/exporters/matrix/gates.ts +62 -129
- package/src/exporters/matrix/render-csv.ts +4 -1
- package/src/exporters/matrix/render-gate-overrides-sheet.ts +50 -0
- package/src/exporters/matrix/render-xlsx.ts +6 -0
- package/src/exporters/matrix/types.ts +9 -1
- package/src/exporters/matrix/xlsx-cells.ts +1 -1
- package/src/exporters/playwright-report-parser.ts +1 -0
- package/src/exporters/scenario-merger.ts +2 -1
- package/src/exporters/types.ts +5 -0
- package/src/generators/test-generator/code-generator.ts +13 -0
- package/src/graph/evaluate-graph.ts +66 -0
- package/src/graph/locate-finding.ts +93 -0
- package/src/graph/node-decl.ts +72 -0
- package/src/graph/nodes/core-node-catalog.ts +15 -0
- package/src/graph/nodes/test-case-contract-nodes.ts +74 -0
- package/src/graph/nodes/test-case-nodes.ts +68 -0
- package/src/graph/nodes/unit-audit-nodes.ts +95 -0
- package/src/graph/nodes/unit-contract-node.ts +89 -0
- package/src/graph/nodes/unit-design-nodes.ts +89 -0
- package/src/graph/nodes/unit-execution-nodes.ts +77 -0
- package/src/graph/test-case-identity.ts +75 -0
- package/src/graph/test-case-results.ts +90 -0
- package/src/graph/test-case-satisfied.ts +55 -0
- package/src/graph/test-case-state-shape.ts +62 -0
- package/src/graph/test-case-states.ts +84 -0
- package/src/graph/unit-artifact-probes.ts +77 -0
- package/src/graph/unit-state-facts.ts +112 -0
- package/src/harness/audit.ts +46 -11
- package/src/harness/catalog/gate-rules.yaml +647 -0
- package/src/harness/counted-assertions.ts +33 -0
- package/src/harness/defect-draft.ts +115 -0
- package/src/harness/defects.ts +94 -0
- package/src/harness/gates/audit-gate-terms.ts +80 -0
- package/src/harness/gates/audit-gate-verdict.ts +78 -0
- package/src/harness/gates/audit-input-hash.ts +55 -0
- package/src/harness/gates/audit-report-verification.ts +201 -0
- package/src/harness/gates/decisions-hash.ts +42 -0
- package/src/harness/gates/delivery-checklist.ts +120 -0
- package/src/harness/gates/delivery-decision-gate.ts +139 -0
- package/src/harness/gates/delivery-decision-step.ts +89 -0
- package/src/harness/gates/gate-override-report.ts +114 -0
- package/src/harness/gates/gate-override-scope.ts +66 -0
- package/src/harness/gates/gate-override-validation.ts +75 -0
- package/src/harness/gates/gate-rule-catalog.ts +82 -0
- package/src/harness/gates/gate-terms.ts +59 -0
- package/src/harness/gates/in-run-decision-check.ts +99 -0
- package/src/harness/gates/journey-gate-inputs.ts +89 -0
- package/src/harness/gates/migrated-waiver-review.ts +68 -0
- package/src/harness/gates/resolve-rule.ts +94 -0
- package/src/harness/gates/unit-gate-overrides.ts +99 -0
- package/src/harness/journey.ts +215 -38
- package/src/harness/manifest.ts +69 -45
- package/src/harness/next-step.ts +60 -170
- package/src/harness/parse.ts +40 -13
- package/src/harness/provenance.ts +99 -11
- package/src/harness/script-check.ts +27 -6
- package/src/harness/sensors.ts +73 -47
- package/src/harness/triage-signals.ts +46 -0
- package/src/harness/triage-unit.ts +113 -0
- package/src/harness/triage.ts +127 -0
- package/src/harness/viewpoint-ledger.ts +2 -2
- package/src/hooks/bash-write-targets.ts +109 -0
- package/src/hooks/claude-hook-entry.ts +85 -0
- package/src/hooks/claude-transcript-turn.ts +96 -0
- package/src/hooks/guard-delivery-contract-rule.ts +110 -0
- package/src/hooks/guard-protected-paths.ts +71 -0
- package/src/hooks/guard-rules.ts +98 -0
- package/src/hooks/guard-tty-spoof-rule.ts +31 -0
- package/src/hooks/hand-back-core.ts +112 -0
- package/src/hooks/hook-cli-command.ts +17 -0
- package/src/hooks/hook-registry.ts +24 -0
- package/src/hooks/hook-result-contract.ts +114 -0
- package/src/hooks/hook-toggles.ts +66 -0
- package/src/hooks/pre-tool-guard-hook.ts +67 -0
- package/src/hooks/session-start-unit-state-hook.ts +56 -0
- package/src/hooks/stop-next-step-hook.ts +37 -0
- package/src/hooks/sungen-project-root.ts +80 -0
- package/src/orchestrator/ai-skills/command-partial-includes.ts +72 -0
- package/src/orchestrator/ai-skills/commands.ts +22 -8
- package/src/orchestrator/ai-skills/golden-skills.test.ts +23 -0
- package/src/orchestrator/assets-drift.ts +12 -5
- package/src/orchestrator/claude-hooks-install.ts +168 -0
- package/src/orchestrator/lockstep-version.ts +28 -15
- package/src/orchestrator/project-initializer.ts +22 -0
- package/src/orchestrator/screen-manager.ts +3 -1
- package/src/orchestrator/templates/ai-src/commands/add-api.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/add-flow.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/add-screen.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/create-data-test.md +1 -0
- package/src/orchestrator/templates/ai-src/commands/create-test.md +14 -16
- package/src/orchestrator/templates/ai-src/commands/dashboard.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/delivery.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/design.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/feedback.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/locale.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/review.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/run-test.md +14 -10
- package/src/orchestrator/templates/ai-src/config/claude.md +20 -7
- package/src/orchestrator/templates/ai-src/config/copilot.md +20 -7
- package/src/orchestrator/templates/ai-src/partials/hand-back-rule.claude.md +20 -0
- package/src/orchestrator/templates/ai-src/partials/hand-back-rule.codex.md +20 -0
- package/src/orchestrator/templates/ai-src/partials/hand-back-rule.copilot.md +20 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-api-coverage-model/SKILL.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-capture-mobile/SKILL.md +3 -3
- package/src/orchestrator/templates/ai-src/skills/sungen-data-factory/SKILL.md +9 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +2 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +2 -0
- package/src/orchestrator/templates/claude-hooks/sungen-hook.cjs +64 -0
- package/src/utils/safe-yaml-parse.ts +44 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.unitScopeOfDir = unitScopeOfDir;
|
|
37
|
+
exports.loadUnitGateOverrides = loadUnitGateOverrides;
|
|
38
|
+
/**
|
|
39
|
+
* The gate overrides in force for ONE unit, read from the decision layer (OES-11.2/11.3, DOS-13).
|
|
40
|
+
*
|
|
41
|
+
* Sources: `qa/decisions/` (project) and `qa/<kind>/<unit>/decisions/` (the unit). Only entries that
|
|
42
|
+
* verify against themselves are considered (readDecisions); superseded ones are out of force. Per
|
|
43
|
+
* rule the override in force is the most specific — an exact unit beats a glob — then the latest, then
|
|
44
|
+
* the higher decision id (deterministic). Each carries whether git HEAD holds it: an uncommitted one
|
|
45
|
+
* still counts (the author sees its effect), release refuses it (decision.in-run, review H1).
|
|
46
|
+
* Never throws: a bad file is a `problem`, a bad override is `rejected`.
|
|
47
|
+
*/
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const decision_file_1 = require("../../decisions/decision-file");
|
|
50
|
+
const read_decisions_1 = require("../../decisions/read-decisions");
|
|
51
|
+
const gate_override_validation_1 = require("./gate-override-validation");
|
|
52
|
+
const decisions_hash_1 = require("./decisions-hash");
|
|
53
|
+
const in_run_decision_check_1 = require("./in-run-decision-check");
|
|
54
|
+
/** The decision scope of a unit directory (`screens/login`, `api/flows/signup`), or null. */
|
|
55
|
+
function unitScopeOfDir(projectRoot, unitDir) {
|
|
56
|
+
const rel = path.relative(path.join(projectRoot, 'qa'), unitDir).split(path.sep).join('/');
|
|
57
|
+
return rel && !rel.startsWith('..') && (0, decision_file_1.isValidScope)(rel) && rel !== decision_file_1.PROJECT_SCOPE ? rel : null;
|
|
58
|
+
}
|
|
59
|
+
const specificity = (o, unitScope) => (o.scope === unitScope ? 1 : 0);
|
|
60
|
+
/** Does `a` take precedence over `b` for the same rule? valid_from is schema-checked ISO; NaN never orders. */
|
|
61
|
+
function wins(a, b, unitScope) {
|
|
62
|
+
const s = specificity(a, unitScope) - specificity(b, unitScope);
|
|
63
|
+
if (s !== 0)
|
|
64
|
+
return s > 0;
|
|
65
|
+
const t = (Date.parse(a.validFrom) || 0) - (Date.parse(b.validFrom) || 0);
|
|
66
|
+
return t !== 0 ? t > 0 : a.decisionId > b.decisionId;
|
|
67
|
+
}
|
|
68
|
+
function loadUnitGateOverrides(projectRoot, unitScope) {
|
|
69
|
+
const scopes = unitScope ? [decision_file_1.PROJECT_SCOPE, unitScope] : [decision_file_1.PROJECT_SCOPE];
|
|
70
|
+
const entries = [];
|
|
71
|
+
const problems = [];
|
|
72
|
+
for (const s of scopes) {
|
|
73
|
+
const r = (0, read_decisions_1.readDecisions)(projectRoot, s);
|
|
74
|
+
entries.push(...r.entries);
|
|
75
|
+
problems.push(...r.problems);
|
|
76
|
+
}
|
|
77
|
+
const rel = (p) => path.relative(projectRoot, p).split(path.sep).join('/');
|
|
78
|
+
const hashItems = problems.map((p) => (0, decisions_hash_1.problemHashItem)(projectRoot, p));
|
|
79
|
+
const byRule = new Map();
|
|
80
|
+
const rejected = [];
|
|
81
|
+
const ineffective = [];
|
|
82
|
+
// HEAD membership is read once, and only when an override is in reach (two git calls).
|
|
83
|
+
let head;
|
|
84
|
+
const inHead = (p) => {
|
|
85
|
+
if (head === undefined)
|
|
86
|
+
head = (0, in_run_decision_check_1.committedDecisionPaths)(projectRoot);
|
|
87
|
+
return head ? head.has(p) : null;
|
|
88
|
+
};
|
|
89
|
+
for (const e of entries.filter((x) => x.kind === 'gate-override')) {
|
|
90
|
+
const j = (0, gate_override_validation_1.judgeOverride)(e, unitScope);
|
|
91
|
+
if (j.status === 'irrelevant')
|
|
92
|
+
continue;
|
|
93
|
+
const p = rel(e.path);
|
|
94
|
+
hashItems.push({ path: p, entryHash: e.entry_hash });
|
|
95
|
+
if (e.superseded_by)
|
|
96
|
+
continue;
|
|
97
|
+
const rule = typeof e.payload?.rule === 'string' ? e.payload.rule : undefined;
|
|
98
|
+
const issue = { decisionId: e.id, path: p, rule, entry: e, committed: inHead(p) };
|
|
99
|
+
if (j.status === 'rejected') {
|
|
100
|
+
rejected.push({ ...issue, reason: j.reason });
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (j.status === 'ineffective') {
|
|
104
|
+
ineffective.push({ ...issue, reason: j.reason });
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const o = { ...j.override, committed: issue.committed };
|
|
108
|
+
const current = byRule.get(o.rule);
|
|
109
|
+
if (!current || wins(o, current, unitScope))
|
|
110
|
+
byRule.set(o.rule, o);
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
unitScope,
|
|
114
|
+
context: { overrides: byRule },
|
|
115
|
+
inForce: [...byRule.values()].sort((a, b) => a.rule.localeCompare(b.rule, 'en')),
|
|
116
|
+
rejected,
|
|
117
|
+
ineffective,
|
|
118
|
+
problems,
|
|
119
|
+
decisionsHash: (0, decisions_hash_1.computeDecisionsHash)(hashItems),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=unit-gate-overrides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-gate-overrides.js","sourceRoot":"","sources":["../../../src/harness/gates/unit-gate-overrides.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,wCAGC;AAYD,sDA4CC;AAlGD;;;;;;;;;GASG;AACH,2CAA6B;AAC7B,iEAA6F;AAC7F,mEAA6E;AAC7E,yEAA2D;AAE3D,qDAA4F;AAC5F,mEAAiE;AAsBjE,6FAA6F;AAC7F,SAAgB,cAAc,CAAC,WAAmB,EAAE,OAAe;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3F,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAA,4BAAY,EAAC,GAAG,CAAC,IAAI,GAAG,KAAK,6BAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACjG,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,CAAiB,EAAE,SAAwB,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7G,+GAA+G;AAC/G,SAAS,IAAI,CAAC,CAAiB,EAAE,CAAiB,EAAE,SAAwB;IAC1E,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;AACvD,CAAC;AAED,SAAgB,qBAAqB,CAAC,WAAmB,EAAE,SAAwB;IACjF,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,6BAAa,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,6BAAa,CAAC,CAAC;IACxE,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,IAAA,8BAAa,EAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3F,MAAM,SAAS,GAAwB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,gCAAe,EAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IACjD,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAoB,EAAE,CAAC;IACxC,uFAAuF;IACvF,IAAI,IAAoC,CAAC;IACzC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAkB,EAAE;QAC3C,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,GAAG,IAAA,8CAAsB,EAAC,WAAW,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,EAAE,CAAC;QAClE,MAAM,CAAC,GAAG,IAAA,wCAAa,EAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY;YAAE,SAAS;QACxC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,CAAC,aAAa;YAAE,SAAS;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,MAAM,KAAK,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACzF,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC/F,MAAM,CAAC,GAAmB,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO;QACL,SAAS;QACT,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;QAC9B,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChF,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,aAAa,EAAE,IAAA,qCAAoB,EAAC,SAAS,CAAC;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
import { DecisionGateFinding } from './gates/journey-gate-inputs';
|
|
2
|
+
/** `overridden`: the audit recorded a gate-override on the obligation's rule (OES-11.2) — accepted like a waiver. */
|
|
3
|
+
export type ObStatus = 'satisfied' | 'needs-work' | 'pending' | 'waived' | 'overridden';
|
|
2
4
|
export interface Obligation {
|
|
3
5
|
id: string;
|
|
4
6
|
title: string;
|
|
5
7
|
status: ObStatus;
|
|
6
8
|
detail: string;
|
|
7
9
|
waivedReason?: string;
|
|
10
|
+
overriddenBy?: string;
|
|
8
11
|
}
|
|
9
12
|
/** S5 — a parsed anchor so an IDE can jump straight to what needs review. */
|
|
10
13
|
export interface Anchor {
|
|
@@ -26,6 +29,10 @@ export interface JourneyReport {
|
|
|
26
29
|
obligations: Obligation[];
|
|
27
30
|
needsYou: ReviewItem[];
|
|
28
31
|
nextSuggested: string;
|
|
32
|
+
/** T3 — set when an audit report exists but does not count (stale or untrusted). */
|
|
33
|
+
auditNotCounted?: string;
|
|
34
|
+
/** Decision files that do not verify, edited committed entries, rejected overrides — hard, block the gate. */
|
|
35
|
+
decisionFindings?: DecisionGateFinding[];
|
|
29
36
|
}
|
|
30
37
|
/**
|
|
31
38
|
* The public entry: compute fresh, then RECONCILE with the persisted state —
|
|
@@ -33,8 +40,23 @@ export interface JourneyReport {
|
|
|
33
40
|
* - an active waiver (evidence unchanged) sets status='waived' (carries the reason);
|
|
34
41
|
* - a STALE waiver (audit changed since it was waived) is re-surfaced for re-decision (anti-amnesia).
|
|
35
42
|
* Then persist the current evidence cursor.
|
|
43
|
+
* Waivers in force come from the decision layer; legacy waivers that match git HEAD are imported once,
|
|
44
|
+
* others are UNTRUSTED (not counted, listed for a human), and the result is dual-written back.
|
|
45
|
+
* A read-only checkout gets the same board without throwing.
|
|
36
46
|
*/
|
|
37
47
|
export declare function runJourney(projectRoot: string, unit: string): JourneyReport;
|
|
48
|
+
/** The single human gate (DOS §3.4, S5): given with `--signoff`, never waived (#936). */
|
|
49
|
+
export declare const SIGNOFF_OBLIGATION = "OB-signoff";
|
|
50
|
+
export declare const signoffCommand: (unit: string) => string;
|
|
51
|
+
/** "Never audited" (T3): a unit is measured by `sungen audit`, never waived through (review W2). */
|
|
52
|
+
export declare const CREATE_OBLIGATION = "OB-create";
|
|
53
|
+
/**
|
|
54
|
+
* Throws unless `obId` is an obligation of the board that a waiver can accept. Refused in every state,
|
|
55
|
+
* each with what does it instead: OB-signoff (before any audit it is not on the board, after one a
|
|
56
|
+
* waiver would let the human gate be waived away) and OB-create (an unaudited unit would pass every
|
|
57
|
+
* gate on a waiver; the audit measures it).
|
|
58
|
+
*/
|
|
59
|
+
export declare function assertWaivable(report: JourneyReport, unit: string, obId: string): void;
|
|
38
60
|
/**
|
|
39
61
|
* Waive an obligation — REQUIRES a reason (anti-amnesia: a waiver leaves a recorded "why").
|
|
40
62
|
* Records the current evidence cursor so reconcile can invalidate it if the audit changes.
|
|
@@ -45,7 +67,19 @@ export declare function waive(projectRoot: string, unit: string, obId: string, r
|
|
|
45
67
|
* obligation is satisfied or waived (you cannot sign off an unclean suite). Records who/when +
|
|
46
68
|
* the evidence cursor; reconcile invalidates it (stale → re-review) if the suite later changes.
|
|
47
69
|
*/
|
|
70
|
+
/** Throws unless the board may be signed off: no decision problem, every other obligation accepted. */
|
|
71
|
+
export declare function assertCanSignOff(before: JourneyReport): void;
|
|
72
|
+
/** Who signs off: `--by`, else the git user; throws when neither names anyone (never `by: unknown`). */
|
|
73
|
+
export declare function signoffSigner(projectRoot: string, unit: string, by?: string): {
|
|
74
|
+
signer: string;
|
|
75
|
+
gitUser: string;
|
|
76
|
+
};
|
|
48
77
|
export declare function signoff(projectRoot: string, unit: string, by?: string): JourneyReport;
|
|
78
|
+
/**
|
|
79
|
+
* Write a DERIVED journey file (board, report, roll-up). Best-effort by contract (DOS-13.3): a read-only
|
|
80
|
+
* or full checkout still shows the board — the file is skipped and null returned; any other error throws.
|
|
81
|
+
*/
|
|
82
|
+
export declare function writeJourneyFileBestEffort(file: string, text: string): string | null;
|
|
49
83
|
export declare function renderJourneyBoard(r: JourneyReport): string;
|
|
50
84
|
export type GatePhase = 'create' | 'run' | 'deliver';
|
|
51
85
|
export interface GateVerdict {
|
|
@@ -62,6 +96,14 @@ export interface GateVerdict {
|
|
|
62
96
|
id: string;
|
|
63
97
|
title: string;
|
|
64
98
|
}[];
|
|
99
|
+
/** Required obligations accepted because the audit applied a gate-override to their rule. */
|
|
100
|
+
overriddenCredit?: {
|
|
101
|
+
id: string;
|
|
102
|
+
title: string;
|
|
103
|
+
by: string;
|
|
104
|
+
}[];
|
|
105
|
+
/** The phase rule itself was lowered by this gate-override: the open obligations do not halt. */
|
|
106
|
+
phaseOverriddenBy?: string;
|
|
65
107
|
}
|
|
66
108
|
export declare function runGate(projectRoot: string, unit: string, phase: GatePhase): GateVerdict;
|
|
67
109
|
export declare function renderGate(v: GateVerdict): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journey.d.ts","sourceRoot":"","sources":["../../src/harness/journey.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"journey.d.ts","sourceRoot":"","sources":["../../src/harness/journey.ts"],"names":[],"mappings":"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"}
|
package/dist/harness/journey.js
CHANGED
|
@@ -33,9 +33,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CREATE_OBLIGATION = exports.signoffCommand = exports.SIGNOFF_OBLIGATION = void 0;
|
|
36
37
|
exports.runJourney = runJourney;
|
|
38
|
+
exports.assertWaivable = assertWaivable;
|
|
37
39
|
exports.waive = waive;
|
|
40
|
+
exports.assertCanSignOff = assertCanSignOff;
|
|
41
|
+
exports.signoffSigner = signoffSigner;
|
|
38
42
|
exports.signoff = signoff;
|
|
43
|
+
exports.writeJourneyFileBestEffort = writeJourneyFileBestEffort;
|
|
39
44
|
exports.renderJourneyBoard = renderJourneyBoard;
|
|
40
45
|
exports.runGate = runGate;
|
|
41
46
|
exports.renderGate = renderGate;
|
|
@@ -61,6 +66,14 @@ const path = __importStar(require("path"));
|
|
|
61
66
|
const crypto = __importStar(require("crypto"));
|
|
62
67
|
const unit_paths_1 = require("./unit-paths");
|
|
63
68
|
const read_text_1 = require("./read-text");
|
|
69
|
+
const migration_sentinel_1 = require("../basis/migration-sentinel");
|
|
70
|
+
const legacy_waiver_migration_1 = require("../decisions/legacy-waiver-migration");
|
|
71
|
+
const append_decision_1 = require("../decisions/append-decision");
|
|
72
|
+
const decision_source_1 = require("../decisions/decision-source");
|
|
73
|
+
const resolve_rule_1 = require("./gates/resolve-rule");
|
|
74
|
+
const journey_gate_inputs_1 = require("./gates/journey-gate-inputs");
|
|
75
|
+
const in_run_decision_check_1 = require("./gates/in-run-decision-check");
|
|
76
|
+
const decision_file_1 = require("../decisions/decision-file");
|
|
64
77
|
function readJSON(p) {
|
|
65
78
|
try {
|
|
66
79
|
return fs.existsSync(p) ? JSON.parse((0, read_text_1.readTextFile)(p)) : null;
|
|
@@ -96,9 +109,32 @@ function extractAnchor(text) {
|
|
|
96
109
|
return { vpId: vp ? vp[0] : undefined, file: fl ? fl[1] : undefined, line: fl ? Number(fl[2]) : undefined };
|
|
97
110
|
}
|
|
98
111
|
const SAT = 0.8; // axis at/above this = satisfied (below = needs-work)
|
|
112
|
+
/**
|
|
113
|
+
* OB-coverage IS the audit's viewpoint gate (#934): the registry maps it to `audit.viewpoint-coverage`,
|
|
114
|
+
* whose condition is "no critical theme missing or shallow" (audit-gate-terms.ts). The coverage
|
|
115
|
+
* percentage alone can read 83% with a critical theme missing, so a gap the rule blocks on keeps the
|
|
116
|
+
* obligation open and names the themes. An override the audit applied is credited later by
|
|
117
|
+
* applyAuditOverrides — journey never re-applies one, so the rule is resolved from the catalog here.
|
|
118
|
+
*/
|
|
119
|
+
function coverageObligation(coverage, audit) {
|
|
120
|
+
const id = 'OB-coverage';
|
|
121
|
+
const title = 'Viewpoint coverage';
|
|
122
|
+
const pct = coverage === undefined ? '' : `${Math.round(coverage * 100)}% (need ${Math.round(SAT * 100)}%) — `;
|
|
123
|
+
const gaps = Array.isArray(audit.gate?.gaps) ? audit.gate.gaps : [];
|
|
124
|
+
if (gaps.length && (0, resolve_rule_1.resolveRule)(journey_gate_inputs_1.OBLIGATION_RULE[id]).blocking) {
|
|
125
|
+
const themes = gaps.map((g) => `${String(g.theme)} (${g.status === 'shallow' ? 'shallow' : 'missing'})`).join(', ');
|
|
126
|
+
return { id, title, status: 'needs-work', detail: `${pct}critical theme(s) not covered: ${themes} — the audit's viewpoint gate fails on them` };
|
|
127
|
+
}
|
|
128
|
+
const status = coverage === undefined ? 'pending' : coverage >= SAT ? 'satisfied' : 'needs-work';
|
|
129
|
+
return { id, title, status, detail: `${pct}critical themes covered` };
|
|
130
|
+
}
|
|
99
131
|
function computeFresh(projectRoot, unit) {
|
|
100
132
|
const slug = (0, unit_paths_1.reportSlug)(unit);
|
|
101
|
-
|
|
133
|
+
// T3: the report is an output — read through the checks; stale or untrusted counts as never audited.
|
|
134
|
+
const read = (0, journey_gate_inputs_1.readJourneyAudit)(projectRoot, unit);
|
|
135
|
+
const notCountedReason = read.notCountedReason;
|
|
136
|
+
// The verifier checked the top-level keys and types; nested fields are read defensively below, as before.
|
|
137
|
+
const audit = read.audit;
|
|
102
138
|
const phases = readLedgerPhases(path.join(projectRoot, '.sungen', 'ledger', `${slug}.jsonl`));
|
|
103
139
|
const from = [];
|
|
104
140
|
if (audit)
|
|
@@ -111,10 +147,11 @@ function computeFresh(projectRoot, unit) {
|
|
|
111
147
|
const needsYou = [];
|
|
112
148
|
if (!audit) {
|
|
113
149
|
// Nothing measured yet — the journey hasn't really begun.
|
|
114
|
-
obligations.push({ id: 'OB-create', title: 'Generate test cases', status: 'pending', detail: 'No audit report yet — run /sungen:create-test.' });
|
|
150
|
+
obligations.push({ id: 'OB-create', title: 'Generate test cases', status: 'pending', detail: notCountedReason ?? 'No audit report yet — run /sungen:create-test.' });
|
|
115
151
|
return {
|
|
116
|
-
unit, generatedFrom: from, youAreHere, phasesDone: phases, gateStatus: null, score: null,
|
|
117
|
-
|
|
152
|
+
unit, generatedFrom: from, youAreHere, phasesDone: phases, gateStatus: null, score: null, obligations, needsYou,
|
|
153
|
+
nextSuggested: notCountedReason ?? 'Run `/sungen:create-test ' + unit + '` to begin.',
|
|
154
|
+
...(notCountedReason ? { auditNotCounted: notCountedReason } : {}),
|
|
118
155
|
};
|
|
119
156
|
}
|
|
120
157
|
const ax = (audit.calibration && audit.calibration.axes) || {};
|
|
@@ -125,7 +162,7 @@ function computeFresh(projectRoot, unit) {
|
|
|
125
162
|
detail: val === undefined ? detail : `${Math.round(val * 100)}% (need ${Math.round(thr * 100)}%) — ${detail}`,
|
|
126
163
|
});
|
|
127
164
|
obligations.push(ob('OB-spec', 'Spec readiness', ax.specFR, 1, 'FR/sections sufficient to design from'));
|
|
128
|
-
obligations.push(
|
|
165
|
+
obligations.push(coverageObligation(ax.coverage, audit));
|
|
129
166
|
obligations.push(ob('OB-depth', 'Assertion depth', ax.businessDepth, depthThreshold, 'business-critical scenarios assert data'));
|
|
130
167
|
obligations.push(ob('OB-trace', 'Traceability', ax.taxonomy ?? ax.traceability, SAT, 'scenarios trace to viewpoints'));
|
|
131
168
|
// Automation obligation: automatable @manual still pending a driver = needs-work.
|
|
@@ -135,6 +172,8 @@ function computeFresh(projectRoot, unit) {
|
|
|
135
172
|
status: autoPending ? 'needs-work' : 'satisfied',
|
|
136
173
|
detail: autoPending ? `${audit.automatableManual.automatable} @manual scenario(s) a driver could automate` : 'no capability-pending automatable cases',
|
|
137
174
|
});
|
|
175
|
+
// What the audit already applied — never re-applied here, and only while that override is in force.
|
|
176
|
+
const ignored = (0, journey_gate_inputs_1.applyAuditOverrides)(obligations, audit, (0, journey_gate_inputs_1.unitOverrides)(projectRoot, unit).inForce);
|
|
138
177
|
// Needs-you: the review queue. Prefer PRECISE per-scenario anchors from audit's structured
|
|
139
178
|
// depth data — each shallow business-critical scenario carries its own VP id — over regex-parsing
|
|
140
179
|
// the aggregate "DEPTH:" finding string (which names no scenario, so points nowhere). Then
|
|
@@ -146,6 +185,8 @@ function computeFresh(projectRoot, unit) {
|
|
|
146
185
|
anchor: extractAnchor(s.name),
|
|
147
186
|
});
|
|
148
187
|
}
|
|
188
|
+
for (const g of ignored)
|
|
189
|
+
needsYou.push({ text: (0, journey_gate_inputs_1.ignoredOverrideText)(g), anchor: {} });
|
|
149
190
|
const haveStructuredDepth = shallowBC.length > 0;
|
|
150
191
|
for (const f of (audit.findings || [])) {
|
|
151
192
|
if (!isHumanFinding(f))
|
|
@@ -161,7 +202,7 @@ function computeFresh(projectRoot, unit) {
|
|
|
161
202
|
detail: `${needsYou.length} item(s) queued for your review · ${manualCount} @manual scenario(s)`,
|
|
162
203
|
});
|
|
163
204
|
// Next suggested = first non-satisfied obligation; if all satisfied but run-test not done → run.
|
|
164
|
-
const firstGap = obligations.find((o) => o.status !== 'satisfied' && o.id !== 'OB-signoff');
|
|
205
|
+
const firstGap = obligations.find((o) => o.status !== 'satisfied' && o.status !== 'overridden' && o.id !== 'OB-signoff');
|
|
165
206
|
let nextSuggested;
|
|
166
207
|
if (firstGap)
|
|
167
208
|
nextSuggested = `Repair "${firstGap.title}" (${firstGap.detail}).`;
|
|
@@ -188,9 +229,14 @@ function saveState(p, s) {
|
|
|
188
229
|
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
189
230
|
fs.writeFileSync(p, JSON.stringify(s, null, 2), 'utf-8');
|
|
190
231
|
}
|
|
232
|
+
/** An obligation that does not block: met, waived by a human, or overridden by the audit's gate-override. */
|
|
233
|
+
const accepted = (s) => s === 'satisfied' || s === 'waived' || s === 'overridden';
|
|
191
234
|
/** Recompute nextSuggested AFTER waivers are applied (a waived obligation is not a gap). */
|
|
192
235
|
function computeNext(r, unit) {
|
|
193
|
-
const
|
|
236
|
+
const bad = r.decisionFindings?.[0];
|
|
237
|
+
if (bad)
|
|
238
|
+
return `Resolve ${r.decisionFindings.length} decision problem(s) first — ${bad.rule} on ${bad.path}.`;
|
|
239
|
+
const gap = r.obligations.find((o) => !accepted(o.status) && o.id !== 'OB-signoff');
|
|
194
240
|
if (gap)
|
|
195
241
|
return `Repair "${gap.title}" (${gap.detail}).`;
|
|
196
242
|
if (!r.phasesDone.some((s) => s === 'run' || s.startsWith('run')))
|
|
@@ -203,17 +249,33 @@ function computeNext(r, unit) {
|
|
|
203
249
|
* - an active waiver (evidence unchanged) sets status='waived' (carries the reason);
|
|
204
250
|
* - a STALE waiver (audit changed since it was waived) is re-surfaced for re-decision (anti-amnesia).
|
|
205
251
|
* Then persist the current evidence cursor.
|
|
252
|
+
* Waivers in force come from the decision layer; legacy waivers that match git HEAD are imported once,
|
|
253
|
+
* others are UNTRUSTED (not counted, listed for a human), and the result is dual-written back.
|
|
254
|
+
* A read-only checkout gets the same board without throwing.
|
|
206
255
|
*/
|
|
207
256
|
function runJourney(projectRoot, unit) {
|
|
208
257
|
const slug = (0, unit_paths_1.reportSlug)(unit);
|
|
258
|
+
(0, migration_sentinel_1.assertNoPendingMigration)(projectRoot, slug);
|
|
209
259
|
const report = computeFresh(projectRoot, unit);
|
|
210
260
|
const sp = statePath(projectRoot, slug);
|
|
211
261
|
const state = loadState(sp) || { unit, auditHash: '', waivers: {} };
|
|
212
262
|
const curHash = auditHashOf(projectRoot, slug);
|
|
263
|
+
const sync = (0, legacy_waiver_migration_1.planWaiverSync)(projectRoot, unit, slug, sp, state.waivers);
|
|
264
|
+
for (const u of sync.untrusted) {
|
|
265
|
+
const title = report.obligations.find((o) => o.id === u.obligation)?.title ?? u.obligation;
|
|
266
|
+
const ignored = unwaivableWhy(u.obligation, unit);
|
|
267
|
+
report.needsYou.unshift({ text: ignored ? ignoredWaiverText(u.obligation, ignored, u.waiver.reason) : (0, legacy_waiver_migration_1.untrustedWaiverText)(unit, slug, title, u), anchor: { vpId: u.obligation } });
|
|
268
|
+
}
|
|
213
269
|
for (const ob of report.obligations) {
|
|
214
|
-
const w =
|
|
270
|
+
const w = sync.waivers[ob.id];
|
|
215
271
|
if (!w)
|
|
216
272
|
continue;
|
|
273
|
+
// A waiver recorded before `--waive` refused this obligation never opens it (review W1).
|
|
274
|
+
const ignored = unwaivableWhy(ob.id, unit);
|
|
275
|
+
if (ignored) {
|
|
276
|
+
report.needsYou.unshift({ text: ignoredWaiverText(ob.id, ignored, w.reason), anchor: { vpId: ob.id } });
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
217
279
|
if (w.auditHashAtWaive === curHash) {
|
|
218
280
|
ob.status = 'waived';
|
|
219
281
|
ob.waivedReason = w.reason;
|
|
@@ -229,16 +291,67 @@ function runJourney(projectRoot, unit) {
|
|
|
229
291
|
if (signoffOb && state.signoff) {
|
|
230
292
|
if (state.signoff.auditHashAtSignoff === curHash) {
|
|
231
293
|
signoffOb.status = 'satisfied';
|
|
232
|
-
signoffOb.detail = `signed off${state.signoff.by ? ' by ' + state.signoff.by : ''} at ${state.signoff.at}`;
|
|
294
|
+
signoffOb.detail = `signed off${state.signoff.by ? ' by ' + state.signoff.by : ''}${state.signoff.recordedBy ? ` (recorded by ${state.signoff.recordedBy})` : ''} at ${state.signoff.at}`;
|
|
233
295
|
}
|
|
234
296
|
else {
|
|
235
297
|
report.needsYou.unshift({ text: `⚠️ Sign-off is STALE (suite changed since ${state.signoff.at}) — re-review and sign off again.`, anchor: { vpId: 'OB-signoff' } });
|
|
236
298
|
}
|
|
237
299
|
}
|
|
300
|
+
// Phase-03 carry-over: a decision that does not verify is a FINDING the gate blocks on, not a crash.
|
|
301
|
+
const decisionFindings = (0, journey_gate_inputs_1.journeyDecisionFindings)(projectRoot, (0, journey_gate_inputs_1.unitOverrides)(projectRoot, unit));
|
|
302
|
+
const next = { unit, auditHash: curHash, waivers: sync.stateWaivers, signoff: state.signoff };
|
|
303
|
+
try {
|
|
304
|
+
(0, legacy_waiver_migration_1.commitWaiverSync)(projectRoot, unit, slug, sync, sp, JSON.stringify(next, null, 2));
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
if (!(err instanceof append_decision_1.DecisionConflictError))
|
|
308
|
+
throw err;
|
|
309
|
+
const rel = path.relative(projectRoot, err.path).split(path.sep).join('/');
|
|
310
|
+
if (!decisionFindings.some((f) => f.path === rel))
|
|
311
|
+
decisionFindings.push({ rule: 'decision.mutated', path: rel, message: err.message });
|
|
312
|
+
}
|
|
313
|
+
if (decisionFindings.length) {
|
|
314
|
+
report.decisionFindings = decisionFindings;
|
|
315
|
+
for (const f of [...decisionFindings].reverse())
|
|
316
|
+
report.needsYou.unshift({ text: (0, journey_gate_inputs_1.decisionFindingText)(f), anchor: { file: f.path } });
|
|
317
|
+
}
|
|
238
318
|
report.nextSuggested = computeNext(report, unit);
|
|
239
|
-
saveState(sp, { unit, auditHash: curHash, waivers: state.waivers, signoff: state.signoff });
|
|
240
319
|
return report;
|
|
241
320
|
}
|
|
321
|
+
/** The single human gate (DOS §3.4, S5): given with `--signoff`, never waived (#936). */
|
|
322
|
+
exports.SIGNOFF_OBLIGATION = 'OB-signoff';
|
|
323
|
+
const signoffCommand = (unit) => `sungen journey --screen ${unit} --signoff --by "<name>"`;
|
|
324
|
+
exports.signoffCommand = signoffCommand;
|
|
325
|
+
/** "Never audited" (T3): a unit is measured by `sungen audit`, never waived through (review W2). */
|
|
326
|
+
exports.CREATE_OBLIGATION = 'OB-create';
|
|
327
|
+
/** Why a waiver can never accept `obId` (and what does instead), or null when it can. */
|
|
328
|
+
function unwaivableWhy(obId, unit) {
|
|
329
|
+
if (obId === exports.SIGNOFF_OBLIGATION)
|
|
330
|
+
return `sign-off is given with --signoff, never waived (${(0, exports.signoffCommand)(unit)})`;
|
|
331
|
+
if (obId === exports.CREATE_OBLIGATION)
|
|
332
|
+
return `an unaudited unit cannot be waived through — re-run \`sungen audit --screen ${unit}\``;
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
/** The review-queue line for a recorded waiver the board does not honour. */
|
|
336
|
+
const ignoredWaiverText = (obId, why, reason) => `⚠️ waiver on ${obId} ignored: ${why}. Was: ${reason}`;
|
|
337
|
+
/**
|
|
338
|
+
* Throws unless `obId` is an obligation of the board that a waiver can accept. Refused in every state,
|
|
339
|
+
* each with what does it instead: OB-signoff (before any audit it is not on the board, after one a
|
|
340
|
+
* waiver would let the human gate be waived away) and OB-create (an unaudited unit would pass every
|
|
341
|
+
* gate on a waiver; the audit measures it).
|
|
342
|
+
*/
|
|
343
|
+
function assertWaivable(report, unit, obId) {
|
|
344
|
+
if (obId === exports.SIGNOFF_OBLIGATION) {
|
|
345
|
+
throw new Error(`${exports.SIGNOFF_OBLIGATION} is the human sign-off — it is given, not waived. Once every other obligation is satisfied or waived, a human runs: ${(0, exports.signoffCommand)(unit)}`);
|
|
346
|
+
}
|
|
347
|
+
if (obId === exports.CREATE_OBLIGATION) {
|
|
348
|
+
throw new Error(`${exports.CREATE_OBLIGATION} means the unit has no audit that counts — an unaudited unit cannot be waived through. Run: sungen audit --screen ${unit}`);
|
|
349
|
+
}
|
|
350
|
+
const valid = report.obligations.map((o) => o.id).filter((id) => id !== exports.SIGNOFF_OBLIGATION && id !== exports.CREATE_OBLIGATION);
|
|
351
|
+
if (!valid.includes(obId)) {
|
|
352
|
+
throw new Error(`Unknown obligation "${obId}". Valid: ${valid.join(', ') || `none — the unit has no audit that counts; run sungen audit --screen ${unit}`}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
242
355
|
/**
|
|
243
356
|
* Waive an obligation — REQUIRES a reason (anti-amnesia: a waiver leaves a recorded "why").
|
|
244
357
|
* Records the current evidence cursor so reconcile can invalidate it if the audit changes.
|
|
@@ -248,36 +361,65 @@ function waive(projectRoot, unit, obId, reason) {
|
|
|
248
361
|
throw new Error('A reason is required to waive (anti-amnesia: a waiver must record WHY). Use --reason "...".');
|
|
249
362
|
}
|
|
250
363
|
const slug = (0, unit_paths_1.reportSlug)(unit);
|
|
251
|
-
const fresh =
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
const sp = statePath(projectRoot, slug);
|
|
257
|
-
const state = loadState(sp) || { unit, auditHash: '', waivers: {} };
|
|
258
|
-
state.waivers[obId] = { reason: reason.trim(), at: new Date().toISOString(), auditHashAtWaive: auditHashOf(projectRoot, slug) };
|
|
259
|
-
saveState(sp, state);
|
|
260
|
-
return runJourney(projectRoot, unit);
|
|
364
|
+
const fresh = runJourney(projectRoot, unit); // stops on a pending migration; imports legacy waivers first
|
|
365
|
+
assertWaivable(fresh, unit, obId);
|
|
366
|
+
const given = { reason: reason.trim(), at: new Date().toISOString(), auditHashAtWaive: auditHashOf(projectRoot, slug) };
|
|
367
|
+
(0, legacy_waiver_migration_1.recordWaiver)(projectRoot, unit, obId, given); // DOS-13.5: the decision layer is the record …
|
|
368
|
+
return runJourney(projectRoot, unit); // … and runJourney dual-writes it to the legacy file
|
|
261
369
|
}
|
|
262
370
|
/**
|
|
263
371
|
* Sign off — the single human gate (S5). Allowed ONLY when every other deliver-required
|
|
264
372
|
* obligation is satisfied or waived (you cannot sign off an unclean suite). Records who/when +
|
|
265
373
|
* the evidence cursor; reconcile invalidates it (stale → re-review) if the suite later changes.
|
|
266
374
|
*/
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const blockers = before.obligations.filter((o) => o.id !== 'OB-signoff' && o.status
|
|
375
|
+
/** Throws unless the board may be signed off: no decision problem, every other obligation accepted. */
|
|
376
|
+
function assertCanSignOff(before) {
|
|
377
|
+
const blockers = before.obligations.filter((o) => o.id !== 'OB-signoff' && !accepted(o.status));
|
|
378
|
+
if (before.decisionFindings?.length) {
|
|
379
|
+
throw new Error(`Cannot sign off — ${before.decisionFindings.length} decision problem(s): ${before.decisionFindings.map((f) => `${f.rule} ${f.path}`).join(', ')}.`);
|
|
380
|
+
}
|
|
270
381
|
if (blockers.length) {
|
|
271
382
|
throw new Error(`Cannot sign off — still open: ${blockers.map((b) => b.id).join(', ')}. Fix, or waive each with a reason, first.`);
|
|
272
383
|
}
|
|
384
|
+
}
|
|
385
|
+
/** Who signs off: `--by`, else the git user; throws when neither names anyone (never `by: unknown`). */
|
|
386
|
+
function signoffSigner(projectRoot, unit, by) {
|
|
387
|
+
const gitUser = (0, decision_source_1.gitUserName)(projectRoot);
|
|
388
|
+
const signer = by?.trim() || gitUser;
|
|
389
|
+
if (signer === 'unknown') {
|
|
390
|
+
throw new Error(`Cannot sign off — no git user.name is set and no --by was given, so the sign-off would name nobody. Say who signs: ${(0, exports.signoffCommand)(unit)}`);
|
|
391
|
+
}
|
|
392
|
+
return { signer, gitUser };
|
|
393
|
+
}
|
|
394
|
+
function signoff(projectRoot, unit, by) {
|
|
395
|
+
// Attribution is not self-declared (review item 4): the git user is always on the record.
|
|
396
|
+
const { signer, gitUser } = signoffSigner(projectRoot, unit, by);
|
|
397
|
+
assertCanSignOff(runJourney(projectRoot, unit));
|
|
273
398
|
const slug = (0, unit_paths_1.reportSlug)(unit);
|
|
274
399
|
const sp = statePath(projectRoot, slug);
|
|
275
400
|
const state = loadState(sp) || { unit, auditHash: '', waivers: {} };
|
|
276
|
-
state.signoff = { by, at: new Date().toISOString(), auditHashAtSignoff: auditHashOf(projectRoot, slug) };
|
|
401
|
+
state.signoff = { by: signer, ...(signer !== gitUser ? { recordedBy: gitUser } : {}), at: new Date().toISOString(), auditHashAtSignoff: auditHashOf(projectRoot, slug) };
|
|
277
402
|
saveState(sp, state);
|
|
278
403
|
return runJourney(projectRoot, unit);
|
|
279
404
|
}
|
|
280
|
-
const
|
|
405
|
+
const UNWRITABLE = new Set(['EACCES', 'EROFS', 'ENOSPC', 'EPERM']);
|
|
406
|
+
/**
|
|
407
|
+
* Write a DERIVED journey file (board, report, roll-up). Best-effort by contract (DOS-13.3): a read-only
|
|
408
|
+
* or full checkout still shows the board — the file is skipped and null returned; any other error throws.
|
|
409
|
+
*/
|
|
410
|
+
function writeJourneyFileBestEffort(file, text) {
|
|
411
|
+
try {
|
|
412
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
413
|
+
fs.writeFileSync(file, text, 'utf-8');
|
|
414
|
+
return file;
|
|
415
|
+
}
|
|
416
|
+
catch (err) {
|
|
417
|
+
if (UNWRITABLE.has(err?.code ?? ''))
|
|
418
|
+
return null;
|
|
419
|
+
throw err;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
const ICON = { satisfied: '✅', 'needs-work': '⚠️ ', pending: '⏳', waived: '🚫', overridden: '🔓' };
|
|
281
423
|
function renderJourneyBoard(r) {
|
|
282
424
|
const L = [];
|
|
283
425
|
L.push(`# Journey — ${r.unit}`);
|
|
@@ -314,25 +456,57 @@ const PHASE_REQUIRED = {
|
|
|
314
456
|
// pre-delivery: everything automated PLUS the single human sign-off (S5).
|
|
315
457
|
deliver: ['OB-spec', 'OB-coverage', 'OB-depth', 'OB-trace', 'OB-automation', 'OB-signoff'],
|
|
316
458
|
};
|
|
459
|
+
/** The catalog rule each phase boundary halts by (OES-11.2): soft, so a reasoned override may lower it. */
|
|
460
|
+
const PHASE_RULE = { create: 'journey.phase-create', run: 'journey.phase-run', deliver: 'journey.phase-deliver' };
|
|
317
461
|
function runGate(projectRoot, unit, phase) {
|
|
318
462
|
const r = runJourney(projectRoot, unit);
|
|
319
463
|
const required = PHASE_REQUIRED[phase];
|
|
320
|
-
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
464
|
+
// T3: a unit never audited (or whose report does not count) is never clean — OB-create blocks every phase.
|
|
465
|
+
const reqObs = r.obligations.filter((o) => required.includes(o.id) || o.id === 'OB-create');
|
|
466
|
+
const asBlocker = (o) => ({ id: o.id, title: o.title, detail: o.detail });
|
|
467
|
+
// Never audited is not something a lowered phase rule may wave through (review M4).
|
|
468
|
+
const neverAudited = reqObs.filter((o) => o.id === 'OB-create' && !accepted(o.status)).map(asBlocker);
|
|
469
|
+
const open = reqObs.filter((o) => o.id !== 'OB-create' && !accepted(o.status)).map(asBlocker);
|
|
470
|
+
const overrides = (0, journey_gate_inputs_1.unitOverrides)(projectRoot, unit);
|
|
471
|
+
// Decision problems are hard rules: no phase override lowers them. At the release boundary an
|
|
472
|
+
// override, waiver or approval git HEAD does not hold is refused too (decision.in-run, review H1).
|
|
473
|
+
const scopes = [decision_file_1.PROJECT_SCOPE, ...(overrides.unitScope ? [overrides.unitScope] : [])];
|
|
474
|
+
const hard = [
|
|
475
|
+
...(r.decisionFindings ?? []).filter((f) => (0, resolve_rule_1.resolveRule)(f.rule).blocking)
|
|
476
|
+
.map((f) => ({ id: f.rule, title: 'Decision integrity', detail: `${f.path} — ${f.message}` })),
|
|
477
|
+
...(phase === 'deliver' && (0, resolve_rule_1.resolveRule)(in_run_decision_check_1.IN_RUN_RULE).blocking ? (0, in_run_decision_check_1.uncommittedReleaseDecisions)(projectRoot, scopes) : [])
|
|
478
|
+
.map((d) => ({ id: in_run_decision_check_1.IN_RUN_RULE, title: 'Decision not reviewed', detail: `${d.kind} ${d.id} (${d.path}) — ${d.why.join('; ')}` })),
|
|
479
|
+
...neverAudited,
|
|
480
|
+
];
|
|
481
|
+
const phaseRule = (0, resolve_rule_1.resolveRule)(PHASE_RULE[phase], overrides.context);
|
|
482
|
+
const blockers = [...hard, ...open];
|
|
483
|
+
const halt = hard.length > 0 || (open.length > 0 && phaseRule.blocking);
|
|
324
484
|
const waivedCredit = reqObs.filter((o) => o.status === 'waived').map((o) => ({ id: o.id, title: o.title }));
|
|
325
|
-
|
|
485
|
+
const overriddenCredit = reqObs.filter((o) => o.status === 'overridden').map((o) => ({ id: o.id, title: o.title, by: o.overriddenBy ?? '' }));
|
|
486
|
+
return {
|
|
487
|
+
unit, phase, status: halt ? 'halt' : 'pass', required, blockers, waivedCredit,
|
|
488
|
+
...(overriddenCredit.length ? { overriddenCredit } : {}),
|
|
489
|
+
...(open.length && phaseRule.overriddenBy ? { phaseOverriddenBy: phaseRule.overriddenBy } : {}),
|
|
490
|
+
};
|
|
326
491
|
}
|
|
327
492
|
function renderGate(v) {
|
|
328
493
|
const L = [];
|
|
329
494
|
L.push('');
|
|
330
495
|
L.push(`━━━ Gate: ${v.unit} @ phase "${v.phase}" → ${v.status === 'pass' ? '✅ PASS' : '⛔ HALT'} ━━━`);
|
|
496
|
+
if (v.phaseOverriddenBy)
|
|
497
|
+
L.push(` Phase rule lowered by ${v.phaseOverriddenBy}: open obligations are advisory (decision problems still block).`);
|
|
331
498
|
if (v.blockers.length) {
|
|
332
|
-
L.push(' Blocking obligations (must be satisfied or explicitly waived):');
|
|
499
|
+
L.push(v.phaseOverriddenBy ? ' Open obligations:' : ' Blocking obligations (must be satisfied or explicitly waived):');
|
|
333
500
|
for (const b of v.blockers)
|
|
334
501
|
L.push(` • ${b.id} ${b.title} — ${b.detail}`);
|
|
335
|
-
|
|
502
|
+
// Name what each kind of blocker takes (#936): never offer to waive the sign-off or "never audited".
|
|
503
|
+
const waivable = v.blockers.map((b) => b.id).filter((id) => id.startsWith('OB-') && id !== exports.SIGNOFF_OBLIGATION && id !== 'OB-create');
|
|
504
|
+
if (waivable.length) {
|
|
505
|
+
L.push(` → Self-correct (repair / run-test), or, if accepted, waive with a reason: \`sungen journey --screen ${v.unit} --waive ${waivable.length === 1 ? waivable[0] : `<${waivable.join('|')}>`} --reason "..."\`.`);
|
|
506
|
+
}
|
|
507
|
+
if (v.blockers.some((b) => b.id === exports.SIGNOFF_OBLIGATION)) {
|
|
508
|
+
L.push(` → Human sign-off: once everything else is satisfied or waived, a human runs \`${(0, exports.signoffCommand)(v.unit)}\`.`);
|
|
509
|
+
}
|
|
336
510
|
}
|
|
337
511
|
else {
|
|
338
512
|
L.push(' All required obligations satisfied' + (v.waivedCredit.length ? ` (${v.waivedCredit.length} accepted via waiver)` : '') + '.');
|
|
@@ -363,7 +537,7 @@ function rollupJourney(projectRoot) {
|
|
|
363
537
|
return listUnits(projectRoot).map(({ unit, kind }) => {
|
|
364
538
|
const r = runJourney(projectRoot, unit);
|
|
365
539
|
const signedOff = r.obligations.find((o) => o.id === 'OB-signoff')?.status === 'satisfied';
|
|
366
|
-
const obligationsOpen = r.obligations.filter((o) => o.id !== 'OB-signoff' && o.status
|
|
540
|
+
const obligationsOpen = r.obligations.filter((o) => o.id !== 'OB-signoff' && !accepted(o.status)).length;
|
|
367
541
|
return {
|
|
368
542
|
unit, kind, score: r.score, gateStatus: r.gateStatus, youAreHere: r.youAreHere,
|
|
369
543
|
obligationsOpen, reviewQueue: r.needsYou.length, signedOff,
|