@sun-asterisk/sungen 3.2.34-beta.1 → 3.3.0-alpha.1
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/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 +3 -29
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/capability.js +1 -1
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/contract-derive-command.d.ts +10 -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/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +52 -3
- 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 +41 -13
- 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 +64 -6
- package/dist/cli/commands/next.js.map +1 -1
- 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 +20 -35
- package/dist/cli/index.js.map +1 -1
- 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 +30 -0
- package/dist/contract/derive-free-feature.d.ts.map +1 -0
- package/dist/contract/derive-free-feature.js +145 -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 +35 -0
- package/dist/contract/trace/trace-file-reader.d.ts.map +1 -0
- package/dist/contract/trace/trace-file-reader.js +155 -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 +27 -0
- package/dist/contract/trace/trace-run-record.d.ts.map +1 -0
- package/dist/contract/trace/trace-run-record.js +115 -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 +41 -0
- package/dist/contract/trace/trace-zip-limits.d.ts.map +1 -0
- package/dist/contract/trace/trace-zip-limits.js +48 -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 +30 -0
- package/dist/decisions/confirmed-decision-commands.d.ts.map +1 -0
- package/dist/decisions/confirmed-decision-commands.js +172 -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 +33 -0
- package/dist/decisions/human-confirmation.d.ts.map +1 -0
- package/dist/decisions/human-confirmation.js +155 -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/matrix/build.d.ts +3 -0
- package/dist/exporters/matrix/build.d.ts.map +1 -1
- package/dist/exporters/matrix/build.js +10 -9
- package/dist/exporters/matrix/build.js.map +1 -1
- package/dist/exporters/matrix/export.d.ts +3 -0
- package/dist/exporters/matrix/export.d.ts.map +1 -1
- package/dist/exporters/matrix/export.js +2 -0
- 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 +3 -0
- 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 +3 -0
- package/dist/exporters/matrix/render-xlsx.js.map +1 -1
- package/dist/exporters/matrix/types.d.ts +4 -1
- package/dist/exporters/matrix/types.d.ts.map +1 -1
- package/dist/exporters/matrix/types.js.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 +21 -0
- package/dist/graph/evaluate-graph.d.ts.map +1 -0
- package/dist/graph/evaluate-graph.js +49 -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 +59 -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 +19 -0
- package/dist/graph/nodes/test-case-contract-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/test-case-contract-nodes.js +56 -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 +20 -0
- package/dist/graph/nodes/unit-contract-node.d.ts.map +1 -0
- package/dist/graph/nodes/unit-contract-node.js +81 -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 +90 -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 +18 -17
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/catalog/gate-rules.yaml +647 -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 +32 -0
- package/dist/harness/gates/audit-report-verification.d.ts.map +1 -0
- package/dist/harness/gates/audit-report-verification.js +207 -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 +29 -0
- package/dist/harness/gates/delivery-decision-gate.d.ts.map +1 -0
- package/dist/harness/gates/delivery-decision-gate.js +91 -0
- package/dist/harness/gates/delivery-decision-gate.js.map +1 -0
- package/dist/harness/gates/delivery-decision-step.d.ts +16 -0
- package/dist/harness/gates/delivery-decision-step.d.ts.map +1 -0
- package/dist/harness/gates/delivery-decision-step.js +71 -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 +24 -1
- package/dist/harness/journey.d.ts.map +1 -1
- package/dist/harness/journey.js +114 -23
- 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 +71 -43
- package/dist/harness/manifest.js.map +1 -1
- package/dist/harness/next-step.d.ts +39 -6
- package/dist/harness/next-step.d.ts.map +1 -1
- package/dist/harness/next-step.js +34 -218
- package/dist/harness/next-step.js.map +1 -1
- package/dist/harness/parse.d.ts +10 -6
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +22 -11
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/script-check.d.ts.map +1 -1
- package/dist/harness/script-check.js +22 -5
- 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 +50 -49
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/viewpoint-baseline.d.ts.map +1 -1
- package/dist/harness/viewpoint-baseline.js +1 -7
- package/dist/harness/viewpoint-baseline.js.map +1 -1
- package/dist/harness/viewpoint-ledger.d.ts +3 -13
- package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
- package/dist/harness/viewpoint-ledger.js +8 -38
- 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 +106 -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 +37 -0
- package/dist/hooks/hand-back-core.d.ts.map +1 -0
- package/dist/hooks/hand-back-core.js +115 -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 +55 -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/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/flow-manager.d.ts +1 -0
- package/dist/orchestrator/flow-manager.d.ts.map +1 -1
- package/dist/orchestrator/flow-manager.js +52 -3
- package/dist/orchestrator/flow-manager.js.map +1 -1
- 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 +23 -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 +52 -4
- 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 +36 -46
- 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 +6 -8
- 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-harness-audit/SKILL.md +1 -3
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +0 -18
- package/dist/orchestrator/templates/claude-hooks/sungen-hook.cjs +64 -0
- package/dist/orchestrator/viewpoint-pattern-catalog.d.ts +1 -4
- package/dist/orchestrator/viewpoint-pattern-catalog.d.ts.map +1 -1
- package/dist/orchestrator/viewpoint-pattern-catalog.js +2 -5
- package/dist/orchestrator/viewpoint-pattern-catalog.js.map +1 -1
- 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/registry.ts +16 -0
- package/src/cli/commands/audit.ts +3 -26
- package/src/cli/commands/capability.ts +1 -1
- package/src/cli/commands/contract-derive-command.ts +60 -0
- package/src/cli/commands/contract.ts +130 -0
- package/src/cli/commands/delivery.ts +52 -3
- package/src/cli/commands/generate.ts +3 -1
- package/src/cli/commands/journey.ts +39 -14
- package/src/cli/commands/next.ts +60 -8
- package/src/cli/commands/update.ts +35 -8
- package/src/cli/index.ts +20 -32
- 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 +110 -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 +103 -0
- package/src/contract/trace/trace-binding.ts +56 -0
- package/src/contract/trace/trace-file-reader.ts +123 -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 +74 -0
- package/src/contract/trace/trace-steps.ts +88 -0
- package/src/contract/trace/trace-zip-limits.ts +73 -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 +128 -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 +114 -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/matrix/build.ts +11 -9
- package/src/exporters/matrix/export.ts +5 -0
- package/src/exporters/matrix/gates.ts +62 -129
- package/src/exporters/matrix/render-csv.ts +3 -0
- package/src/exporters/matrix/render-gate-overrides-sheet.ts +50 -0
- package/src/exporters/matrix/render-xlsx.ts +3 -0
- package/src/exporters/matrix/types.ts +4 -1
- package/src/generators/test-generator/code-generator.ts +13 -0
- package/src/graph/evaluate-graph.ts +62 -0
- package/src/graph/locate-finding.ts +93 -0
- package/src/graph/node-decl.ts +65 -0
- package/src/graph/nodes/core-node-catalog.ts +15 -0
- package/src/graph/nodes/test-case-contract-nodes.ts +69 -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 +82 -0
- package/src/graph/nodes/unit-design-nodes.ts +88 -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 +29 -18
- package/src/harness/catalog/gate-rules.yaml +647 -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 +173 -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 +111 -0
- package/src/harness/gates/delivery-decision-step.ts +73 -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 +122 -27
- package/src/harness/manifest.ts +67 -43
- package/src/harness/next-step.ts +59 -210
- package/src/harness/parse.ts +25 -15
- package/src/harness/script-check.ts +20 -5
- package/src/harness/sensors.ts +55 -49
- package/src/harness/viewpoint-baseline.ts +1 -7
- package/src/harness/viewpoint-ledger.ts +11 -52
- 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 +70 -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 +106 -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 +54 -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/claude-hooks-install.ts +168 -0
- package/src/orchestrator/flow-manager.ts +53 -3
- package/src/orchestrator/lockstep-version.ts +28 -15
- package/src/orchestrator/project-initializer.ts +21 -0
- package/src/orchestrator/screen-manager.ts +52 -4
- 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 +36 -46
- 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 +6 -8
- 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-harness-audit/SKILL.md +1 -3
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +0 -18
- package/src/orchestrator/templates/claude-hooks/sungen-hook.cjs +64 -0
- package/src/orchestrator/viewpoint-pattern-catalog.ts +2 -5
- package/src/utils/safe-yaml-parse.ts +44 -0
- package/dist/cli/commands/viewpoint.d.ts +0 -7
- package/dist/cli/commands/viewpoint.d.ts.map +0 -1
- package/dist/cli/commands/viewpoint.js +0 -70
- package/dist/cli/commands/viewpoint.js.map +0 -1
- package/dist/harness/viewpoint-draft-header.d.ts +0 -7
- package/dist/harness/viewpoint-draft-header.d.ts.map +0 -1
- package/dist/harness/viewpoint-draft-header.js +0 -100
- package/dist/harness/viewpoint-draft-header.js.map +0 -1
- package/dist/harness/viewpoint-mode.d.ts +0 -9
- package/dist/harness/viewpoint-mode.d.ts.map +0 -1
- package/dist/harness/viewpoint-mode.js +0 -52
- package/dist/harness/viewpoint-mode.js.map +0 -1
- package/dist/harness/viewpoint-priority.d.ts +0 -19
- package/dist/harness/viewpoint-priority.d.ts.map +0 -1
- package/dist/harness/viewpoint-priority.js +0 -36
- package/dist/harness/viewpoint-priority.js.map +0 -1
- package/dist/harness/viewpoint-review-open.d.ts +0 -6
- package/dist/harness/viewpoint-review-open.d.ts.map +0 -1
- package/dist/harness/viewpoint-review-open.js +0 -90
- package/dist/harness/viewpoint-review-open.js.map +0 -1
- package/dist/harness/viewpoint-scan-refs.d.ts +0 -50
- package/dist/harness/viewpoint-scan-refs.d.ts.map +0 -1
- package/dist/harness/viewpoint-scan-refs.js +0 -200
- package/dist/harness/viewpoint-scan-refs.js.map +0 -1
- package/dist/harness/viewpoint-scan.d.ts +0 -41
- package/dist/harness/viewpoint-scan.d.ts.map +0 -1
- package/dist/harness/viewpoint-scan.js +0 -118
- package/dist/harness/viewpoint-scan.js.map +0 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/review-checklist.md +0 -63
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/viewpoint-template.md +0 -158
- package/dist/orchestrator/viewpoint-scaffold.d.ts +0 -3
- package/dist/orchestrator/viewpoint-scaffold.d.ts.map +0 -1
- package/dist/orchestrator/viewpoint-scaffold.js +0 -70
- package/dist/orchestrator/viewpoint-scaffold.js.map +0 -1
- package/src/cli/commands/viewpoint.ts +0 -58
- package/src/harness/viewpoint-draft-header.ts +0 -55
- package/src/harness/viewpoint-mode.ts +0 -49
- package/src/harness/viewpoint-priority.ts +0 -38
- package/src/harness/viewpoint-review-open.ts +0 -51
- package/src/harness/viewpoint-scan-refs.ts +0 -154
- package/src/harness/viewpoint-scan.ts +0 -111
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/review-checklist.md +0 -63
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/viewpoint-template.md +0 -158
- package/src/orchestrator/viewpoint-scaffold.ts +0 -36
package/src/harness/next-step.ts
CHANGED
|
@@ -16,12 +16,17 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import * as fs from 'fs';
|
|
18
18
|
import * as path from 'path';
|
|
19
|
-
import {
|
|
20
|
-
import { reportSlug, featureFilesFor } from './unit-paths';
|
|
21
|
-
import { readTextFile } from './read-text';
|
|
19
|
+
import { reportSlug } from './unit-paths';
|
|
22
20
|
import { checkAssetsDrift } from '../orchestrator/assets-drift';
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
21
|
+
import type { HeadSnapshot } from '../contract/contract-git';
|
|
22
|
+
import { evaluateGraph, EvaluateOptions } from '../graph/evaluate-graph';
|
|
23
|
+
import { CORE_NODES } from '../graph/nodes/core-node-catalog';
|
|
24
|
+
import type { TestCaseState } from '../graph/test-case-state-shape';
|
|
25
|
+
import { testCaseStates } from '../graph/test-case-states';
|
|
26
|
+
import {
|
|
27
|
+
countFailedResults, countScenarios, hasDeliverableFor, hasResolvedSelector, isCompiled, readIfExists, unitResultFiles,
|
|
28
|
+
} from '../graph/unit-artifact-probes';
|
|
29
|
+
import { AuditNotCounted, ContractFacts, ContractSummary, readContractFacts, readTrustedAudit } from '../graph/unit-state-facts';
|
|
25
30
|
|
|
26
31
|
export interface NextStep {
|
|
27
32
|
/** The command to run, as the operator would type it. */
|
|
@@ -36,6 +41,13 @@ export interface NextStep {
|
|
|
36
41
|
* in the same session (#660).
|
|
37
42
|
*/
|
|
38
43
|
kind: 'do' | 'blocked' | 'optional' | 'decide';
|
|
44
|
+
/** The graph node that produced the step (OES-10.1). `--json` detail; the text never shows it. */
|
|
45
|
+
nodeId?: string;
|
|
46
|
+
granularity?: 'unit' | 'test-case';
|
|
47
|
+
/** The one test case the step is about (`sungen next <unit> --case <id>`). */
|
|
48
|
+
testCase?: string;
|
|
49
|
+
/** Catalog rule ids (gate-rules.yaml) the step answers to. */
|
|
50
|
+
gates?: string[];
|
|
39
51
|
}
|
|
40
52
|
|
|
41
53
|
export interface UnitState {
|
|
@@ -43,8 +55,6 @@ export interface UnitState {
|
|
|
43
55
|
kind: 'screen' | 'flow' | 'api';
|
|
44
56
|
hasSpec: boolean;
|
|
45
57
|
hasViewpoint: boolean;
|
|
46
|
-
/** test-viewpoint.md carries `drafted-by: ai` — written by the AI, not yet accepted by a QA. */
|
|
47
|
-
viewpointIsAiDraft?: boolean;
|
|
48
58
|
hasContract: boolean;
|
|
49
59
|
hasFlowInventory: boolean;
|
|
50
60
|
scenarioCount: number;
|
|
@@ -52,6 +62,13 @@ export interface UnitState {
|
|
|
52
62
|
selectorsArePlaceholder: boolean;
|
|
53
63
|
compiled: boolean;
|
|
54
64
|
hasResults: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Scenarios whose FINAL attempt failed (failed · timedOut · interrupted) across the unit's result
|
|
67
|
+
* files — a retried pass is not a failure. Any failure puts `sungen triage` in the path: with only
|
|
68
|
+
* "optional" left after a deliverable, a red run read as done and its reds reached the export
|
|
69
|
+
* unclassified. Absent when the state was not read from disk.
|
|
70
|
+
*/
|
|
71
|
+
failedCount?: number;
|
|
55
72
|
hasDeliverable: boolean;
|
|
56
73
|
audit?: {
|
|
57
74
|
overall: number;
|
|
@@ -66,94 +83,42 @@ export interface UnitState {
|
|
|
66
83
|
* warning is one grey stderr line at the top of every command (#620).
|
|
67
84
|
*/
|
|
68
85
|
assetsDrift?: { recordedVersion: string; runningVersion: string };
|
|
86
|
+
/** An audit report exists but does not count (stale, untrusted) — gate and delivery block on it too. */
|
|
87
|
+
auditNotCounted?: AuditNotCounted;
|
|
88
|
+
/** The rebuilt Test Contract verdict (DOS-14.4); absent when not read from disk or no scenario exists. */
|
|
89
|
+
contract?: ContractSummary;
|
|
90
|
+
/** Per-test-case state (DOS-11.1); absent when not read from disk or unreadable. */
|
|
91
|
+
testCases?: TestCaseState[];
|
|
69
92
|
steps: NextStep[];
|
|
70
93
|
}
|
|
71
94
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
try {
|
|
76
|
-
return JSON.parse(readTextFile(p)) as Record<string, unknown>;
|
|
77
|
-
} catch {
|
|
78
|
-
return null; // absent or unreadable — treated as "not run"
|
|
79
|
-
}
|
|
95
|
+
export interface ReadUnitStateOptions {
|
|
96
|
+
/** git HEAD read once for many units (`sungen next` with no unit). */
|
|
97
|
+
gitSnapshot?: HeadSnapshot;
|
|
80
98
|
}
|
|
81
99
|
|
|
82
|
-
|
|
83
|
-
let n = 0;
|
|
84
|
-
for (const f of featureFilesFor(unitDir, unit)) {
|
|
85
|
-
const text = fs.existsSync(f) ? readTextFile(f) : '';
|
|
86
|
-
n += (text.match(/^\s*Scenario(?: Outline)?:/gm) ?? []).length;
|
|
87
|
-
}
|
|
88
|
-
return n;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Everything the resolver needs, read from disk. `unitId` is the catalog id
|
|
93
|
-
* (`<screen>` · `flows/<f>` · `api/<a>`); `unitDir` is its directory.
|
|
94
|
-
*/
|
|
95
|
-
const RESULT_FILE = /-test-result(?:\.[^.]+)*\.json$/;
|
|
100
|
+
const exists = (p: string): boolean => fs.existsSync(p);
|
|
96
101
|
|
|
97
102
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
103
|
+
* Everything the resolver needs, read from disk. `unit` is the catalog id
|
|
104
|
+
* (`<screen>` · `flows/<f>` · `api/<a>`); `unitDir` is its directory. The audit report is read
|
|
105
|
+
* through verifyAuditReport, as `sungen gate` and `sungen delivery` read it: a stale or untrusted
|
|
106
|
+
* report counts as never audited (OES-11.4) and is named in `auditNotCounted`.
|
|
102
107
|
*/
|
|
103
|
-
function hasResolvedSelector(selectorText: string): boolean {
|
|
104
|
-
let doc: unknown;
|
|
105
|
-
try { doc = parseYaml(selectorText); } catch { return selectorText.trim().length >= 40; }
|
|
106
|
-
if (!doc || typeof doc !== 'object') return false;
|
|
107
|
-
// A real cell, not a marker left to be filled in. Numbers count (an id or index can be numeric).
|
|
108
|
-
const real = (v: unknown): boolean => (typeof v === 'string' || typeof v === 'number')
|
|
109
|
-
&& String(v).trim() !== '' && !/^(?:todo|tbd|placeholder|replace me)$/i.test(String(v).trim());
|
|
110
|
-
return Object.values(doc as Record<string, unknown>).some((e) => {
|
|
111
|
-
if (!e || typeof e !== 'object') return false;
|
|
112
|
-
const { type, value, name, locator } = e as { type?: unknown; value?: unknown; name?: unknown; locator?: unknown };
|
|
113
|
-
// Every SelectorEntry shape: a CSS `locator`, or a non-page `type` with a value or a role name.
|
|
114
|
-
return real(locator) || (typeof type === 'string' && type !== 'page' && (real(value) || real(name)));
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
|
|
118
108
|
export function readUnitState(
|
|
119
|
-
projectRoot: string, unitDir: string, unit: string, kind: UnitState['kind'],
|
|
109
|
+
projectRoot: string, unitDir: string, unit: string, kind: UnitState['kind'], opts: ReadUnitStateOptions = {},
|
|
120
110
|
): UnitState {
|
|
121
111
|
const req = path.join(unitDir, 'requirements');
|
|
122
112
|
const slug = reportSlug(unit);
|
|
123
|
-
const audit =
|
|
113
|
+
const { report: audit, notCounted } = readTrustedAudit(projectRoot, unit);
|
|
124
114
|
const selectorsDir = path.join(unitDir, 'selectors');
|
|
125
115
|
let selectorFiles: string[] = [];
|
|
126
116
|
try {
|
|
127
117
|
selectorFiles = fs.readdirSync(selectorsDir).filter((f) => f.endsWith('.yaml'));
|
|
128
118
|
} catch { /* api units carry no selectors */ }
|
|
129
|
-
|
|
130
|
-
// point in a unit's life — the resolver exists to report exactly that, so it must not crash on it.
|
|
131
|
-
const read = (p: string): string => (fs.existsSync(p) ? readTextFile(p) : '');
|
|
132
|
-
const selectorTexts = selectorFiles.map((f) => read(path.join(selectorsDir, f)));
|
|
119
|
+
const selectorTexts = selectorFiles.map((f) => readIfExists(path.join(selectorsDir, f)));
|
|
133
120
|
const contractPath = path.join(req, 'flow-contract.yaml');
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
const specDirs = [
|
|
137
|
-
path.join(projectRoot, 'specs', 'generated', 'flows', unit),
|
|
138
|
-
path.join(projectRoot, 'specs', 'generated', unit),
|
|
139
|
-
];
|
|
140
|
-
const compiled = specDirs.some((d) => {
|
|
141
|
-
try {
|
|
142
|
-
return fs.readdirSync(d).some((f) => f.endsWith('.spec.ts'));
|
|
143
|
-
} catch { return false; }
|
|
144
|
-
});
|
|
145
|
-
const hasResults = specDirs.some((d) => {
|
|
146
|
-
try {
|
|
147
|
-
// `<f>-test-result[.<os>][.<env>].json` — a mobile run writes the OS into the name, an env
|
|
148
|
-
// run (SUNGEN_ENV=staging) the env; both are runs (#868).
|
|
149
|
-
return fs.readdirSync(d).some((f) => RESULT_FILE.test(f));
|
|
150
|
-
} catch { return false; }
|
|
151
|
-
});
|
|
152
|
-
let hasDeliverable = false;
|
|
153
|
-
try {
|
|
154
|
-
hasDeliverable = fs.readdirSync(path.join(projectRoot, 'qa', 'deliverables'))
|
|
155
|
-
.some((f) => f.startsWith(`${slug}-`));
|
|
156
|
-
} catch { /* nothing exported yet */ }
|
|
121
|
+
const resultFiles = unitResultFiles(projectRoot, unit);
|
|
157
122
|
|
|
158
123
|
const score = (audit?.score ?? {}) as { overall?: number };
|
|
159
124
|
const baseline = (audit?.viewpointBaseline ?? {}) as { status?: string };
|
|
@@ -161,19 +126,19 @@ export function readUnitState(
|
|
|
161
126
|
unit, kind,
|
|
162
127
|
hasSpec: exists(path.join(req, 'spec.md')),
|
|
163
128
|
hasViewpoint: exists(path.join(req, 'test-viewpoint.md')),
|
|
164
|
-
// An id-less draft has nothing to accept: only the missing-yardstick step speaks for it.
|
|
165
|
-
viewpointIsAiDraft: viewpointFileIsAiDraft(path.join(req, 'test-viewpoint.md'))
|
|
166
|
-
&& readViewpointDeclaration(path.join(req, 'test-viewpoint.md')) !== null,
|
|
167
129
|
hasContract: exists(contractPath),
|
|
168
130
|
// A contract WITHOUT `flows:` can only be scored per phase, which is a materially weaker
|
|
169
131
|
// claim — so it is part of the state, not a detail.
|
|
170
|
-
hasFlowInventory: /^\s*flows:\s*$/m.test(
|
|
132
|
+
hasFlowInventory: /^\s*flows:\s*$/m.test(readIfExists(contractPath)),
|
|
171
133
|
scenarioCount: countScenarios(unitDir, unit),
|
|
172
134
|
hasSelectors: selectorFiles.length > 0,
|
|
173
135
|
// A scaffolded selector file exists but resolves nothing; treating it as "done" is what
|
|
174
136
|
// makes a run look further along than it is.
|
|
175
137
|
selectorsArePlaceholder: selectorFiles.length > 0 && !selectorTexts.some(hasResolvedSelector),
|
|
176
|
-
compiled
|
|
138
|
+
compiled: isCompiled(projectRoot, unit),
|
|
139
|
+
hasResults: resultFiles.length > 0,
|
|
140
|
+
failedCount: countFailedResults(resultFiles),
|
|
141
|
+
hasDeliverable: hasDeliverableFor(projectRoot, slug),
|
|
177
142
|
assetsDrift: (() => {
|
|
178
143
|
const d = checkAssetsDrift(projectRoot);
|
|
179
144
|
return d && d.recordedVersion !== d.runningVersion
|
|
@@ -188,140 +153,24 @@ export function readUnitState(
|
|
|
188
153
|
viewpointBaselineStatus: baseline.status,
|
|
189
154
|
}
|
|
190
155
|
: undefined,
|
|
156
|
+
...(notCounted ? { auditNotCounted: notCounted } : {}),
|
|
191
157
|
steps: [],
|
|
192
158
|
};
|
|
159
|
+
let contract: ContractFacts | undefined;
|
|
160
|
+
if (state.scenarioCount > 0) state.contract = (contract = readContractFacts(projectRoot, unit, unitDir, opts.gitSnapshot)).summary;
|
|
161
|
+
try {
|
|
162
|
+
state.testCases = testCaseStates(projectRoot, unit, { unitDir, auditFindings: state.audit?.findings ?? [] })
|
|
163
|
+
.map((tc) => (contract?.cases.has(tc.id) ? { ...tc, contract: contract.cases.get(tc.id) } : tc));
|
|
164
|
+
} catch { /* an unparseable .feature — the unit-level nodes still answer, as before test-case state */ }
|
|
193
165
|
state.steps = deriveSteps(state);
|
|
194
166
|
return state;
|
|
195
167
|
}
|
|
196
168
|
|
|
197
|
-
/** The finding codes worth naming in a next step — each maps to a specific repair. */
|
|
198
|
-
const REPAIRABLE = [
|
|
199
|
-
'FLOW-CONTRACT-MISSING', 'FLOW-INVENTORY-MISSING', 'FLOW-UNCOVERED', 'FLOW-UNDECLARED',
|
|
200
|
-
'FLOW-PHASE-MISFILED', 'FLOW-GUARANTEE-MISSING', 'FLOW-OUTCOME-UNPROVEN', 'CONTINUITY-ONE-SIDED',
|
|
201
|
-
'ORACLE-URL-ONLY',
|
|
202
|
-
'SPEC-RESTATED-UNVERIFIED', 'VIEWPOINT-GESTURE-SUBSTITUTED', 'SPEC-UNCOVERED', 'SPEC-CLAUSE-UNCOVERED',
|
|
203
|
-
'TRIGGER-UNCOVERED', 'PERMISSION-PAIR-MISSING', 'VISIBILITY-PAIR-MISSING',
|
|
204
|
-
'VIEWPOINT-ITEM-MISSING', 'MANUAL-CODE-MISSING', 'MANUAL-AUTOMATABLE', 'DEPTH-DEFERRED',
|
|
205
|
-
'UI-INVENTORY-MISSING', 'UI-INVENTORY-INCOMPLETE', 'UI-ITEM-UNCOVERED',
|
|
206
|
-
];
|
|
207
|
-
|
|
208
169
|
/**
|
|
209
|
-
* The ordered answer
|
|
210
|
-
*
|
|
170
|
+
* The ordered answer — earliest unmet precondition first, so the list reads as a path rather than a
|
|
171
|
+
* menu. Evaluated over the internal node graph (src/graph, OES-10.1): each former if/return branch
|
|
172
|
+
* is one node, and an open blocking node cuts everything after it, exactly as the `return`s did.
|
|
211
173
|
*/
|
|
212
|
-
export function deriveSteps(s: UnitState): NextStep[] {
|
|
213
|
-
|
|
214
|
-
const design = s.kind === 'api' ? `/sungen:create-test ${s.unit}` : `/sungen:create-test ${s.unit}`;
|
|
215
|
-
|
|
216
|
-
if (!s.hasSpec && !s.hasViewpoint) {
|
|
217
|
-
out.push({
|
|
218
|
-
kind: 'blocked',
|
|
219
|
-
command: `write qa/${s.kind === 'screen' ? 'screens' : s.kind === 'flow' ? 'flows' : 'api'}/${s.unit}/requirements/spec.md`,
|
|
220
|
-
because: 'the unit has neither a spec nor a test-viewpoint, so there is nothing to generate FROM — generation without a source invents behaviour',
|
|
221
|
-
});
|
|
222
|
-
return out;
|
|
223
|
-
}
|
|
224
|
-
// Stale AI assets come FIRST, because they invalidate the advice below: a HARD RULE added to
|
|
225
|
-
// `create-test` reaches nobody until `sungen update` runs, so the run that follows will repeat
|
|
226
|
-
// whatever the old instructions said. Upgrading the package alone does not refresh them, and the
|
|
227
|
-
// existing warning is one grey stderr line among a command's whole output (#620).
|
|
228
|
-
if (s.assetsDrift) {
|
|
229
|
-
out.push({
|
|
230
|
-
kind: 'do',
|
|
231
|
-
command: 'sungen update',
|
|
232
|
-
because: `this project's AI commands/skills were written by sungen ${s.assetsDrift.recordedVersion} and you are running ${s.assetsDrift.runningVersion} — upgrading the package does NOT refresh them, so any rule added since ${s.assetsDrift.recordedVersion} is not in effect for the next run`,
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
// The yardstick. `atomicLedger` and `traceability` are measured against test-viewpoint.md and
|
|
236
|
-
// four sensors read it, so its absence is not cosmetic — and it can go missing from a unit that
|
|
237
|
-
// already HAS a spec (a run deleted it), which the "no source at all" branch above never sees.
|
|
238
|
-
if (!s.hasViewpoint) {
|
|
239
|
-
out.push({
|
|
240
|
-
kind: 'blocked',
|
|
241
|
-
command: s.kind === 'flow'
|
|
242
|
-
? `sungen add-flow --flow ${s.unit} --path <start-url> # repairs the missing scaffold; never overwrites`
|
|
243
|
-
: `write qa/screens/${s.unit}/requirements/test-viewpoint.md`,
|
|
244
|
-
because: 'requirements/test-viewpoint.md is missing — it is the yardstick `atomicLedger` and `traceability` are measured against, and four sensors read it, so the audit reports VIEWPOINT-MISSING and those axes are excluded. A flow contract does not substitute: it declares the use case, the viewpoint declares the claims',
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
if (s.kind === 'flow' && !s.hasContract) {
|
|
248
|
-
out.push({
|
|
249
|
-
kind: 'blocked',
|
|
250
|
-
command: `author requirements/flow-contract.yaml, then ${design}`,
|
|
251
|
-
because: 'a flow with no contract is scored as a generic screen against page-type themes a journey cannot have (FLOW-CONTRACT-MISSING)',
|
|
252
|
-
});
|
|
253
|
-
return out;
|
|
254
|
-
}
|
|
255
|
-
// Before any generation: the AI drafts the viewpoint and audits it BEFORE it writes scenarios, so
|
|
256
|
-
// this is exactly where a draft would otherwise be accepted by the process that wrote it.
|
|
257
|
-
if (s.viewpointIsAiDraft) {
|
|
258
|
-
out.push({
|
|
259
|
-
kind: 'decide',
|
|
260
|
-
command: `sungen audit --screen ${s.unit} --accept-viewpoint`,
|
|
261
|
-
because: 'test-viewpoint.md is marked `drafted-by: ai` — nobody has reviewed it, so the ledger and traceability axes are held as unverified. A QA reviews the claims (adds what matters, deletes what does not), then accepts; the command records the baseline and removes the marker. A decision, not a step: an agent presents it and does not run it',
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
if (s.scenarioCount === 0) {
|
|
265
|
-
out.push({ kind: 'do', command: design, because: 'no scenarios exist yet' });
|
|
266
|
-
return out;
|
|
267
|
-
}
|
|
268
|
-
if (s.kind === 'flow' && !s.hasFlowInventory) {
|
|
269
|
-
out.push({
|
|
270
|
-
kind: 'do',
|
|
271
|
-
command: `add \`flows:\` to requirements/flow-contract.yaml, then sungen audit --screen ${s.unit}`,
|
|
272
|
-
because: 'without the inventory, coverage is measured per PHASE — and a phase counts as covered as soon as one scenario carries it, so the number cannot tell you a flow is missing',
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
if (!s.audit) {
|
|
276
|
-
out.push({ kind: 'do', command: `sungen audit --screen ${s.unit}`, because: 'the suite has never been measured' });
|
|
277
|
-
return out;
|
|
278
|
-
}
|
|
279
|
-
if (s.audit.viewpointBaselineStatus === 'changed' && !s.viewpointIsAiDraft) { // the draft's own decide step is already above
|
|
280
|
-
out.push({
|
|
281
|
-
kind: 'decide',
|
|
282
|
-
command: `sungen audit --screen ${s.unit} --accept-viewpoint`,
|
|
283
|
-
because: 'test-viewpoint.md changed since the accepted baseline, so the ledger and traceability axes are not evidence until a QA confirms the new declaration. A decision, not a step: an agent presents it and does not run it — accepting the yardstick you just wrote makes both axes read 100% by construction',
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
const repair = s.audit.findings
|
|
287
|
-
.map((f) => f.split(':')[0].trim())
|
|
288
|
-
.filter((code) => REPAIRABLE.includes(code));
|
|
289
|
-
if (repair.length > 0) {
|
|
290
|
-
out.push({
|
|
291
|
-
kind: 'do',
|
|
292
|
-
command: `repair, then sungen audit --screen ${s.unit}`,
|
|
293
|
-
because: `${repair.length} finding(s) name a specific repair: ${[...new Set(repair)].slice(0, 4).join(', ')}`,
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
if (s.audit.gateStatus === 'FAIL') {
|
|
297
|
-
out.push({
|
|
298
|
-
kind: 'blocked',
|
|
299
|
-
command: `repair the gate, then sungen audit --screen ${s.unit}`,
|
|
300
|
-
because: `the viewpoint gate is FAIL at ${s.audit.overall}/10 — running tests against a design that fails its own gate measures the wrong thing`,
|
|
301
|
-
});
|
|
302
|
-
return out;
|
|
303
|
-
}
|
|
304
|
-
if (s.kind !== 'api' && (!s.hasSelectors || s.selectorsArePlaceholder)) {
|
|
305
|
-
out.push({
|
|
306
|
-
kind: 'do',
|
|
307
|
-
command: `/sungen:run-test ${s.unit}`,
|
|
308
|
-
because: s.hasSelectors
|
|
309
|
-
? 'the selector file is still a placeholder, so nothing resolves against a live page'
|
|
310
|
-
: 'no selectors exist yet — run-test generates them from the live page, compiles and auto-fixes',
|
|
311
|
-
});
|
|
312
|
-
return out;
|
|
313
|
-
}
|
|
314
|
-
if (!s.compiled) {
|
|
315
|
-
out.push({ kind: 'do', command: `sungen generate --${s.kind === 'flow' ? 'flow' : 'screen'} ${s.unit}`, because: 'the suite has not been compiled to a spec yet' });
|
|
316
|
-
return out;
|
|
317
|
-
}
|
|
318
|
-
if (!s.hasResults) {
|
|
319
|
-
out.push({ kind: 'do', command: `/sungen:run-test ${s.unit}`, because: 'the compiled spec has never been run, so every case is Pending' });
|
|
320
|
-
return out;
|
|
321
|
-
}
|
|
322
|
-
if (!s.hasDeliverable) {
|
|
323
|
-
out.push({ kind: 'do', command: `/sungen:delivery ${s.unit}`, because: 'results exist but have not been exported to the Test Case & Coverage Matrix' });
|
|
324
|
-
}
|
|
325
|
-
out.push({ kind: 'optional', command: `/sungen:create-test ${s.unit}`, because: 'extend coverage — the next tier, or the flows the inventory still lists as pending' });
|
|
326
|
-
return out;
|
|
174
|
+
export function deriveSteps(s: UnitState, opts: EvaluateOptions = {}): NextStep[] {
|
|
175
|
+
return evaluateGraph(CORE_NODES, s, s.testCases, opts);
|
|
327
176
|
}
|
package/src/harness/parse.ts
CHANGED
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
import * as fs from 'fs';
|
|
9
9
|
import { GherkinParser, ParsedScenario, ParsedStep } from '../generators/gherkin-parser';
|
|
10
10
|
import { readTextFile, readViewpointText } from './read-text';
|
|
11
|
-
import { parsePriority, toEntryPriority } from './viewpoint-priority';
|
|
12
11
|
import { featureFilesFor } from './unit-paths';
|
|
13
12
|
|
|
14
13
|
export type Priority = 'high' | 'normal' | 'low' | 'unknown';
|
|
@@ -16,7 +15,7 @@ export type Priority = 'high' | 'normal' | 'low' | 'unknown';
|
|
|
16
15
|
export interface ViewpointEntry {
|
|
17
16
|
id: string; // e.g. VP-DATA-CONSISTENCY
|
|
18
17
|
priority: 'High' | 'Medium' | 'Low' | 'Unknown';
|
|
19
|
-
/** The declared priority word as written (`critical` · `high` · `medium` · `
|
|
18
|
+
/** The declared priority word as written (`critical` · `high` · `medium` · `normal` · `low` ·
|
|
20
19
|
* `deferred` · `skip`, which also stands for skipped / n/a / none / not applicable), kept because `priority` folds several of them together and the
|
|
21
20
|
* PRIORITY-CONTRADICTED check needs them apart. Absent when no priority was declared. */
|
|
22
21
|
priorityWord?: string;
|
|
@@ -26,14 +25,14 @@ export interface ViewpointEntry {
|
|
|
26
25
|
|
|
27
26
|
/**
|
|
28
27
|
* Whole SECTIONS that declare something ABOUT the checklist rather than listing claims or
|
|
29
|
-
* viewpoints — known issues,
|
|
28
|
+
* viewpoints — known issues, traceability indexes, references, changelogs. Shared by the atomic
|
|
30
29
|
* ledger (their rows are not claims to prove, #630) and the viewpoint-overview parser (an id
|
|
31
30
|
* listed there is a reference, not a declaration, #833). `UI Patterns Identified` is the author's
|
|
32
31
|
* pick of WHICH sungen-viewpoint patterns apply — a `Skip` row there is not a claim to cover (#841).
|
|
33
32
|
* A `How to run` / `Procedure` section — that exact heading, optionally naming one id — is a manual
|
|
34
33
|
* check's steps, not claims of its own (#855); `How to test the login flow` stays a normal section.
|
|
35
34
|
*/
|
|
36
|
-
export const NON_DECLARATION_SECTION = /^(?:(?:ui patterns?(?: identified)?|(?:how to (?:run|test|reproduce|verify)|(?:manual )?procedures?)(?:\s+(?:vp|fl)-[^\s:]+)?)\s*:?$|(?:known issues?|open questions?|
|
|
35
|
+
export const NON_DECLARATION_SECTION = /^(?:(?:ui patterns?(?: identified)?|(?:how to (?:run|test|reproduce|verify)|(?:manual )?procedures?)(?:\s+(?:vp|fl)-[^\s:]+)?)\s*:?$|(?:known issues?|open questions?|deferred|out of scope|viewpoint grouping|traceability|metadata|scope|journey phases?|revision history|references?|sources?|changelog)\b)/i;
|
|
37
36
|
|
|
38
37
|
/**
|
|
39
38
|
* Every word a viewpoint row may declare as its priority — ONE list for the overview parser, the
|
|
@@ -41,7 +40,7 @@ export const NON_DECLARATION_SECTION = /^(?:(?:ui patterns?(?: identified)?|(?:h
|
|
|
41
40
|
* `Skip` that the `sungen add` / `add-flow` scaffolds themselves suggest (#853). `deferred` and the
|
|
42
41
|
* not-applicable words are declarations as well: such a row is not a claim to cover.
|
|
43
42
|
*/
|
|
44
|
-
export const PRIORITY_WORDS = 'critical|high|medium|
|
|
43
|
+
export const PRIORITY_WORDS = 'critical|high|medium|normal|low|deferred|skip(?:ped)?|n\\/a|none|not applicable';
|
|
45
44
|
/** "Declared not applicable" — folded to `skip` so every consumer checks one word. */
|
|
46
45
|
const NOT_APPLICABLE = /^(?:skip(?:ped)?|n\/a|none|not applicable)$/i;
|
|
47
46
|
|
|
@@ -55,7 +54,7 @@ const PRIORITY_HEADER = /^(?:priority|pri|level|severity|優先度?|độ ưu ti
|
|
|
55
54
|
function priorityOf(cell: string): { priority: ViewpointEntry['priority']; priorityWord?: string } {
|
|
56
55
|
const raw = cell.match(PRIORITY_WORD)?.[1].toLowerCase();
|
|
57
56
|
const word = raw && NOT_APPLICABLE.test(raw) ? 'skip' : raw;
|
|
58
|
-
const priority =
|
|
57
|
+
const priority = /high/i.test(cell) ? 'High' : /medium/i.test(cell) ? 'Medium' : /low/i.test(cell) ? 'Low' : 'Unknown';
|
|
59
58
|
return word ? { priority, priorityWord: word } : { priority };
|
|
60
59
|
}
|
|
61
60
|
|
|
@@ -64,9 +63,6 @@ export interface ScenarioInfo {
|
|
|
64
63
|
vpCode?: string; // VP-CART-001 style code in the scenario title
|
|
65
64
|
category?: string; // CART, LIST, VAL, ... (from the code)
|
|
66
65
|
priority: Priority;
|
|
67
|
-
/** The priority tag as written, lower-cased, without `@` — keeps `critical` / `medium` / `med`, which
|
|
68
|
-
* `priority` has no slot for, so PRIORITY-CONTRADICTED can fold it like the declared word (#861). */
|
|
69
|
-
priorityTag?: string;
|
|
70
66
|
manual: boolean;
|
|
71
67
|
thenCount: number;
|
|
72
68
|
hasDataAssertion: boolean; // a Then asserts {{data}} / contains / match data
|
|
@@ -83,6 +79,7 @@ export interface ScenarioInfo {
|
|
|
83
79
|
deferredToFlow?: boolean; // @deferred:flow — owned by a flow, not automated on this screen (H6)
|
|
84
80
|
ownedByFlow?: string; // @owned-by:<flow> — the flow that owns this deferred scenario (H6)
|
|
85
81
|
featureManual?: boolean; // its Feature is tagged @manual — codegen skips the whole file (#835)
|
|
82
|
+
handWritten?: boolean; // @free / @impl:code — counted, never compiled (isHandWritten, DOS-14.8)
|
|
86
83
|
/** Ordered steps with their resolved bucket (And/But inherit) — flow handoff analysis (#569). */
|
|
87
84
|
/** `arg` = the step's data table, normalised (#817) — absent when the step has none. */
|
|
88
85
|
steps?: Array<{ bucket: 'given' | 'when' | 'then'; text: string; arg?: string }>;
|
|
@@ -332,9 +329,6 @@ function classifyScenario(sc: ParsedScenario): ScenarioInfo {
|
|
|
332
329
|
const requiresCaps = tags.filter((t) => /^@requires:/i.test(t)).map((t) => t.slice('@requires:'.length).trim().toLowerCase()).filter(Boolean);
|
|
333
330
|
let priority: Priority = 'unknown';
|
|
334
331
|
for (const t of tags) if (PRIORITY_TAGS[t]) priority = PRIORITY_TAGS[t];
|
|
335
|
-
// Deliberately wider than `priority` (every priority word, any case): only PRIORITY-CONTRADICTED reads
|
|
336
|
-
// it, so `@critical` / `@High` are judged there without moving what select-by-ids or the score see.
|
|
337
|
-
const priorityTag = [...tags].reverse().find((t) => /^@(?:critical|high|medium|med|normal|low)$/i.test(t))?.slice(1).toLowerCase();
|
|
338
332
|
|
|
339
333
|
const { vpCode, category } = vpCodeOf(sc.name);
|
|
340
334
|
// Project-scheme ID: the leading token of the title (VP0-001 / MS-HP-001 / VP-LIST-001).
|
|
@@ -386,7 +380,6 @@ function classifyScenario(sc: ParsedScenario): ScenarioInfo {
|
|
|
386
380
|
vpCode,
|
|
387
381
|
category,
|
|
388
382
|
priority,
|
|
389
|
-
priorityTag,
|
|
390
383
|
manual,
|
|
391
384
|
thenCount,
|
|
392
385
|
hasDataAssertion: hasData,
|
|
@@ -412,9 +405,26 @@ export function loadScenarios(featurePath: string): ScenarioInfo[] {
|
|
|
412
405
|
const feature = parser.parseFeatureFile(featurePath);
|
|
413
406
|
// Kept apart from `manual` so the audit's accounting is unchanged; only `select` reads it.
|
|
414
407
|
const featureManual = (feature.tags || []).some((t: string) => /^@manual\b/i.test(t)) || undefined;
|
|
408
|
+
// A derived `@proposed` scenario (sungen contract derive, DOS-14.8) is not counted until QA approves it;
|
|
409
|
+
// an approved `@free` / `@impl:code` one IS counted, but never compiled (`handWritten`).
|
|
410
|
+
const tagsOf = (s: { tags?: string[] }): string[] => [...(feature.tags || []), ...(s.tags || [])];
|
|
415
411
|
return (feature.scenarios || [])
|
|
416
|
-
.filter((s) => !s.stepsName && !s.hookType) // skip @steps/@hook blocks
|
|
417
|
-
.map((s) => ({
|
|
412
|
+
.filter((s) => !s.stepsName && !s.hookType && !tagsOf(s).some((t) => PROPOSED_TAG.test(t))) // skip @steps/@hook blocks and unapproved proposals
|
|
413
|
+
.map((s) => ({
|
|
414
|
+
...classifyScenario(withBackground(s, feature.background)), sourceFile: featurePath, featureManual,
|
|
415
|
+
handWritten: isHandWritten(tagsOf(s), featurePath) || undefined,
|
|
416
|
+
}));
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const PROPOSED_TAG = /^@proposed$/i;
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Is a scenario implemented by HAND-WRITTEN code rather than compiled (DOS-14.2, 14.8)? `@free`,
|
|
423
|
+
* `@impl:code`, a derived `@proposed`, or anything in a derived `*.free.feature`. The one predicate
|
|
424
|
+
* codegen (never compiles these), script-check (never expects a compiled twin) and the harness share.
|
|
425
|
+
*/
|
|
426
|
+
export function isHandWritten(tags: readonly string[], featureFile?: string): boolean {
|
|
427
|
+
return (!!featureFile && featureFile.endsWith('.free.feature')) || tags.some((t) => /^@(?:free|impl:code|proposed)$/i.test(t));
|
|
418
428
|
}
|
|
419
429
|
|
|
420
430
|
/**
|
|
@@ -18,6 +18,8 @@ import * as os from 'os';
|
|
|
18
18
|
import { loadUnitScenarios, ScenarioInfo } from './parse';
|
|
19
19
|
import { featureFilesFor } from './unit-paths';
|
|
20
20
|
import { readTextFile } from './read-text';
|
|
21
|
+
import { CATALOG_GATE_RULES } from './gates/resolve-rule';
|
|
22
|
+
import { evaluateGateTerms } from './gates/gate-terms';
|
|
21
23
|
|
|
22
24
|
export interface ScriptCheckResult {
|
|
23
25
|
screen: string;
|
|
@@ -340,7 +342,8 @@ function findSpecs(dir: string, name: string, kind: UnitKind): string[] {
|
|
|
340
342
|
export async function runScriptCheck(screenDir: string, screenName: string, kind: UnitKind): Promise<ScriptCheckResult> {
|
|
341
343
|
const featureFiles = featureFilesFor(screenDir, screenName);
|
|
342
344
|
const scenarios = loadUnitScenarios(screenDir, screenName);
|
|
343
|
-
|
|
345
|
+
// Hand-written (@free / @impl:code) scenarios are proven by their traces, not compiled — no twin expected.
|
|
346
|
+
const automated = scenarios.filter((s) => !s.manual && !s.handWritten);
|
|
344
347
|
const manual = scenarios.filter((s) => s.manual);
|
|
345
348
|
|
|
346
349
|
const committedSpecs = findSpecs(path.join(process.cwd(), 'specs', 'generated'), screenName, kind);
|
|
@@ -388,9 +391,10 @@ export async function runScriptCheck(screenDir: string, screenName: string, kind
|
|
|
388
391
|
// failed regenerate degrades check C to its heuristic instead of crashing it.
|
|
389
392
|
let stepTrace: Map<string, string[]> | undefined;
|
|
390
393
|
if (committedSpec) {
|
|
394
|
+
let tmp: string | undefined;
|
|
391
395
|
try {
|
|
392
396
|
const { CodeGenerator } = require('../generators/test-generator/code-generator');
|
|
393
|
-
|
|
397
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'sungen-scriptcheck-'));
|
|
394
398
|
const qaSourceDir = path.join(process.cwd(), 'qa', kind === 'flow' ? 'flows' : kind === 'api' ? 'api' : 'screens');
|
|
395
399
|
// api units derive their unit id (api/<area>) from the feature path — like `generate --api`;
|
|
396
400
|
// screen/flow pass screenName + flowMode explicitly (unchanged → byte-identical regenerate).
|
|
@@ -428,9 +432,11 @@ export async function runScriptCheck(screenDir: string, screenName: string, kind
|
|
|
428
432
|
if (drift === 'drift') {
|
|
429
433
|
findings.push('DRIFT: committed spec differs from a fresh regenerate → spec was hand-edited or the .feature changed without `sungen generate`. The test code no longer reflects the Gherkin.');
|
|
430
434
|
}
|
|
431
|
-
fs.rmSync(tmp, { recursive: true, force: true });
|
|
432
435
|
} catch (e) {
|
|
433
436
|
findings.push(`Drift check skipped (regenerate failed): ${e instanceof Error ? e.message : e}`);
|
|
437
|
+
} finally {
|
|
438
|
+
// Removed on every path: a throwing regenerate used to leave one sungen-scriptcheck-* dir per call.
|
|
439
|
+
if (tmp) fs.rmSync(tmp, { recursive: true, force: true });
|
|
434
440
|
}
|
|
435
441
|
}
|
|
436
442
|
|
|
@@ -446,7 +452,16 @@ export async function runScriptCheck(screenDir: string, screenName: string, kind
|
|
|
446
452
|
}
|
|
447
453
|
const bypass = assertionlessTests.length > 0 || hollowSteps.length > 0;
|
|
448
454
|
|
|
449
|
-
|
|
455
|
+
// Every term is a hard rule (the #387 drift family): no gate-override can lower one, so the
|
|
456
|
+
// catalog alone decides (OES-11.3).
|
|
457
|
+
const faithful = evaluateGateTerms([
|
|
458
|
+
{ rule: 'script.no-spec', holds: !!committedSpec },
|
|
459
|
+
{ rule: 'script.count-mismatch', holds: countMatch },
|
|
460
|
+
{ rule: 'script.missing-in-spec', holds: missingInSpec.length === 0 },
|
|
461
|
+
{ rule: 'script.extra-in-spec', holds: extraInSpec.length === 0 },
|
|
462
|
+
{ rule: 'script.drift', holds: drift === 'in-sync' },
|
|
463
|
+
{ rule: 'script.bypass', holds: !bypass },
|
|
464
|
+
], CATALOG_GATE_RULES);
|
|
450
465
|
|
|
451
466
|
return {
|
|
452
467
|
screen: screenName,
|
|
@@ -462,7 +477,7 @@ export async function runScriptCheck(screenDir: string, screenName: string, kind
|
|
|
462
477
|
assertionlessTests,
|
|
463
478
|
hollowSteps,
|
|
464
479
|
bypass,
|
|
465
|
-
status:
|
|
480
|
+
status: faithful.pass ? 'OK' : 'FAIL',
|
|
466
481
|
findings,
|
|
467
482
|
};
|
|
468
483
|
}
|