@codyswann/lisa 4.49.0 → 4.50.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/all/copy-overwrite/scripts/check-conflict-markers.mjs +4 -1
- package/all/copy-overwrite/scripts/lib/gate-failure-diagnosis.mjs +163 -0
- package/all/copy-overwrite/scripts/lisa-enforcement-fallback.sh +178 -1
- package/all/copy-overwrite/scripts/lisa-hooks/block-direct-issue-create.sh +89 -10
- package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +44 -0
- package/all/copy-overwrite/scripts/lisa-lint-staged-preflight.mjs +1 -1
- package/all/copy-overwrite/scripts/lisa-run-gates.mjs +24 -24
- package/all/copy-overwrite/scripts/lisa-work-item.mjs +490 -81
- package/cdk/package-lisa/package.lisa.json +45 -15
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +76 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +121 -227
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/plugin-templates/lisa-block-direct-issue-create.ts +45 -1
- package/dist/opencode/plugin-templates/parity-safety-net.sh +44 -0
- package/expo/package-lisa/package.lisa.json +110 -53
- package/harper-fabric/package-lisa/package.lisa.json +62 -32
- package/nestjs/package-lisa/package.lisa.json +57 -27
- package/npm-package/package-lisa/package.lisa.json +43 -7
- package/package.json +11 -7
- package/phaser/copy-overwrite/ast-grep/rules/no-day-truncating-file-age-predicate.yml +50 -0
- package/phaser/package-lisa/package.lisa.json +62 -32
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +17 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +4 -1
- package/plugins/lisa/hooks/block-direct-issue-create.sh +89 -10
- package/plugins/lisa/hooks/discharge-work-item-gates.sh +7 -1
- package/plugins/lisa/hooks/parity-safety-net.sh +44 -0
- package/plugins/lisa/hooks/threshold-ratchet-families.mjs +12 -0
- package/plugins/lisa/rules/eager/00-rule-index.md +79 -0
- package/plugins/lisa/rules/eager/base-rules.md +10 -0
- package/plugins/lisa/rules/eager/config-resolution.md +1 -88
- package/plugins/lisa/rules/reference/automation-runbook-contract.md +97 -0
- package/plugins/lisa/rules/reference/bdd-e2e-coverage.md +56 -0
- package/plugins/lisa/rules/reference/blocker-containment.md +58 -0
- package/plugins/lisa/rules/reference/claim-archaeology.md +42 -0
- package/plugins/lisa/rules/reference/claim-evidence-mapping.md +83 -0
- package/plugins/lisa/rules/reference/claim-time-guards.md +37 -0
- package/plugins/lisa/rules/reference/config-resolution.md +97 -0
- package/plugins/lisa/rules/reference/control-reachability.md +44 -0
- package/plugins/lisa/rules/reference/convergent-review.md +31 -0
- package/plugins/lisa/rules/reference/credential-substrate-precedence.md +57 -0
- package/plugins/lisa/rules/reference/dependency-decision-records.md +37 -0
- package/plugins/lisa/rules/reference/dependency-internalization-kit.md +47 -0
- package/plugins/lisa/rules/reference/dependency-trust-classes.md +48 -0
- package/plugins/lisa/rules/reference/deployed-state-readback.md +52 -0
- package/plugins/lisa/rules/reference/derived-branch-plan.md +52 -0
- package/plugins/lisa/rules/reference/design-source-of-truth.md +43 -0
- package/plugins/lisa/rules/reference/design-value-binding.md +103 -0
- package/plugins/lisa/rules/reference/documentation-source-paths.md +18 -0
- package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +75 -0
- package/plugins/lisa/rules/reference/observability-audit.md +20 -0
- package/plugins/lisa/rules/reference/prd-definition-of-ready.md +37 -0
- package/plugins/lisa/rules/reference/prd-lifecycle-rollup.md +36 -0
- package/plugins/lisa/rules/reference/pre-flight-autofill.md +88 -0
- package/plugins/lisa/rules/reference/promotion-contract.md +21 -0
- package/plugins/lisa/rules/reference/readiness-rubric.md +63 -0
- package/plugins/lisa/rules/reference/ready-role-filing.md +34 -0
- package/plugins/lisa/rules/reference/rejection-detection.md +69 -0
- package/plugins/lisa/rules/reference/repo-scope-split.md +48 -0
- package/plugins/lisa/rules/reference/reset-seed-coverage.md +55 -0
- package/plugins/lisa/rules/reference/usage-accounting.md +38 -0
- package/plugins/lisa/rules/reference/work-item-definition-of-ready.md +32 -0
- package/plugins/lisa/scripts/intake-blocker-reprobe.mjs +158 -1
- package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +17 -1
- package/plugins/lisa/skills/lisa-github-build-intake/SKILL.md +4 -0
- package/plugins/lisa/skills/lisa-jira-build-intake/SKILL.md +4 -0
- package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +4 -0
- package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +4 -1
- package/plugins/lisa-agy/hooks/block-direct-issue-create.sh +89 -10
- package/plugins/lisa-agy/hooks/parity-safety-net.sh +44 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/scripts/intake-blocker-reprobe.mjs +158 -1
- package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +17 -1
- package/plugins/lisa-agy/skills/lisa-github-build-intake/SKILL.md +4 -0
- package/plugins/lisa-agy/skills/lisa-jira-build-intake/SKILL.md +4 -0
- package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +4 -0
- package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +4 -1
- 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 +1 -1
- package/plugins/lisa-copilot/hooks/block-direct-issue-create.sh +89 -10
- package/plugins/lisa-copilot/hooks/discharge-work-item-gates.sh +7 -1
- package/plugins/lisa-copilot/hooks/parity-safety-net.sh +44 -0
- package/plugins/lisa-copilot/hooks/threshold-ratchet-families.mjs +12 -0
- package/plugins/lisa-copilot/rules/eager/00-rule-index.md +79 -0
- package/plugins/lisa-copilot/rules/eager/base-rules.md +10 -0
- package/plugins/lisa-copilot/rules/eager/config-resolution.md +1 -88
- package/plugins/lisa-copilot/rules/reference/automation-runbook-contract.md +97 -0
- package/plugins/lisa-copilot/rules/reference/bdd-e2e-coverage.md +56 -0
- package/plugins/lisa-copilot/rules/reference/blocker-containment.md +58 -0
- package/plugins/lisa-copilot/rules/reference/claim-archaeology.md +42 -0
- package/plugins/lisa-copilot/rules/reference/claim-evidence-mapping.md +83 -0
- package/plugins/lisa-copilot/rules/reference/claim-time-guards.md +37 -0
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +97 -0
- package/plugins/lisa-copilot/rules/reference/control-reachability.md +44 -0
- package/plugins/lisa-copilot/rules/reference/convergent-review.md +31 -0
- package/plugins/lisa-copilot/rules/reference/credential-substrate-precedence.md +57 -0
- package/plugins/lisa-copilot/rules/reference/dependency-decision-records.md +37 -0
- package/plugins/lisa-copilot/rules/reference/dependency-internalization-kit.md +47 -0
- package/plugins/lisa-copilot/rules/reference/dependency-trust-classes.md +48 -0
- package/plugins/lisa-copilot/rules/reference/deployed-state-readback.md +52 -0
- package/plugins/lisa-copilot/rules/reference/derived-branch-plan.md +52 -0
- package/plugins/lisa-copilot/rules/reference/design-source-of-truth.md +43 -0
- package/plugins/lisa-copilot/rules/reference/design-value-binding.md +103 -0
- package/plugins/lisa-copilot/rules/reference/documentation-source-paths.md +18 -0
- package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +75 -0
- package/plugins/lisa-copilot/rules/reference/observability-audit.md +20 -0
- package/plugins/lisa-copilot/rules/reference/prd-definition-of-ready.md +37 -0
- package/plugins/lisa-copilot/rules/reference/prd-lifecycle-rollup.md +36 -0
- package/plugins/lisa-copilot/rules/reference/pre-flight-autofill.md +88 -0
- package/plugins/lisa-copilot/rules/reference/promotion-contract.md +21 -0
- package/plugins/lisa-copilot/rules/reference/readiness-rubric.md +63 -0
- package/plugins/lisa-copilot/rules/reference/ready-role-filing.md +34 -0
- package/plugins/lisa-copilot/rules/reference/rejection-detection.md +69 -0
- package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +48 -0
- package/plugins/lisa-copilot/rules/reference/reset-seed-coverage.md +55 -0
- package/plugins/lisa-copilot/rules/reference/usage-accounting.md +38 -0
- package/plugins/lisa-copilot/rules/reference/work-item-definition-of-ready.md +32 -0
- package/plugins/lisa-copilot/scripts/intake-blocker-reprobe.mjs +158 -1
- package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +17 -1
- package/plugins/lisa-copilot/skills/lisa-github-build-intake/SKILL.md +4 -0
- package/plugins/lisa-copilot/skills/lisa-jira-build-intake/SKILL.md +4 -0
- package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +4 -0
- package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +4 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/block-direct-issue-create.sh +89 -10
- package/plugins/lisa-cursor/hooks/discharge-work-item-gates.sh +7 -1
- package/plugins/lisa-cursor/hooks/parity-safety-net.sh +44 -0
- package/plugins/lisa-cursor/hooks/threshold-ratchet-families.mjs +12 -0
- package/plugins/lisa-cursor/rules/00-rule-index.mdc +84 -0
- package/plugins/lisa-cursor/rules/automation-runbook-contract-reference.mdc +97 -0
- package/plugins/lisa-cursor/rules/base-rules.mdc +10 -0
- package/plugins/lisa-cursor/rules/bdd-e2e-coverage-reference.mdc +56 -0
- package/plugins/lisa-cursor/rules/blocker-containment-reference.mdc +58 -0
- package/plugins/lisa-cursor/rules/claim-archaeology-reference.mdc +42 -0
- package/plugins/lisa-cursor/rules/claim-evidence-mapping-reference.mdc +83 -0
- package/plugins/lisa-cursor/rules/claim-time-guards-reference.mdc +37 -0
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +97 -0
- package/plugins/lisa-cursor/rules/config-resolution.mdc +1 -88
- package/plugins/lisa-cursor/rules/control-reachability-reference.mdc +44 -0
- package/plugins/lisa-cursor/rules/convergent-review-reference.mdc +31 -0
- package/plugins/lisa-cursor/rules/credential-substrate-precedence-reference.mdc +57 -0
- package/plugins/lisa-cursor/rules/dependency-decision-records-reference.mdc +37 -0
- package/plugins/lisa-cursor/rules/dependency-internalization-kit-reference.mdc +47 -0
- package/plugins/lisa-cursor/rules/dependency-trust-classes-reference.mdc +48 -0
- package/plugins/lisa-cursor/rules/deployed-state-readback-reference.mdc +52 -0
- package/plugins/lisa-cursor/rules/derived-branch-plan-reference.mdc +52 -0
- package/plugins/lisa-cursor/rules/design-source-of-truth-reference.mdc +43 -0
- package/plugins/lisa-cursor/rules/design-value-binding-reference.mdc +103 -0
- package/plugins/lisa-cursor/rules/documentation-source-paths-reference.mdc +18 -0
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +75 -0
- package/plugins/lisa-cursor/rules/observability-audit-reference.mdc +20 -0
- package/plugins/lisa-cursor/rules/prd-definition-of-ready-reference.mdc +37 -0
- package/plugins/lisa-cursor/rules/prd-lifecycle-rollup-reference.mdc +36 -0
- package/plugins/lisa-cursor/rules/pre-flight-autofill-reference.mdc +88 -0
- package/plugins/lisa-cursor/rules/promotion-contract-reference.mdc +21 -0
- package/plugins/lisa-cursor/rules/readiness-rubric-reference.mdc +63 -0
- package/plugins/lisa-cursor/rules/ready-role-filing-reference.mdc +34 -0
- package/plugins/lisa-cursor/rules/rejection-detection-reference.mdc +69 -0
- package/plugins/lisa-cursor/rules/repo-scope-split-reference.mdc +48 -0
- package/plugins/lisa-cursor/rules/reset-seed-coverage-reference.mdc +55 -0
- package/plugins/lisa-cursor/rules/usage-accounting-reference.mdc +38 -0
- package/plugins/lisa-cursor/rules/work-item-definition-of-ready-reference.mdc +32 -0
- package/plugins/lisa-cursor/scripts/intake-blocker-reprobe.mjs +158 -1
- package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +17 -1
- package/plugins/lisa-cursor/skills/lisa-github-build-intake/SKILL.md +4 -0
- package/plugins/lisa-cursor/skills/lisa-jira-build-intake/SKILL.md +4 -0
- package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +4 -0
- package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +4 -1
- 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-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- 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-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- 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/src/base/hooks/block-direct-issue-create.sh +89 -10
- package/plugins/src/base/hooks/discharge-work-item-gates.sh +7 -1
- package/plugins/src/base/hooks/parity-safety-net.sh +44 -0
- package/plugins/src/base/hooks/threshold-ratchet-families.mjs +12 -0
- package/plugins/src/base/rules/eager/00-rule-index.md +79 -0
- package/plugins/src/base/rules/eager/base-rules.md +10 -0
- package/plugins/src/base/rules/eager/config-resolution.md +1 -88
- package/plugins/src/base/rules/reference/automation-runbook-contract.md +97 -0
- package/plugins/src/base/rules/reference/bdd-e2e-coverage.md +56 -0
- package/plugins/src/base/rules/reference/blocker-containment.md +58 -0
- package/plugins/src/base/rules/reference/claim-archaeology.md +42 -0
- package/plugins/src/base/rules/reference/claim-evidence-mapping.md +83 -0
- package/plugins/src/base/rules/reference/claim-time-guards.md +37 -0
- package/plugins/src/base/rules/reference/config-resolution.md +97 -0
- package/plugins/src/base/rules/reference/control-reachability.md +44 -0
- package/plugins/src/base/rules/reference/convergent-review.md +31 -0
- package/plugins/src/base/rules/reference/credential-substrate-precedence.md +57 -0
- package/plugins/src/base/rules/reference/dependency-decision-records.md +37 -0
- package/plugins/src/base/rules/reference/dependency-internalization-kit.md +47 -0
- package/plugins/src/base/rules/reference/dependency-trust-classes.md +48 -0
- package/plugins/src/base/rules/reference/deployed-state-readback.md +52 -0
- package/plugins/src/base/rules/reference/derived-branch-plan.md +52 -0
- package/plugins/src/base/rules/reference/design-source-of-truth.md +43 -0
- package/plugins/src/base/rules/reference/design-value-binding.md +103 -0
- package/plugins/src/base/rules/reference/documentation-source-paths.md +18 -0
- package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +75 -0
- package/plugins/src/base/rules/reference/observability-audit.md +20 -0
- package/plugins/src/base/rules/reference/prd-definition-of-ready.md +37 -0
- package/plugins/src/base/rules/reference/prd-lifecycle-rollup.md +36 -0
- package/plugins/src/base/rules/reference/pre-flight-autofill.md +88 -0
- package/plugins/src/base/rules/reference/promotion-contract.md +21 -0
- package/plugins/src/base/rules/reference/readiness-rubric.md +63 -0
- package/plugins/src/base/rules/reference/ready-role-filing.md +34 -0
- package/plugins/src/base/rules/reference/rejection-detection.md +69 -0
- package/plugins/src/base/rules/reference/repo-scope-split.md +48 -0
- package/plugins/src/base/rules/reference/reset-seed-coverage.md +55 -0
- package/plugins/src/base/rules/reference/usage-accounting.md +38 -0
- package/plugins/src/base/rules/reference/work-item-definition-of-ready.md +32 -0
- package/plugins/src/base/scripts/intake-blocker-reprobe.mjs +158 -1
- package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +17 -1
- package/plugins/src/base/skills/lisa-github-build-intake/SKILL.md +4 -0
- package/plugins/src/base/skills/lisa-jira-build-intake/SKILL.md +4 -0
- package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +4 -0
- package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +4 -1
- package/rails/copy-overwrite/ast-grep/rules/no-day-truncating-file-age-predicate.yml +50 -0
- package/rails/copy-overwrite/scripts/threshold-ratchet-families.mjs +12 -0
- package/scripts/check-eager-rule-budget.mjs +176 -0
- package/scripts/check-generated-artifact-merge-coverage.mjs +7 -0
- package/scripts/check-rules-pairing.sh +45 -14
- package/scripts/check-shipped-surface-removals.mjs +851 -0
- package/scripts/generate-export-surface.mjs +318 -0
- package/scripts/lib/shipped-surface.mjs +212 -0
- package/scripts/lisa-enforcement-fallback.sh +178 -1
- package/scripts/remedy-conformance.mjs +435 -0
- package/scripts/two-channel-couplings.json +2 -2
- package/typescript/copy-contents/.husky/pre-push +147 -2
- package/typescript/copy-overwrite/ast-grep/rules/no-day-truncating-file-age-predicate.yml +50 -0
- package/typescript/copy-overwrite/audit.ignore.config.json +0 -10
- package/typescript/copy-overwrite/scripts/lisa-mutation.mjs +180 -29
- package/typescript/copy-overwrite/scripts/threshold-ratchet-families.mjs +12 -0
- package/typescript/package-lisa/package.lisa.json +72 -42
- package/plugins/lisa/rules/eager/automation-runbook-contract.md +0 -92
- package/plugins/lisa/rules/eager/bdd-e2e-coverage.md +0 -51
- package/plugins/lisa/rules/eager/blocker-containment.md +0 -53
- package/plugins/lisa/rules/eager/claim-archaeology.md +0 -37
- package/plugins/lisa/rules/eager/claim-evidence-mapping.md +0 -78
- package/plugins/lisa/rules/eager/claim-time-guards.md +0 -32
- package/plugins/lisa/rules/eager/control-reachability.md +0 -39
- package/plugins/lisa/rules/eager/convergent-review.md +0 -24
- package/plugins/lisa/rules/eager/credential-substrate-precedence.md +0 -54
- package/plugins/lisa/rules/eager/dependency-decision-records.md +0 -32
- package/plugins/lisa/rules/eager/dependency-internalization-kit.md +0 -42
- package/plugins/lisa/rules/eager/dependency-trust-classes.md +0 -43
- package/plugins/lisa/rules/eager/deployed-state-readback.md +0 -47
- package/plugins/lisa/rules/eager/derived-branch-plan.md +0 -47
- package/plugins/lisa/rules/eager/design-source-of-truth.md +0 -38
- package/plugins/lisa/rules/eager/design-value-binding.md +0 -98
- package/plugins/lisa/rules/eager/documentation-source-paths.md +0 -13
- package/plugins/lisa/rules/eager/factory-model.md +0 -41
- package/plugins/lisa/rules/eager/leaf-only-lifecycle.md +0 -70
- package/plugins/lisa/rules/eager/observability-audit.md +0 -15
- package/plugins/lisa/rules/eager/prd-definition-of-ready.md +0 -32
- package/plugins/lisa/rules/eager/prd-lifecycle-rollup.md +0 -31
- package/plugins/lisa/rules/eager/pre-flight-autofill.md +0 -84
- package/plugins/lisa/rules/eager/project-learnings.md +0 -22
- package/plugins/lisa/rules/eager/promotion-contract.md +0 -18
- package/plugins/lisa/rules/eager/readiness-rubric.md +0 -58
- package/plugins/lisa/rules/eager/ready-role-filing.md +0 -29
- package/plugins/lisa/rules/eager/rejection-detection.md +0 -64
- package/plugins/lisa/rules/eager/repo-scope-split.md +0 -43
- package/plugins/lisa/rules/eager/reset-seed-coverage.md +0 -50
- package/plugins/lisa/rules/eager/usage-accounting.md +0 -33
- package/plugins/lisa/rules/eager/work-item-definition-of-ready.md +0 -27
- package/plugins/lisa-copilot/rules/eager/automation-runbook-contract.md +0 -92
- package/plugins/lisa-copilot/rules/eager/bdd-e2e-coverage.md +0 -51
- package/plugins/lisa-copilot/rules/eager/blocker-containment.md +0 -53
- package/plugins/lisa-copilot/rules/eager/claim-archaeology.md +0 -37
- package/plugins/lisa-copilot/rules/eager/claim-evidence-mapping.md +0 -78
- package/plugins/lisa-copilot/rules/eager/claim-time-guards.md +0 -32
- package/plugins/lisa-copilot/rules/eager/control-reachability.md +0 -39
- package/plugins/lisa-copilot/rules/eager/convergent-review.md +0 -24
- package/plugins/lisa-copilot/rules/eager/credential-substrate-precedence.md +0 -54
- package/plugins/lisa-copilot/rules/eager/dependency-decision-records.md +0 -32
- package/plugins/lisa-copilot/rules/eager/dependency-internalization-kit.md +0 -42
- package/plugins/lisa-copilot/rules/eager/dependency-trust-classes.md +0 -43
- package/plugins/lisa-copilot/rules/eager/deployed-state-readback.md +0 -47
- package/plugins/lisa-copilot/rules/eager/derived-branch-plan.md +0 -47
- package/plugins/lisa-copilot/rules/eager/design-source-of-truth.md +0 -38
- package/plugins/lisa-copilot/rules/eager/design-value-binding.md +0 -98
- package/plugins/lisa-copilot/rules/eager/documentation-source-paths.md +0 -13
- package/plugins/lisa-copilot/rules/eager/factory-model.md +0 -41
- package/plugins/lisa-copilot/rules/eager/leaf-only-lifecycle.md +0 -70
- package/plugins/lisa-copilot/rules/eager/observability-audit.md +0 -15
- package/plugins/lisa-copilot/rules/eager/prd-definition-of-ready.md +0 -32
- package/plugins/lisa-copilot/rules/eager/prd-lifecycle-rollup.md +0 -31
- package/plugins/lisa-copilot/rules/eager/pre-flight-autofill.md +0 -84
- package/plugins/lisa-copilot/rules/eager/project-learnings.md +0 -22
- package/plugins/lisa-copilot/rules/eager/promotion-contract.md +0 -18
- package/plugins/lisa-copilot/rules/eager/readiness-rubric.md +0 -58
- package/plugins/lisa-copilot/rules/eager/ready-role-filing.md +0 -29
- package/plugins/lisa-copilot/rules/eager/rejection-detection.md +0 -64
- package/plugins/lisa-copilot/rules/eager/repo-scope-split.md +0 -43
- package/plugins/lisa-copilot/rules/eager/reset-seed-coverage.md +0 -50
- package/plugins/lisa-copilot/rules/eager/usage-accounting.md +0 -33
- package/plugins/lisa-copilot/rules/eager/work-item-definition-of-ready.md +0 -27
- package/plugins/lisa-cursor/rules/automation-runbook-contract.mdc +0 -97
- package/plugins/lisa-cursor/rules/bdd-e2e-coverage.mdc +0 -56
- package/plugins/lisa-cursor/rules/blocker-containment.mdc +0 -58
- package/plugins/lisa-cursor/rules/claim-archaeology.mdc +0 -42
- package/plugins/lisa-cursor/rules/claim-evidence-mapping.mdc +0 -83
- package/plugins/lisa-cursor/rules/claim-time-guards.mdc +0 -37
- package/plugins/lisa-cursor/rules/control-reachability.mdc +0 -44
- package/plugins/lisa-cursor/rules/convergent-review.mdc +0 -29
- package/plugins/lisa-cursor/rules/credential-substrate-precedence.mdc +0 -59
- package/plugins/lisa-cursor/rules/dependency-decision-records.mdc +0 -37
- package/plugins/lisa-cursor/rules/dependency-internalization-kit.mdc +0 -47
- package/plugins/lisa-cursor/rules/dependency-trust-classes.mdc +0 -48
- package/plugins/lisa-cursor/rules/deployed-state-readback.mdc +0 -52
- package/plugins/lisa-cursor/rules/derived-branch-plan.mdc +0 -52
- package/plugins/lisa-cursor/rules/design-source-of-truth.mdc +0 -43
- package/plugins/lisa-cursor/rules/design-value-binding.mdc +0 -103
- package/plugins/lisa-cursor/rules/documentation-source-paths.mdc +0 -18
- package/plugins/lisa-cursor/rules/factory-model.mdc +0 -46
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle.mdc +0 -75
- package/plugins/lisa-cursor/rules/observability-audit.mdc +0 -20
- package/plugins/lisa-cursor/rules/prd-definition-of-ready.mdc +0 -37
- package/plugins/lisa-cursor/rules/prd-lifecycle-rollup.mdc +0 -36
- package/plugins/lisa-cursor/rules/pre-flight-autofill.mdc +0 -89
- package/plugins/lisa-cursor/rules/project-learnings.mdc +0 -27
- package/plugins/lisa-cursor/rules/promotion-contract.mdc +0 -23
- package/plugins/lisa-cursor/rules/readiness-rubric.mdc +0 -63
- package/plugins/lisa-cursor/rules/ready-role-filing.mdc +0 -34
- package/plugins/lisa-cursor/rules/rejection-detection.mdc +0 -69
- package/plugins/lisa-cursor/rules/repo-scope-split.mdc +0 -48
- package/plugins/lisa-cursor/rules/reset-seed-coverage.mdc +0 -55
- package/plugins/lisa-cursor/rules/usage-accounting.mdc +0 -38
- package/plugins/lisa-cursor/rules/work-item-definition-of-ready.mdc +0 -32
- package/plugins/src/base/rules/eager/automation-runbook-contract.md +0 -92
- package/plugins/src/base/rules/eager/bdd-e2e-coverage.md +0 -51
- package/plugins/src/base/rules/eager/blocker-containment.md +0 -53
- package/plugins/src/base/rules/eager/claim-archaeology.md +0 -37
- package/plugins/src/base/rules/eager/claim-evidence-mapping.md +0 -78
- package/plugins/src/base/rules/eager/claim-time-guards.md +0 -32
- package/plugins/src/base/rules/eager/control-reachability.md +0 -39
- package/plugins/src/base/rules/eager/convergent-review.md +0 -24
- package/plugins/src/base/rules/eager/credential-substrate-precedence.md +0 -54
- package/plugins/src/base/rules/eager/dependency-decision-records.md +0 -32
- package/plugins/src/base/rules/eager/dependency-internalization-kit.md +0 -42
- package/plugins/src/base/rules/eager/dependency-trust-classes.md +0 -43
- package/plugins/src/base/rules/eager/deployed-state-readback.md +0 -47
- package/plugins/src/base/rules/eager/derived-branch-plan.md +0 -47
- package/plugins/src/base/rules/eager/design-source-of-truth.md +0 -38
- package/plugins/src/base/rules/eager/design-value-binding.md +0 -98
- package/plugins/src/base/rules/eager/documentation-source-paths.md +0 -13
- package/plugins/src/base/rules/eager/factory-model.md +0 -41
- package/plugins/src/base/rules/eager/leaf-only-lifecycle.md +0 -70
- package/plugins/src/base/rules/eager/observability-audit.md +0 -15
- package/plugins/src/base/rules/eager/prd-definition-of-ready.md +0 -32
- package/plugins/src/base/rules/eager/prd-lifecycle-rollup.md +0 -31
- package/plugins/src/base/rules/eager/pre-flight-autofill.md +0 -84
- package/plugins/src/base/rules/eager/project-learnings.md +0 -22
- package/plugins/src/base/rules/eager/promotion-contract.md +0 -18
- package/plugins/src/base/rules/eager/readiness-rubric.md +0 -58
- package/plugins/src/base/rules/eager/ready-role-filing.md +0 -29
- package/plugins/src/base/rules/eager/rejection-detection.md +0 -64
- package/plugins/src/base/rules/eager/repo-scope-split.md +0 -43
- package/plugins/src/base/rules/eager/reset-seed-coverage.md +0 -50
- package/plugins/src/base/rules/eager/usage-accounting.md +0 -33
- package/plugins/src/base/rules/eager/work-item-definition-of-ready.md +0 -27
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Reset/Seed Coverage & State Classification (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Reset/Seed Coverage & State Classification (load-bearing)
|
|
7
|
-
|
|
8
|
-
**Every persistent entity a project owns carries exactly one declared reset policy, and a work item that adds or changes persistent state is not done until the reset/seed contract covers it.** An entity the running system holds but the contract does not classify is a contract violation, and the check that finds it **fails closed** — an unclassified entity is never treated as safe to keep and never treated as safe to delete.
|
|
9
|
-
|
|
10
|
-
**One vendor-neutral contract, cited by** `lisa-research`, `lisa-acceptance-criteria`, `lisa-task-decomposition`, `lisa-test-strategy`, `lisa-implement`, `lisa-codify-verification`, `lisa-verification-lifecycle`, and `lisa-verify` (the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never divergent per-skill prose). It never names a database engine, cloud, identity provider, or test runner — those are project configuration.
|
|
11
|
-
|
|
12
|
-
## Why this exists
|
|
13
|
-
|
|
14
|
-
Test suites create state. Without a contract, cleanup is a habit: a flow creates a uniquely-marked record and deletes it on the happy path only, so every early failure leaks one more. Nothing sweeps it, nothing complains, and the suite degrades until someone reads a flake as a product bug. The observed shape is always the same — leaked records accumulate silently until a list view, a uniqueness constraint, or a count assertion breaks. Per-flow self-cleanup is not coverage; it is the failure mode.
|
|
15
|
-
|
|
16
|
-
## Membership
|
|
17
|
-
|
|
18
|
-
Membership is **state, not repo name, ticket label, or storage engine**: an entity is in scope the moment something the project writes **outlives the process that wrote it**. That includes rows and tables, but rows are only one kind of state. Also in scope: identity-provider objects (accounts, groups, memberships, sessions), object storage (buckets, prefixes, uploaded files), search indexes, queues and topics (in-flight and dead-letter), caches with a persistence tier, materialized/derived views and projections, feature-flag and configuration overrides, scheduled jobs created at runtime, and analytics or third-party side effects a run leaves behind. Out of scope: values that live only in memory for the duration of one process.
|
|
19
|
-
|
|
20
|
-
A work item is in scope when it **adds** such an entity, **changes what owns or writes** one, or **changes the lifetime** of one. Renames count as changes, not as new entities plus deletions.
|
|
21
|
-
|
|
22
|
-
## The four policies
|
|
23
|
-
|
|
24
|
-
Every entity is classified as exactly one of:
|
|
25
|
-
|
|
26
|
-
- **`fixture-owned`** — the reset may create, mutate, and delete rows here, but only those it owns. Ownership is declared as a predicate (a reserved id shape, a reserved account or namespace, a marker attribute), never as "everything in this entity."
|
|
27
|
-
- **`preserve`** — the reset must leave this untouched. Catalog, reference data, anything a migration seeds, anything expensive or impossible to rebuild, and any state belonging to someone who is not the fixture.
|
|
28
|
-
- **`derived-rebuild`** — not authored by anyone; recomputed from its sources after the reset (projections, materialized views, search indexes, caches). The reset rebuilds it rather than clearing or preserving it, and proves it converged.
|
|
29
|
-
- **`forbidden`** — the reset must be structurally unable to touch it: ledgers, payments, wallets, withdrawals, audit trails, anything irreversible. Declaring `forbidden` obliges naming the enforcement outside the script — a least-privilege role, a revoked grant, a separate account or credential boundary — because a script-only promise dies in the refactor that drops the safe caller.
|
|
30
|
-
|
|
31
|
-
**Classify by provenance, never by observation.** "The table looked empty" is not evidence it is unused; runtime statistics are approximations, and a table that has never been analyzed reports rows it holds. Ask who writes it and whether anything can put it back.
|
|
32
|
-
|
|
33
|
-
## Keep-lists are a detector, not the safety model
|
|
34
|
-
|
|
35
|
-
Deriving the clear-list by subtracting a keep-list from a schema listing is a **useful detector** — run it, and let it flag entities the contract has not seen. It is not the boundary. It cannot model renames, multiple schemas, framework-generated entities, views, partitions, row-level ownership, or any of the non-DB state above, and "new entities are cleared unless exempted" erases unrelated data the first time something adds one. The boundary is the classification; subtraction only tells you the classification is stale.
|
|
36
|
-
|
|
37
|
-
## Required assurances
|
|
38
|
-
|
|
39
|
-
A reset contract is not complete until it declares, and points at evidence for, all of: non-fixture and catalog data survive; reserved fixture identifiers are rejected on collision with anything real; foreign references into preserved entities are refused rather than cascaded; every write is **acknowledged** (a mutation reported by the caller and not confirmed by the system is a failure, not a success); a second apply converges to the same state and reports no further change; the post-state is verified by **exact expected counts**, not "at least one"; and production fails closed with no override of any kind. Where the platform can enforce a boundary with roles, grants, or constraints, it does — the in-process guard remains as defense in depth, never as the primary control.
|
|
40
|
-
|
|
41
|
-
## Definition of done
|
|
42
|
-
|
|
43
|
-
A work item that adds or changes persistent state is not done until: (1) every entity it introduces or changes is classified in the project's state contract with a reason and an owner; (2) `fixture-owned` entities it introduces declare their ownership predicate **and** are actually swept by the reset — an entity a suite creates but nothing removes is the leak this rule exists to prevent; (3) `preserve`/`forbidden` entities it introduces name their enforcement; (4) any seed the suite depends on covers the new state, with the verify step asserting exact counts; and (5) the state-classification check passes in the same PR. **A missing or stale classification is a verification failure, not a warning** — it blocks completion exactly as a `PARTIAL` spec-conformance verdict does, and is never demoted to "optional", "if cheap", or a follow-up without a linked build-ready ticket created before merge.
|
|
44
|
-
|
|
45
|
-
## Bootstrap, noop, and degradation
|
|
46
|
-
|
|
47
|
-
A project with no state contract yet is not exempt: the first work item touching persistent state scaffolds the minimum (the contract file, its own entities classified, the check wired into CI) and covers **its own** state. It never backfills the whole system — pre-existing unclassified entities are recorded as burndown with an owner and a date, not treated as this item's blocker. A project that genuinely holds no persistent state declares a **machine-readable noop** (`mode: "declared-noop"` with reason, owner, and a capability-manifest reference) which the check verifies against the repo rather than taking on faith — a bare exit 0 is indistinguishable from a successful destructive run and never satisfies this rule. A project that cannot produce a runtime inventory records the checked sources and the absence, exactly as the regression-spec absence path in `verification` does; a silent skip is never one of the exits.
|
|
48
|
-
|
|
49
|
-
## Command envelope
|
|
50
|
-
|
|
51
|
-
Every reset, seed, verify, inventory, and classification adapter answers the **same interface** — one validated JSON result on stdout, exit 0 only when the operation both completed **and** verified, `--dry-run` mandatory before anything destructive, and a requested stage always re-checked against server-resolved identity rather than trusted. The envelope is specified in the reference body and is what makes "every repo answers the same question the same way" checkable instead of aspirational.
|
|
52
|
-
|
|
53
|
-
**The production arm of this is executable, not advisory.** `scripts/lisa-destructive-guard.mjs` ships to every adopter and is wired into the envelope itself: a destructive run against a production-resolved — or unresolvable — environment has **no representable success envelope**, so it can never exit 0, and there is no parameter, field, or environment variable anywhere in the guard that changes the answer. A dry run is not an exemption, and `--dry-run` is the default rather than an opt-in. Read this as what it is: a check at the one interface every adapter passes through, which an adapter that misreports its own environment still defeats. The end state is a destructive capability that is **not deployed to production at all** — non-existence beats refusal — and that design, with the failure modes it must still close, is recorded in `docs/design/reset-production-absence.md`.
|
|
54
|
-
|
|
55
|
-
Full contract (state-contract schema, check semantics, detectors, envelope schema, enforcement patterns, bootstrap procedure): [reference/reset-seed-coverage.md](reset-seed-coverage-reference.mdc).
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Usage Accounting (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Usage Accounting (load-bearing)
|
|
7
|
-
|
|
8
|
-
Lisa attaches AI usage and cost telemetry to every artifact it creates/updates. The format is a single canonical managed section.
|
|
9
|
-
|
|
10
|
-
## Managed section
|
|
11
|
-
|
|
12
|
-
Every artifact with inline body content gets exactly one section:
|
|
13
|
-
|
|
14
|
-
```markdown
|
|
15
|
-
## Lisa Usage
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
**Canonical. Rewrite in place; never append a second usage section.** If the host can't safely edit body, write the same section in a comment and treat that comment as the managed artifact for future rewrites.
|
|
19
|
-
|
|
20
|
-
## Required field semantics
|
|
21
|
-
|
|
22
|
-
Each direct entry records ONE logical Lisa run on ONE artifact. `entry_id` is the stable dedupe key — rewriting the same logical run with the same `entry_id` updates in place; a different run gets a different `entry_id`.
|
|
23
|
-
|
|
24
|
-
- **`source`**: `observed` (runtime supplied) / `estimated` (derived from trustworthy metadata + pricing contract) / `measured-subset` (a trustworthy subtotal exists, but the complete run total is unknown) / `unavailable`.
|
|
25
|
-
- **`measured_subset_tokens`**: optional measured subtotal for `measured-subset` entries only. Omission is normalized to `null` for backward-compatible callers. Keep `total_tokens = null` so rollups do not treat a subset as a complete total.
|
|
26
|
-
- **`pricing_status`**: same trinary plus `missing` (cost not known but should be).
|
|
27
|
-
- **Absence ≠ zero.** `null` means unknown; `0` means explicitly zero. Always write the entry — never silently omit.
|
|
28
|
-
- Do NOT replace observed counts with estimates.
|
|
29
|
-
|
|
30
|
-
## Rollup
|
|
31
|
-
|
|
32
|
-
Container artifacts (Epic, PRD, etc.) roll up usage from their direct children. Roll-up is recursive — a parent's `## Lisa Usage` aggregates its descendants' direct entries. Re-writes are idempotent: re-running an intake or lifecycle skill must not duplicate entries.
|
|
33
|
-
|
|
34
|
-
Measured-child incompleteness is durable across ordinary rewrites through the optional
|
|
35
|
-
`lisa:usage-rollup-token-status` extension. Do not infer completeness merely because a rewrite did
|
|
36
|
-
not re-fetch child ledgers.
|
|
37
|
-
|
|
38
|
-
Full schema (backward-compatible 17-field primary marker, correlated measured-subset extension, pricing semantics, rollup math, idempotent-migration rules): [reference/usage-accounting.md](usage-accounting-reference.mdc).
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Work-Item Definition of Ready (type-keyed)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Work-Item Definition of Ready (type-keyed)
|
|
7
|
-
|
|
8
|
-
**`ready` means: a stateless agent can claim this item and drive it to its terminal state with zero human clarification.** Every readiness gate exists because its absence forces a question; the bar is type-keyed because different work types break autonomy differently.
|
|
9
|
-
|
|
10
|
-
## Shared core (every leaf, enforced by `*-validate-*` S1–S16)
|
|
11
|
-
|
|
12
|
-
Three-audience description · Gherkin acceptance criteria (except Spike) · Out of Scope · single-repo scope · relationship search · typed evidence manifest on runtime changes · Source Requirement traceability when PRD-sourced · provable read access to every named external surface · declared reachability for any **existing** test the item pins as a red-before-green control (`control-reachability`, gate S20 — `N/A` when the item introduces a new test instead).
|
|
13
|
-
|
|
14
|
-
## Per-type additions
|
|
15
|
-
|
|
16
|
-
| Type | Must additionally carry | Terminal state is |
|
|
17
|
-
|---|---|---|
|
|
18
|
-
| **Bug** | agent-executable reproduction (or a failing test) · expected-vs-actual with the *source* of "expected" · environment + version observed, last-known-good when known · reproducibility rate (always / intermittent + frequency) · at least one occurrence evidence link | the same repro/test fails before the fix and passes after |
|
|
19
|
-
| **Story** | user-visible AC; SHOULD name non-happy-path states (error / empty / loading) for UI stories · design source precedence when artifacts exist | every AC exercised on the running product |
|
|
20
|
-
| **Task** | an observable done-state and the command/check that proves it | the verification check passes |
|
|
21
|
-
| **Improvement** | metric + measurement method the agent can run · measured baseline value · numeric target | measured value meets the target |
|
|
22
|
-
| **Spike** | the question · the decision it enables + options weighed · a timebox · deliverable format **and location** | a deliverable at the named location that answers the question — findings, decision, options weighed |
|
|
23
|
-
| **Sub-task** | a parent, always · otherwise the bar of its own type | per its type |
|
|
24
|
-
| **Epic / container** | never build-ready (`leaf-only-lifecycle`) · judged on decomposition completeness, not buildability | all required children terminal |
|
|
25
|
-
|
|
26
|
-
## The stateless-pickup test (S18)
|
|
27
|
-
|
|
28
|
-
The final gate checks the property itself instead of proxies for it: read the item as a fresh agent with no session context, using only the item and what it links to. List every question you would have to ask a human before starting, choosing between materially different implementations, or declaring done. **Ready = zero questions.** Each question found is the FAIL remediation, verbatim.
|
|
29
|
-
|
|
30
|
-
Sources this bar distills: INVEST (stories) · ISTQB / IEEE 1044 defect anatomy and minimal-reproducible-example practice (bugs) · SMART (improvements) · Scrum's Definition of Ready (the framing) · TASC AC8.6 (the normative criterion).
|
|
31
|
-
|
|
32
|
-
Full rationale and worked examples: [the reference body of this rule](work-item-definition-of-ready-reference.mdc).
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# Automation Runbook Contract (load-bearing)
|
|
2
|
-
|
|
3
|
-
**Every registered automation loop carries a checked-in runbook, and every run of that loop ends in
|
|
4
|
-
exactly one of six run outcomes** with a one-line, operator-readable summary. A registered loop with
|
|
5
|
-
no runbook, or a run that stops without naming its outcome, is a contract violation.
|
|
6
|
-
|
|
7
|
-
**One vendor-neutral contract, to be cited by (wired in the loop-conformance ticket)
|
|
8
|
-
`lisa-setup-automations`, `lisa-automation-status`, `lisa-tear-down-automations`, and every
|
|
9
|
-
registered loop skill** (the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug,
|
|
10
|
-
never divergent per-loop prose).
|
|
11
|
-
|
|
12
|
-
## Membership
|
|
13
|
-
|
|
14
|
-
Membership is **registration, not skill-existence**: a loop is under this contract the moment it is
|
|
15
|
-
registered as a scheduled automation, and registering a new one pulls it in automatically. There is
|
|
16
|
-
no hardcoded roster of loops anywhere.
|
|
17
|
-
|
|
18
|
-
### Interactive flows are members too
|
|
19
|
-
|
|
20
|
-
The outcome vocabulary is **not cron-specific** — it answers "did this need me?", which an operator
|
|
21
|
-
asks of an interactive run exactly as often as of a scheduled one. Every Lisa flow that terminates
|
|
22
|
-
is a member: `lisa-implement`, `lisa-verify`, `lisa-plan`, `lisa-git-submit-pr`,
|
|
23
|
-
`lisa-drive-pr-to-merge`, `lisa-research`, and any skill invoked as a slash command.
|
|
24
|
-
|
|
25
|
-
For an interactive flow the required run record is the **final user-facing message**, not a JSONL
|
|
26
|
-
row written by `automation-run-record.mjs`. Interactive flows may also record local JSONL telemetry
|
|
27
|
-
when a specific skill owns that surface, but this contract's mandatory record is the final answer.
|
|
28
|
-
It opens with the outcome and the operator action, before any narrative:
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
change-proved — nothing for you. PR #6393 open, auto-merge on, CI running.
|
|
32
|
-
approval-requested — need a decision: ship the 135 Regular→Bold flips, or hold for design sign-off?
|
|
33
|
-
recovery-required — need you: staging E2E gate red for congestion; rerun or admin-merge.
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
The operator must learn whether they are needed **from the first line**, without reading the report.
|
|
37
|
-
Findings, evidence and caveats follow; they never replace the action line and never precede it.
|
|
38
|
-
|
|
39
|
-
An interactive flow that ends in prose with the action buried — or absent — is the same contract
|
|
40
|
-
violation as a silent cron exit. "I flagged X, I noticed Y, worth knowing Z" is narrative, not an
|
|
41
|
-
outcome. If nothing is needed, say **"nothing for you"** in those words and stop.
|
|
42
|
-
|
|
43
|
-
## The six run outcomes
|
|
44
|
-
|
|
45
|
-
Exactly one per run:
|
|
46
|
-
**`nothing-needed | candidate-proposed | change-proved | approval-requested | recovery-required | policy-obsolete`**
|
|
47
|
-
|
|
48
|
-
Health and operator action are **orthogonal** — a healthy run can still need an answer:
|
|
49
|
-
|
|
50
|
-
- `nothing-needed` — the loop ran and found nothing to act on. **Healthy.** Operator action: none.
|
|
51
|
-
A queue scanner's `nothing-needed` summary must name the lanes it swept and the total open — a dry
|
|
52
|
-
queue and a wrong denominator are otherwise indistinguishable. See the reference body.
|
|
53
|
-
- `candidate-proposed` — the loop proposed work (ticket, PRD, recommendation). **Healthy.** Operator
|
|
54
|
-
action: review the proposed item and flip it ready when you want it built.
|
|
55
|
-
- `change-proved` — the loop made a change and proved it with evidence. **Healthy.** Operator
|
|
56
|
-
action: none (informational).
|
|
57
|
-
- `approval-requested` — the loop reached a boundary it may not cross alone. **Healthy.** Operator
|
|
58
|
-
action: answer the approval question.
|
|
59
|
-
- `recovery-required` — the loop itself could not complete (access, tooling, or substrate broken)
|
|
60
|
-
and escalated a decision-ready packet. **Not healthy.** Operator action: restore the named
|
|
61
|
-
capability, then close the escalation item.
|
|
62
|
-
- `policy-obsolete` — the loop's own retirement policy (the retirement condition written in its
|
|
63
|
-
runbook) tripped, so it proposed its own teardown. **Healthy.** Operator action: approve the
|
|
64
|
-
teardown, decline it (close the proposal as **Not planned**; the loop keeps running at cadence),
|
|
65
|
-
or re-cadence it.
|
|
66
|
-
|
|
67
|
-
## A run outcome is NOT a work-item lifecycle terminal state (CRITICAL)
|
|
68
|
-
|
|
69
|
-
A **run outcome** describes the LOOP ITERATION. A **terminal state** describes a TICKET — Lisa
|
|
70
|
-
already uses that phrase for work-item lifecycles (`lisa-intake`: "`Blocked` is a valid terminal
|
|
71
|
-
state of the downstream lifecycles"). The two vocabularies never merge in an operator-facing report.
|
|
72
|
-
A healthy cycle that routes a work item to `Blocked` with clarifying questions is
|
|
73
|
-
`candidate-proposed` — it produced something — so it is **never `nothing-needed`**, which is
|
|
74
|
-
reserved for runs that found nothing at all, and **never `recovery-required`**, which means the
|
|
75
|
-
loop itself is broken, not that a work item was blocked.
|
|
76
|
-
|
|
77
|
-
## No silent exit
|
|
78
|
-
|
|
79
|
-
Every run — including a trivial early termination — ends by naming exactly one run outcome plus a
|
|
80
|
-
one-line operator summary of what happened, recorded where the status surface can read it —
|
|
81
|
-
there is no silent exit. The shared local substrate is
|
|
82
|
-
`plugins/src/base/scripts/automation-run-record.mjs`, which writes bounded JSONL records under
|
|
83
|
-
`.lisa/automations/runs/<loop-id>.jsonl`. Silence and health must never look identical to an
|
|
84
|
-
operator.
|
|
85
|
-
|
|
86
|
-
## Never block, always degrade
|
|
87
|
-
|
|
88
|
-
A missing runbook, an unreadable record surface, or an absent optional dependency **degrades** the
|
|
89
|
-
run — say so in the summary and finish with an outcome — it never crashes the loop, never blocks
|
|
90
|
-
other work, and never leaves the run unreported.
|
|
91
|
-
|
|
92
|
-
Full contract (template, outcome definitions, escalation packet, retirement): [reference/automation-runbook-contract.md](../reference/automation-runbook-contract.md).
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# BDD Behavior Contract & E2E Coverage (load-bearing)
|
|
2
|
-
|
|
3
|
-
**Every frontend work item ships its behavior as Gherkin scenarios with stable IDs, and seals each required scenario-platform obligation with aligned e2e automation in the project's configured runner for that platform.** A frontend change that adds no scenario, or a required scenario-platform obligation with neither a mapped test nor a dated waiver, is a contract violation.
|
|
4
|
-
|
|
5
|
-
**One vendor-neutral contract, cited by** `lisa-research`, `lisa-acceptance-criteria`, `lisa-task-decomposition`, `lisa-test-strategy`, `lisa-tdd-implementation`, `lisa-implement`, `lisa-codify-verification`, `lisa-verification-lifecycle`, `lisa-spec-conformance`, and `lisa-verify` (the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never divergent per-skill prose).
|
|
6
|
-
|
|
7
|
-
## Membership
|
|
8
|
-
|
|
9
|
-
Membership is **surface, not repo name or ticket label**: a work item is frontend-type the moment it adds or changes something a user can observe — a screen, route, component, interaction, visual state, empty/error/loading state, navigation path, or copy a user reads. It applies on every platform the project ships. Backend-only, infrastructure, docs, tooling, and refactors with no user-observable delta are out; a refactor that changes what the user sees is in.
|
|
10
|
-
|
|
11
|
-
## The contract lives in the repo
|
|
12
|
-
|
|
13
|
-
Default locations (a project that already has an equivalent contract keeps its own paths and records them in `.lisa.config.json`):
|
|
14
|
-
|
|
15
|
-
| Artifact | Default path | What it is |
|
|
16
|
-
|---|---|---|
|
|
17
|
-
| Scenarios | `bdd/features/*.feature` | Gherkin, the product-level behavior contract |
|
|
18
|
-
| Coverage map | `bdd/coverage-map.json` | scenario → runner/platform/file/evidence mappings, plus waivers, per-runner test-discovery roots, and exclusions |
|
|
19
|
-
| Generated matrix | `docs/bdd-scenario-matrix.md` | regenerated, never hand-edited |
|
|
20
|
-
| Burndown | `docs/e2e-bdd-coverage.md` | current coverage per platform |
|
|
21
|
-
|
|
22
|
-
## Scenario shape
|
|
23
|
-
|
|
24
|
-
Every scenario carries **one stable `@BDD-<DOMAIN>-<NNN>` ID**, the platforms it requires (`@web`, `@ios`, `@android`, … as the project declares them), provenance (design node, ratified decision), and a tracker tag tying it to the work item that introduced or changed it. IDs are never renumbered or reused: behavior that stays user-observably the same keeps its ID through a rewrite; genuinely different behavior gets a new ID and the old one is marked `@superseded`.
|
|
25
|
-
|
|
26
|
-
Lifecycle tag, exactly one or none:
|
|
27
|
-
|
|
28
|
-
- **no tag** — ratified and required; it is in the coverage denominator.
|
|
29
|
-
- **`@blocked`** — specified but awaiting a decision or dependency; the *product* does not do this yet.
|
|
30
|
-
- **`@reference-only`** — intentionally not authoritative.
|
|
31
|
-
- **`@superseded`** — replaced by a ratified rule or a newer scenario.
|
|
32
|
-
|
|
33
|
-
The last three are out of the denominator. Deleting a committed capability to make coverage look better is a violation; mark it, do not drop it.
|
|
34
|
-
|
|
35
|
-
## What seals a scenario
|
|
36
|
-
|
|
37
|
-
Coverage is counted per **required scenario-platform obligation**, and an obligation is sealed only by **aligned e2e automation in the project's configured runner for that platform** — the runner→platform mapping is project configuration (e.g. a web runner covering `web`, a device runner covering `ios`/`android`), never named by this contract. A unit test, a route boot, a screenshot, a fixture, an API test, or a passing test on a *different* platform never seals an obligation: they prove something else. Each mapping names the runner, the platforms, the file, and the evidence string inside it, so the gate can prove the mapping still resolves.
|
|
38
|
-
|
|
39
|
-
**The gate reads in both directions.** It also walks the test roots the project declares per runner, so an e2e test that exists but that the contract never mentions is a violation — map it to a scenario, or record an exclusion stating why it aligns to no product behavior. Roots are configuration: a subflow or helper directory left undeclared is structurally invisible, which is the same failure as having no gate for it.
|
|
40
|
-
|
|
41
|
-
**Waivers are dated IOUs, never coverage.** An obligation whose runner genuinely cannot decide it today (no camera on the simulator, no request interception, no provisioned provider credential) is recorded with scenario, platforms, reason, and `recordedAt`. It leaves the denominator; it never counts as covered, and nothing about it asserts the behavior works. A waiver is invalid — and fails the gate — when it names a nonexistent scenario or an undeclared platform, covers an already-excluded scenario, or masks a scenario-platform that already has a mapping. Revisit a waiver when its reason dies.
|
|
42
|
-
|
|
43
|
-
## Definition of done
|
|
44
|
-
|
|
45
|
-
A frontend work item is not done until: (1) every user-facing behavior it adds or changes exists as a Gherkin scenario with a stable ID in the project's behavior contract, traceable to the work item; (2) every required scenario-platform obligation it introduces is either mapped to aligned e2e automation in the project's configured runner for that platform, or carries a dated waiver naming the runner limitation; and (3) the coverage gate passes and the generated matrix and burndown are regenerated and committed in the same PR. **Missing BDD coverage is a verification failure, not a warning** — it blocks completion exactly as a `PARTIAL` spec-conformance verdict does, and it is never demoted to "optional", "if cheap", or a follow-up without a linked build-ready ticket created before merge.
|
|
46
|
-
|
|
47
|
-
## Bootstrap and degradation
|
|
48
|
-
|
|
49
|
-
A project with no `bdd/` contract yet is not exempt — the first frontend work item scaffolds the minimum (features dir, coverage map with the project's detected runner→platform mapping, gate + matrix scripts) and covers **its own** behavior. It never backfills the whole app: pre-existing uncovered behavior is recorded as burndown, not treated as this item's blocker. If no e2e runner exists for a required platform at all, record the checked locations and the absence as the reason, exactly as the regression-spec absence path in `verification` does — a silent skip is never one of the exits.
|
|
50
|
-
|
|
51
|
-
Full contract (coverage-map schema, gate semantics, bootstrap procedure, per-flow obligations): [reference/bdd-e2e-coverage.md](../reference/bdd-e2e-coverage.md).
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# Blocker Containment (load-bearing)
|
|
2
|
-
|
|
3
|
-
**An `is blocked by` dependency is cleared by one fact only: the blocker's code is present on the branch the dependent will be built from.** A lifecycle status name — `done`, `on-stg`, `on-dev`, `code-review`, or any configured equivalent — is never that fact. It is a label that correlates with the fact in a single-trunk workflow and comes apart from it in a promotion workflow.
|
|
4
|
-
|
|
5
|
-
**One vendor-neutral contract, cited by** `lisa-repair-intake` (Class A dependency clearing), `lisa-intake-explain` (dependency hold gate), and `lisa-ticket-triage` (Phase 1.5 open-blocker gate) — the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never divergent per-consumer prose.
|
|
6
|
-
|
|
7
|
-
## Why a status name is the wrong test
|
|
8
|
-
|
|
9
|
-
Where promotion runs `dev → staging → main`, `main` is the **trailing** branch. A blocker at `On Stg` is merged to `staging` and absent from `main`, so a dependent that builds from `main` does not have it. A blocker in `Code Review` is merged to nothing at all. The two failures are symmetric and both are live in the tree:
|
|
10
|
-
|
|
11
|
-
- Test too **loosely** (any env-staged `done` clears) and a dependent is dispatched into work whose prerequisite is not on its branch. Nothing goes red; the item moves to `ready`, which is indistinguishable from a repair that worked.
|
|
12
|
-
- Test too **strictly** (only the production terminal clears) and every dependent strands behind a blocker that is already merged where it matters.
|
|
13
|
-
|
|
14
|
-
Containment is the one predicate that gets both right, because it asks the question the status name was standing in for.
|
|
15
|
-
|
|
16
|
-
## The predicate
|
|
17
|
-
|
|
18
|
-
1. **Resolve the dependent's base branch.** Take the dependent's `## Target Backend Environment` and map that exact key forward through `.lisa.config.json` `deploy.branches`, per `derived-branch-plan` and `config-resolution`. **Never read the rendered `Branch Plan` section as input** — `derived-branch-plan` forbids it; a surface needing the base branch derives it again.
|
|
19
|
-
2. **Resolve the blocker's merge commit** — the commit that landed the blocker's PR.
|
|
20
|
-
3. **Test ancestry on the remote:** is that commit an ancestor of the resolved base branch (`git merge-base --is-ancestor <sha> origin/<base>`)?
|
|
21
|
-
4. **Cleared** iff the answer is yes. Otherwise **still blocking**.
|
|
22
|
-
|
|
23
|
-
## Fail closed
|
|
24
|
-
|
|
25
|
-
**Never fail open on an unresolvable ancestry check.** Any step that cannot be positively resolved leaves the dependency **blocking**, and the run record says which step failed:
|
|
26
|
-
|
|
27
|
-
- no linked PR, or a PR that is not merged;
|
|
28
|
-
- the blocker is inaccessible (deleted, cross-org, permission denied) — containment across repositories is not defined;
|
|
29
|
-
- the dependent's environment is not derivable, maps non-uniquely, or maps to a branch absent from the remote;
|
|
30
|
-
- the ancestry query itself fails.
|
|
31
|
-
|
|
32
|
-
A false negative (left blocked) costs a cycle and is visible. A false positive (dispatched into a missing prerequisite) is invisible and surfaces days later as work begun before its dependency existed. Prefer the visible failure.
|
|
33
|
-
|
|
34
|
-
## The one carve-out: a blocker with no code
|
|
35
|
-
|
|
36
|
-
A dependency need not deliver code. A blocker **closed as completed** that positively declares no code deliverable — `Target Backend Environment: None — no runtime behavior change` (doc-only / config-only / type-only), no linked PR, no merge commit — is **cleared**, because there is no artifact whose location could matter.
|
|
37
|
-
|
|
38
|
-
This requires a **positive determination**, never an absence. "I could not find a PR" is fail-closed under the rule above; "the item declares it ships no code" is this carve-out. Collapsing the two turns the carve-out into a universal bypass.
|
|
39
|
-
|
|
40
|
-
## Ancestry answers a development question, not a deployment one
|
|
41
|
-
|
|
42
|
-
This rule requires an ancestry test. `deployed-state-readback` says ancestry is **never** evidence of deployment. Both are correct — they answer different questions:
|
|
43
|
-
|
|
44
|
-
- **Here:** *is the blocker's code on the branch I will build from?* An `is blocked by` link is a **development** dependency, satisfied once the code is on your base branch. Ancestry is the right test, and waiting for production strands dependents.
|
|
45
|
-
- **There:** *is this thing live?* A commit can be an ancestor of the default branch and never have shipped — a discarded pipeline execution leaves it merged and undeployed. Ancestry is provably insufficient.
|
|
46
|
-
|
|
47
|
-
Never use this rule's test to answer a "does it already exist in the environment?" question.
|
|
48
|
-
|
|
49
|
-
## Human override
|
|
50
|
-
|
|
51
|
-
A human statement on the item that the dependency is satisfied clears it, and outranks a failed containment check. Record it as the reason in the run record. This is the escape hatch for cross-repo and untracked dependencies, and it is the only one. An automation may never synthesize one on its own behalf.
|
|
52
|
-
|
|
53
|
-
Full contract (resolution steps, per-vendor merge-commit bindings, the fail-closed reason-key table, the no-code carve-out's three conditions, and what this rule deliberately does not do): [reference/blocker-containment.md](../reference/blocker-containment.md).
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# Claim-Time Archaeology (load-bearing)
|
|
2
|
-
|
|
3
|
-
Lisa lifecycles are one-way — a done issue never reopens, so a residual failure comes back as a **new** issue with no visible link to the issue that shipped it. Archaeology recovers that link at claim time: the claiming agent learns it is working on round 2 of a past failure, and what specifically went wrong the first time.
|
|
4
|
-
|
|
5
|
-
**One vendor-neutral contract, cited by every build-intake arm** (the `leaf-only-lifecycle` / `repo-scope-split` / `rejection-detection` precedent: one shared slug, never three divergent implementations).
|
|
6
|
-
|
|
7
|
-
## When it runs
|
|
8
|
-
|
|
9
|
-
In build-intake step 3b, **AFTER the rejection-detection classification and BEFORE the relabel/transition** `$READY → $CLAIMED`. Rejection detection runs first; its classification is an **input** to archaeology — a detected `rejection-reclaim` passes straight through, never re-derived.
|
|
10
|
-
|
|
11
|
-
## Classify the claimed item
|
|
12
|
-
|
|
13
|
-
Return exactly one of:
|
|
14
|
-
|
|
15
|
-
- **`rejection-reclaim`** — taken directly from the `rejection-detection` result. Reuse it; do not re-derive.
|
|
16
|
-
- **`retry-of-done-issue`** — an ancestry signal names a closed done issue whose shipped work this issue exists to fix.
|
|
17
|
-
- **`fresh`** — no ancestor found, signals weak/inconclusive, budget exhausted, or the pass errored. The default and the safe degrade.
|
|
18
|
-
|
|
19
|
-
## Ancestry signals (summary — full bindings in the reference body)
|
|
20
|
-
|
|
21
|
-
1. **Tracker metadata** — the typed relations the read skills already parse (Blocks / Blocked by / Relates to / Duplicates / Cloned from, `closingIssuesReferences`, cross-references).
|
|
22
|
-
2. **Text similarity** — tracker search primitives over recently-closed issues touching the same implicated files, ranked by title/label overlap. Lexical only; no embedding machinery exists.
|
|
23
|
-
3. **Git ancestry** — deterministic `git log --follow` / `git blame` / merge-commit queries yielding a parseable `{file, sha, pr, date}` result. Never delegate this to the prose-report `git-history-analyzer` agent.
|
|
24
|
-
|
|
25
|
-
## Learning-loop exclusion (scan-side)
|
|
26
|
-
|
|
27
|
-
An artifact this flow produced is **never** an ancestor. Exclude anything carrying `[lisa-learning-drop]`, `[lisa-learning-pr]`, `[lisa-learning-upstream-handoff]`, `[lisa-rejection-candidate]`, or `[lisa-archaeology-candidate]` markers, or the `learning:needs-triage` label.
|
|
28
|
-
|
|
29
|
-
## Cost budget — never block the claim
|
|
30
|
-
|
|
31
|
-
The pass runs inside a hard budget: `.lisa.config.json` `archaeology.maxSteps` (default **8** tracker/git queries; optional `archaeology.maxSeconds`). Budget exhausted, weak signals, or an exception → classify `fresh` and proceed. Archaeology is a bonus layered on the claim; it **never blocks the claim**. Exceeding the budget degrades to `fresh` — a normal outcome, not an error.
|
|
32
|
-
|
|
33
|
-
## On `retry-of-done-issue`
|
|
34
|
-
|
|
35
|
-
Reconstruct what the ancestor's PR shipped (merged PR, review threads, evidence comments) and derive **ONE** candidate learning citing the **delta** between what was done and what this issue proves was needed — routed to `lisa-persist-learning` exactly like the rejection-reflection path. Fallback when that skill is absent: a comment with a visible prose line plus `<!-- [lisa-archaeology-candidate] key=<issue>::<ancestor> -->` (marker-dedupe; re-claims produce no duplicate). `fresh` → no candidate, zero comments.
|
|
36
|
-
|
|
37
|
-
Full contract (signal bindings, classification table, candidate derivation, budget mechanics): [reference/claim-archaeology.md](../reference/claim-archaeology.md).
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# Claim → Evidence Mapping Contract (load-bearing)
|
|
2
|
-
|
|
3
|
-
**Every claim about the software declares a boundary, and a claim is established only by evidence of
|
|
4
|
-
a kind that reaches that boundary.** Unit tests are a quality prerequisite, not a claim discharger:
|
|
5
|
-
a passing unit `test-run-log` reaches only the **code-unit** boundary. Citing evidence whose *kind*
|
|
6
|
-
does not reach a claim's *boundary* — a unit log offered as proof that a button works in the browser
|
|
7
|
-
— is a contract violation, and a review-rejectable defect.
|
|
8
|
-
|
|
9
|
-
## The claim-boundary taxonomy (closed set)
|
|
10
|
-
|
|
11
|
-
Every claim binds to exactly one boundary, and each boundary is discharged only by evidence of the
|
|
12
|
-
kind(s) that reach it. The boundaries and their establishing evidence kinds are seeded verbatim from
|
|
13
|
-
the `verification` rule's artifact-type taxonomy — no new vocabulary is invented here:
|
|
14
|
-
|
|
15
|
-
- **`code-unit`** — pure-logic behavior in isolation → unit `test-run-log`. Reaches no boundary
|
|
16
|
-
below it.
|
|
17
|
-
- **`browser`** — user-visible UI behavior → `screenshot`, `recording`. **Never** a unit
|
|
18
|
-
`test-run-log`.
|
|
19
|
-
- **`http-api`** — request/response contract → `http-transcript`. **Never** a unit `test-run-log`.
|
|
20
|
-
- **`cli`** — command behavior → `cli-output`.
|
|
21
|
-
- **`data`** — persisted state → `db-query-output`, `state-dump`.
|
|
22
|
-
- **`deploy-health`** — a healthy running deployment → `deploy-log`. **Never** any pre-deploy
|
|
23
|
-
artifact.
|
|
24
|
-
- **`performance`** — latency/throughput/frame timing → `perf-trace` (with methodology).
|
|
25
|
-
- **`standards-compat`** — conformance to an external standard → `cli-output` / `test-run-log` from
|
|
26
|
-
the compat runner.
|
|
27
|
-
|
|
28
|
-
## The core inequality
|
|
29
|
-
|
|
30
|
-
**unit tests ≠ browser behavior ≠ healthy deployment ≠ standards compatibility.** Each is a distinct
|
|
31
|
-
boundary; evidence at one never discharges a claim at another. "Verified" must name the boundary its
|
|
32
|
-
evidence actually reaches, so a report read at the gate states its own limits (`factory-model`
|
|
33
|
-
rule 5).
|
|
34
|
-
|
|
35
|
-
## Field names (fixed here, made executable later)
|
|
36
|
-
|
|
37
|
-
A claim carries three fields — `claim_id`, `boundary`, and `required_evidence_kinds` — named here so
|
|
38
|
-
every downstream surface uses one spelling. This ticket only writes the contract down; the schema and
|
|
39
|
-
gate that make these fields executable ship with **BCE-2 (#1836)** — do not assume that surface is
|
|
40
|
-
present in this branch.
|
|
41
|
-
|
|
42
|
-
## Security buckets (conservative by default)
|
|
43
|
-
|
|
44
|
-
A security finding is **proven** only with both a reproducer of a reaching kind and a bounded
|
|
45
|
-
impact/exploitability statement; missing either, it renders **unproven** with its reason and **stays
|
|
46
|
-
in the security section** — never auto-demoted to maintenance. The label is one policy point,
|
|
47
|
-
`security.review.unprovenBucket` (default `security-unproven`); the procedure lives in the
|
|
48
|
-
`lisa-security-review` skill.
|
|
49
|
-
|
|
50
|
-
## Artifact identity (pinned, never assumed)
|
|
51
|
-
|
|
52
|
-
A claim applies only to the artifact its evidence was collected against. Every verdict pins
|
|
53
|
-
`artifact.head_sha` — the commit the run observed — and every evidence entry pins the
|
|
54
|
-
`artifact_head_sha` in force when it was captured, its `sha256` content digest, and `captured_at`.
|
|
55
|
-
Evidence collected on a pre-merge head is valid for the merge commit **only** when that head is a
|
|
56
|
-
parent of the merge, per the ancestry + deploy-run definition of "what shipped" that
|
|
57
|
-
`lisa-drive-pr-to-merge` already owns — cite it, never write a second one. A mismatched SHA or a
|
|
58
|
-
recomputed digest that disagrees fails loudly, naming both SHAs / the evidence id, and verification
|
|
59
|
-
re-runs against the merged head before completion is declared. Full definition: the reference body.
|
|
60
|
-
|
|
61
|
-
## Not established (required, never omitted)
|
|
62
|
-
|
|
63
|
-
A claim with no reaching evidence is **Not established**, and every report says so out loud. Each
|
|
64
|
-
evidence comment and verdict carries a `Not established` section listing what was *not* proved —
|
|
65
|
-
boundaries not exercised, environments not tested, behavior consciously out of scope. It is never
|
|
66
|
-
omitted and never blank: with nothing outstanding it still renders `None outstanding — reviewed`, and
|
|
67
|
-
`not_established_reviewed` attests the list was reviewed even when the list itself is empty. This
|
|
68
|
-
generalizes the required, never-empty `Known limits` field of `lisa-improve-harness`. Full definition
|
|
69
|
-
and operator-voice exemplars: the reference body.
|
|
70
|
-
|
|
71
|
-
## No behavior change; degrade, never block
|
|
72
|
-
|
|
73
|
-
This rule is documentation, not a gate: it changes no schema, no skill, and no check. Where a later
|
|
74
|
-
surface it names is not yet installed, cite the boundary a claim reaches and continue — never block
|
|
75
|
-
on the absent surface. Read the contract to someone who has never seen Lisa and they should be able
|
|
76
|
-
to say why a unit-test log does not prove a button works in the browser.
|
|
77
|
-
|
|
78
|
-
Full contract (claim-boundary taxonomy, core inequality, worked example, field names): [reference/claim-evidence-mapping.md](../reference/claim-evidence-mapping.md).
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Claim-Time Guards (load-bearing)
|
|
2
|
-
|
|
3
|
-
Two guards that run when build-intake claims a ready item, both from failures observed in the fleet: an item built twice because it had already shipped, and a loop burning cycles re-attempting an item that was never going to succeed.
|
|
4
|
-
|
|
5
|
-
**One vendor-neutral contract, cited by every build-intake arm** (the `leaf-only-lifecycle` / `repo-scope-split` / `rejection-detection` / `claim-archaeology` precedent: one shared slug, never three divergent implementations).
|
|
6
|
-
|
|
7
|
-
## When they run
|
|
8
|
-
|
|
9
|
-
Inside build-intake step `3b`, after `rejection-detection` and `claim-archaeology`, still before the `$READY → $CLAIMED` transition. The `two-failed-attempts` valve runs first — it is cheaper and it is the only pass that can stop the claim outright.
|
|
10
|
-
|
|
11
|
-
## `already-implemented` → `verify-and-close`
|
|
12
|
-
|
|
13
|
-
A ready item may already be implemented, because agents ship without transitioning. Before implementing, probe for the item's **own** key:
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
git log --all --grep "<key>" --format='%H %aI %s' -n 10
|
|
17
|
-
gh pr list --repo <org>/<repo> --state all --search "<key>" --json number,state,mergedAt,url
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
On a hit, do not build it twice — switch `3c` to **verify-and-close**: verify what shipped against this item's acceptance criteria, post evidence naming the shipping PR/commit, then run the ordinary `3d` transition and rollup. If the shipped change only partially satisfies the criteria, implement the remaining gap instead of closing.
|
|
21
|
-
|
|
22
|
-
Distinct from `claim-archaeology` (finds a **different** ancestor issue) and from `DUPLICATE_ALREADY_FIXED` (a **different** canonical issue). Unreadable history degrades to "no hit"; the guard never blocks the claim.
|
|
23
|
-
|
|
24
|
-
## `two-failed-attempts` → blocked
|
|
25
|
-
|
|
26
|
-
Every non-success terminal outcome records a durable marker on the item — a visible line plus `<!-- [lisa-build-attempt] n=<N> outcome=<outcome> measures=<work|machine> -->` (match on the marker, never the title). A cron holds no memory between cycles, so the item carries the count.
|
|
27
|
-
|
|
28
|
-
**Two filters before counting.** Count a marker only when it is `measures=work` — a run terminated by a signal, or whose outcome was `recovery-required`, measures the box and not the item — and only when it was recorded **after the item most recently entered the ready lane**. An unlabelled marker counts as `work`; an unreadable lane history falls back to counting every `work` marker. Both defaults keep the valve shut rather than open (CodySwannGT/lisa#3854).
|
|
29
|
-
|
|
30
|
-
With **two or more** surviving markers at claim time: do not claim. Move the item to the configured `blocked` role (resolved per `config-resolution`, never hardcoded), post an operator-readable comment naming both attempts and what a human must decide or supply, and **stop the loop** for this cycle. Recovery is deliberate and it works — a human or a `lisa-repair-intake` cycle with the blocker provably cleared returns it to the queue, which ends the period the old markers describe without deleting them.
|
|
31
|
-
|
|
32
|
-
Full contract (probe bounds, verify-and-close steps, partial-hit handling, marker mechanics): [reference/claim-time-guards.md](../reference/claim-time-guards.md).
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# Control Reachability — A Prescribed Control Must Reach the Changed Path (load-bearing)
|
|
2
|
-
|
|
3
|
-
A work item may hand the implementer a falsifiable stopping rule: *"make the change; `<named existing test>` must go red. If it still passes, the fix did nothing."* That is good practice — it replaces eyeballing with an observation. It is also **only valid if that test's fixture exercises the path the change touches.**
|
|
4
|
-
|
|
5
|
-
When it does not, the test stays green **for a reason unrelated to the change**: execution never reached the changed code. The stopping rule then instructs the implementer to revert a correct fix, and the more faithfully the implementer follows the item, the more reliably it happens. Measured once in the portfolio: a pinned test's fixture omitted the field the fix read, execution fell through to a default branch, the test stayed green, and the fix had worked.
|
|
6
|
-
|
|
7
|
-
This is the specification-side sibling of `falsifiable-checks`, which governs a check *you authored*. Here the check is **prescribed by the work item** and the defect is in the prose, not the code.
|
|
8
|
-
|
|
9
|
-
## Authoring obligation — checkable, not advisory
|
|
10
|
-
|
|
11
|
-
**A work item that names an existing test as a red-before-green control must say what makes that test reach the code the change touches.** Naming the code is not enough; the item names the *input*.
|
|
12
|
-
|
|
13
|
-
Declare it in `## Validation Journey`, one marker per named control:
|
|
14
|
-
|
|
15
|
-
```text
|
|
16
|
-
[CONTROL: <test-identifier> | reaches: <input-or-field>]
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
- `<test-identifier>` — non-empty: the test file path, the test name, or both.
|
|
20
|
-
- `reaches:` — the literal key, then the **input, field, fixture key, argument, or state** that carries execution into the changed code. `reaches: the fix` and `reaches: the changed code` restate the assertion and do not satisfy it.
|
|
21
|
-
|
|
22
|
-
Enforced by gate **S20** in `lisa-jira-validate-ticket`, `lisa-github-validate-issue`, and `lisa-linear-validate-issue`; rendered by `lisa-jira-write-ticket`, `lisa-github-write-issue`, and `lisa-linear-write-issue`; read at claim time by `lisa-ticket-triage` and `lisa-implement`.
|
|
23
|
-
|
|
24
|
-
**An item that prescribes no existing-test control is exempt.** Introducing a *new* test carries no reachability obligation — the gate is `N/A` and the item is never reported as incomplete on this basis.
|
|
25
|
-
|
|
26
|
-
## Implementer obligation — a green control is two facts, not one
|
|
27
|
-
|
|
28
|
-
`lisa-tdd-implementation` and `lisa-reproduce-bug` bind this arm: **when a prescribed control does not change state as the item predicted, stop. Establish which cause holds before acting on the stopping rule.**
|
|
29
|
-
|
|
30
|
-
| Cause | Correct action |
|
|
31
|
-
|---|---|
|
|
32
|
-
| The change had no effect on behaviour | Revisit the change |
|
|
33
|
-
| The fixture never reaches the changed code path | Fix or extend the control — do **not** revert |
|
|
34
|
-
|
|
35
|
-
They demand opposite actions, and the cheaper reading ("the fix did nothing") wins by default when nothing forces the distinction. So force it: **prove reachability by execution, never by reading the fixture.** Put a temporary throw, log line, or counter in the changed code and run that one test; or run coverage scoped to it and read whether the changed lines were hit. Reasoning that the fixture *looks like* it reaches the path is the same move `falsifiable-checks` rejects as "mentally reverting".
|
|
36
|
-
|
|
37
|
-
**Never revert on an unexplained green.** An unexplained control is a blocked observation, not a verdict — and a reachable-but-still-green control is the only form of it that licenses revisiting the change.
|
|
38
|
-
|
|
39
|
-
Full prose, the worked instance, and the reporting template: [reference/control-reachability.md](../reference/control-reachability.md).
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# Convergent Review
|
|
2
|
-
|
|
3
|
-
Review exists to get correct work merged, not to keep a PR in review orbit.
|
|
4
|
-
|
|
5
|
-
- Block only concrete correctness, security, data-loss, or contract-violation
|
|
6
|
-
failures. Lint-owned style, formatting, taste, and speculative improvements
|
|
7
|
-
are non-blocking unless the work item or repository rules make them release
|
|
8
|
-
criteria.
|
|
9
|
-
- Every finding must state severity, blocking yes/no, a concrete failure
|
|
10
|
-
scenario, evidence, and the smallest actionable fix — plus
|
|
11
|
-
`invariant_violated` (the property at risk) and `machinery_to_remove` (what
|
|
12
|
-
becomes deletable, or `none`), required for `readiness-rubric` findings and
|
|
13
|
-
recommended elsewhere.
|
|
14
|
-
- Present findings highest-consequence first, by severity and blast radius, not
|
|
15
|
-
by discovery order. Report section order stays stable.
|
|
16
|
-
- A blocking finding without a concrete failure scenario is malformed by
|
|
17
|
-
contract; downgrade it to non-blocking and ask for evidence.
|
|
18
|
-
- Resolve each finding as `fixed`, `deferred`, or `pushed-back`. If the reviewer
|
|
19
|
-
cannot refute a pushback with fresh evidence, the author's disposition stands.
|
|
20
|
-
- After suggestion implementation completes and gates pass, review does not
|
|
21
|
-
reopen absent new evidence: a relevant new commit, a failed gate, a newly cited
|
|
22
|
-
failure scenario, or a scope change.
|
|
23
|
-
- Irreconcilable blocking disagreement becomes a blocked work item with both
|
|
24
|
-
positions summarized for the operator, not an endless loop.
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
# Credential-Substrate Precedence (load-bearing)
|
|
2
|
-
|
|
3
|
-
**When more than one substrate can reach an external system, the configured credentials
|
|
4
|
-
provider's token/CLI path goes first and the interactive MCP is the fallback — and
|
|
5
|
-
identity-match verification is mandatory on every substrate, at every tier.**
|
|
6
|
-
|
|
7
|
-
**One shared, vendor-neutral contract cited by every `*-access` skill** (the
|
|
8
|
-
`leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never divergent
|
|
9
|
-
per-skill prose). An access skill states its per-vendor mechanics — which token, which
|
|
10
|
-
CLI, which identity anchor — and cites this rule for the ordering. It never restates,
|
|
11
|
-
narrows, or locally overrides that ordering.
|
|
12
|
-
|
|
13
|
-
Settled by decision record `2026-08-12-credential-substrate-precedence` (D6), and
|
|
14
|
-
settled in the `settled-decisions` sense: re-arguing MCP-first inside a skill is out of
|
|
15
|
-
scope for that skill's work.
|
|
16
|
-
|
|
17
|
-
## The ladder
|
|
18
|
-
|
|
19
|
-
1. **Tier 1 — configured-provider substrate.** The token or CLI path fed by
|
|
20
|
-
`lisa-secrets-access`, chosen whenever its bootstrap credential is available **and**
|
|
21
|
-
the resolved substrate identity-matches the configured tenant/workspace/site.
|
|
22
|
-
`lisa-secrets-access` is the single chokepoint — never read an OS keychain a second
|
|
23
|
-
time. The two legacy OS-keychain rungs that remain (`lisa-atlassian-access`,
|
|
24
|
-
`lisa-notion-access`) are a dated migration ramp with a **removal date of
|
|
25
|
-
2026-11-01**, not a standing exemption; no new access skill may add one.
|
|
26
|
-
2. **Tier 2 — interactive MCP**, used only when tier 1 is *genuinely* unavailable:
|
|
27
|
-
no bootstrap, no adapter for the operation (per-operation, not per-session), or a
|
|
28
|
-
provider outage. "The MCP happens to be authenticated" and "tier 1 is slower" are
|
|
29
|
-
**not** qualifying reasons.
|
|
30
|
-
3. **Tier 3 — loud, actionable failure** naming the exact credential to set and the exact
|
|
31
|
-
remediation. Never silently no-op, never blind-retry a failed or absent substrate,
|
|
32
|
-
never fall through to one that failed identity-match.
|
|
33
|
-
|
|
34
|
-
## Identity-match is mandatory on every substrate
|
|
35
|
-
|
|
36
|
-
Verified **in both directions** before any operation: the substrate must claim the
|
|
37
|
-
configured tenant, and the configured tenant must be one the substrate can reach. A
|
|
38
|
-
substrate authenticated as a different account is **skipped, never used — including at
|
|
39
|
-
tier 1**. A credential is not an identity claim; the identity claim is what the provider
|
|
40
|
-
says when asked. Skipping the check because "the user obviously meant this workspace" is
|
|
41
|
-
forbidden.
|
|
42
|
-
|
|
43
|
-
## Mutating operations: fallback is guarded, never routine
|
|
44
|
-
|
|
45
|
-
Falling back to an ambient-bound substrate for a **write** requires: switch profile and
|
|
46
|
-
assert identity immediately before the write → write → re-read the affected objects →
|
|
47
|
-
assert the tenant **from the response** (self URL host, cloudId in the path, response
|
|
48
|
-
metadata), not from the pre-flight check → on mismatch, stop, report a cross-tenant
|
|
49
|
-
hazard, and best-effort roll back. A successful pre-flight switch is not sufficient:
|
|
50
|
-
another process can mutate global state between the check and the write.
|
|
51
|
-
|
|
52
|
-
Full contract (per-vendor identity anchors and probes, the provider-first rationale, MCP's
|
|
53
|
-
first-class fallback role, consequences, and the checklist for adding or editing an access
|
|
54
|
-
skill): [reference/credential-substrate-precedence.md](../reference/credential-substrate-precedence.md).
|