@sun-asterisk/sungen 3.2.35 → 3.3.0-alpha.10
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/case-triage-hint.d.ts +14 -0
- package/dist/cli/case-triage-hint.d.ts.map +1 -0
- package/dist/cli/case-triage-hint.js +23 -0
- package/dist/cli/case-triage-hint.js.map +1 -0
- package/dist/cli/commands/audit.js +1 -1
- 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 +12 -0
- package/dist/cli/commands/contract-derive-command.d.ts.map +1 -0
- package/dist/cli/commands/contract-derive-command.js +113 -0
- package/dist/cli/commands/contract-derive-command.js.map +1 -0
- package/dist/cli/commands/contract.d.ts +20 -0
- package/dist/cli/commands/contract.d.ts.map +1 -0
- package/dist/cli/commands/contract.js +195 -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 +109 -19
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/gate.d.ts.map +1 -1
- package/dist/cli/commands/gate.js +2 -1
- package/dist/cli/commands/gate.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +17 -3
- 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 +47 -17
- package/dist/cli/commands/journey.js.map +1 -1
- package/dist/cli/commands/next.d.ts +13 -0
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +98 -9
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/triage.d.ts +2 -1
- package/dist/cli/commands/triage.d.ts.map +1 -1
- package/dist/cli/commands/triage.js +45 -3
- package/dist/cli/commands/triage.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 +37 -8
- 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/json-error-on-exit.d.ts +34 -0
- package/dist/cli/json-error-on-exit.d.ts.map +1 -0
- package/dist/cli/json-error-on-exit.js +63 -0
- package/dist/cli/json-error-on-exit.js.map +1 -0
- package/dist/cli/project-sungen-invocation.d.ts +13 -0
- package/dist/cli/project-sungen-invocation.d.ts.map +1 -0
- package/dist/cli/project-sungen-invocation.js +95 -0
- package/dist/cli/project-sungen-invocation.js.map +1 -0
- package/dist/cli/run-command-hints.d.ts +9 -0
- package/dist/cli/run-command-hints.d.ts.map +1 -0
- package/dist/cli/run-command-hints.js +84 -0
- package/dist/cli/run-command-hints.js.map +1 -0
- package/dist/cli/waiting-for-you-block.d.ts +18 -0
- package/dist/cli/waiting-for-you-block.d.ts.map +1 -0
- package/dist/cli/waiting-for-you-block.js +22 -0
- package/dist/cli/waiting-for-you-block.js.map +1 -0
- package/dist/contract/accept-opaque-steps.d.ts +3 -0
- package/dist/contract/accept-opaque-steps.d.ts.map +1 -0
- package/dist/contract/accept-opaque-steps.js +114 -0
- package/dist/contract/accept-opaque-steps.js.map +1 -0
- package/dist/contract/approve-contract.d.ts +38 -0
- package/dist/contract/approve-contract.d.ts.map +1 -0
- package/dist/contract/approve-contract.js +93 -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 +22 -0
- package/dist/contract/build-trace-conformance.d.ts.map +1 -0
- package/dist/contract/build-trace-conformance.js +151 -0
- package/dist/contract/build-trace-conformance.js.map +1 -0
- package/dist/contract/classify-contract-change.d.ts +24 -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 +47 -0
- package/dist/contract/classify-trace-conformance.d.ts.map +1 -0
- package/dist/contract/classify-trace-conformance.js +164 -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 +92 -0
- package/dist/contract/contract-schema.d.ts.map +1 -0
- package/dist/contract/contract-schema.js +124 -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 +141 -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 +49 -0
- package/dist/contract/derive-free-feature.d.ts.map +1 -0
- package/dist/contract/derive-free-feature.js +183 -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 +75 -0
- package/dist/contract/project-contract-blockers.js.map +1 -0
- package/dist/contract/record-contract-approval.d.ts +36 -0
- package/dist/contract/record-contract-approval.d.ts.map +1 -0
- package/dist/contract/record-contract-approval.js +126 -0
- package/dist/contract/record-contract-approval.js.map +1 -0
- package/dist/contract/render-free-gherkin.d.ts +42 -0
- package/dist/contract/render-free-gherkin.d.ts.map +1 -0
- package/dist/contract/render-free-gherkin.js +147 -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 +20 -0
- package/dist/contract/resolve-unit-trace-identities.d.ts.map +1 -0
- package/dist/contract/resolve-unit-trace-identities.js +62 -0
- package/dist/contract/resolve-unit-trace-identities.js.map +1 -0
- package/dist/contract/trace/collect-trace-evidence.d.ts +44 -0
- package/dist/contract/trace/collect-trace-evidence.d.ts.map +1 -0
- package/dist/contract/trace/collect-trace-evidence.js +219 -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/read-file-once.d.ts +20 -0
- package/dist/contract/trace/read-file-once.d.ts.map +1 -0
- package/dist/contract/trace/read-file-once.js +135 -0
- package/dist/contract/trace/read-file-once.js.map +1 -0
- package/dist/contract/trace/scenario-id-claims.d.ts +11 -0
- package/dist/contract/trace/scenario-id-claims.d.ts.map +1 -0
- package/dist/contract/trace/scenario-id-claims.js +89 -0
- package/dist/contract/trace/scenario-id-claims.js.map +1 -0
- package/dist/contract/trace/select-final-attempt.d.ts +29 -0
- package/dist/contract/trace/select-final-attempt.d.ts.map +1 -0
- package/dist/contract/trace/select-final-attempt.js +119 -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 +22 -0
- package/dist/contract/trace/trace-binding.d.ts.map +1 -0
- package/dist/contract/trace/trace-binding.js +91 -0
- package/dist/contract/trace/trace-binding.js.map +1 -0
- package/dist/contract/trace/trace-file-reader.d.ts +47 -0
- package/dist/contract/trace/trace-file-reader.d.ts.map +1 -0
- package/dist/contract/trace/trace-file-reader.js +137 -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-freshness.d.ts +27 -0
- package/dist/contract/trace/trace-freshness.d.ts.map +1 -0
- package/dist/contract/trace/trace-freshness.js +146 -0
- package/dist/contract/trace/trace-freshness.js.map +1 -0
- package/dist/contract/trace/trace-identity-resolution.d.ts +28 -0
- package/dist/contract/trace/trace-identity-resolution.d.ts.map +1 -0
- package/dist/contract/trace/trace-identity-resolution.js +87 -0
- package/dist/contract/trace/trace-identity-resolution.js.map +1 -0
- package/dist/contract/trace/trace-run-record.d.ts +32 -0
- package/dist/contract/trace/trace-run-record.d.ts.map +1 -0
- package/dist/contract/trace/trace-run-record.js +135 -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 +109 -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 +43 -0
- package/dist/decisions/decision-schema.d.ts.map +1 -0
- package/dist/decisions/decision-schema.js +76 -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 +19 -0
- package/dist/decisions/git-head-trust.d.ts.map +1 -0
- package/dist/decisions/git-head-trust.js +128 -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 +38 -0
- package/dist/decisions/legacy-waiver-migration.d.ts.map +1 -0
- package/dist/decisions/legacy-waiver-migration.js +179 -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 +11 -2
- package/dist/exporters/csv-exporter.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.js +8 -4
- package/dist/exporters/csv-exporter.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 +10 -9
- package/dist/exporters/matrix/build.js.map +1 -1
- package/dist/exporters/matrix/export.d.ts +9 -1
- package/dist/exporters/matrix/export.d.ts.map +1 -1
- package/dist/exporters/matrix/export.js +13 -4
- 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/exporters/matrix/xlsx-cells.js +1 -1
- package/dist/exporters/matrix/xlsx-cells.js.map +1 -1
- package/dist/exporters/test-data-resolver.d.ts.map +1 -1
- package/dist/exporters/test-data-resolver.js +2 -12
- package/dist/exporters/test-data-resolver.js.map +1 -1
- package/dist/exporters/xlsx-exporter.d.ts +3 -2
- package/dist/exporters/xlsx-exporter.d.ts.map +1 -1
- package/dist/exporters/xlsx-exporter.js +4 -4
- package/dist/exporters/xlsx-exporter.js.map +1 -1
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
- package/dist/generators/gherkin-parser/index.js +0 -1
- package/dist/generators/gherkin-parser/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/contain-text-assertion.hbs +1 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -13
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +1 -9
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +18 -4
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/diagnostics.d.ts +3 -9
- package/dist/generators/test-generator/diagnostics.d.ts.map +1 -1
- package/dist/generators/test-generator/diagnostics.js +3 -9
- package/dist/generators/test-generator/diagnostics.js.map +1 -1
- package/dist/generators/test-generator/patterns/types.d.ts +1 -1
- package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.d.ts +0 -8
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +8 -52
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.d.ts +0 -16
- package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.js +0 -59
- package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +2 -10
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/graph/board-human-actions.d.ts +5 -0
- package/dist/graph/board-human-actions.d.ts.map +1 -0
- package/dist/graph/board-human-actions.js +83 -0
- package/dist/graph/board-human-actions.js.map +1 -0
- package/dist/graph/evaluate-graph.d.ts +41 -0
- package/dist/graph/evaluate-graph.d.ts.map +1 -0
- package/dist/graph/evaluate-graph.js +77 -0
- package/dist/graph/evaluate-graph.js.map +1 -0
- package/dist/graph/human-action.d.ts +21 -0
- package/dist/graph/human-action.d.ts.map +1 -0
- package/dist/graph/human-action.js +3 -0
- package/dist/graph/human-action.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/manual-triage-decisions.d.ts +19 -0
- package/dist/graph/manual-triage-decisions.d.ts.map +1 -0
- package/dist/graph/manual-triage-decisions.js +53 -0
- package/dist/graph/manual-triage-decisions.js.map +1 -0
- package/dist/graph/node-decl.d.ts +75 -0
- package/dist/graph/node-decl.d.ts.map +1 -0
- package/dist/graph/node-decl.js +11 -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 +72 -0
- package/dist/graph/nodes/test-case-contract-nodes.js.map +1 -0
- package/dist/graph/nodes/test-case-nodes.d.ts +29 -0
- package/dist/graph/nodes/test-case-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/test-case-nodes.js +95 -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 +96 -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 +96 -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 +12 -0
- package/dist/graph/test-case-results.d.ts.map +1 -0
- package/dist/graph/test-case-results.js +161 -0
- package/dist/graph/test-case-results.js.map +1 -0
- package/dist/graph/test-case-satisfied.d.ts +26 -0
- package/dist/graph/test-case-satisfied.d.ts.map +1 -0
- package/dist/graph/test-case-satisfied.js +55 -0
- package/dist/graph/test-case-satisfied.js.map +1 -0
- package/dist/graph/test-case-state-shape.d.ts +73 -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 +135 -0
- package/dist/graph/unit-artifact-probes.js.map +1 -0
- package/dist/graph/unit-results-freshness.d.ts +29 -0
- package/dist/graph/unit-results-freshness.d.ts.map +1 -0
- package/dist/graph/unit-results-freshness.js +213 -0
- package/dist/graph/unit-results-freshness.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 +14 -2
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +20 -21
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/catalog/gate-rules.yaml +647 -0
- package/dist/harness/defect-draft.d.ts.map +1 -1
- package/dist/harness/defect-draft.js +12 -2
- package/dist/harness/defect-draft.js.map +1 -1
- package/dist/harness/defects.d.ts +14 -0
- package/dist/harness/defects.d.ts.map +1 -1
- package/dist/harness/defects.js +14 -10
- package/dist/harness/defects.js.map +1 -1
- package/dist/harness/flow-check.d.ts +9 -0
- package/dist/harness/flow-check.d.ts.map +1 -1
- package/dist/harness/flow-check.js +11 -0
- package/dist/harness/flow-check.js.map +1 -1
- 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 +102 -0
- package/dist/harness/gates/audit-gate-verdict.js.map +1 -0
- package/dist/harness/gates/audit-input-hash.d.ts +6 -0
- package/dist/harness/gates/audit-input-hash.d.ts.map +1 -0
- package/dist/harness/gates/audit-input-hash.js +124 -0
- package/dist/harness/gates/audit-input-hash.js.map +1 -0
- package/dist/harness/gates/audit-report-verification.d.ts +43 -0
- package/dist/harness/gates/audit-report-verification.d.ts.map +1 -0
- package/dist/harness/gates/audit-report-verification.js +241 -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 +24 -0
- package/dist/harness/gates/delivery-checklist.d.ts.map +1 -0
- package/dist/harness/gates/delivery-checklist.js +161 -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 +166 -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-import-bounds.d.ts +13 -0
- package/dist/harness/gates/migrated-waiver-import-bounds.d.ts.map +1 -0
- package/dist/harness/gates/migrated-waiver-import-bounds.js +141 -0
- package/dist/harness/gates/migrated-waiver-import-bounds.js.map +1 -0
- package/dist/harness/gates/migrated-waiver-review.d.ts +16 -0
- package/dist/harness/gates/migrated-waiver-review.d.ts.map +1 -0
- package/dist/harness/gates/migrated-waiver-review.js +114 -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 +64 -1
- package/dist/harness/journey.d.ts.map +1 -1
- package/dist/harness/journey.js +258 -34
- 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 +58 -4
- package/dist/harness/next-step.d.ts.map +1 -1
- package/dist/harness/next-step.js +55 -204
- package/dist/harness/next-step.js.map +1 -1
- package/dist/harness/parse.d.ts +7 -0
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +18 -2
- 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 +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 +41 -38
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/triage-manual-classification.d.ts +32 -0
- package/dist/harness/triage-manual-classification.d.ts.map +1 -0
- package/dist/harness/triage-manual-classification.js +56 -0
- package/dist/harness/triage-manual-classification.js.map +1 -0
- package/dist/harness/unit-paths.d.ts +8 -0
- package/dist/harness/unit-paths.d.ts.map +1 -1
- package/dist/harness/unit-paths.js +23 -1
- package/dist/harness/unit-paths.js.map +1 -1
- package/dist/hooks/bash-read-only-segment.d.ts +9 -0
- package/dist/hooks/bash-read-only-segment.d.ts.map +1 -0
- package/dist/hooks/bash-read-only-segment.js +168 -0
- package/dist/hooks/bash-read-only-segment.js.map +1 -0
- package/dist/hooks/bash-write-targets.d.ts +25 -0
- package/dist/hooks/bash-write-targets.d.ts.map +1 -0
- package/dist/hooks/bash-write-targets.js +266 -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 +13 -0
- package/dist/hooks/guard-protected-paths.d.ts.map +1 -0
- package/dist/hooks/guard-protected-paths.js +116 -0
- package/dist/hooks/guard-protected-paths.js.map +1 -0
- package/dist/hooks/guard-rules.d.ts +20 -0
- package/dist/hooks/guard-rules.d.ts.map +1 -0
- package/dist/hooks/guard-rules.js +130 -0
- package/dist/hooks/guard-rules.js.map +1 -0
- package/dist/hooks/guard-tty-spoof-rule.d.ts +17 -0
- package/dist/hooks/guard-tty-spoof-rule.d.ts.map +1 -0
- package/dist/hooks/guard-tty-spoof-rule.js +22 -0
- package/dist/hooks/guard-tty-spoof-rule.js.map +1 -0
- package/dist/hooks/hand-back-core.d.ts +42 -0
- package/dist/hooks/hand-back-core.d.ts.map +1 -0
- package/dist/hooks/hand-back-core.js +128 -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 +14 -0
- package/dist/hooks/session-start-unit-state-hook.d.ts.map +1 -0
- package/dist/hooks/session-start-unit-state-hook.js +60 -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 +43 -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/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- 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 +11 -3
- package/dist/orchestrator/ai-skills/commands.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/templates/ai-src/commands/add-api.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/add-flow.md +6 -26
- 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 +17 -16
- package/dist/orchestrator/templates/ai-src/commands/dashboard.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/delivery.md +4 -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 +4 -0
- package/dist/orchestrator/templates/ai-src/commands/run-test.md +6 -8
- 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/partials/waiting-for-you.claude.md +11 -0
- package/dist/orchestrator/templates/ai-src/partials/waiting-for-you.codex.md +11 -0
- package/dist/orchestrator/templates/ai-src/partials/waiting-for-you.copilot.md +11 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +1 -2
- package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +4 -5
- package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +8 -24
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +3 -4
- package/dist/orchestrator/templates/claude-hooks/sungen-hook.cjs +64 -0
- package/dist/orchestrator/templates/specs-test-data.ts +4 -22
- 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/case-triage-hint.ts +31 -0
- package/src/cli/commands/audit.ts +1 -1
- package/src/cli/commands/capability.ts +1 -1
- package/src/cli/commands/contract-derive-command.ts +72 -0
- package/src/cli/commands/contract.ts +164 -0
- package/src/cli/commands/delivery.ts +106 -19
- package/src/cli/commands/gate.ts +2 -1
- package/src/cli/commands/generate.ts +16 -3
- package/src/cli/commands/journey.ts +45 -18
- package/src/cli/commands/next.ts +92 -11
- package/src/cli/commands/triage.ts +41 -3
- package/src/cli/commands/update.ts +41 -10
- package/src/cli/index.ts +24 -30
- package/src/cli/json-error-on-exit.ts +72 -0
- package/src/cli/project-sungen-invocation.ts +59 -0
- package/src/cli/run-command-hints.ts +47 -0
- package/src/cli/waiting-for-you-block.ts +27 -0
- package/src/contract/accept-opaque-steps.ts +114 -0
- package/src/contract/approve-contract.ts +101 -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 +103 -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 +170 -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 +166 -0
- package/src/contract/contract-units.ts +52 -0
- package/src/contract/contracts-lock-file.ts +98 -0
- package/src/contract/data-normalize.ts +66 -0
- package/src/contract/derive-free-feature.ts +153 -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 +38 -0
- package/src/contract/record-contract-approval.ts +110 -0
- package/src/contract/render-free-gherkin.ts +118 -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 +58 -0
- package/src/contract/trace/collect-trace-evidence.ts +178 -0
- package/src/contract/trace/identity-cache.ts +61 -0
- package/src/contract/trace/read-file-once.ts +95 -0
- package/src/contract/trace/scenario-id-claims.ts +60 -0
- package/src/contract/trace/select-final-attempt.ts +77 -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 +59 -0
- package/src/contract/trace/trace-file-reader.ts +144 -0
- package/src/contract/trace/trace-fingerprint.ts +68 -0
- package/src/contract/trace/trace-freshness.ts +110 -0
- package/src/contract/trace/trace-identity-resolution.ts +77 -0
- package/src/contract/trace/trace-run-record.ts +96 -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 +64 -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 +77 -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 +76 -0
- package/src/decisions/human-confirmation.ts +119 -0
- package/src/decisions/legacy-waiver-migration.ts +146 -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 +12 -4
- package/src/exporters/matrix/build.ts +11 -9
- package/src/exporters/matrix/export.ts +16 -4
- 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/exporters/matrix/xlsx-cells.ts +1 -1
- package/src/exporters/test-data-resolver.ts +2 -10
- package/src/exporters/xlsx-exporter.ts +5 -4
- package/src/generators/gherkin-parser/index.ts +0 -1
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/contain-text-assertion.hbs +1 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -13
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +1 -9
- package/src/generators/test-generator/code-generator.ts +17 -4
- package/src/generators/test-generator/diagnostics.ts +3 -9
- package/src/generators/test-generator/patterns/types.ts +0 -2
- package/src/generators/test-generator/step-mapper.ts +9 -56
- package/src/generators/test-generator/utils/data-resolver.ts +0 -53
- package/src/generators/test-generator/utils/selector-resolver.ts +2 -10
- package/src/graph/board-human-actions.ts +80 -0
- package/src/graph/evaluate-graph.ts +97 -0
- package/src/graph/human-action.ts +33 -0
- package/src/graph/locate-finding.ts +93 -0
- package/src/graph/manual-triage-decisions.ts +55 -0
- package/src/graph/node-decl.ts +83 -0
- package/src/graph/nodes/core-node-catalog.ts +15 -0
- package/src/graph/nodes/test-case-contract-nodes.ts +90 -0
- package/src/graph/nodes/test-case-nodes.ts +100 -0
- package/src/graph/nodes/unit-audit-nodes.ts +96 -0
- package/src/graph/nodes/unit-contract-node.ts +100 -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 +111 -0
- package/src/graph/test-case-satisfied.ts +58 -0
- package/src/graph/test-case-state-shape.ts +67 -0
- package/src/graph/test-case-states.ts +84 -0
- package/src/graph/unit-artifact-probes.ts +79 -0
- package/src/graph/unit-results-freshness.ts +165 -0
- package/src/graph/unit-state-facts.ts +112 -0
- package/src/harness/audit.ts +31 -18
- package/src/harness/catalog/gate-rules.yaml +647 -0
- package/src/harness/defect-draft.ts +13 -2
- package/src/harness/defects.ts +22 -9
- package/src/harness/flow-check.ts +11 -0
- package/src/harness/gates/audit-gate-terms.ts +80 -0
- package/src/harness/gates/audit-gate-verdict.ts +79 -0
- package/src/harness/gates/audit-input-hash.ts +79 -0
- package/src/harness/gates/audit-report-verification.ts +206 -0
- package/src/harness/gates/decisions-hash.ts +42 -0
- package/src/harness/gates/delivery-checklist.ts +152 -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 +124 -0
- package/src/harness/gates/journey-gate-inputs.ts +89 -0
- package/src/harness/gates/migrated-waiver-import-bounds.ts +103 -0
- package/src/harness/gates/migrated-waiver-review.ts +121 -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 +287 -39
- package/src/harness/manifest.ts +67 -43
- package/src/harness/next-step.ts +91 -193
- package/src/harness/parse.ts +20 -2
- package/src/harness/provenance.ts +99 -11
- package/src/harness/script-check.ts +20 -5
- package/src/harness/sensors.ts +47 -40
- package/src/harness/triage-manual-classification.ts +76 -0
- package/src/harness/unit-paths.ts +19 -0
- package/src/hooks/bash-read-only-segment.ts +130 -0
- package/src/hooks/bash-write-targets.ts +195 -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 +80 -0
- package/src/hooks/guard-rules.ts +117 -0
- package/src/hooks/guard-tty-spoof-rule.ts +34 -0
- package/src/hooks/hand-back-core.ts +118 -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 +59 -0
- package/src/hooks/stop-next-step-hook.ts +38 -0
- package/src/hooks/sungen-project-root.ts +80 -0
- package/src/index.ts +1 -2
- package/src/orchestrator/ai-skills/command-partial-includes.ts +72 -0
- package/src/orchestrator/ai-skills/commands.ts +17 -5
- 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/templates/ai-src/commands/add-api.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/add-flow.md +6 -26
- 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 +17 -16
- package/src/orchestrator/templates/ai-src/commands/dashboard.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/delivery.md +4 -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 +4 -0
- package/src/orchestrator/templates/ai-src/commands/run-test.md +6 -8
- 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/partials/waiting-for-you.claude.md +11 -0
- package/src/orchestrator/templates/ai-src/partials/waiting-for-you.codex.md +11 -0
- package/src/orchestrator/templates/ai-src/partials/waiting-for-you.copilot.md +11 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +1 -2
- package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +4 -5
- package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +8 -24
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +3 -4
- package/src/orchestrator/templates/claude-hooks/sungen-hook.cjs +64 -0
- package/src/orchestrator/templates/specs-test-data.ts +4 -22
- package/src/utils/safe-yaml-parse.ts +44 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/expanded-assertion.hbs +0 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/date-picker-unsupported.hbs +0 -5
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/expanded-assertion.hbs +0 -12
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/expanded-assertion.hbs +0 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/date-picker-unsupported.hbs +0 -5
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/expanded-assertion.hbs +0 -12
package/src/harness/manifest.ts
CHANGED
|
@@ -6,21 +6,33 @@
|
|
|
6
6
|
* scenario: keep / regenerate / retire — so the orchestrator regenerates only the
|
|
7
7
|
* parts whose spec changed (stable + cheap), and never silently drifts.
|
|
8
8
|
*
|
|
9
|
+
* Schema 2 (DOS-12.3, red-team #1): each entry names its `hashAlgo`. Section entries keep `sha1-12`
|
|
10
|
+
* and the fuzzy `matchSection` — changing either would make every manifest on disk read "changed".
|
|
11
|
+
* Only item anchors (`<docId>#<itemId>` in a `# --- Section: … ---` comment) use `sha256-12` + exact
|
|
12
|
+
* ids. A manifest WITHOUT `schema` is compared as is (its sections are sha1-12) and upgraded on save.
|
|
9
13
|
* Deterministic. Manifest lives at .sungen/manifest/<screen>.json.
|
|
10
14
|
*/
|
|
11
15
|
import * as fs from 'fs';
|
|
12
16
|
import * as path from 'path';
|
|
13
|
-
import { createHash } from 'crypto';
|
|
14
17
|
import { featureFilesFor, reportSlug } from './unit-paths';
|
|
15
18
|
import { readTextFile } from './read-text';
|
|
16
19
|
import { vpCodeOf } from './parse';
|
|
20
|
+
import { HashAlgo, sectionHash } from '../basis/anchor-hash';
|
|
21
|
+
import { isItemAnchorId } from '../basis/anchor-grammar';
|
|
22
|
+
import { extractSpecAnchors } from '../basis/extract-spec-anchors';
|
|
23
|
+
import { normalizeSectionName as norm, readSpecSectionBlocks } from '../basis/spec-sections';
|
|
24
|
+
import { assertNoPendingMigration, withMigrationSentinel } from '../basis/migration-sentinel';
|
|
25
|
+
|
|
26
|
+
export const MANIFEST_SCHEMA = 2;
|
|
17
27
|
|
|
18
28
|
export interface SpecSection { name: string; hash: string }
|
|
19
|
-
export interface ManifestEntry { scenario: string; vpCode?: string; section: string; specHash: string }
|
|
29
|
+
export interface ManifestEntry { scenario: string; vpCode?: string; section: string; specHash: string; hashAlgo?: HashAlgo }
|
|
20
30
|
export interface Manifest {
|
|
31
|
+
schema?: number; // absent = written before schema 2 → silent re-baseline
|
|
21
32
|
screen: string;
|
|
22
33
|
builtAt: string;
|
|
23
|
-
specSections: Record<string, string>; // section name →
|
|
34
|
+
specSections: Record<string, string>; // section name → sha1-12 (snapshot at build time)
|
|
35
|
+
specItems?: Record<string, string>; // item anchor → sha256-12 (schema 2, BM-51 specs with a docId)
|
|
24
36
|
entries: ManifestEntry[]; // scenario ↔ section ↔ hash
|
|
25
37
|
}
|
|
26
38
|
|
|
@@ -33,13 +45,6 @@ export interface ChangePlan {
|
|
|
33
45
|
summary: { keep: number; regenerate: number; retire: number; newSections: number };
|
|
34
46
|
}
|
|
35
47
|
|
|
36
|
-
function norm(s: string): string {
|
|
37
|
-
return s.replace(/\(Tier[^)]*\)/i, '').replace(/[#*-]/g, '').trim().toLowerCase().replace(/\s+/g, ' ');
|
|
38
|
-
}
|
|
39
|
-
function shortHash(s: string): string {
|
|
40
|
-
return createHash('sha1').update(s).digest('hex').slice(0, 12);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
48
|
const NO_SPEC = '(no-spec-link)';
|
|
44
49
|
|
|
45
50
|
/**
|
|
@@ -61,21 +66,17 @@ function matchSection(featureSection: string, specNames: string[]): string | nul
|
|
|
61
66
|
/** Parse spec.md into hashable sections (## and ### headings; "Section:" prefix stripped). */
|
|
62
67
|
export function parseSpecSections(specPath: string): SpecSection[] {
|
|
63
68
|
if (!fs.existsSync(specPath)) return [];
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
} else if (cur) {
|
|
74
|
-
cur.body.push(line);
|
|
75
|
-
}
|
|
69
|
+
return readSpecSectionBlocks(readTextFile(specPath).split('\n')).map((s) => ({ name: norm(s.name), hash: sectionHash(s.body) }));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Item anchors a scenario can be linked to exactly: unambiguous §4.1 items and their §4.2 rows. */
|
|
73
|
+
function parseSpecItems(specPath: string): Record<string, string> {
|
|
74
|
+
if (!fs.existsSync(specPath)) return {};
|
|
75
|
+
const out: Record<string, string> = {};
|
|
76
|
+
for (const a of extractSpecAnchors(readTextFile(specPath), { repo: '.', sha: 'WORKTREE', path: 'spec.md' }).anchors) {
|
|
77
|
+
if (a.kind !== 'section' && a.confidence === 'EXTRACTED') out[a.id] = a.hash;
|
|
76
78
|
}
|
|
77
|
-
|
|
78
|
-
return sections.map((s) => ({ name: norm(s.name), hash: shortHash(s.body.join('\n').trim()) }));
|
|
79
|
+
return out;
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
/** Parse feature into scenario → section mapping using `# --- Section: X ---` comments. */
|
|
@@ -87,7 +88,7 @@ function parseFeatureSections(featurePath: string): { scenario: string; vpCode?:
|
|
|
87
88
|
for (const raw of lines) {
|
|
88
89
|
const line = raw.trim();
|
|
89
90
|
const sc = line.match(/^#\s*-{2,}\s*Section:\s*(.*?)\s*-{2,}\s*$/i);
|
|
90
|
-
if (sc) { section = norm(sc[1]); continue; }
|
|
91
|
+
if (sc) { section = isItemAnchorId(sc[1].trim()) ? sc[1].trim() : norm(sc[1]); continue; }
|
|
91
92
|
const s = line.match(/^Scenario:\s*(.*)$/);
|
|
92
93
|
if (s) {
|
|
93
94
|
const name = s[1].trim();
|
|
@@ -100,44 +101,55 @@ function parseFeatureSections(featurePath: string): { scenario: string; vpCode?:
|
|
|
100
101
|
export function buildManifest(screenDir: string, screenName: string): Manifest {
|
|
101
102
|
const specPath = path.join(screenDir, 'requirements', 'spec.md');
|
|
102
103
|
const featureFiles = featureFilesFor(screenDir, screenName);
|
|
103
|
-
const specSections = parseSpecSections(specPath);
|
|
104
104
|
const specMap: Record<string, string> = {};
|
|
105
|
-
for (const s of
|
|
105
|
+
for (const s of parseSpecSections(specPath)) specMap[s.name] = s.hash;
|
|
106
|
+
const specItems = parseSpecItems(specPath);
|
|
106
107
|
|
|
107
108
|
const specNames = Object.keys(specMap);
|
|
108
|
-
const
|
|
109
|
-
|
|
109
|
+
const entries: ManifestEntry[] = featureFiles.flatMap(parseFeatureSections).map((f) => {
|
|
110
|
+
const base = { scenario: f.scenario, vpCode: f.vpCode };
|
|
111
|
+
if (isItemAnchorId(f.section)) {
|
|
112
|
+
const hash = specItems[f.section];
|
|
113
|
+
return hash ? { ...base, section: f.section, specHash: hash, hashAlgo: 'sha256-12' as HashAlgo } : { ...base, section: f.section, specHash: NO_SPEC };
|
|
114
|
+
}
|
|
110
115
|
const matched = matchSection(f.section, specNames);
|
|
111
|
-
return
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
section: matched ?? f.section, // canonical spec section when matched
|
|
115
|
-
specHash: matched ? specMap[matched] : NO_SPEC,
|
|
116
|
-
};
|
|
116
|
+
return matched
|
|
117
|
+
? { ...base, section: matched, specHash: specMap[matched], hashAlgo: 'sha1-12' as HashAlgo } // canonical spec section when matched
|
|
118
|
+
: { ...base, section: f.section, specHash: NO_SPEC };
|
|
117
119
|
});
|
|
118
120
|
|
|
119
121
|
return {
|
|
122
|
+
schema: MANIFEST_SCHEMA,
|
|
120
123
|
screen: screenName,
|
|
121
124
|
builtAt: new Date().toISOString(),
|
|
122
125
|
specSections: specMap,
|
|
126
|
+
...(Object.keys(specItems).length ? { specItems } : {}),
|
|
123
127
|
entries,
|
|
124
128
|
};
|
|
125
129
|
}
|
|
126
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Compare a stored manifest — legacy or schema 2 — with the spec now. Read-only: it never rewrites
|
|
133
|
+
* the manifest. A legacy entry has no `hashAlgo` and is a section entry hashed sha1-12, exactly what
|
|
134
|
+
* the current code computes, so real drift since the legacy build reads `regenerate` and nothing reads
|
|
135
|
+
* "changed" merely because the format moved on.
|
|
136
|
+
*/
|
|
127
137
|
export function diffManifest(screenDir: string, screenName: string, manifest: Manifest): ChangePlan {
|
|
138
|
+
assertNoPendingMigration(process.cwd(), reportSlug(screenName));
|
|
128
139
|
const specPath = path.join(screenDir, 'requirements', 'spec.md');
|
|
129
|
-
const current = parseSpecSections(specPath);
|
|
130
140
|
const currentMap: Record<string, string> = {};
|
|
131
|
-
for (const s of
|
|
141
|
+
for (const s of parseSpecSections(specPath)) currentMap[s.name] = s.hash;
|
|
142
|
+
const currentItems = manifest.entries.some((e) => e.hashAlgo === 'sha256-12') ? parseSpecItems(specPath) : {};
|
|
132
143
|
|
|
133
144
|
const scenarios = manifest.entries.map((e) => {
|
|
134
145
|
let change: ChangeKind; let reason: string;
|
|
146
|
+
const what = e.hashAlgo === 'sha256-12' ? 'spec item' : 'spec section';
|
|
135
147
|
if (e.specHash === NO_SPEC) { change = 'keep'; reason = 'not linked to a spec section (manual/cross-cutting)'; }
|
|
136
148
|
else {
|
|
137
|
-
const now = currentMap[e.section];
|
|
138
|
-
if (now === undefined) { change = 'retire'; reason =
|
|
139
|
-
else if (now !== e.specHash) { change = 'regenerate'; reason =
|
|
140
|
-
else { change = 'keep'; reason =
|
|
149
|
+
const now = e.hashAlgo === 'sha256-12' ? currentItems[e.section] : currentMap[e.section];
|
|
150
|
+
if (now === undefined) { change = 'retire'; reason = `${what} "${e.section}" no longer exists`; }
|
|
151
|
+
else if (now !== e.specHash) { change = 'regenerate'; reason = `${what} "${e.section}" changed (${e.specHash} → ${now})`; }
|
|
152
|
+
else { change = 'keep'; reason = `${what} unchanged`; }
|
|
141
153
|
}
|
|
142
154
|
return { scenario: e.scenario, section: e.section, change, reason };
|
|
143
155
|
});
|
|
@@ -167,9 +179,21 @@ export function loadManifest(screenName: string): Manifest | null {
|
|
|
167
179
|
const p = manifestPath(screenName);
|
|
168
180
|
return fs.existsSync(p) ? JSON.parse(readTextFile(p)) : null;
|
|
169
181
|
}
|
|
170
|
-
|
|
171
|
-
|
|
182
|
+
/** The manifest on disk at `p`, or null when absent or unreadable (then a save is a plain write). */
|
|
183
|
+
function loadManifestFile(p: string): Manifest | null {
|
|
184
|
+
try { return fs.existsSync(p) ? JSON.parse(readTextFile(p)) : null; } catch { return null; }
|
|
185
|
+
}
|
|
186
|
+
function writeManifest(p: string, m: Manifest): void {
|
|
172
187
|
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
173
188
|
fs.writeFileSync(p, JSON.stringify(m, null, 2), 'utf-8');
|
|
189
|
+
}
|
|
190
|
+
/** Write a built manifest. Replacing a legacy (schema-less) file is the upgrade to schema 2, done under the sentinel. */
|
|
191
|
+
export function saveManifest(m: Manifest): string {
|
|
192
|
+
const slug = reportSlug(m.screen);
|
|
193
|
+
assertNoPendingMigration(process.cwd(), slug);
|
|
194
|
+
const p = manifestPath(m.screen);
|
|
195
|
+
const upgrading = m.schema === MANIFEST_SCHEMA && (loadManifestFile(p)?.schema ?? MANIFEST_SCHEMA) !== MANIFEST_SCHEMA;
|
|
196
|
+
if (upgrading) withMigrationSentinel(process.cwd(), m.screen, slug, 'manifest upgrade to schema 2', [p], () => writeManifest(p, m));
|
|
197
|
+
else writeManifest(p, m);
|
|
174
198
|
return p;
|
|
175
199
|
}
|
package/src/harness/next-step.ts
CHANGED
|
@@ -16,10 +16,20 @@
|
|
|
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';
|
|
21
|
+
import type { HeadSnapshot } from '../contract/contract-git';
|
|
22
|
+
import { boardHumanActions } from '../graph/board-human-actions';
|
|
23
|
+
import { evaluateGraph, evaluateHumanActions, EvaluateOptions } from '../graph/evaluate-graph';
|
|
24
|
+
import type { HumanAction } from '../graph/human-action';
|
|
25
|
+
import { CORE_NODES } from '../graph/nodes/core-node-catalog';
|
|
26
|
+
import type { TestCaseState } from '../graph/test-case-state-shape';
|
|
27
|
+
import { testCaseStates } from '../graph/test-case-states';
|
|
28
|
+
import {
|
|
29
|
+
countFailedResults, countScenarios, hasDeliverableFor, hasResolvedSelector, isCompiled, readIfExists, unitResultFiles,
|
|
30
|
+
} from '../graph/unit-artifact-probes';
|
|
31
|
+
import { AuditNotCounted, ContractFacts, ContractSummary, readContractFacts, readTrustedAudit } from '../graph/unit-state-facts';
|
|
32
|
+
import { ResultsFreshness, resultsFreshness } from '../graph/unit-results-freshness';
|
|
23
33
|
|
|
24
34
|
export interface NextStep {
|
|
25
35
|
/** The command to run, as the operator would type it. */
|
|
@@ -34,6 +44,13 @@ export interface NextStep {
|
|
|
34
44
|
* in the same session (#660).
|
|
35
45
|
*/
|
|
36
46
|
kind: 'do' | 'blocked' | 'optional' | 'decide';
|
|
47
|
+
/** The graph node that produced the step (OES-10.1). `--json` detail; the text never shows it. */
|
|
48
|
+
nodeId?: string;
|
|
49
|
+
granularity?: 'unit' | 'test-case';
|
|
50
|
+
/** The one test case the step is about (`sungen next <unit> --case <id>`). */
|
|
51
|
+
testCase?: string;
|
|
52
|
+
/** Catalog rule ids (gate-rules.yaml) the step answers to. */
|
|
53
|
+
gates?: string[];
|
|
37
54
|
}
|
|
38
55
|
|
|
39
56
|
export interface UnitState {
|
|
@@ -48,6 +65,13 @@ export interface UnitState {
|
|
|
48
65
|
selectorsArePlaceholder: boolean;
|
|
49
66
|
compiled: boolean;
|
|
50
67
|
hasResults: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Scenarios whose FINAL attempt failed (failed · timedOut · interrupted) across the unit's result
|
|
70
|
+
* files — a retried pass is not a failure. Any failure puts `sungen triage` in the path: with only
|
|
71
|
+
* "optional" left after a deliverable, a red run read as done and its reds reached the export
|
|
72
|
+
* unclassified. Absent when the state was not read from disk.
|
|
73
|
+
*/
|
|
74
|
+
failedCount?: number;
|
|
51
75
|
hasDeliverable: boolean;
|
|
52
76
|
audit?: {
|
|
53
77
|
overall: number;
|
|
@@ -62,94 +86,57 @@ export interface UnitState {
|
|
|
62
86
|
* warning is one grey stderr line at the top of every command (#620).
|
|
63
87
|
*/
|
|
64
88
|
assetsDrift?: { recordedVersion: string; runningVersion: string };
|
|
89
|
+
/** An audit report exists but does not count (stale, untrusted) — gate and delivery block on it too. */
|
|
90
|
+
auditNotCounted?: AuditNotCounted;
|
|
91
|
+
/** The rebuilt Test Contract verdict (DOS-14.4); absent when not read from disk or no scenario exists. */
|
|
92
|
+
contract?: ContractSummary;
|
|
93
|
+
/** Per-test-case state (DOS-11.1); absent when not read from disk or unreadable. */
|
|
94
|
+
testCases?: TestCaseState[];
|
|
95
|
+
/** Which run the results come from and what they are older than (#942); absent without results. Advisory, decides no step. */
|
|
96
|
+
results?: ResultsFreshness;
|
|
65
97
|
steps: NextStep[];
|
|
98
|
+
/**
|
|
99
|
+
* Every pending HUMAN-ONLY action ("Waiting for you", #954): the frontier's decisions (deriveHumanActions)
|
|
100
|
+
* and the board's asks (sign-off, a waiver to give again, a decision recorded during the run). Set by
|
|
101
|
+
* readUnitState; commands canonical (`sungen …`). An agent presents them and never runs them.
|
|
102
|
+
*/
|
|
103
|
+
humanActions?: HumanAction[];
|
|
104
|
+
/**
|
|
105
|
+
* The title of the blocking step that cut the frontier: past it only actions that do not depend on it
|
|
106
|
+
* are listed (sign-off, accept-in-run and the first contract approval wait). Absent when nothing cuts.
|
|
107
|
+
*/
|
|
108
|
+
humanActionsHeldBy?: string;
|
|
109
|
+
/** The canonical command of that blocking step (#966) — what clears the hold. */
|
|
110
|
+
humanActionsHeldByCommand?: string;
|
|
66
111
|
}
|
|
67
112
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
return JSON.parse(readTextFile(p)) as Record<string, unknown>;
|
|
73
|
-
} catch {
|
|
74
|
-
return null; // absent or unreadable — treated as "not run"
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function countScenarios(unitDir: string, unit: string): number {
|
|
79
|
-
let n = 0;
|
|
80
|
-
for (const f of featureFilesFor(unitDir, unit)) {
|
|
81
|
-
const text = fs.existsSync(f) ? readTextFile(f) : '';
|
|
82
|
-
n += (text.match(/^\s*Scenario(?: Outline)?:/gm) ?? []).length;
|
|
83
|
-
}
|
|
84
|
-
return n;
|
|
113
|
+
export interface ReadUnitStateOptions {
|
|
114
|
+
/** git HEAD read once for many units (`sungen next` with no unit). */
|
|
115
|
+
gitSnapshot?: HeadSnapshot;
|
|
85
116
|
}
|
|
86
117
|
|
|
87
|
-
|
|
88
|
-
* Everything the resolver needs, read from disk. `unitId` is the catalog id
|
|
89
|
-
* (`<screen>` · `flows/<f>` · `api/<a>`); `unitDir` is its directory.
|
|
90
|
-
*/
|
|
91
|
-
const RESULT_FILE = /-test-result(?:\.[^.]+)*\.json$/;
|
|
118
|
+
const exists = (p: string): boolean => fs.existsSync(p);
|
|
92
119
|
|
|
93
120
|
/**
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
121
|
+
* Everything the resolver needs, read from disk. `unit` is the catalog id
|
|
122
|
+
* (`<screen>` · `flows/<f>` · `api/<a>`); `unitDir` is its directory. The audit report is read
|
|
123
|
+
* through verifyAuditReport, as `sungen gate` and `sungen delivery` read it: a stale or untrusted
|
|
124
|
+
* report counts as never audited (OES-11.4) and is named in `auditNotCounted`.
|
|
98
125
|
*/
|
|
99
|
-
function hasResolvedSelector(selectorText: string): boolean {
|
|
100
|
-
let doc: unknown;
|
|
101
|
-
try { doc = parseYaml(selectorText); } catch { return selectorText.trim().length >= 40; }
|
|
102
|
-
if (!doc || typeof doc !== 'object') return false;
|
|
103
|
-
// A real cell, not a marker left to be filled in. Numbers count (an id or index can be numeric).
|
|
104
|
-
const real = (v: unknown): boolean => (typeof v === 'string' || typeof v === 'number')
|
|
105
|
-
&& String(v).trim() !== '' && !/^(?:todo|tbd|placeholder|replace me)$/i.test(String(v).trim());
|
|
106
|
-
return Object.values(doc as Record<string, unknown>).some((e) => {
|
|
107
|
-
if (!e || typeof e !== 'object') return false;
|
|
108
|
-
const { type, value, name, locator } = e as { type?: unknown; value?: unknown; name?: unknown; locator?: unknown };
|
|
109
|
-
// Every SelectorEntry shape: a CSS `locator`, or a non-page `type` with a value or a role name.
|
|
110
|
-
return real(locator) || (typeof type === 'string' && type !== 'page' && (real(value) || real(name)));
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
|
|
114
126
|
export function readUnitState(
|
|
115
|
-
projectRoot: string, unitDir: string, unit: string, kind: UnitState['kind'],
|
|
127
|
+
projectRoot: string, unitDir: string, unit: string, kind: UnitState['kind'], opts: ReadUnitStateOptions = {},
|
|
116
128
|
): UnitState {
|
|
117
129
|
const req = path.join(unitDir, 'requirements');
|
|
118
130
|
const slug = reportSlug(unit);
|
|
119
|
-
const audit =
|
|
131
|
+
const { report: audit, notCounted } = readTrustedAudit(projectRoot, unit);
|
|
120
132
|
const selectorsDir = path.join(unitDir, 'selectors');
|
|
121
133
|
let selectorFiles: string[] = [];
|
|
122
134
|
try {
|
|
123
135
|
selectorFiles = fs.readdirSync(selectorsDir).filter((f) => f.endsWith('.yaml'));
|
|
124
136
|
} catch { /* api units carry no selectors */ }
|
|
125
|
-
|
|
126
|
-
// point in a unit's life — the resolver exists to report exactly that, so it must not crash on it.
|
|
127
|
-
const read = (p: string): string => (fs.existsSync(p) ? readTextFile(p) : '');
|
|
128
|
-
const selectorTexts = selectorFiles.map((f) => read(path.join(selectorsDir, f)));
|
|
137
|
+
const selectorTexts = selectorFiles.map((f) => readIfExists(path.join(selectorsDir, f)));
|
|
129
138
|
const contractPath = path.join(req, 'flow-contract.yaml');
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
const specDirs = [
|
|
133
|
-
path.join(projectRoot, 'specs', 'generated', 'flows', unit),
|
|
134
|
-
path.join(projectRoot, 'specs', 'generated', unit),
|
|
135
|
-
];
|
|
136
|
-
const compiled = specDirs.some((d) => {
|
|
137
|
-
try {
|
|
138
|
-
return fs.readdirSync(d).some((f) => f.endsWith('.spec.ts'));
|
|
139
|
-
} catch { return false; }
|
|
140
|
-
});
|
|
141
|
-
const hasResults = specDirs.some((d) => {
|
|
142
|
-
try {
|
|
143
|
-
// `<f>-test-result[.<os>][.<env>].json` — a mobile run writes the OS into the name, an env
|
|
144
|
-
// run (SUNGEN_ENV=staging) the env; both are runs (#868).
|
|
145
|
-
return fs.readdirSync(d).some((f) => RESULT_FILE.test(f));
|
|
146
|
-
} catch { return false; }
|
|
147
|
-
});
|
|
148
|
-
let hasDeliverable = false;
|
|
149
|
-
try {
|
|
150
|
-
hasDeliverable = fs.readdirSync(path.join(projectRoot, 'qa', 'deliverables'))
|
|
151
|
-
.some((f) => f.startsWith(`${slug}-`));
|
|
152
|
-
} catch { /* nothing exported yet */ }
|
|
139
|
+
const resultFiles = unitResultFiles(projectRoot, unit);
|
|
153
140
|
|
|
154
141
|
const score = (audit?.score ?? {}) as { overall?: number };
|
|
155
142
|
const baseline = (audit?.viewpointBaseline ?? {}) as { status?: string };
|
|
@@ -160,13 +147,16 @@ export function readUnitState(
|
|
|
160
147
|
hasContract: exists(contractPath),
|
|
161
148
|
// A contract WITHOUT `flows:` can only be scored per phase, which is a materially weaker
|
|
162
149
|
// claim — so it is part of the state, not a detail.
|
|
163
|
-
hasFlowInventory: /^\s*flows:\s*$/m.test(
|
|
150
|
+
hasFlowInventory: /^\s*flows:\s*$/m.test(readIfExists(contractPath)),
|
|
164
151
|
scenarioCount: countScenarios(unitDir, unit),
|
|
165
152
|
hasSelectors: selectorFiles.length > 0,
|
|
166
153
|
// A scaffolded selector file exists but resolves nothing; treating it as "done" is what
|
|
167
154
|
// makes a run look further along than it is.
|
|
168
155
|
selectorsArePlaceholder: selectorFiles.length > 0 && !selectorTexts.some(hasResolvedSelector),
|
|
169
|
-
compiled
|
|
156
|
+
compiled: isCompiled(projectRoot, unit),
|
|
157
|
+
hasResults: resultFiles.length > 0,
|
|
158
|
+
failedCount: countFailedResults(resultFiles),
|
|
159
|
+
hasDeliverable: hasDeliverableFor(projectRoot, slug),
|
|
170
160
|
assetsDrift: (() => {
|
|
171
161
|
const d = checkAssetsDrift(projectRoot);
|
|
172
162
|
return d && d.recordedVersion !== d.runningVersion
|
|
@@ -181,131 +171,39 @@ export function readUnitState(
|
|
|
181
171
|
viewpointBaselineStatus: baseline.status,
|
|
182
172
|
}
|
|
183
173
|
: undefined,
|
|
174
|
+
...(notCounted ? { auditNotCounted: notCounted } : {}),
|
|
184
175
|
steps: [],
|
|
185
176
|
};
|
|
177
|
+
let contract: ContractFacts | undefined;
|
|
178
|
+
if (state.scenarioCount > 0) state.contract = (contract = readContractFacts(projectRoot, unit, unitDir, opts.gitSnapshot)).summary;
|
|
179
|
+
try {
|
|
180
|
+
state.testCases = testCaseStates(projectRoot, unit, { unitDir, auditFindings: state.audit?.findings ?? [] })
|
|
181
|
+
.map((tc) => (contract?.cases.has(tc.id) ? { ...tc, contract: contract.cases.get(tc.id) } : tc));
|
|
182
|
+
} catch { /* an unparseable .feature — the unit-level nodes still answer, as before test-case state */ }
|
|
183
|
+
try {
|
|
184
|
+
const results = resultsFreshness(projectRoot, unitDir, unit);
|
|
185
|
+
if (results) state.results = results;
|
|
186
|
+
} catch { /* advisory: results that cannot be dated add nothing */ }
|
|
186
187
|
state.steps = deriveSteps(state);
|
|
188
|
+
const graph = evaluateHumanActions(CORE_NODES, state, state.testCases);
|
|
189
|
+
const seen = new Set<string>();
|
|
190
|
+
state.humanActions = [...graph.actions, ...boardHumanActions(projectRoot, unitDir, state, graph.cut)]
|
|
191
|
+
.filter((a) => !seen.has(a.command) && Boolean(seen.add(a.command)));
|
|
192
|
+
if (graph.heldBy) state.humanActionsHeldBy = graph.heldBy;
|
|
193
|
+
if (graph.heldByCommand) state.humanActionsHeldByCommand = graph.heldByCommand;
|
|
187
194
|
return state;
|
|
188
195
|
}
|
|
189
196
|
|
|
190
|
-
/** The finding codes worth naming in a next step — each maps to a specific repair. */
|
|
191
|
-
const REPAIRABLE = [
|
|
192
|
-
'FLOW-CONTRACT-MISSING', 'FLOW-INVENTORY-MISSING', 'FLOW-UNCOVERED', 'FLOW-UNDECLARED',
|
|
193
|
-
'FLOW-PHASE-MISFILED', 'FLOW-GUARANTEE-MISSING', 'FLOW-OUTCOME-UNPROVEN', 'CONTINUITY-ONE-SIDED',
|
|
194
|
-
'ORACLE-URL-ONLY',
|
|
195
|
-
'SPEC-RESTATED-UNVERIFIED', 'VIEWPOINT-GESTURE-SUBSTITUTED', 'SPEC-UNCOVERED', 'SPEC-CLAUSE-UNCOVERED',
|
|
196
|
-
'TRIGGER-UNCOVERED', 'PERMISSION-PAIR-MISSING', 'VISIBILITY-PAIR-MISSING',
|
|
197
|
-
'VIEWPOINT-ITEM-MISSING', 'MANUAL-CODE-MISSING', 'MANUAL-AUTOMATABLE', 'DEPTH-DEFERRED',
|
|
198
|
-
'UI-INVENTORY-MISSING', 'UI-INVENTORY-INCOMPLETE', 'UI-ITEM-UNCOVERED',
|
|
199
|
-
];
|
|
200
|
-
|
|
201
197
|
/**
|
|
202
|
-
* The ordered answer
|
|
203
|
-
*
|
|
198
|
+
* The ordered answer — earliest unmet precondition first, so the list reads as a path rather than a
|
|
199
|
+
* menu. Evaluated over the internal node graph (src/graph, OES-10.1): each former if/return branch
|
|
200
|
+
* is one node, and an open blocking node cuts everything after it, exactly as the `return`s did.
|
|
204
201
|
*/
|
|
205
|
-
export function deriveSteps(s: UnitState): NextStep[] {
|
|
206
|
-
|
|
207
|
-
|
|
202
|
+
export function deriveSteps(s: UnitState, opts: EvaluateOptions = {}): NextStep[] {
|
|
203
|
+
return evaluateGraph(CORE_NODES, s, s.testCases, opts);
|
|
204
|
+
}
|
|
208
205
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
command: `write qa/${s.kind === 'screen' ? 'screens' : s.kind === 'flow' ? 'flows' : 'api'}/${s.unit}/requirements/spec.md`,
|
|
213
|
-
because: 'the unit has neither a spec nor a test-viewpoint, so there is nothing to generate FROM — generation without a source invents behaviour',
|
|
214
|
-
});
|
|
215
|
-
return out;
|
|
216
|
-
}
|
|
217
|
-
// Stale AI assets come FIRST, because they invalidate the advice below: a HARD RULE added to
|
|
218
|
-
// `create-test` reaches nobody until `sungen update` runs, so the run that follows will repeat
|
|
219
|
-
// whatever the old instructions said. Upgrading the package alone does not refresh them, and the
|
|
220
|
-
// existing warning is one grey stderr line among a command's whole output (#620).
|
|
221
|
-
if (s.assetsDrift) {
|
|
222
|
-
out.push({
|
|
223
|
-
kind: 'do',
|
|
224
|
-
command: 'sungen update',
|
|
225
|
-
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`,
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
// The yardstick. `atomicLedger` and `traceability` are measured against test-viewpoint.md and
|
|
229
|
-
// four sensors read it, so its absence is not cosmetic — and it can go missing from a unit that
|
|
230
|
-
// already HAS a spec (a run deleted it), which the "no source at all" branch above never sees.
|
|
231
|
-
if (!s.hasViewpoint) {
|
|
232
|
-
out.push({
|
|
233
|
-
kind: 'blocked',
|
|
234
|
-
command: s.kind === 'flow'
|
|
235
|
-
? `sungen add-flow --flow ${s.unit} --path <start-url> # repairs the missing scaffold; never overwrites`
|
|
236
|
-
: `write qa/screens/${s.unit}/requirements/test-viewpoint.md`,
|
|
237
|
-
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',
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
if (s.kind === 'flow' && !s.hasContract) {
|
|
241
|
-
out.push({
|
|
242
|
-
kind: 'blocked',
|
|
243
|
-
command: `author requirements/flow-contract.yaml, then ${design}`,
|
|
244
|
-
because: 'a flow with no contract is scored as a generic screen against page-type themes a journey cannot have (FLOW-CONTRACT-MISSING)',
|
|
245
|
-
});
|
|
246
|
-
return out;
|
|
247
|
-
}
|
|
248
|
-
if (s.scenarioCount === 0) {
|
|
249
|
-
out.push({ kind: 'do', command: design, because: 'no scenarios exist yet' });
|
|
250
|
-
return out;
|
|
251
|
-
}
|
|
252
|
-
if (s.kind === 'flow' && !s.hasFlowInventory) {
|
|
253
|
-
out.push({
|
|
254
|
-
kind: 'do',
|
|
255
|
-
command: `add \`flows:\` to requirements/flow-contract.yaml, then sungen audit --screen ${s.unit}`,
|
|
256
|
-
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',
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
if (!s.audit) {
|
|
260
|
-
out.push({ kind: 'do', command: `sungen audit --screen ${s.unit}`, because: 'the suite has never been measured' });
|
|
261
|
-
return out;
|
|
262
|
-
}
|
|
263
|
-
if (s.audit.viewpointBaselineStatus === 'changed') {
|
|
264
|
-
out.push({
|
|
265
|
-
kind: 'decide',
|
|
266
|
-
command: `sungen audit --screen ${s.unit} --accept-viewpoint`,
|
|
267
|
-
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',
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
const repair = s.audit.findings
|
|
271
|
-
.map((f) => f.split(':')[0].trim())
|
|
272
|
-
.filter((code) => REPAIRABLE.includes(code));
|
|
273
|
-
if (repair.length > 0) {
|
|
274
|
-
out.push({
|
|
275
|
-
kind: 'do',
|
|
276
|
-
command: `repair, then sungen audit --screen ${s.unit}`,
|
|
277
|
-
because: `${repair.length} finding(s) name a specific repair: ${[...new Set(repair)].slice(0, 4).join(', ')}`,
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
if (s.audit.gateStatus === 'FAIL') {
|
|
281
|
-
out.push({
|
|
282
|
-
kind: 'blocked',
|
|
283
|
-
command: `repair the gate, then sungen audit --screen ${s.unit}`,
|
|
284
|
-
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`,
|
|
285
|
-
});
|
|
286
|
-
return out;
|
|
287
|
-
}
|
|
288
|
-
if (s.kind !== 'api' && (!s.hasSelectors || s.selectorsArePlaceholder)) {
|
|
289
|
-
out.push({
|
|
290
|
-
kind: 'do',
|
|
291
|
-
command: `/sungen:run-test ${s.unit}`,
|
|
292
|
-
because: s.hasSelectors
|
|
293
|
-
? 'the selector file is still a placeholder, so nothing resolves against a live page'
|
|
294
|
-
: 'no selectors exist yet — run-test generates them from the live page, compiles and auto-fixes',
|
|
295
|
-
});
|
|
296
|
-
return out;
|
|
297
|
-
}
|
|
298
|
-
if (!s.compiled) {
|
|
299
|
-
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' });
|
|
300
|
-
return out;
|
|
301
|
-
}
|
|
302
|
-
if (!s.hasResults) {
|
|
303
|
-
out.push({ kind: 'do', command: `/sungen:run-test ${s.unit}`, because: 'the compiled spec has never been run, so every case is Pending' });
|
|
304
|
-
return out;
|
|
305
|
-
}
|
|
306
|
-
if (!s.hasDeliverable) {
|
|
307
|
-
out.push({ kind: 'do', command: `/sungen:delivery ${s.unit}`, because: 'results exist but have not been exported to the Test Case & Coverage Matrix' });
|
|
308
|
-
}
|
|
309
|
-
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' });
|
|
310
|
-
return out;
|
|
206
|
+
/** The human-only actions of the same frontier (#954) — the graph's part of `humanActions`, without the board. */
|
|
207
|
+
export function deriveHumanActions(s: UnitState): HumanAction[] {
|
|
208
|
+
return evaluateHumanActions(CORE_NODES, s, s.testCases).actions;
|
|
311
209
|
}
|
package/src/harness/parse.ts
CHANGED
|
@@ -79,6 +79,7 @@ export interface ScenarioInfo {
|
|
|
79
79
|
deferredToFlow?: boolean; // @deferred:flow — owned by a flow, not automated on this screen (H6)
|
|
80
80
|
ownedByFlow?: string; // @owned-by:<flow> — the flow that owns this deferred scenario (H6)
|
|
81
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)
|
|
82
83
|
/** Ordered steps with their resolved bucket (And/But inherit) — flow handoff analysis (#569). */
|
|
83
84
|
/** `arg` = the step's data table, normalised (#817) — absent when the step has none. */
|
|
84
85
|
steps?: Array<{ bucket: 'given' | 'when' | 'then'; text: string; arg?: string }>;
|
|
@@ -404,9 +405,26 @@ export function loadScenarios(featurePath: string): ScenarioInfo[] {
|
|
|
404
405
|
const feature = parser.parseFeatureFile(featurePath);
|
|
405
406
|
// Kept apart from `manual` so the audit's accounting is unchanged; only `select` reads it.
|
|
406
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 || [])];
|
|
407
411
|
return (feature.scenarios || [])
|
|
408
|
-
.filter((s) => !s.stepsName && !s.hookType) // skip @steps/@hook blocks
|
|
409
|
-
.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));
|
|
410
428
|
}
|
|
411
429
|
|
|
412
430
|
/**
|