@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
|
@@ -1,3 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read the fast channel: which caller-tree paths a `@main` reusable workflow
|
|
3
|
+
* names, and whether anything on a faster channel already covers them.
|
|
4
|
+
*
|
|
5
|
+
* Split from `core/two-channel-delivery` on the seam the signatures already
|
|
6
|
+
* drew: that module knows verdicts and remedies and nothing about YAML; this
|
|
7
|
+
* one knows how a workflow spells a path and nothing about what the answer
|
|
8
|
+
* means. Both are pure — reaching the filesystem belongs to the caller, so the
|
|
9
|
+
* same functions serve Lisa's own CI gate and `lisa doctor` on a consumer.
|
|
10
|
+
*
|
|
11
|
+
* ## What counts as a caller-tree read
|
|
12
|
+
*
|
|
13
|
+
* A path under `scripts/`, `bin/`, or `tools/` carrying a file extension, not
|
|
14
|
+
* preceded by another path segment. The negative lookbehind is what keeps
|
|
15
|
+
* `node_modules/@codyswann/lisa/all/copy-overwrite/scripts/lisa-gates.mjs`
|
|
16
|
+
* from being read as a caller-tree path — it is a PACKAGE path, and whether it
|
|
17
|
+
* survives a release is a different question with its own gate (#2960).
|
|
18
|
+
*
|
|
19
|
+
* ## Why full-line comments are stripped and inline prose is not
|
|
20
|
+
*
|
|
21
|
+
* These workflows are heavily commented, and a comment naming a script is
|
|
22
|
+
* prose rather than a claim. Full-line comments are dropped. Prose INSIDE a
|
|
23
|
+
* `run:` block — an `echo "::error …"` naming the very script the step failed
|
|
24
|
+
* to find — is not, because there is no reliable way to tell it from a command
|
|
25
|
+
* without parsing shell. It costs nothing: such a mention is always in a step
|
|
26
|
+
* that already reads the path, and couplings are deduplicated per workflow and
|
|
27
|
+
* path, so the pair collapses to the one entry it should have been.
|
|
28
|
+
*
|
|
29
|
+
* ## Why deduplication resolves conservatively
|
|
30
|
+
*
|
|
31
|
+
* When one workflow reads the same path from several steps, `packageBacked` is
|
|
32
|
+
* true only if EVERY occurrence names a package candidate — one host-only step
|
|
33
|
+
* is enough to make the coupling host-only, because that step is the one that
|
|
34
|
+
* will fail. `guarded` runs the other way and is true if ANY occurrence is
|
|
35
|
+
* guarded, because one silent-skip path is enough to make the absence silent.
|
|
36
|
+
* Both directions point at reporting more rather than less.
|
|
37
|
+
*
|
|
38
|
+
* ## Why the handling signals are literal, and stay literal
|
|
39
|
+
*
|
|
40
|
+
* `guarded` says the step can TELL the path is missing. It has never said what
|
|
41
|
+
* the step then does, and a narrative that inferred the consequence from it
|
|
42
|
+
* asserted control flow nothing had read (CodySwannGT/lisa#3860). Deciding what
|
|
43
|
+
* an absent branch does needs a shell parser, and the answer would still be a
|
|
44
|
+
* guess. So this module reports the other checkable thing: which literal
|
|
45
|
+
* absence-handling tokens the step's own text contains. `else-branch` does not
|
|
46
|
+
* mean the else covers this read — it means the characters are there, so a
|
|
47
|
+
* reader who was about to conclude "this skips silently" is told, in the same
|
|
48
|
+
* sentence, that the step has a branch they have not read.
|
|
49
|
+
*
|
|
50
|
+
* ## Why the staleness probe is reported at two scopes
|
|
51
|
+
*
|
|
52
|
+
* The second dimension — can this coupling tell an OLD artifact from a current
|
|
53
|
+
* one — needs the same treatment, with one wrinkle the handling signals do not
|
|
54
|
+
* have. A read can reach the step it is used in through a `workflow_call`
|
|
55
|
+
* input default: `nightly-e2e-health.yml` defaults `guard_script` to
|
|
56
|
+
* `scripts/check-nightly-e2e-health.mjs`, and the step that compares contract
|
|
57
|
+
* versions names `$GUARD` and never the path. A step-scoped signal would
|
|
58
|
+
* therefore MISS a handshake that exists — a false negative on the one arm
|
|
59
|
+
* where a false negative reads as "this cannot detect staleness".
|
|
60
|
+
*
|
|
61
|
+
* So both scopes are reported, under names that say which is which:
|
|
62
|
+
* `step-requests-version` is exact for the step that reads the path, and
|
|
63
|
+
* `workflow-requests-version` says only that some step of this workflow asks.
|
|
64
|
+
* Neither is allowed to conclude anything alone — the artifact half, which the
|
|
65
|
+
* caller supplies and which IS exact for the path, is what bounds them.
|
|
66
|
+
* @module core/two-channel-delivery-scan
|
|
67
|
+
*/
|
|
68
|
+
import { HANDLING_SIGNALS, } from "./two-channel-delivery.js";
|
|
69
|
+
import { requestsVersion, STALENESS_SIGNALS, } from "./two-channel-staleness.js";
|
|
1
70
|
/** How a workflow spells a path inside the installed Lisa package. */
|
|
2
71
|
const PACKAGE_PREFIX = "node_modules/@codyswann/lisa/";
|
|
3
72
|
/** Directories a consumer keeps its own executable artifacts in. */
|
|
@@ -125,6 +194,30 @@ function isGuarded(body, callerPath) {
|
|
|
125
194
|
before.includes(HASH_FILES));
|
|
126
195
|
});
|
|
127
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Literal tokens in a step's text that bear on what an absent path does.
|
|
199
|
+
*
|
|
200
|
+
* Deliberately shallow. Each entry asks only "do these characters appear in
|
|
201
|
+
* this step", which is checkable by reading the step; none of them claims the
|
|
202
|
+
* token governs the read. The set is closed and small: an unnamed signal is
|
|
203
|
+
* reported as no signal, which is why the detail says which names exist.
|
|
204
|
+
*/
|
|
205
|
+
const SIGNAL_PATTERNS = {
|
|
206
|
+
"else-branch": /(?:^|[\s;])(?:else|elif)(?:[\s;]|$)/,
|
|
207
|
+
"exit-zero": /(?:^|[\s;])exit\s+0(?!\d)/,
|
|
208
|
+
"exit-nonzero": /(?:^|[\s;])exit\s+[1-9]\d*/,
|
|
209
|
+
"error-annotation": /::error/,
|
|
210
|
+
"notice-annotation": /::(?:notice|warning)/,
|
|
211
|
+
"failure-suppression": /\|\|\s*true|continue-on-error:|set\s+\+e/,
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* Which absence-handling tokens one step's text contains.
|
|
215
|
+
* @param body - The step's text
|
|
216
|
+
* @returns Signal names, in the vocabulary's declared order
|
|
217
|
+
*/
|
|
218
|
+
function handlingSignalsIn(body) {
|
|
219
|
+
return HANDLING_SIGNALS.filter(name => SIGNAL_PATTERNS[name].test(body));
|
|
220
|
+
}
|
|
128
221
|
/**
|
|
129
222
|
* Every caller-tree read in one step.
|
|
130
223
|
* @param step - The step
|
|
@@ -132,32 +225,60 @@ function isGuarded(body, callerPath) {
|
|
|
132
225
|
*/
|
|
133
226
|
function occurrencesIn(step) {
|
|
134
227
|
const packagePaths = matchesIn(PACKAGE_PATH, step.body);
|
|
228
|
+
const handling = handlingSignalsIn(step.body);
|
|
229
|
+
const stepRequestsVersion = requestsVersion(step.body);
|
|
135
230
|
return matchesIn(CALLER_PATH, step.body).map(callerPath => ({
|
|
136
231
|
step: step.name,
|
|
137
232
|
path: callerPath,
|
|
138
233
|
packageBacked: isPackageBacked(packagePaths, callerPath),
|
|
139
234
|
guarded: isGuarded(step.body, callerPath),
|
|
235
|
+
handling,
|
|
236
|
+
stepRequestsVersion,
|
|
140
237
|
}));
|
|
141
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* The staleness tokens one coupling carries, across both scopes.
|
|
241
|
+
*
|
|
242
|
+
* Deduplicated through `STALENESS_SIGNALS` so the order is the vocabulary's
|
|
243
|
+
* and two runs over the same tree emit the same bytes.
|
|
244
|
+
* @param context - The workflow-level inputs
|
|
245
|
+
* @param callerPath - The caller-tree path
|
|
246
|
+
* @param found - Every occurrence of that path in this workflow
|
|
247
|
+
* @returns Signal names in the vocabulary's declared order
|
|
248
|
+
*/
|
|
249
|
+
function stalenessSignalsFor(context, callerPath, found) {
|
|
250
|
+
const present = [
|
|
251
|
+
...(context.artifactSignalsFor(callerPath) ?? []),
|
|
252
|
+
...(found.some(occurrence => occurrence.stepRequestsVersion)
|
|
253
|
+
? ["step-requests-version"]
|
|
254
|
+
: []),
|
|
255
|
+
...(context.workflowRequestsVersion
|
|
256
|
+
? ["workflow-requests-version"]
|
|
257
|
+
: []),
|
|
258
|
+
];
|
|
259
|
+
return STALENESS_SIGNALS.filter(name => present.includes(name));
|
|
260
|
+
}
|
|
142
261
|
/**
|
|
143
262
|
* Collapse repeated reads of one path into the single coupling they are.
|
|
144
|
-
* @param
|
|
263
|
+
* @param context - Workflow name, lane and artifact lookups, workflow-scope signal
|
|
145
264
|
* @param occurrences - Every occurrence found in that workflow
|
|
146
|
-
* @param lanesFor - Delivery lanes shipping a caller path
|
|
147
265
|
* @returns One coupling per distinct path, sorted by path
|
|
148
266
|
*/
|
|
149
|
-
function collapse(
|
|
267
|
+
function collapse(context, occurrences) {
|
|
150
268
|
const paths = [...new Set(occurrences.map(occurrence => occurrence.path))];
|
|
151
269
|
return paths
|
|
152
270
|
.map(callerPath => {
|
|
153
271
|
const found = occurrences.filter(occurrence => occurrence.path === callerPath);
|
|
154
272
|
return {
|
|
155
|
-
workflow,
|
|
273
|
+
workflow: context.workflow,
|
|
156
274
|
step: found[0]?.step ?? "",
|
|
157
275
|
path: callerPath,
|
|
158
|
-
lanes: lanesFor(callerPath),
|
|
276
|
+
lanes: context.lanesFor(callerPath),
|
|
159
277
|
packageBacked: found.every(occurrence => occurrence.packageBacked),
|
|
160
278
|
guarded: found.some(occurrence => occurrence.guarded),
|
|
279
|
+
handling: HANDLING_SIGNALS.filter(name => found.some(occurrence => occurrence.handling.includes(name))),
|
|
280
|
+
staleness: stalenessSignalsFor(context, callerPath, found),
|
|
281
|
+
artifactRead: context.artifactSignalsFor(callerPath) !== null,
|
|
161
282
|
};
|
|
162
283
|
})
|
|
163
284
|
.sort((left, right) => left.path.localeCompare(right.path));
|
|
@@ -168,11 +289,17 @@ function collapse(workflow, occurrences, lanesFor) {
|
|
|
168
289
|
* @param options.workflow - Workflow file name, as a consumer spells it after `@main`
|
|
169
290
|
* @param options.text - Raw workflow YAML
|
|
170
291
|
* @param options.lanesFor - Delivery lanes shipping a caller path
|
|
292
|
+
* @param options.artifactSignalsFor - Staleness tokens the delivered artifact carries, or null when nothing is delivered there
|
|
171
293
|
* @returns One coupling per distinct caller path, sorted by path
|
|
172
294
|
*/
|
|
173
295
|
export function scanWorkflow(options) {
|
|
174
296
|
const steps = extractSteps(options.text);
|
|
175
|
-
return collapse(
|
|
297
|
+
return collapse({
|
|
298
|
+
workflow: options.workflow,
|
|
299
|
+
lanesFor: options.lanesFor,
|
|
300
|
+
artifactSignalsFor: options.artifactSignalsFor,
|
|
301
|
+
workflowRequestsVersion: steps.some(step => requestsVersion(step.body)),
|
|
302
|
+
}, steps.flatMap(occurrencesIn));
|
|
176
303
|
}
|
|
177
304
|
/**
|
|
178
305
|
* Whether a workflow can be called by another repository at all.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"two-channel-delivery-scan.js","sourceRoot":"","sources":["../../src/core/two-channel-delivery-scan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"two-channel-delivery-scan.js","sourceRoot":"","sources":["../../src/core/two-channel-delivery-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,8 +64,32 @@
|
|
|
64
64
|
* as unmeasured rather than as a clean sweep. An empty comparison and a
|
|
65
65
|
* converged consumer must not produce the same output — this whole subject is
|
|
66
66
|
* failures that read as normal, and reproducing that here would be perverse.
|
|
67
|
+
*
|
|
68
|
+
* ## Absence and staleness are two dimensions, not two values of one
|
|
69
|
+
*
|
|
70
|
+
* Everything above is about the read path being ABSENT, and absence is the
|
|
71
|
+
* benign half: an absent artifact makes a step skip or fail, and neither
|
|
72
|
+
* outcome is a wrong answer. The harmful half is PRESENT-AND-OLD — a gate that
|
|
73
|
+
* posts a red required check derived from superseded logic, which every reader
|
|
74
|
+
* believes (CodySwannGT/lisa#3477).
|
|
75
|
+
*
|
|
76
|
+
* So `detection` is a SECOND dimension hung off the same entry rather than an
|
|
77
|
+
* extra member of `CouplingVerdict`. A coupling can be `apply-lagged` and carry
|
|
78
|
+
* a version handshake; it can be `package-backed` and carry none. Folding the
|
|
79
|
+
* two together would force a choice between the questions instead of answering
|
|
80
|
+
* both.
|
|
81
|
+
*
|
|
82
|
+
* The dimension is DERIVED, never declared. What a reader is allowed to record
|
|
83
|
+
* by hand is the DECISION — whether the staleness half is worth closing here —
|
|
84
|
+
* and even that is checked against the tree: a decision claiming a handshake
|
|
85
|
+
* that the delivered artifact and the workflow do not between them show is a
|
|
86
|
+
* failure, not a note. Silence is the one thing the dimension may never mean:
|
|
87
|
+
* a coupling whose delivered artifact cannot be read at all is `unchecked`,
|
|
88
|
+
* said out loud, rather than defaulted to current.
|
|
67
89
|
* @module core/two-channel-delivery
|
|
68
90
|
*/
|
|
91
|
+
import { type StalenessDecision, type StalenessDetection, type StalenessRecord, type StalenessSignal } from "./two-channel-staleness.js";
|
|
92
|
+
export type { StalenessDecision, StalenessDetection, StalenessRecord, StalenessSignal, } from "./two-channel-staleness.js";
|
|
69
93
|
/**
|
|
70
94
|
* How one artifact reaches a consumer that already exists.
|
|
71
95
|
*
|
|
@@ -102,6 +126,17 @@ export type CouplingVerdict =
|
|
|
102
126
|
| "undelivered";
|
|
103
127
|
/** What to do about one verdict. */
|
|
104
128
|
export type CouplingRemedy = "none" | "run-lisa-apply" | "adopt-the-artifact" | "author-the-artifact";
|
|
129
|
+
/**
|
|
130
|
+
* Every absence-handling token a step's text may carry, in report order.
|
|
131
|
+
*
|
|
132
|
+
* The vocabulary lives here beside the verdicts rather than beside the
|
|
133
|
+
* patterns that find it, for the same reason the verdicts do: the detail must
|
|
134
|
+
* be able to say which names it looked for, and a scan that stopped looking
|
|
135
|
+
* must not be able to render as a step that carries nothing.
|
|
136
|
+
*/
|
|
137
|
+
export declare const HANDLING_SIGNALS: readonly ["else-branch", "exit-zero", "exit-nonzero", "error-annotation", "notice-annotation", "failure-suppression"];
|
|
138
|
+
/** One absence-handling token name. */
|
|
139
|
+
export type HandlingSignal = (typeof HANDLING_SIGNALS)[number];
|
|
105
140
|
/** One host-relative path read by one step of one reusable workflow. */
|
|
106
141
|
export interface CouplingInput {
|
|
107
142
|
/** Workflow file name, as a consumer spells it after `@main`. */
|
|
@@ -121,12 +156,40 @@ export interface CouplingInput {
|
|
|
121
156
|
* Whether the read sits behind a file-existence test.
|
|
122
157
|
*
|
|
123
158
|
* Not a verdict, and deliberately not one. A guard changes the SHAPE of the
|
|
124
|
-
* failure rather than its existence
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
159
|
+
* failure rather than its existence, and the shape #3050 is about is the
|
|
160
|
+
* silent one — so it is recorded on the entry and said in the detail rather
|
|
161
|
+
* than folded into the verdict.
|
|
162
|
+
*
|
|
163
|
+
* It says the step can TELL the path is missing. It does NOT say what the
|
|
164
|
+
* step then does; see `handling`.
|
|
128
165
|
*/
|
|
129
166
|
readonly guarded: boolean;
|
|
167
|
+
/**
|
|
168
|
+
* Literal absence-handling tokens present in the step's own text.
|
|
169
|
+
*
|
|
170
|
+
* Evidence, not a conclusion. A name here means those characters appear in
|
|
171
|
+
* the step; it never means the token governs this read. Its job is to stop a
|
|
172
|
+
* reader completing the sentence the scan refuses to complete.
|
|
173
|
+
*/
|
|
174
|
+
readonly handling: readonly HandlingSignal[];
|
|
175
|
+
/**
|
|
176
|
+
* Literal staleness-probe tokens found for this coupling.
|
|
177
|
+
*
|
|
178
|
+
* Evidence for the second dimension, held to the same rule as `handling`: a
|
|
179
|
+
* name means the characters were found where the name says to look. The
|
|
180
|
+
* artifact-side names are exact for this path; the workflow-side one is
|
|
181
|
+
* workflow-scoped and says so in its own name.
|
|
182
|
+
*/
|
|
183
|
+
readonly staleness: readonly StalenessSignal[];
|
|
184
|
+
/**
|
|
185
|
+
* Whether any delivered artifact was available at this path to inspect.
|
|
186
|
+
*
|
|
187
|
+
* False is NOT "the artifact has no version probe" — it is "there was no
|
|
188
|
+
* artifact to ask". The two must not collapse: one is a measurement, the
|
|
189
|
+
* other is the absence of one, and reporting the second as the first is the
|
|
190
|
+
* defect this module is named after.
|
|
191
|
+
*/
|
|
192
|
+
readonly artifactRead: boolean;
|
|
130
193
|
}
|
|
131
194
|
/** One coupling, its verdict, and the evidence behind it. */
|
|
132
195
|
export interface CouplingEntry extends CouplingInput {
|
|
@@ -138,6 +201,12 @@ export interface CouplingEntry extends CouplingInput {
|
|
|
138
201
|
readonly verdict: CouplingVerdict;
|
|
139
202
|
/** The action this verdict calls for. */
|
|
140
203
|
readonly remedy: CouplingRemedy;
|
|
204
|
+
/** What this coupling can tell about the artifact's AGE. Derived. */
|
|
205
|
+
readonly detection: StalenessDetection;
|
|
206
|
+
/** The recorded decision about the staleness half, or null if none was. */
|
|
207
|
+
readonly decision: StalenessDecision | null;
|
|
208
|
+
/** The reason recorded beside that decision, or null. */
|
|
209
|
+
readonly reason: string | null;
|
|
141
210
|
/** One operator-readable sentence. */
|
|
142
211
|
readonly detail: string;
|
|
143
212
|
}
|
|
@@ -175,6 +244,32 @@ export interface TwoChannelReport {
|
|
|
175
244
|
* which is how an allowlist added to harden a guard becomes the bypass.
|
|
176
245
|
*/
|
|
177
246
|
readonly staleRatifications: readonly string[];
|
|
247
|
+
/** How many LEDGERED entries carry each detection. Every key is present. */
|
|
248
|
+
readonly detectionCounts: Readonly<Record<StalenessDetection, number>>;
|
|
249
|
+
/** How many LEDGERED entries carry each decision. Every key is present. */
|
|
250
|
+
readonly decisionCounts: Readonly<Record<StalenessDecision, number>>;
|
|
251
|
+
/** How many ledgered entries the run classified, the tally's denominator. */
|
|
252
|
+
readonly classifiable: number;
|
|
253
|
+
/**
|
|
254
|
+
* Ledgered couplings with no recorded staleness decision.
|
|
255
|
+
*
|
|
256
|
+
* The forcing function. A derived detection arrives free for entry 24; the
|
|
257
|
+
* decision does not, and this is what refuses the entry until somebody makes
|
|
258
|
+
* one.
|
|
259
|
+
*/
|
|
260
|
+
readonly unclassified: readonly string[];
|
|
261
|
+
/** Recorded decisions the tree refuses to support, one sentence each. */
|
|
262
|
+
readonly contradictions: readonly string[];
|
|
263
|
+
/** Recorded decisions that are unusable as written, one sentence each. */
|
|
264
|
+
readonly malformed: readonly string[];
|
|
265
|
+
/**
|
|
266
|
+
* Staleness decisions matching no live coupling.
|
|
267
|
+
*
|
|
268
|
+
* Reported for the same reason a stale ratification is: a decision about a
|
|
269
|
+
* coupling that no longer exists is an unexamined exemption the next
|
|
270
|
+
* matching path inherits for free.
|
|
271
|
+
*/
|
|
272
|
+
readonly staleClassifications: readonly string[];
|
|
178
273
|
/** False when the run did not actually measure anything. */
|
|
179
274
|
readonly measured: boolean;
|
|
180
275
|
/** Why the run measured nothing, or null when it measured something. */
|
|
@@ -205,11 +300,13 @@ export declare function resolveDeliveryChannel(lanes: readonly string[]): Delive
|
|
|
205
300
|
* @param options.couplings - Every caller-tree path read that was found
|
|
206
301
|
* @param options.inspected - What the run looked at
|
|
207
302
|
* @param options.ratified - Ratification reasons, keyed `<workflow>::<path>`
|
|
303
|
+
* @param options.classified - Staleness decisions, keyed `<workflow>::<path>`
|
|
208
304
|
* @returns The measurement
|
|
209
305
|
*/
|
|
210
306
|
export declare function classifyTwoChannelDelivery(options: {
|
|
211
307
|
couplings: readonly CouplingInput[];
|
|
212
308
|
inspected: InspectionCounts;
|
|
213
309
|
ratified: Readonly<Record<string, string>>;
|
|
310
|
+
classified: Readonly<Record<string, StalenessRecord>>;
|
|
214
311
|
}): TwoChannelReport;
|
|
215
312
|
//# sourceMappingURL=two-channel-delivery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"two-channel-delivery.d.ts","sourceRoot":"","sources":["../../src/core/two-channel-delivery.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"two-channel-delivery.d.ts","sourceRoot":"","sources":["../../src/core/two-channel-delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,8 +64,31 @@
|
|
|
64
64
|
* as unmeasured rather than as a clean sweep. An empty comparison and a
|
|
65
65
|
* converged consumer must not produce the same output — this whole subject is
|
|
66
66
|
* failures that read as normal, and reproducing that here would be perverse.
|
|
67
|
+
*
|
|
68
|
+
* ## Absence and staleness are two dimensions, not two values of one
|
|
69
|
+
*
|
|
70
|
+
* Everything above is about the read path being ABSENT, and absence is the
|
|
71
|
+
* benign half: an absent artifact makes a step skip or fail, and neither
|
|
72
|
+
* outcome is a wrong answer. The harmful half is PRESENT-AND-OLD — a gate that
|
|
73
|
+
* posts a red required check derived from superseded logic, which every reader
|
|
74
|
+
* believes (CodySwannGT/lisa#3477).
|
|
75
|
+
*
|
|
76
|
+
* So `detection` is a SECOND dimension hung off the same entry rather than an
|
|
77
|
+
* extra member of `CouplingVerdict`. A coupling can be `apply-lagged` and carry
|
|
78
|
+
* a version handshake; it can be `package-backed` and carry none. Folding the
|
|
79
|
+
* two together would force a choice between the questions instead of answering
|
|
80
|
+
* both.
|
|
81
|
+
*
|
|
82
|
+
* The dimension is DERIVED, never declared. What a reader is allowed to record
|
|
83
|
+
* by hand is the DECISION — whether the staleness half is worth closing here —
|
|
84
|
+
* and even that is checked against the tree: a decision claiming a handshake
|
|
85
|
+
* that the delivered artifact and the workflow do not between them show is a
|
|
86
|
+
* failure, not a note. Silence is the one thing the dimension may never mean:
|
|
87
|
+
* a coupling whose delivered artifact cannot be read at all is `unchecked`,
|
|
88
|
+
* said out loud, rather than defaulted to current.
|
|
67
89
|
* @module core/two-channel-delivery
|
|
68
90
|
*/
|
|
91
|
+
import { contradictionIn, detectStaleness, malformedIn, stalenessShape, STALENESS_DECISIONS, STALENESS_DETECTIONS, } from "./two-channel-staleness.js";
|
|
69
92
|
/** The channel a refreshing lane puts an artifact on. */
|
|
70
93
|
const CHANNEL_APPLY = "apply";
|
|
71
94
|
/** The channel a scaffold-time-only lane puts an artifact on. */
|
|
@@ -98,6 +121,22 @@ const REMEDIES = {
|
|
|
98
121
|
};
|
|
99
122
|
/** Every verdict, so a count of zero is still a stated zero. */
|
|
100
123
|
const VERDICTS = Object.keys(REMEDIES);
|
|
124
|
+
/**
|
|
125
|
+
* Every absence-handling token a step's text may carry, in report order.
|
|
126
|
+
*
|
|
127
|
+
* The vocabulary lives here beside the verdicts rather than beside the
|
|
128
|
+
* patterns that find it, for the same reason the verdicts do: the detail must
|
|
129
|
+
* be able to say which names it looked for, and a scan that stopped looking
|
|
130
|
+
* must not be able to render as a step that carries nothing.
|
|
131
|
+
*/
|
|
132
|
+
export const HANDLING_SIGNALS = [
|
|
133
|
+
"else-branch",
|
|
134
|
+
"exit-zero",
|
|
135
|
+
"exit-nonzero",
|
|
136
|
+
"error-annotation",
|
|
137
|
+
"notice-annotation",
|
|
138
|
+
"failure-suppression",
|
|
139
|
+
];
|
|
101
140
|
/** Verdicts where nothing Lisa does on its own ever closes the gap. */
|
|
102
141
|
const UNRESTORABLE = new Set([
|
|
103
142
|
NEVER_DELIVERED,
|
|
@@ -144,14 +183,46 @@ function verdictFor(input, channel) {
|
|
|
144
183
|
return UNDELIVERED;
|
|
145
184
|
}
|
|
146
185
|
/**
|
|
147
|
-
*
|
|
186
|
+
* What the scan saw about a guard, and what it explicitly did not see.
|
|
187
|
+
*
|
|
188
|
+
* This clause used to finish the reader's sentence for them: guarded meant "an
|
|
189
|
+
* absent path SKIPS rather than fails … nothing reads as broken", asserted as
|
|
190
|
+
* though observed. It was inferred from one syntactic signal — that the read
|
|
191
|
+
* sits behind an `-f` test — and it was wrong about the first two steps it was
|
|
192
|
+
* ever quoted for, both of which fall back, annotate and verify rather than
|
|
193
|
+
* skip (CodySwannGT/lisa#3860). Generated prose that states a reader's thesis
|
|
194
|
+
* verbatim is the most persuasive evidence available and the least verified.
|
|
195
|
+
*
|
|
196
|
+
* So the consequence is no longer claimed. What is stated is what a guard
|
|
197
|
+
* establishes (the step can tell the path is missing), what was not read (the
|
|
198
|
+
* other branch, any fallback, any exit, any post-run verification), and which
|
|
199
|
+
* literal handling tokens the step's text carries.
|
|
148
200
|
* @param guarded - Whether the read sits behind an existence test
|
|
149
|
-
* @returns One clause describing
|
|
201
|
+
* @returns One clause describing what was and was not examined
|
|
150
202
|
*/
|
|
151
|
-
function
|
|
203
|
+
function guardShape(guarded) {
|
|
152
204
|
return guarded
|
|
153
|
-
? "The read
|
|
154
|
-
: "
|
|
205
|
+
? "The read sits behind an existence test, which is ALL this scan examined of the step's control flow: it did not read the test's other branch, any fallback, any explicit `exit`, or any verification of the step's output. Whether an absent path skips quietly, falls back, or fails loudly is therefore NOT MEASURED — read the step before concluding it proves nothing. The shape worth ruling out is the silent one, where a skip posts no context and an absent required context is not a red one."
|
|
206
|
+
: "No existence test guards the read, which is ALL this scan examined of the step's control flow: it did not read anything that could absorb the failure. An absent path most likely fails the job loudly — the better of the two failures, because it is visible — but that is inferred from the missing guard, NOT MEASURED.";
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Which handling tokens the step's text carries, named without interpretation.
|
|
210
|
+
* @param handling - Signal names the scan found
|
|
211
|
+
* @returns One clause listing them, or saying none of the known names appear
|
|
212
|
+
*/
|
|
213
|
+
function handlingShape(handling) {
|
|
214
|
+
const quoted = (names) => names.map(name => `\`${name}\``).join(", ");
|
|
215
|
+
return handling.length === 0
|
|
216
|
+
? `The step's text carries none of the tokens this scan can see (${quoted(HANDLING_SIGNALS)}), which is a statement about those names and not about the step's behaviour.`
|
|
217
|
+
: `The step's text does carry ${quoted(handling)} — located in the step, deliberately NOT related to this read, and enough to make "it skips silently" a claim to check rather than assume.`;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* How an absent path shows up, which is not the same as whether it is absent.
|
|
221
|
+
* @param input - The coupling
|
|
222
|
+
* @returns Two clauses: what was examined, and what tokens were located
|
|
223
|
+
*/
|
|
224
|
+
function absenceShape(input) {
|
|
225
|
+
return `${guardShape(input.guarded)} ${handlingShape(input.handling)}`;
|
|
155
226
|
}
|
|
156
227
|
/**
|
|
157
228
|
* The sentence one verdict is explained with.
|
|
@@ -165,12 +236,12 @@ function detailFor(input, verdict) {
|
|
|
165
236
|
return `${called} It resolves \`${input.path}\` only after a package-relative candidate, which travels with the installed package — the caller-tree copy is a fallback, not the delivery channel.`;
|
|
166
237
|
}
|
|
167
238
|
if (verdict === APPLY_LAGGED) {
|
|
168
|
-
return `${called} It reads \`${input.path}\` from the CALLER's tree with no package-relative candidate, and Lisa delivers that path on the \`lisa apply\` channel (${input.lanes.join(", ")}). The two halves land in the wrong order: this step is live everywhere immediately, the file it needs is live only where somebody applied. ${absenceShape(input
|
|
239
|
+
return `${called} It reads \`${input.path}\` from the CALLER's tree with no package-relative candidate, and Lisa delivers that path on the \`lisa apply\` channel (${input.lanes.join(", ")}). The two halves land in the wrong order: this step is live everywhere immediately, the file it needs is live only where somebody applied. ${absenceShape(input)}`;
|
|
169
240
|
}
|
|
170
241
|
if (verdict === NEVER_DELIVERED) {
|
|
171
|
-
return `${called} It reads \`${input.path}\` from the CALLER's tree, and Lisa ships that path create-only (${input.lanes.join(", ")}) — written once at scaffold time and never refreshed, so an existing consumer NEVER receives it. Fixing it upstream does not mean a bump brings it; adoption is a manual step the consumer must take. ${absenceShape(input
|
|
242
|
+
return `${called} It reads \`${input.path}\` from the CALLER's tree, and Lisa ships that path create-only (${input.lanes.join(", ")}) — written once at scaffold time and never refreshed, so an existing consumer NEVER receives it. Fixing it upstream does not mean a bump brings it; adoption is a manual step the consumer must take. ${absenceShape(input)}`;
|
|
172
243
|
}
|
|
173
|
-
return `${called} It reads \`${input.path}\` from the CALLER's tree, and Lisa ships no such path in any delivery lane — no apply and no bump ever produces it. Either the consumer authors it or
|
|
244
|
+
return `${called} It reads \`${input.path}\` from the CALLER's tree, and Lisa ships no such path in any delivery lane — no apply and no bump ever produces it. Either the consumer authors it, or whatever the step does where the path is missing runs instead — and that branch is the part this scan does not read. ${absenceShape(input)}`;
|
|
174
245
|
}
|
|
175
246
|
/**
|
|
176
247
|
* Compare `<workflow>::<path>` keys the same way everywhere, so two runs over
|
|
@@ -185,20 +256,27 @@ function byKey(left, right) {
|
|
|
185
256
|
/**
|
|
186
257
|
* Turn one raw coupling into a classified entry.
|
|
187
258
|
* @param input - The coupling
|
|
259
|
+
* @param classified - Recorded staleness decisions, keyed `<workflow>::<path>`
|
|
188
260
|
* @returns The entry
|
|
189
261
|
*/
|
|
190
|
-
function toEntry(input) {
|
|
262
|
+
function toEntry(input, classified) {
|
|
191
263
|
const channel = input.packageBacked
|
|
192
264
|
? CHANNEL_PACKAGE
|
|
193
265
|
: resolveDeliveryChannel(input.lanes);
|
|
194
266
|
const verdict = verdictFor(input, channel);
|
|
267
|
+
const key = `${input.workflow}::${input.path}`;
|
|
268
|
+
const detection = detectStaleness(input);
|
|
269
|
+
const record = classified[key];
|
|
195
270
|
return {
|
|
196
271
|
...input,
|
|
197
|
-
key
|
|
272
|
+
key,
|
|
198
273
|
channel,
|
|
199
274
|
verdict,
|
|
200
275
|
remedy: REMEDIES[verdict],
|
|
201
|
-
|
|
276
|
+
detection,
|
|
277
|
+
decision: record?.decision ?? null,
|
|
278
|
+
reason: record?.reason ?? null,
|
|
279
|
+
detail: `${detailFor(input, verdict)} ${stalenessShape(input, detection)}`,
|
|
202
280
|
};
|
|
203
281
|
}
|
|
204
282
|
/**
|
|
@@ -233,14 +311,23 @@ function unmeasuredReasonFor(inspected) {
|
|
|
233
311
|
* @param options.couplings - Every caller-tree path read that was found
|
|
234
312
|
* @param options.inspected - What the run looked at
|
|
235
313
|
* @param options.ratified - Ratification reasons, keyed `<workflow>::<path>`
|
|
314
|
+
* @param options.classified - Staleness decisions, keyed `<workflow>::<path>`
|
|
236
315
|
* @returns The measurement
|
|
237
316
|
*/
|
|
238
317
|
export function classifyTwoChannelDelivery(options) {
|
|
239
|
-
const { couplings, inspected, ratified } = options;
|
|
240
|
-
const entries = couplings
|
|
318
|
+
const { couplings, inspected, ratified, classified } = options;
|
|
319
|
+
const entries = couplings
|
|
320
|
+
.map(input => toEntry(input, classified))
|
|
321
|
+
.sort(byKey);
|
|
241
322
|
const unrestorable = entries.filter(entry => UNRESTORABLE.has(entry.verdict));
|
|
242
323
|
const live = new Set(unrestorable.map(entry => entry.key));
|
|
243
324
|
const unmeasuredReason = unmeasuredReasonFor(inspected);
|
|
325
|
+
// The staleness dimension is asked of the LEDGERED couplings only. A
|
|
326
|
+
// package-backed step is covered by the fast channel and is not written to
|
|
327
|
+
// the ledger, so requiring a hand-authored decision for one would demand a
|
|
328
|
+
// sentence about an entry no reader can see.
|
|
329
|
+
const ledgered = entries.filter(entry => entry.verdict !== PACKAGE_BACKED);
|
|
330
|
+
const ledgeredKeys = new Set(ledgered.map(entry => entry.key));
|
|
244
331
|
return {
|
|
245
332
|
entries,
|
|
246
333
|
counts: Object.fromEntries(VERDICTS.map(verdict => [
|
|
@@ -252,6 +339,27 @@ export function classifyTwoChannelDelivery(options) {
|
|
|
252
339
|
staleRatifications: Object.keys(ratified)
|
|
253
340
|
.filter(key => !live.has(key))
|
|
254
341
|
.sort((left, right) => left.localeCompare(right)),
|
|
342
|
+
detectionCounts: Object.fromEntries(STALENESS_DETECTIONS.map(detection => [
|
|
343
|
+
detection,
|
|
344
|
+
ledgered.filter(entry => entry.detection === detection).length,
|
|
345
|
+
])),
|
|
346
|
+
decisionCounts: Object.fromEntries(STALENESS_DECISIONS.map(decision => [
|
|
347
|
+
decision,
|
|
348
|
+
ledgered.filter(entry => entry.decision === decision).length,
|
|
349
|
+
])),
|
|
350
|
+
classifiable: ledgered.length,
|
|
351
|
+
unclassified: ledgered
|
|
352
|
+
.filter(entry => entry.decision === null)
|
|
353
|
+
.map(entry => entry.key),
|
|
354
|
+
contradictions: ledgered
|
|
355
|
+
.map(contradictionIn)
|
|
356
|
+
.filter((sentence) => sentence !== null),
|
|
357
|
+
malformed: ledgered
|
|
358
|
+
.map(malformedIn)
|
|
359
|
+
.filter((sentence) => sentence !== null),
|
|
360
|
+
staleClassifications: Object.keys(classified)
|
|
361
|
+
.filter(key => !ledgeredKeys.has(key))
|
|
362
|
+
.sort((left, right) => left.localeCompare(right)),
|
|
255
363
|
measured: unmeasuredReason === null,
|
|
256
364
|
unmeasuredReason,
|
|
257
365
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"two-channel-delivery.js","sourceRoot":"","sources":["../../src/core/two-channel-delivery.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"two-channel-delivery.js","sourceRoot":"","sources":["../../src/core/two-channel-delivery.ts"],"names":[],"mappings":"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"}
|