@codyswann/lisa 4.54.13 → 4.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/all/copy-contents/.gitattributes +8 -0
- package/all/copy-overwrite/scripts/check-orphaned-branches.mjs +78 -9
- package/all/copy-overwrite/scripts/check-third-party-action-pins.mjs +17 -1
- package/all/copy-overwrite/scripts/lib/process-tree-runner.mjs +194 -7
- package/all/copy-overwrite/scripts/lisa-enforcement-fallback.sh +31 -0
- package/all/copy-overwrite/scripts/lisa-hooks/block-blind-automerge.sh +81 -2
- package/all/copy-overwrite/scripts/lisa-hooks/block-direct-issue-create.sh +293 -8
- package/all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh +21 -0
- package/all/copy-overwrite/scripts/lisa-hooks/block-managed-file-edits.sh +78 -15
- package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +21 -0
- package/all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh +21 -0
- package/all/copy-overwrite/scripts/lisa-hooks/guard-dedupe.bash +340 -0
- package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +29 -1
- package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.mjs +183 -1
- package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.sh +21 -0
- package/all/copy-overwrite/scripts/lisa-postinstall.mjs +21 -1
- package/all/copy-overwrite/scripts/lisa-run-gates.mjs +100 -5
- package/all/copy-overwrite/scripts/lisa-work-item.mjs +1085 -80
- package/all/create-only/.github/workflows/continuous-gates.yml +7 -0
- package/cdk/create-only/.github/workflows/ci.yml +7 -0
- package/cdk/create-only/.github/workflows/deploy.yml +21 -0
- package/dist/cli/apply.d.ts.map +1 -1
- package/dist/cli/apply.js +9 -1
- package/dist/cli/apply.js.map +1 -1
- package/dist/cli/doctor-apply-deletions.d.ts +61 -0
- package/dist/cli/doctor-apply-deletions.d.ts.map +1 -0
- package/dist/cli/doctor-apply-deletions.js +137 -0
- package/dist/cli/doctor-apply-deletions.js.map +1 -0
- package/dist/cli/doctor-cdk-preset-adoption.d.ts +15 -0
- package/dist/cli/doctor-cdk-preset-adoption.d.ts.map +1 -0
- package/dist/cli/doctor-cdk-preset-adoption.js +316 -0
- package/dist/cli/doctor-cdk-preset-adoption.js.map +1 -0
- package/dist/cli/doctor-config-shadowing.d.ts +22 -0
- package/dist/cli/doctor-config-shadowing.d.ts.map +1 -0
- package/dist/cli/doctor-config-shadowing.js +123 -0
- package/dist/cli/doctor-config-shadowing.js.map +1 -0
- package/dist/cli/doctor-rails-deploy-intent.d.ts +15 -0
- package/dist/cli/doctor-rails-deploy-intent.d.ts.map +1 -0
- package/dist/cli/doctor-rails-deploy-intent.js +197 -0
- package/dist/cli/doctor-rails-deploy-intent.js.map +1 -0
- package/dist/cli/doctor-seeded-artifacts.d.ts +12 -0
- package/dist/cli/doctor-seeded-artifacts.d.ts.map +1 -0
- package/dist/cli/doctor-seeded-artifacts.js +54 -0
- package/dist/cli/doctor-seeded-artifacts.js.map +1 -0
- package/dist/cli/doctor-stale-banner-scan.d.ts +44 -0
- package/dist/cli/doctor-stale-banner-scan.d.ts.map +1 -0
- package/dist/cli/doctor-stale-banner-scan.js +152 -0
- package/dist/cli/doctor-stale-banner-scan.js.map +1 -0
- package/dist/cli/doctor-stale-managed-banner.d.ts +19 -0
- package/dist/cli/doctor-stale-managed-banner.d.ts.map +1 -0
- package/dist/cli/doctor-stale-managed-banner.js +198 -0
- package/dist/cli/doctor-stale-managed-banner.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +16 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/ui-detected-stacks.d.ts.map +1 -1
- package/dist/cli/ui-detected-stacks.js +3 -2
- package/dist/cli/ui-detected-stacks.js.map +1 -1
- package/dist/cli/update-check.d.ts.map +1 -1
- package/dist/cli/update-check.js +14 -0
- package/dist/cli/update-check.js.map +1 -1
- package/dist/cli/worktree-liveness.d.ts +5 -0
- package/dist/cli/worktree-liveness.d.ts.map +1 -1
- package/dist/cli/worktree-liveness.js +7 -6
- package/dist/cli/worktree-liveness.js.map +1 -1
- package/dist/cli/worktree-ownership.d.ts +13 -0
- package/dist/cli/worktree-ownership.d.ts.map +1 -1
- package/dist/cli/worktree-ownership.js +14 -0
- package/dist/cli/worktree-ownership.js.map +1 -1
- package/dist/configs/eslint/base.d.ts +34 -0
- package/dist/configs/eslint/base.d.ts.map +1 -1
- package/dist/configs/eslint/base.js +34 -0
- package/dist/configs/eslint/base.js.map +1 -1
- package/dist/core/apply-receipt.d.ts +65 -0
- package/dist/core/apply-receipt.d.ts.map +1 -1
- package/dist/core/apply-receipt.js +62 -2
- package/dist/core/apply-receipt.js.map +1 -1
- package/dist/core/cdk-preset-adoption.d.ts +136 -0
- package/dist/core/cdk-preset-adoption.d.ts.map +1 -0
- package/dist/core/cdk-preset-adoption.js +135 -0
- package/dist/core/cdk-preset-adoption.js.map +1 -0
- package/dist/core/config-shadowing.d.ts +36 -0
- package/dist/core/config-shadowing.d.ts.map +1 -1
- package/dist/core/config-shadowing.js +38 -0
- package/dist/core/config-shadowing.js.map +1 -1
- package/dist/core/config.d.ts +11 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/learnings-merge-driver.d.ts +10 -0
- package/dist/core/learnings-merge-driver.d.ts.map +1 -1
- package/dist/core/learnings-merge-driver.js +18 -0
- package/dist/core/learnings-merge-driver.js.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +136 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +9 -1
- package/dist/core/lisa.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.d.ts +5 -5
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +7 -7
- package/dist/core/nightly-e2e-guard-behavior-certificate.js.map +1 -1
- package/dist/core/ownership-header.d.ts +74 -0
- package/dist/core/ownership-header.d.ts.map +1 -0
- package/dist/core/ownership-header.js +76 -0
- package/dist/core/ownership-header.js.map +1 -0
- package/dist/core/rails-deploy-production-intent.d.ts +36 -0
- package/dist/core/rails-deploy-production-intent.d.ts.map +1 -0
- package/dist/core/rails-deploy-production-intent.js +79 -0
- package/dist/core/rails-deploy-production-intent.js.map +1 -0
- package/dist/core/stale-managed-banner.d.ts +78 -0
- package/dist/core/stale-managed-banner.d.ts.map +1 -0
- package/dist/core/stale-managed-banner.js +118 -0
- package/dist/core/stale-managed-banner.js.map +1 -0
- package/dist/core/two-channel-delivery-scan.d.ts +33 -1
- package/dist/core/two-channel-delivery-scan.d.ts.map +1 -1
- package/dist/core/two-channel-delivery-scan.js +133 -6
- package/dist/core/two-channel-delivery-scan.js.map +1 -1
- package/dist/core/two-channel-delivery.d.ts +101 -4
- package/dist/core/two-channel-delivery.d.ts.map +1 -1
- package/dist/core/two-channel-delivery.js +121 -13
- package/dist/core/two-channel-delivery.js.map +1 -1
- package/dist/core/two-channel-staleness.d.ts +137 -0
- package/dist/core/two-channel-staleness.d.ts.map +1 -0
- package/dist/core/two-channel-staleness.js +268 -0
- package/dist/core/two-channel-staleness.js.map +1 -0
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +265 -121
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/core/workflow-deletion-ownership.d.ts +6 -24
- package/dist/core/workflow-deletion-ownership.d.ts.map +1 -1
- package/dist/core/workflow-deletion-ownership.js +22 -42
- package/dist/core/workflow-deletion-ownership.js.map +1 -1
- package/dist/detection/detectors/cdk.d.ts.map +1 -1
- package/dist/detection/detectors/cdk.js +2 -1
- package/dist/detection/detectors/cdk.js.map +1 -1
- package/dist/health/template-inspection.d.ts.map +1 -1
- package/dist/health/template-inspection.js +2 -1
- package/dist/health/template-inspection.js.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.d.ts +16 -0
- package/dist/migrations/ensure-lisa-postinstall.d.ts.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.js +16 -0
- package/dist/migrations/ensure-lisa-postinstall.js.map +1 -1
- package/dist/migrations/ensure-pinned-reusable-workflow-refs.d.ts +2 -2
- package/dist/migrations/ensure-pinned-reusable-workflow-refs.d.ts.map +1 -1
- package/dist/migrations/ensure-pinned-reusable-workflow-refs.js +98 -34
- package/dist/migrations/ensure-pinned-reusable-workflow-refs.js.map +1 -1
- package/dist/migrations/ensure-playwright-dedicated-caller.d.ts.map +1 -1
- package/dist/migrations/ensure-playwright-dedicated-caller.js +1 -0
- package/dist/migrations/ensure-playwright-dedicated-caller.js.map +1 -1
- package/dist/opencode/hooks-installer.d.ts.map +1 -1
- package/dist/opencode/hooks-installer.js +1 -0
- package/dist/opencode/hooks-installer.js.map +1 -1
- package/dist/opencode/plugin-templates/block-managed-file-edits.sh +78 -15
- package/dist/opencode/plugin-templates/block-no-verify.sh +21 -0
- package/dist/opencode/plugin-templates/guard-dedupe.bash +337 -0
- package/dist/opencode/plugin-templates/lisa-block-direct-issue-create.ts +242 -55
- package/dist/opencode/plugin-templates/parity-safety-net.sh +29 -1
- package/dist/strategies/package-lisa.d.ts.map +1 -1
- package/dist/strategies/package-lisa.js +2 -1
- package/dist/strategies/package-lisa.js.map +1 -1
- package/dist/utils/path-utils.d.ts +29 -0
- package/dist/utils/path-utils.d.ts.map +1 -1
- package/dist/utils/path-utils.js +41 -0
- package/dist/utils/path-utils.js.map +1 -1
- package/expo/create-only/.github/workflows/ci.yml +21 -0
- package/expo/create-only/.github/workflows/deploy.yml +28 -0
- package/expo/create-only/.github/workflows/maestro-e2e.yml +7 -0
- package/expo/create-only/.github/workflows/nightly-e2e-bypass-reaper.yml +124 -13
- package/expo/create-only/.github/workflows/nightly-e2e-health.yml +7 -0
- package/expo/create-only/.github/workflows/nightly-e2e-report.yml +7 -0
- package/expo/create-only/.github/workflows/nightly-e2e-tracking.yml +8 -0
- package/expo/create-only/.github/workflows/playwright-e2e.yml +7 -0
- package/harper-fabric/copy-overwrite/.github/workflows/ci.yml +7 -0
- package/harper-fabric/create-only/.github/workflows/deploy.yml +14 -0
- package/nestjs/create-only/.github/workflows/ci.yml +14 -0
- package/nestjs/create-only/.github/workflows/deploy.yml +28 -0
- package/package.json +10 -5
- package/phaser/copy-overwrite/.github/workflows/ci.yml +7 -0
- package/plugins/lisa/.claude-plugin/plugin.json +28 -1
- package/plugins/lisa/.codex-plugin/hooks.json +27 -0
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
- package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +27 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-github-prd-intake/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/SKILL.md +14 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +51 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +27 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/SKILL.md +14 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +51 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +55 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +27 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-prd-intake/SKILL.md +47 -30
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +3 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/SKILL.md +14 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +54 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-clear/SKILL.md +19 -7
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-fail/SKILL.md +28 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-queue/SKILL.md +28 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +94 -24
- package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/SKILL.md +32 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +4 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-track/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-build-intake/SKILL.md +9 -0
- package/plugins/lisa/agents/linear-prd-intake.md +8 -8
- package/plugins/lisa/hooks/block-blind-automerge.sh +81 -2
- package/plugins/lisa/hooks/block-direct-issue-create.agy.sh +64 -16
- package/plugins/lisa/hooks/block-direct-issue-create.sh +293 -8
- package/plugins/lisa/hooks/block-instruction-file-edits.sh +21 -0
- package/plugins/lisa/hooks/block-managed-file-edits.sh +78 -15
- package/plugins/lisa/hooks/block-no-verify.sh +21 -0
- package/plugins/lisa/hooks/block-shell-json-parsing.sh +21 -0
- package/plugins/lisa/hooks/failure-signature-index.mjs +240 -5
- package/plugins/lisa/hooks/guard-dedupe.bash +337 -0
- package/plugins/lisa/hooks/inject-rules.sh +13 -5
- package/plugins/lisa/hooks/operational-hazards.mjs +736 -0
- package/plugins/lisa/hooks/operational-hazards.sh +28 -0
- package/plugins/lisa/hooks/parity-safety-net.sh +29 -1
- package/plugins/lisa/hooks/threshold-ratchet-compare.mjs +102 -21
- package/plugins/lisa/hooks/threshold-ratchet-families.mjs +130 -2
- package/plugins/lisa/hooks/threshold-ratchet.mjs +63 -13
- package/plugins/lisa/hooks/worktree-binding-guard.mjs +183 -1
- package/plugins/lisa/hooks/worktree-binding-guard.sh +21 -0
- package/plugins/lisa/rules/eager/00-rule-index.md +1 -0
- package/plugins/lisa/rules/eager/operational-hazards.md +50 -0
- package/plugins/lisa/rules/eager/tracked-work.md +1 -1
- package/plugins/lisa/rules/reference/config-resolution.md +1 -1
- package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +1 -1
- package/plugins/lisa/rules/reference/operational-hazards.md +115 -0
- package/plugins/lisa/rules/reference/work-item-trailer-definition.md +129 -0
- package/plugins/lisa/scripts/intake-blocker-reprobe.mjs +407 -26
- package/plugins/lisa/scripts/qa-signal-lifecycle.mjs +507 -0
- package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
- package/plugins/lisa/skills/lisa-github-build-intake/SKILL.md +27 -4
- package/plugins/lisa/skills/lisa-github-prd-intake/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/lisa/skills/lisa-github-verify/SKILL.md +14 -0
- package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +51 -0
- package/plugins/lisa/skills/lisa-intake/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-jira-build-intake/SKILL.md +27 -4
- package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/lisa/skills/lisa-jira-verify/SKILL.md +14 -0
- package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +51 -0
- package/plugins/lisa/skills/lisa-linear-access/SKILL.md +55 -2
- package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +27 -4
- package/plugins/lisa/skills/lisa-linear-prd-intake/SKILL.md +48 -31
- package/plugins/lisa/skills/lisa-linear-to-tracker/SKILL.md +3 -3
- package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/lisa/skills/lisa-linear-verify/SKILL.md +14 -0
- package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +54 -3
- package/plugins/lisa/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/lisa/skills/lisa-qa-clear/SKILL.md +19 -7
- package/plugins/lisa/skills/lisa-qa-fail/SKILL.md +28 -3
- package/plugins/lisa/skills/lisa-qa-queue/SKILL.md +28 -3
- package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +94 -24
- package/plugins/lisa/skills/lisa-rework-triage/SKILL.md +32 -2
- package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +5 -5
- package/plugins/lisa/skills/lisa-track/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-tracker-build-intake/SKILL.md +9 -0
- package/plugins/lisa-agy/agents/linear-prd-intake.md +8 -8
- package/plugins/lisa-agy/hooks/block-blind-automerge.sh +81 -2
- package/plugins/lisa-agy/hooks/block-direct-issue-create.agy.sh +64 -16
- package/plugins/lisa-agy/hooks/block-direct-issue-create.sh +293 -8
- package/plugins/lisa-agy/hooks/block-instruction-file-edits.sh +21 -0
- package/plugins/lisa-agy/hooks/block-managed-file-edits.sh +78 -15
- package/plugins/lisa-agy/hooks/block-shell-json-parsing.sh +21 -0
- package/plugins/lisa-agy/hooks/guard-dedupe.bash +337 -0
- package/plugins/lisa-agy/hooks/parity-safety-net.sh +29 -1
- package/plugins/lisa-agy/hooks.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/scripts/intake-blocker-reprobe.mjs +407 -26
- package/plugins/lisa-agy/scripts/qa-signal-lifecycle.mjs +507 -0
- package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
- package/plugins/lisa-agy/skills/lisa-github-build-intake/SKILL.md +27 -4
- package/plugins/lisa-agy/skills/lisa-github-prd-intake/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-agy/skills/lisa-github-verify/SKILL.md +14 -0
- package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +51 -0
- package/plugins/lisa-agy/skills/lisa-intake/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-jira-build-intake/SKILL.md +27 -4
- package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/lisa-agy/skills/lisa-jira-verify/SKILL.md +14 -0
- package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +51 -0
- package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +55 -2
- package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +27 -4
- package/plugins/lisa-agy/skills/lisa-linear-prd-intake/SKILL.md +48 -31
- package/plugins/lisa-agy/skills/lisa-linear-to-tracker/SKILL.md +3 -3
- package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-agy/skills/lisa-linear-verify/SKILL.md +14 -0
- package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +54 -3
- package/plugins/lisa-agy/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/lisa-qa-clear/SKILL.md +19 -7
- package/plugins/lisa-agy/skills/lisa-qa-fail/SKILL.md +28 -3
- package/plugins/lisa-agy/skills/lisa-qa-queue/SKILL.md +28 -3
- package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +94 -24
- package/plugins/lisa-agy/skills/lisa-rework-triage/SKILL.md +32 -2
- package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +5 -5
- package/plugins/lisa-agy/skills/lisa-track/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-tracker-build-intake/SKILL.md +9 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +19 -1
- package/plugins/lisa-copilot/agents/linear-prd-intake.agent.md +8 -8
- package/plugins/lisa-copilot/hooks/block-blind-automerge.sh +81 -2
- package/plugins/lisa-copilot/hooks/block-direct-issue-create.sh +293 -8
- package/plugins/lisa-copilot/hooks/block-instruction-file-edits.sh +21 -0
- package/plugins/lisa-copilot/hooks/block-managed-file-edits.sh +78 -15
- package/plugins/lisa-copilot/hooks/block-no-verify.sh +21 -0
- package/plugins/lisa-copilot/hooks/block-shell-json-parsing.sh +21 -0
- package/plugins/lisa-copilot/hooks/failure-signature-index.mjs +240 -5
- package/plugins/lisa-copilot/hooks/guard-dedupe.bash +337 -0
- package/plugins/lisa-copilot/hooks/inject-rules.sh +13 -5
- package/plugins/lisa-copilot/hooks/operational-hazards.mjs +736 -0
- package/plugins/lisa-copilot/hooks/operational-hazards.sh +28 -0
- package/plugins/lisa-copilot/hooks/parity-safety-net.sh +29 -1
- package/plugins/lisa-copilot/hooks/threshold-ratchet-compare.mjs +102 -21
- package/plugins/lisa-copilot/hooks/threshold-ratchet-families.mjs +130 -2
- package/plugins/lisa-copilot/hooks/threshold-ratchet.mjs +63 -13
- package/plugins/lisa-copilot/hooks/worktree-binding-guard.mjs +183 -1
- package/plugins/lisa-copilot/hooks/worktree-binding-guard.sh +21 -0
- package/plugins/lisa-copilot/rules/eager/00-rule-index.md +1 -0
- package/plugins/lisa-copilot/rules/eager/operational-hazards.md +50 -0
- package/plugins/lisa-copilot/rules/eager/tracked-work.md +1 -1
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +1 -1
- package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +1 -1
- package/plugins/lisa-copilot/rules/reference/operational-hazards.md +115 -0
- package/plugins/lisa-copilot/rules/reference/work-item-trailer-definition.md +129 -0
- package/plugins/lisa-copilot/scripts/intake-blocker-reprobe.mjs +407 -26
- package/plugins/lisa-copilot/scripts/qa-signal-lifecycle.mjs +507 -0
- package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
- package/plugins/lisa-copilot/skills/lisa-github-build-intake/SKILL.md +27 -4
- package/plugins/lisa-copilot/skills/lisa-github-prd-intake/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-copilot/skills/lisa-github-verify/SKILL.md +14 -0
- package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +51 -0
- package/plugins/lisa-copilot/skills/lisa-intake/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-jira-build-intake/SKILL.md +27 -4
- package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/lisa-copilot/skills/lisa-jira-verify/SKILL.md +14 -0
- package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +51 -0
- package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +55 -2
- package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +27 -4
- package/plugins/lisa-copilot/skills/lisa-linear-prd-intake/SKILL.md +48 -31
- package/plugins/lisa-copilot/skills/lisa-linear-to-tracker/SKILL.md +3 -3
- package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-copilot/skills/lisa-linear-verify/SKILL.md +14 -0
- package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +54 -3
- package/plugins/lisa-copilot/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/lisa-qa-clear/SKILL.md +19 -7
- package/plugins/lisa-copilot/skills/lisa-qa-fail/SKILL.md +28 -3
- package/plugins/lisa-copilot/skills/lisa-qa-queue/SKILL.md +28 -3
- package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +94 -24
- package/plugins/lisa-copilot/skills/lisa-rework-triage/SKILL.md +32 -2
- package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +5 -5
- package/plugins/lisa-copilot/skills/lisa-track/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-tracker-build-intake/SKILL.md +9 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/linear-prd-intake.md +8 -8
- package/plugins/lisa-cursor/hooks/block-blind-automerge.sh +81 -2
- package/plugins/lisa-cursor/hooks/block-direct-issue-create.sh +293 -8
- package/plugins/lisa-cursor/hooks/block-instruction-file-edits.sh +21 -0
- package/plugins/lisa-cursor/hooks/block-managed-file-edits.sh +78 -15
- package/plugins/lisa-cursor/hooks/block-no-verify.sh +21 -0
- package/plugins/lisa-cursor/hooks/block-shell-json-parsing.sh +21 -0
- package/plugins/lisa-cursor/hooks/failure-signature-index.mjs +240 -5
- package/plugins/lisa-cursor/hooks/guard-dedupe.bash +337 -0
- package/plugins/lisa-cursor/hooks/hooks.json +10 -0
- package/plugins/lisa-cursor/hooks/operational-hazards.mjs +736 -0
- package/plugins/lisa-cursor/hooks/operational-hazards.sh +28 -0
- package/plugins/lisa-cursor/hooks/parity-safety-net.sh +29 -1
- package/plugins/lisa-cursor/hooks/threshold-ratchet-compare.mjs +102 -21
- package/plugins/lisa-cursor/hooks/threshold-ratchet-families.mjs +130 -2
- package/plugins/lisa-cursor/hooks/threshold-ratchet.mjs +63 -13
- package/plugins/lisa-cursor/hooks/worktree-binding-guard.mjs +183 -1
- package/plugins/lisa-cursor/hooks/worktree-binding-guard.sh +21 -0
- package/plugins/lisa-cursor/rules/00-rule-index.mdc +1 -0
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/operational-hazards-reference.mdc +120 -0
- package/plugins/lisa-cursor/rules/operational-hazards.mdc +55 -0
- package/plugins/lisa-cursor/rules/tracked-work.mdc +1 -1
- package/plugins/lisa-cursor/rules/work-item-trailer-definition-reference.mdc +134 -0
- package/plugins/lisa-cursor/scripts/intake-blocker-reprobe.mjs +407 -26
- package/plugins/lisa-cursor/scripts/qa-signal-lifecycle.mjs +507 -0
- package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
- package/plugins/lisa-cursor/skills/lisa-github-build-intake/SKILL.md +27 -4
- package/plugins/lisa-cursor/skills/lisa-github-prd-intake/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-cursor/skills/lisa-github-verify/SKILL.md +14 -0
- package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +51 -0
- package/plugins/lisa-cursor/skills/lisa-intake/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-jira-build-intake/SKILL.md +27 -4
- package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/lisa-cursor/skills/lisa-jira-verify/SKILL.md +14 -0
- package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +51 -0
- package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +55 -2
- package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +27 -4
- package/plugins/lisa-cursor/skills/lisa-linear-prd-intake/SKILL.md +48 -31
- package/plugins/lisa-cursor/skills/lisa-linear-to-tracker/SKILL.md +3 -3
- package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-cursor/skills/lisa-linear-verify/SKILL.md +14 -0
- package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +54 -3
- package/plugins/lisa-cursor/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/lisa-qa-clear/SKILL.md +19 -7
- package/plugins/lisa-cursor/skills/lisa-qa-fail/SKILL.md +28 -3
- package/plugins/lisa-cursor/skills/lisa-qa-queue/SKILL.md +28 -3
- package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +94 -24
- package/plugins/lisa-cursor/skills/lisa-rework-triage/SKILL.md +32 -2
- package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +5 -5
- package/plugins/lisa-cursor/skills/lisa-track/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-tracker-build-intake/SKILL.md +9 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/hooks/inject-rules.sh +14 -3
- package/plugins/lisa-harper-fabric/rules/eager/harper-fabric.md +31 -0
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/hooks/inject-rules.sh +14 -3
- package/plugins/lisa-harper-fabric-copilot/rules/eager/harper-fabric.md +31 -0
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/rules/harper-fabric-reference.mdc +57 -0
- package/plugins/lisa-harper-fabric-cursor/rules/harper-fabric.mdc +32 -53
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/hooks/inject-rules.sh +14 -3
- package/plugins/lisa-phaser/rules/eager/phaser.md +44 -0
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/hooks/inject-rules.sh +14 -3
- package/plugins/lisa-phaser-copilot/rules/eager/phaser.md +44 -0
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/rules/phaser-reference.mdc +189 -0
- package/plugins/lisa-phaser-cursor/rules/phaser.mdc +45 -185
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/hooks/inject-rules.sh +14 -4
- package/plugins/lisa-rails/rules/eager/rails-conventions.md +23 -0
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/hooks/inject-rules.sh +14 -4
- package/plugins/lisa-rails-copilot/rules/eager/rails-conventions.md +23 -0
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/rules/rails-conventions-reference.mdc +181 -0
- package/plugins/lisa-rails-cursor/rules/rails-conventions.mdc +24 -177
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/materialized-artifacts.json +1 -0
- package/plugins/src/base/.claude-plugin/plugin.json +27 -0
- package/plugins/src/base/agents/linear-prd-intake.md +8 -8
- package/plugins/src/base/hooks/block-blind-automerge.sh +81 -2
- package/plugins/src/base/hooks/block-direct-issue-create.agy.sh +64 -16
- package/plugins/src/base/hooks/block-direct-issue-create.sh +293 -8
- package/plugins/src/base/hooks/block-instruction-file-edits.sh +21 -0
- package/plugins/src/base/hooks/block-managed-file-edits.sh +78 -15
- package/plugins/src/base/hooks/block-no-verify.sh +21 -0
- package/plugins/src/base/hooks/block-shell-json-parsing.sh +21 -0
- package/plugins/src/base/hooks/failure-signature-index.mjs +240 -5
- package/plugins/src/base/hooks/guard-dedupe.bash +337 -0
- package/plugins/src/base/hooks/inject-rules.sh +13 -5
- package/plugins/src/base/hooks/operational-hazards.mjs +736 -0
- package/plugins/src/base/hooks/operational-hazards.sh +28 -0
- package/plugins/src/base/hooks/parity-safety-net.sh +29 -1
- package/plugins/src/base/hooks/threshold-ratchet-compare.mjs +102 -21
- package/plugins/src/base/hooks/threshold-ratchet-families.mjs +130 -2
- package/plugins/src/base/hooks/threshold-ratchet.mjs +63 -13
- package/plugins/src/base/hooks/worktree-binding-guard.mjs +183 -1
- package/plugins/src/base/hooks/worktree-binding-guard.sh +21 -0
- package/plugins/src/base/rules/eager/00-rule-index.md +1 -0
- package/plugins/src/base/rules/eager/operational-hazards.md +50 -0
- package/plugins/src/base/rules/eager/tracked-work.md +1 -1
- package/plugins/src/base/rules/reference/config-resolution.md +1 -1
- package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +1 -1
- package/plugins/src/base/rules/reference/operational-hazards.md +115 -0
- package/plugins/src/base/rules/reference/work-item-trailer-definition.md +129 -0
- package/plugins/src/base/scripts/intake-blocker-reprobe.mjs +407 -26
- package/plugins/src/base/scripts/qa-signal-lifecycle.mjs +507 -0
- package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
- package/plugins/src/base/skills/lisa-github-build-intake/SKILL.md +27 -4
- package/plugins/src/base/skills/lisa-github-prd-intake/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/src/base/skills/lisa-github-verify/SKILL.md +14 -0
- package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +51 -0
- package/plugins/src/base/skills/lisa-intake/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-jira-build-intake/SKILL.md +27 -4
- package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/src/base/skills/lisa-jira-verify/SKILL.md +14 -0
- package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +51 -0
- package/plugins/src/base/skills/lisa-linear-access/SKILL.md +55 -2
- package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +27 -4
- package/plugins/src/base/skills/lisa-linear-prd-intake/SKILL.md +48 -31
- package/plugins/src/base/skills/lisa-linear-to-tracker/SKILL.md +3 -3
- package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/src/base/skills/lisa-linear-verify/SKILL.md +14 -0
- package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +54 -3
- package/plugins/src/base/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/src/base/skills/lisa-qa-clear/SKILL.md +19 -7
- package/plugins/src/base/skills/lisa-qa-fail/SKILL.md +28 -3
- package/plugins/src/base/skills/lisa-qa-queue/SKILL.md +28 -3
- package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +94 -24
- package/plugins/src/base/skills/lisa-rework-triage/SKILL.md +32 -2
- package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +5 -5
- package/plugins/src/base/skills/lisa-track/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-tracker-build-intake/SKILL.md +9 -0
- package/plugins/src/harper-fabric/hooks/inject-rules.sh +14 -3
- package/plugins/src/harper-fabric/rules/eager/harper-fabric.md +31 -0
- package/plugins/src/phaser/hooks/inject-rules.sh +14 -3
- package/plugins/src/phaser/rules/eager/phaser.md +44 -0
- package/plugins/src/rails/hooks/inject-rules.sh +14 -4
- package/plugins/src/rails/rules/eager/rails-conventions.md +23 -0
- package/rails/copy-overwrite/scripts/check-threshold-ratchet.mjs +63 -13
- package/rails/copy-overwrite/scripts/threshold-ratchet-compare.mjs +102 -21
- package/rails/copy-overwrite/scripts/threshold-ratchet-families.mjs +130 -2
- package/rails/create-only/.github/workflows/ci.yml +8 -0
- package/rails/create-only/.github/workflows/deploy.yml +22 -0
- package/scripts/build-plugins.sh +2 -1
- package/scripts/check-engine-floor.mjs +361 -0
- package/scripts/check-guard-parity-notes.mjs +709 -0
- package/scripts/check-template-workflow-refs.mjs +9 -0
- package/scripts/check-third-party-action-pins.mjs +17 -1
- package/scripts/check-workflow-contract-assertions.mjs +480 -0
- package/scripts/copy-opencode-plugin-templates.mjs +1 -0
- package/scripts/deployed-guard-advice.mjs +636 -0
- package/scripts/generate-agy-plugin-artifacts.mjs +35 -10
- package/scripts/generate-export-surface.mjs +105 -19
- package/scripts/generate-two-channel-couplings.ts +143 -212
- package/scripts/lisa-enforcement-fallback.sh +31 -0
- package/scripts/measure-scripts-profile-gap.mts +361 -0
- package/scripts/mutation-performance-measure.mjs +21 -5
- package/scripts/reconcile-release-tags.mjs +65 -84
- package/scripts/two-channel-couplings.json +302 -70
- package/scripts/workflow-contract-assertion.sh +47 -0
- package/typescript/copy-overwrite/.lintstagedrc.json +1 -0
- package/typescript/copy-overwrite/eslint.ignore.config.json +1 -0
- package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +527 -53
- package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +301 -13
- package/typescript/copy-overwrite/scripts/check-threshold-ratchet.mjs +63 -13
- package/typescript/copy-overwrite/scripts/threshold-ratchet-compare.mjs +102 -21
- package/typescript/copy-overwrite/scripts/threshold-ratchet-families.mjs +130 -2
- package/typescript/create-only/.github/workflows/ci.yml +7 -0
- /package/plugins/lisa-harper-fabric/rules/{harper-fabric.md → reference/harper-fabric.md} +0 -0
- /package/plugins/lisa-harper-fabric-copilot/rules/{harper-fabric.md → reference/harper-fabric.md} +0 -0
- /package/plugins/lisa-phaser/rules/{phaser.md → reference/phaser.md} +0 -0
- /package/plugins/lisa-phaser-copilot/rules/{phaser.md → reference/phaser.md} +0 -0
- /package/plugins/lisa-rails/rules/{rails-conventions.md → reference/rails-conventions.md} +0 -0
- /package/plugins/lisa-rails-copilot/rules/{rails-conventions.md → reference/rails-conventions.md} +0 -0
- /package/plugins/src/harper-fabric/rules/{harper-fabric.md → reference/harper-fabric.md} +0 -0
- /package/plugins/src/phaser/rules/{phaser.md → reference/phaser.md} +0 -0
- /package/plugins/src/rails/rules/{rails-conventions.md → reference/rails-conventions.md} +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every staleness-probe token this scan can see, in report order.
|
|
3
|
+
*
|
|
4
|
+
* The same discipline the handling signals are held to: each name means those
|
|
5
|
+
* characters were found where the name says to look, and nothing more. Two of
|
|
6
|
+
* them are read off the DELIVERED ARTIFACT and are exact for this coupling's
|
|
7
|
+
* path; two are read off the workflow and say which SCOPE they came from,
|
|
8
|
+
* because the scopes are not equally tight and pretending otherwise is how a
|
|
9
|
+
* derived field starts asserting.
|
|
10
|
+
*/
|
|
11
|
+
export declare const STALENESS_SIGNALS: readonly ["artifact-declares-version", "artifact-answers-version", "step-requests-version", "workflow-requests-version"];
|
|
12
|
+
/** One staleness-probe token name. */
|
|
13
|
+
export type StalenessSignal = (typeof STALENESS_SIGNALS)[number];
|
|
14
|
+
/**
|
|
15
|
+
* What this coupling can tell about the AGE of the artifact it reads.
|
|
16
|
+
*
|
|
17
|
+
* Derived from the signals above and from `guarded`, never declared. The
|
|
18
|
+
* ordering is deliberate: each member says strictly less than the one before
|
|
19
|
+
* it, and the last says the question could not be answered at all.
|
|
20
|
+
*/
|
|
21
|
+
export declare const STALENESS_DETECTIONS: readonly ["version-handshake", "capability-probe", "existence-only", "no-probe", "unchecked"];
|
|
22
|
+
/** What this coupling can tell about the AGE of the artifact it reads. */
|
|
23
|
+
export type StalenessDetection = (typeof STALENESS_DETECTIONS)[number];
|
|
24
|
+
/**
|
|
25
|
+
* The hand-authored half: whether the staleness gap here is worth closing.
|
|
26
|
+
*
|
|
27
|
+
* This is the field a new coupling cannot be added without. The detection is
|
|
28
|
+
* derived and therefore free; the decision costs somebody a sentence, which is
|
|
29
|
+
* the whole point — a sweep decays the moment entry 24 appears, a required
|
|
30
|
+
* decision does not.
|
|
31
|
+
*/
|
|
32
|
+
export declare const STALENESS_DECISIONS: readonly ["handshake", "not-needed", "warranted"];
|
|
33
|
+
/** The hand-authored half: whether the staleness gap here is worth closing. */
|
|
34
|
+
export type StalenessDecision = (typeof STALENESS_DECISIONS)[number];
|
|
35
|
+
/** One recorded decision about one coupling's staleness half. */
|
|
36
|
+
export interface StalenessRecord {
|
|
37
|
+
/** What was decided. */
|
|
38
|
+
readonly decision: StalenessDecision;
|
|
39
|
+
/** Why. Required for every decision that is not `handshake`. */
|
|
40
|
+
readonly reason?: string;
|
|
41
|
+
}
|
|
42
|
+
/** What the scan found about one coupling, as the staleness rules see it. */
|
|
43
|
+
export interface StalenessInput {
|
|
44
|
+
/** Literal staleness-probe tokens found for this coupling. */
|
|
45
|
+
readonly staleness: readonly StalenessSignal[];
|
|
46
|
+
/** Whether any delivered artifact was available at this path to inspect. */
|
|
47
|
+
readonly artifactRead: boolean;
|
|
48
|
+
/** Whether the read sits behind a file-existence test. */
|
|
49
|
+
readonly guarded: boolean;
|
|
50
|
+
}
|
|
51
|
+
/** One classified coupling and the decision recorded about it. */
|
|
52
|
+
export interface DecidedCoupling {
|
|
53
|
+
/** Stable `<workflow>::<path>` identity. */
|
|
54
|
+
readonly key: string;
|
|
55
|
+
/** Workflow file name. */
|
|
56
|
+
readonly workflow: string;
|
|
57
|
+
/** The caller-tree path. */
|
|
58
|
+
readonly path: string;
|
|
59
|
+
/** What the tree says this coupling can detect about age. */
|
|
60
|
+
readonly detection: StalenessDetection;
|
|
61
|
+
/** What was recorded by hand, or null when nobody has. */
|
|
62
|
+
readonly decision: StalenessDecision | null;
|
|
63
|
+
/** The reason recorded beside that decision, or null. */
|
|
64
|
+
readonly reason: string | null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The staleness tokens one delivered artifact's own text carries.
|
|
68
|
+
*
|
|
69
|
+
* Pure: the caller reads the file, this decides what the bytes say. Lives
|
|
70
|
+
* beside the vocabulary so both halves of it are derived in one place and
|
|
71
|
+
* cannot drift apart.
|
|
72
|
+
* @param text - The delivered artifact's text
|
|
73
|
+
* @returns Signal names in the vocabulary's declared order
|
|
74
|
+
*/
|
|
75
|
+
export declare function artifactStalenessSignals(text: string): readonly StalenessSignal[];
|
|
76
|
+
/**
|
|
77
|
+
* Whether a chunk of workflow text asks something for its contract version.
|
|
78
|
+
* @param text - Step or workflow text, already stripped of full-line comments
|
|
79
|
+
* @returns Whether the request token appears
|
|
80
|
+
*/
|
|
81
|
+
export declare function requestsVersion(text: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* What this coupling can tell about the artifact's AGE.
|
|
84
|
+
*
|
|
85
|
+
* Derived, in the order the members are declared, so each answer says strictly
|
|
86
|
+
* less than the one above it:
|
|
87
|
+
*
|
|
88
|
+
* - no artifact to read at all — `unchecked`, the honest non-answer;
|
|
89
|
+
* - the artifact answers a version AND something asks for one — a handshake;
|
|
90
|
+
* - the STEP asks for a version the artifact cannot answer — a capability
|
|
91
|
+
* probe, which is #3477's defect: one floor, blind above it;
|
|
92
|
+
* - an existence test and no version probe — absence, never age;
|
|
93
|
+
* - neither — nothing here bears on either question.
|
|
94
|
+
*
|
|
95
|
+
* The handshake arm accepts the workflow-scoped signal as well as the
|
|
96
|
+
* step-scoped one, and that is a deliberate, stated looseness. A read can
|
|
97
|
+
* reach the step through a `workflow_call` input default — `guard_script`
|
|
98
|
+
* defaults to `scripts/check-nightly-e2e-health.mjs`, and the step that
|
|
99
|
+
* compares versions names `$GUARD`, never the path — so a step-scoped-only
|
|
100
|
+
* rule would refute a handshake that exists. Over-crediting here is bounded by
|
|
101
|
+
* the ARTIFACT half, which is exact for this path: a workflow that asks for a
|
|
102
|
+
* version cannot manufacture a handshake for a file that answers none.
|
|
103
|
+
* @param input - What the scan found for one coupling
|
|
104
|
+
* @returns What it can detect about age
|
|
105
|
+
*/
|
|
106
|
+
export declare function detectStaleness(input: StalenessInput): StalenessDetection;
|
|
107
|
+
/**
|
|
108
|
+
* How the age question was answered, and on what evidence.
|
|
109
|
+
* @param input - What the scan found for one coupling
|
|
110
|
+
* @param detection - What it can detect about age
|
|
111
|
+
* @returns One clause naming the verdict and the tokens behind it
|
|
112
|
+
*/
|
|
113
|
+
export declare function stalenessShape(input: StalenessInput, detection: StalenessDetection): string;
|
|
114
|
+
/**
|
|
115
|
+
* Which recorded decisions the tree refuses to support, and why.
|
|
116
|
+
*
|
|
117
|
+
* One rule in each direction, because a hand-authored field that only ever
|
|
118
|
+
* over-claims is half a check:
|
|
119
|
+
*
|
|
120
|
+
* - a `handshake` decision on a coupling whose derived detection is not
|
|
121
|
+
* `version-handshake` claims cover the tree does not show;
|
|
122
|
+
* - any other decision on a coupling that DOES carry one records a gap that
|
|
123
|
+
* has already been closed, which decays into a stale exemption.
|
|
124
|
+
*
|
|
125
|
+
* Neither is a judgement about whether the decision was wise. Both are the
|
|
126
|
+
* cheap, checkable half: the declaration must agree with what was measured.
|
|
127
|
+
* @param entry - The classified entry
|
|
128
|
+
* @returns One sentence, or null when the decision and the tree agree
|
|
129
|
+
*/
|
|
130
|
+
export declare function contradictionIn(entry: DecidedCoupling): string | null;
|
|
131
|
+
/**
|
|
132
|
+
* Which recorded decisions are unusable as written.
|
|
133
|
+
* @param entry - The classified entry
|
|
134
|
+
* @returns One sentence, or null when the record is well-formed
|
|
135
|
+
*/
|
|
136
|
+
export declare function malformedIn(entry: DecidedCoupling): string | null;
|
|
137
|
+
//# sourceMappingURL=two-channel-staleness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"two-channel-staleness.d.ts","sourceRoot":"","sources":["../../src/core/two-channel-staleness.ts"],"names":[],"mappings":"AA8EA;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,0HASpB,CAAC;AAEX,sCAAsC;AACtC,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,+FAuBvB,CAAC;AAEX,0EAA0E;AAC1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,mDAOtB,CAAC;AAEX,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,iEAAiE;AACjE,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5C,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GACX,SAAS,eAAe,EAAE,CAM5B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AACD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,kBAAkB,CAQzE;AAgBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,kBAAkB,GAC5B,MAAM,CAQR;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAQrE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAajE"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The staleness dimension: can a two-channel coupling tell an OLD artifact
|
|
3
|
+
* from a current one (CodySwannGT/lisa#3687)?
|
|
4
|
+
*
|
|
5
|
+
* `core/two-channel-delivery` answers whether the artifact ARRIVES. Absence is
|
|
6
|
+
* the benign half of the defect — an absent artifact makes a step skip or fail,
|
|
7
|
+
* and neither outcome is a wrong answer. The harmful half is present-and-old: a
|
|
8
|
+
* gate posting a red required check derived from superseded logic, which every
|
|
9
|
+
* reader believes. CodySwannGT/lisa#3477 measured that on one coupling, where
|
|
10
|
+
* the only age probe was a single hardcoded capability floor and could not
|
|
11
|
+
* answer "how old".
|
|
12
|
+
*
|
|
13
|
+
* So this is a SECOND dimension hung off the same entry rather than an extra
|
|
14
|
+
* member of the delivery verdict. A coupling can be apply-lagged and carry a
|
|
15
|
+
* version handshake; it can be package-backed and carry none.
|
|
16
|
+
*
|
|
17
|
+
* ## Derived, never declared
|
|
18
|
+
*
|
|
19
|
+
* The detection is read off the tree on every run. What a person is allowed to
|
|
20
|
+
* record by hand is the DECISION — whether closing the gap here is worth it —
|
|
21
|
+
* and even that is checked in both directions against what was measured. A
|
|
22
|
+
* handshake nobody can find is refused; so is an exemption on a coupling that
|
|
23
|
+
* already has one.
|
|
24
|
+
*
|
|
25
|
+
* ## The one thing this may never mean
|
|
26
|
+
*
|
|
27
|
+
* Silence. A coupling whose delivered artifact cannot be read at all is
|
|
28
|
+
* `unchecked`, said out loud, rather than defaulted to current. "There was no
|
|
29
|
+
* artifact to ask" and "the artifact carries no version tokens" produce the
|
|
30
|
+
* same empty token list and are not the same fact.
|
|
31
|
+
*
|
|
32
|
+
* Structural inputs rather than the coupling types themselves, so this module
|
|
33
|
+
* imports nothing from `core/two-channel-delivery` and the two can be read in
|
|
34
|
+
* either order.
|
|
35
|
+
* @module core/two-channel-staleness
|
|
36
|
+
*/
|
|
37
|
+
/** Every staleness detection value, named once so no two mentions can drift. */
|
|
38
|
+
const VERSION_HANDSHAKE = "version-handshake";
|
|
39
|
+
const CAPABILITY_PROBE = "capability-probe";
|
|
40
|
+
const EXISTENCE_ONLY = "existence-only";
|
|
41
|
+
const NO_PROBE = "no-probe";
|
|
42
|
+
const UNCHECKED = "unchecked";
|
|
43
|
+
/** Every staleness decision value, named once for the same reason. */
|
|
44
|
+
const DECISION_HANDSHAKE = "handshake";
|
|
45
|
+
const DECISION_NOT_NEEDED = "not-needed";
|
|
46
|
+
const DECISION_WARRANTED = "warranted";
|
|
47
|
+
/**
|
|
48
|
+
* The floor a stated reason must clear to be a reason rather than a label.
|
|
49
|
+
*
|
|
50
|
+
* A floor, not a proof — no check tells a real argument from filler. What it
|
|
51
|
+
* buys is that "n/a", "ok" and "advisory" cannot stand in for the decision this
|
|
52
|
+
* field exists to record, which is the same collapse the empty-reason refusal
|
|
53
|
+
* below already rejects, one step further along.
|
|
54
|
+
*/
|
|
55
|
+
const MIN_REASON_CHARACTERS = 40;
|
|
56
|
+
/** How a workflow asks an artifact how old it is. */
|
|
57
|
+
const VERSION_REQUEST = "contract-version";
|
|
58
|
+
/**
|
|
59
|
+
* How a delivered artifact declares the contract version it speaks.
|
|
60
|
+
*
|
|
61
|
+
* A literal rather than a pattern. Both existing handshakes spell it the same
|
|
62
|
+
* way — `NIGHTLY_E2E_CONTRACT_VERSION`, `WORK_ITEM_CONTRACT_VERSION` — and a
|
|
63
|
+
* looser matcher would let `expected_workflow_contract_major`, which is the
|
|
64
|
+
* FAST channel's own handshake about the workflow body rather than the
|
|
65
|
+
* artifact it reads, answer a question it has nothing to do with.
|
|
66
|
+
*/
|
|
67
|
+
const VERSION_CONSTANT = "_CONTRACT_VERSION";
|
|
68
|
+
/** Every staleness-probe token, named once so no two mentions can drift. */
|
|
69
|
+
const ARTIFACT_DECLARES = "artifact-declares-version";
|
|
70
|
+
const ARTIFACT_ANSWERS = "artifact-answers-version";
|
|
71
|
+
const STEP_REQUESTS = "step-requests-version";
|
|
72
|
+
const WORKFLOW_REQUESTS = "workflow-requests-version";
|
|
73
|
+
/**
|
|
74
|
+
* Every staleness-probe token this scan can see, in report order.
|
|
75
|
+
*
|
|
76
|
+
* The same discipline the handling signals are held to: each name means those
|
|
77
|
+
* characters were found where the name says to look, and nothing more. Two of
|
|
78
|
+
* them are read off the DELIVERED ARTIFACT and are exact for this coupling's
|
|
79
|
+
* path; two are read off the workflow and say which SCOPE they came from,
|
|
80
|
+
* because the scopes are not equally tight and pretending otherwise is how a
|
|
81
|
+
* derived field starts asserting.
|
|
82
|
+
*/
|
|
83
|
+
export const STALENESS_SIGNALS = [
|
|
84
|
+
/** The delivered file declares a `*_CONTRACT_VERSION` constant. Per-path. */
|
|
85
|
+
ARTIFACT_DECLARES,
|
|
86
|
+
/** The delivered file's text carries the `contract-version` request. Per-path. */
|
|
87
|
+
ARTIFACT_ANSWERS,
|
|
88
|
+
/** The step that reads this path asks something for a `contract-version`. */
|
|
89
|
+
STEP_REQUESTS,
|
|
90
|
+
/** Some step of this workflow does — the read may arrive via an input default. */
|
|
91
|
+
WORKFLOW_REQUESTS,
|
|
92
|
+
];
|
|
93
|
+
/**
|
|
94
|
+
* What this coupling can tell about the AGE of the artifact it reads.
|
|
95
|
+
*
|
|
96
|
+
* Derived from the signals above and from `guarded`, never declared. The
|
|
97
|
+
* ordering is deliberate: each member says strictly less than the one before
|
|
98
|
+
* it, and the last says the question could not be answered at all.
|
|
99
|
+
*/
|
|
100
|
+
export const STALENESS_DETECTIONS = [
|
|
101
|
+
/** The artifact answers a version and the workflow asks for one. */
|
|
102
|
+
VERSION_HANDSHAKE,
|
|
103
|
+
/**
|
|
104
|
+
* The step asks the artifact for a subcommand the artifact does not answer.
|
|
105
|
+
*
|
|
106
|
+
* That is #3477's defect exactly: age inferred from whether one call
|
|
107
|
+
* succeeds, which detects staleness at one floor and is blind above it.
|
|
108
|
+
*/
|
|
109
|
+
CAPABILITY_PROBE,
|
|
110
|
+
/** An existence test and no version probe — sees absence, never age. */
|
|
111
|
+
EXISTENCE_ONLY,
|
|
112
|
+
/** Neither. Nothing about this read bears on absence or on age. */
|
|
113
|
+
NO_PROBE,
|
|
114
|
+
/**
|
|
115
|
+
* No delivered artifact could be read, so the artifact half is UNKNOWN.
|
|
116
|
+
*
|
|
117
|
+
* Not "current" and not "no probe". Lisa ships nothing at this path, so
|
|
118
|
+
* whether a consumer's copy could answer a version is undecidable from this
|
|
119
|
+
* tree — said out loud, because silence reading as success is the family of
|
|
120
|
+
* defect this whole module exists to stop.
|
|
121
|
+
*/
|
|
122
|
+
UNCHECKED,
|
|
123
|
+
];
|
|
124
|
+
/**
|
|
125
|
+
* The hand-authored half: whether the staleness gap here is worth closing.
|
|
126
|
+
*
|
|
127
|
+
* This is the field a new coupling cannot be added without. The detection is
|
|
128
|
+
* derived and therefore free; the decision costs somebody a sentence, which is
|
|
129
|
+
* the whole point — a sweep decays the moment entry 24 appears, a required
|
|
130
|
+
* decision does not.
|
|
131
|
+
*/
|
|
132
|
+
export const STALENESS_DECISIONS = [
|
|
133
|
+
/** It already has a handshake. Only valid where the tree shows one. */
|
|
134
|
+
DECISION_HANDSHAKE,
|
|
135
|
+
/** Reasoned exemption: closing this gap is cost without cover. */
|
|
136
|
+
DECISION_NOT_NEEDED,
|
|
137
|
+
/** Worth closing, and not closed yet. Counted as an open obligation. */
|
|
138
|
+
DECISION_WARRANTED,
|
|
139
|
+
];
|
|
140
|
+
/**
|
|
141
|
+
* The staleness tokens one delivered artifact's own text carries.
|
|
142
|
+
*
|
|
143
|
+
* Pure: the caller reads the file, this decides what the bytes say. Lives
|
|
144
|
+
* beside the vocabulary so both halves of it are derived in one place and
|
|
145
|
+
* cannot drift apart.
|
|
146
|
+
* @param text - The delivered artifact's text
|
|
147
|
+
* @returns Signal names in the vocabulary's declared order
|
|
148
|
+
*/
|
|
149
|
+
export function artifactStalenessSignals(text) {
|
|
150
|
+
const found = [
|
|
151
|
+
...(text.includes(VERSION_CONSTANT) ? [ARTIFACT_DECLARES] : []),
|
|
152
|
+
...(text.includes(VERSION_REQUEST) ? [ARTIFACT_ANSWERS] : []),
|
|
153
|
+
];
|
|
154
|
+
return STALENESS_SIGNALS.filter(name => found.includes(name));
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Whether a chunk of workflow text asks something for its contract version.
|
|
158
|
+
* @param text - Step or workflow text, already stripped of full-line comments
|
|
159
|
+
* @returns Whether the request token appears
|
|
160
|
+
*/
|
|
161
|
+
export function requestsVersion(text) {
|
|
162
|
+
return text.includes(VERSION_REQUEST);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* What this coupling can tell about the artifact's AGE.
|
|
166
|
+
*
|
|
167
|
+
* Derived, in the order the members are declared, so each answer says strictly
|
|
168
|
+
* less than the one above it:
|
|
169
|
+
*
|
|
170
|
+
* - no artifact to read at all — `unchecked`, the honest non-answer;
|
|
171
|
+
* - the artifact answers a version AND something asks for one — a handshake;
|
|
172
|
+
* - the STEP asks for a version the artifact cannot answer — a capability
|
|
173
|
+
* probe, which is #3477's defect: one floor, blind above it;
|
|
174
|
+
* - an existence test and no version probe — absence, never age;
|
|
175
|
+
* - neither — nothing here bears on either question.
|
|
176
|
+
*
|
|
177
|
+
* The handshake arm accepts the workflow-scoped signal as well as the
|
|
178
|
+
* step-scoped one, and that is a deliberate, stated looseness. A read can
|
|
179
|
+
* reach the step through a `workflow_call` input default — `guard_script`
|
|
180
|
+
* defaults to `scripts/check-nightly-e2e-health.mjs`, and the step that
|
|
181
|
+
* compares versions names `$GUARD`, never the path — so a step-scoped-only
|
|
182
|
+
* rule would refute a handshake that exists. Over-crediting here is bounded by
|
|
183
|
+
* the ARTIFACT half, which is exact for this path: a workflow that asks for a
|
|
184
|
+
* version cannot manufacture a handshake for a file that answers none.
|
|
185
|
+
* @param input - What the scan found for one coupling
|
|
186
|
+
* @returns What it can detect about age
|
|
187
|
+
*/
|
|
188
|
+
export function detectStaleness(input) {
|
|
189
|
+
if (!input.artifactRead)
|
|
190
|
+
return UNCHECKED;
|
|
191
|
+
const has = (signal) => input.staleness.includes(signal);
|
|
192
|
+
const asked = has(STEP_REQUESTS) || has(WORKFLOW_REQUESTS);
|
|
193
|
+
if (has(ARTIFACT_ANSWERS) && asked)
|
|
194
|
+
return VERSION_HANDSHAKE;
|
|
195
|
+
if (has(STEP_REQUESTS))
|
|
196
|
+
return CAPABILITY_PROBE;
|
|
197
|
+
return input.guarded ? EXISTENCE_ONLY : NO_PROBE;
|
|
198
|
+
}
|
|
199
|
+
/** One sentence per detection value, stating what it does and does not prove. */
|
|
200
|
+
const DETECTION_SHAPES = {
|
|
201
|
+
[VERSION_HANDSHAKE]: "The delivered artifact answers a contract version and the workflow asks for one, so a copy too old to speak the same contract is NAMED rather than silently run.",
|
|
202
|
+
[CAPABILITY_PROBE]: "The step asks this artifact for a subcommand it does not answer, so age is inferred from whether one call succeeds. That detects staleness at exactly one floor and is blind above it — the defect CodySwannGT/lisa#3477 measured.",
|
|
203
|
+
[EXISTENCE_ONLY]: "An existence test and no version probe: this coupling can see that the artifact is MISSING and cannot see that it is OLD. A present copy of any vintage runs, and its verdict is believed.",
|
|
204
|
+
[NO_PROBE]: "Neither an existence test nor a version probe bears on this read, so nothing here distinguishes a current artifact from an absent or a superseded one.",
|
|
205
|
+
[UNCHECKED]: "Lisa delivers nothing at this path, so there is no artifact to ask whether it could answer a version. The staleness half is UNKNOWN here — not current, and not probe-less.",
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* How the age question was answered, and on what evidence.
|
|
209
|
+
* @param input - What the scan found for one coupling
|
|
210
|
+
* @param detection - What it can detect about age
|
|
211
|
+
* @returns One clause naming the verdict and the tokens behind it
|
|
212
|
+
*/
|
|
213
|
+
export function stalenessShape(input, detection) {
|
|
214
|
+
const quoted = (names) => names.map(name => `\`${name}\``).join(", ");
|
|
215
|
+
const evidence = input.staleness.length === 0
|
|
216
|
+
? `None of the staleness tokens this scan can see (${quoted(STALENESS_SIGNALS)}) were found.`
|
|
217
|
+
: `Tokens found: ${quoted(input.staleness)}. \`workflow-requests-version\` is workflow-scoped — it does not say THIS step asks.`;
|
|
218
|
+
return `STALENESS (a separate dimension from the delivery verdict above): \`${detection}\`. ${DETECTION_SHAPES[detection]} ${evidence}`;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Which recorded decisions the tree refuses to support, and why.
|
|
222
|
+
*
|
|
223
|
+
* One rule in each direction, because a hand-authored field that only ever
|
|
224
|
+
* over-claims is half a check:
|
|
225
|
+
*
|
|
226
|
+
* - a `handshake` decision on a coupling whose derived detection is not
|
|
227
|
+
* `version-handshake` claims cover the tree does not show;
|
|
228
|
+
* - any other decision on a coupling that DOES carry one records a gap that
|
|
229
|
+
* has already been closed, which decays into a stale exemption.
|
|
230
|
+
*
|
|
231
|
+
* Neither is a judgement about whether the decision was wise. Both are the
|
|
232
|
+
* cheap, checkable half: the declaration must agree with what was measured.
|
|
233
|
+
* @param entry - The classified entry
|
|
234
|
+
* @returns One sentence, or null when the decision and the tree agree
|
|
235
|
+
*/
|
|
236
|
+
export function contradictionIn(entry) {
|
|
237
|
+
if (entry.decision === null)
|
|
238
|
+
return null;
|
|
239
|
+
const claimed = entry.decision === DECISION_HANDSHAKE;
|
|
240
|
+
const derived = entry.detection === VERSION_HANDSHAKE;
|
|
241
|
+
if (claimed === derived)
|
|
242
|
+
return null;
|
|
243
|
+
return claimed
|
|
244
|
+
? `${entry.key}: recorded as \`handshake\`, but the tree derives \`${entry.detection}\` — no delivered artifact at \`${entry.path}\` answers a contract version, or no step of \`${entry.workflow}\` asks for one. A handshake nobody can find is the staleness half of this defect wearing the fix's clothes.`
|
|
245
|
+
: `${entry.key}: recorded as \`${entry.decision}\`, but the tree derives \`version-handshake\` — this coupling already detects staleness, so an exemption here records a gap that is closed and would outlive its subject.`;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Which recorded decisions are unusable as written.
|
|
249
|
+
* @param entry - The classified entry
|
|
250
|
+
* @returns One sentence, or null when the record is well-formed
|
|
251
|
+
*/
|
|
252
|
+
export function malformedIn(entry) {
|
|
253
|
+
if (entry.decision === null)
|
|
254
|
+
return null;
|
|
255
|
+
if (!STALENESS_DECISIONS.includes(entry.decision)) {
|
|
256
|
+
return `${entry.key}: \`${String(entry.decision)}\` is not one of ${STALENESS_DECISIONS.join(", ")}.`;
|
|
257
|
+
}
|
|
258
|
+
if (entry.decision === DECISION_HANDSHAKE)
|
|
259
|
+
return null;
|
|
260
|
+
const reason = (entry.reason ?? "").trim();
|
|
261
|
+
if (reason.length === 0) {
|
|
262
|
+
return `${entry.key}: recorded as \`${entry.decision}\` with no reason. A decision without its reason is indistinguishable from nobody having looked, which is the state this field exists to end.`;
|
|
263
|
+
}
|
|
264
|
+
return reason.length < MIN_REASON_CHARACTERS
|
|
265
|
+
? `${entry.key}: recorded as \`${entry.decision}\` with a ${reason.length}-character reason, under the ${MIN_REASON_CHARACTERS} this field requires. A label is not a decision: "advisory" and "n/a" read as an answer while carrying none of the argument a later reader needs to re-examine the exemption.`
|
|
266
|
+
: null;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=two-channel-staleness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"two-channel-staleness.js","sourceRoot":"","sources":["../../src/core/two-channel-staleness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAglFpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA89QjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|