@codyswann/lisa 4.49.0 → 4.50.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-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 +120 -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 +83 -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
|
@@ -2,6 +2,103 @@
|
|
|
2
2
|
|
|
3
3
|
Lisa is vendor-agnostic. PRDs can be sourced from Notion, Confluence, Linear, GitHub Issues, or JIRA. Tickets can be written to JIRA, GitHub Issues, or Linear. Per-project configuration lives in `.lisa.config.json` at the repo root, with optional `.lisa.config.local.json` overriding on a per-key basis.
|
|
4
4
|
|
|
5
|
+
|
|
6
|
+
> The sections between here and the horizontal rule were demoted out of the
|
|
7
|
+
> always-on eager head by CodySwannGT/lisa#3992, verbatim. They are tracker-write
|
|
8
|
+
> and provider mechanics: needed when a flow writes to a tracker or resolves a
|
|
9
|
+
> deploy target, not on every session. The eager head keeps the resolution
|
|
10
|
+
> pointer, the Atlassian identity switch, tracker selection, and repo identity.
|
|
11
|
+
|
|
12
|
+
## Tracker status vocabulary
|
|
13
|
+
|
|
14
|
+
**A status transition may target only a status named in the project's configured workflow map** (`jira.workflow.*` for JIRA; the equivalent label/state map for GitHub and Linear). The configured map is the COMPLETE authorized vocabulary — not a starting point.
|
|
15
|
+
|
|
16
|
+
- **Never adopt statuses discovered from the tracker's live workflow metadata** — transition lists (`getTransitionsForJiraIssue` targets), board columns, status descriptions, or statuses seen on other tickets. A tracker workflow usually contains more statuses than the config names; those extra statuses are not lisa's to use. The live workflow is consulted only to find the transition *id* that reaches a config-named status.
|
|
17
|
+
- **A lifecycle stage with no configured status gets no transition.** If the flow reaches a stage the map does not name (e.g. "PR open awaiting review" when `jira.workflow.review` is unset, or a QA-ready stage with no `qa` mapping), leave the status where it is and record the stage in a comment. Do not pick the nearest-sounding tracker status.
|
|
18
|
+
- **This binds every actor that writes to the tracker** — the lead as much as any subagent. In runtimes where interactively-authenticated MCPs are lead-only, the lead performs the tracker writes for the whole flow; loading an implement/sync skill without the agent definition does not relax this rule.
|
|
19
|
+
|
|
20
|
+
This is the shared slug for the config-bound-transitions policy (the `leaf-only-lifecycle` precedent: one slug, never divergent per-surface prose). Skills and agent definitions cite it rather than restating it.
|
|
21
|
+
|
|
22
|
+
## Project rules and learnings
|
|
23
|
+
|
|
24
|
+
Host-authored project rules live in the fixed, agent-neutral directory
|
|
25
|
+
`.agents/rules/` — not a configurable file. Every agent reaches it through the
|
|
26
|
+
Lisa-managed pointer block in `AGENTS.md`, so it is read once, on demand. A
|
|
27
|
+
project that still carries the retired `.claude/rules/PROJECT_RULES.md` keeps
|
|
28
|
+
it, untouched and authoritative; the pointer names it too. Automated
|
|
29
|
+
learnings never append to host rules: they use the separate machine-managed
|
|
30
|
+
ledger resolved from `.lisa.config.json` — the optional `learnings.file`
|
|
31
|
+
override, else the default `.lisa/PROJECT_LEARNINGS.md`. The ledger lives in the
|
|
32
|
+
cold `.lisa/` tree (never an auto-loaded rules directory) and is consumed only
|
|
33
|
+
through the contract's bounded projection, never read raw wholesale. Both
|
|
34
|
+
writers and budget checks import the executable contract from
|
|
35
|
+
`@codyswann/lisa/learnings`; they must not copy its numeric limits.
|
|
36
|
+
|
|
37
|
+
## Optional Kane browser provider
|
|
38
|
+
|
|
39
|
+
Kane is selected only through `verification.browser.kane`: require `enabled: true`, exact version
|
|
40
|
+
`0.6.3`, `cloudUploadApproved: true`, an explicit non-production `allowedEnvironments` entry, a
|
|
41
|
+
Test Manager `projectId`, and a resolved `exploration` mutation policy of `full`. Credentials never
|
|
42
|
+
live in Lisa config. Run `lisa kane probe` before use and invoke only through `lisa-kane-browser`;
|
|
43
|
+
provider/auth/upload/schema failures are tooling failures, not product failures. Kane supplies
|
|
44
|
+
empirical evidence only—native Playwright/Cypress/Maestro remains the regression authority.
|
|
45
|
+
|
|
46
|
+
## Env → base branch
|
|
47
|
+
|
|
48
|
+
The `## Target Backend Environment` grammar is durable: human-confirmed values
|
|
49
|
+
are a bare configured key or `Confirmed: <env>`; automation writes either
|
|
50
|
+
`Inferred: <env> — evidence: <title|body|reproduction|hostname>` or
|
|
51
|
+
`Assumption: <env> — remote default branch <branch>`. When no unique environment
|
|
52
|
+
maps to the default branch, use `Assumption: remote default branch <branch>`.
|
|
53
|
+
Human confirmation replaces an automated annotation with a bare key or
|
|
54
|
+
`Confirmed: <env>`. For legacy bare values, use managed draft markers and current
|
|
55
|
+
ticket content only; provider edit history is not required. A marker proves
|
|
56
|
+
automation and requires re-annotation; otherwise unknown provenance with
|
|
57
|
+
conflicting evidence stops for confirmation.
|
|
58
|
+
|
|
59
|
+
Resolution order is human-confirmed value; validated `Inferred:` evidence; then
|
|
60
|
+
one unambiguous signal from the human-authored title, body, and reproduction
|
|
61
|
+
steps or a URL hostname. Exclude the complete `Target Backend Environment`
|
|
62
|
+
section and other machine-authored metadata/draft blocks from the scan so an
|
|
63
|
+
annotation cannot validate or conflict with itself. Evidence supersedes only an
|
|
64
|
+
`Assumption:`. A signal must be an exact
|
|
65
|
+
`deploy.branches` key as a complete token/hostname label. The sole normalization
|
|
66
|
+
is `prod` ↔ `production` when exactly one is configured; no other aliases exist.
|
|
67
|
+
Conflicting signals stop. Never infer from arbitrary branch text, URL paths or
|
|
68
|
+
query strings, or substrings. With no signals, use the remote default branch and
|
|
69
|
+
record an assumption: include `<env>` only for a unique reverse-map, otherwise
|
|
70
|
+
use the branch-only form without inventing an environment or blocking. Require
|
|
71
|
+
any selected environment mapping and its remote branch to exist.
|
|
72
|
+
A non-integration environment bug is fixed, merged, and verified on that
|
|
73
|
+
environment branch first, then
|
|
74
|
+
forward cherry-picked down to the integration branch via a linked follow-up.
|
|
75
|
+
|
|
76
|
+
## Env-keyed `done` — promotion completeness
|
|
77
|
+
|
|
78
|
+
A merged PR's base branch names the environment a change **entered**, never the environments it has
|
|
79
|
+
**reached**. Before writing an env-keyed `done`, walk `deploy.order` from its lowest rung and write
|
|
80
|
+
the highest **contiguously reached** rung at or below the resolved env. A rung is reached only when
|
|
81
|
+
the merge commit is an ancestor of its `deploy.branches` branch
|
|
82
|
+
(`git merge-base --is-ancestor <merge-sha> origin/<branch>`, asserted for **every** env branch at or
|
|
83
|
+
below the resolved one, not only the PR's base) **and** that branch's most recent deploy
|
|
84
|
+
**concluded `success`** — read the `conclusion`, never the `status`, because an in-flight deploy has
|
|
85
|
+
a null conclusion and looks identical to a pass. Only a concluded `success` promotes: a null
|
|
86
|
+
conclusion and every other conclusion (`failure`, `cancelled`, `timed_out`, `neutral`, `skipped`,
|
|
87
|
+
`stale`, `action_required`) leave the rung unreached. Where `deploy.order` is absent the ladder is
|
|
88
|
+
the single resolved env; where a branch exposes no deploy surface at all, ancestry alone decides
|
|
89
|
+
that rung.
|
|
90
|
+
|
|
91
|
+
A hotfix straight to `main` that skipped `staging` therefore resolves to the rung below the gap and
|
|
92
|
+
stays open; the terminal value, and provider-native closure with it, is earned only by a
|
|
93
|
+
promotion-complete merge. The recorded reason always carries all three fields —
|
|
94
|
+
`<first unreached env> (<its branch>) — <condition>`, where the condition is `missing ancestry`,
|
|
95
|
+
`deploy unknown: <run URL or "no concluded run">`, or `deploy concluded <conclusion>: <run URL>`. A
|
|
96
|
+
failing run named without its environment and branch is an incomplete reason. An open back-fill PR
|
|
97
|
+
against a skipped environment branch is outstanding delivery, not branch hygiene.
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
5
102
|
This rule is the single source of truth for the `.lisa.config.json` schema, the resolution algorithm, and the dispatch tables every vendor-neutral skill follows.
|
|
6
103
|
|
|
7
104
|
## File location and precedence
|
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
# Control Reachability — reference
|
|
2
2
|
|
|
3
|
+
> Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
|
|
4
|
+
> section below is the former eager head, preserved verbatim; the full
|
|
5
|
+
> contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
|
|
6
|
+
|
|
7
|
+
## Control Reachability — A Prescribed Control Must Reach the Changed Path (load-bearing)
|
|
8
|
+
|
|
9
|
+
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.**
|
|
10
|
+
|
|
11
|
+
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.
|
|
12
|
+
|
|
13
|
+
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.
|
|
14
|
+
|
|
15
|
+
## Authoring obligation — checkable, not advisory
|
|
16
|
+
|
|
17
|
+
**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*.
|
|
18
|
+
|
|
19
|
+
Declare it in `## Validation Journey`, one marker per named control:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
[CONTROL: <test-identifier> | reaches: <input-or-field>]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- `<test-identifier>` — non-empty: the test file path, the test name, or both.
|
|
26
|
+
- `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.
|
|
27
|
+
|
|
28
|
+
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`.
|
|
29
|
+
|
|
30
|
+
**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.
|
|
31
|
+
|
|
32
|
+
## Implementer obligation — a green control is two facts, not one
|
|
33
|
+
|
|
34
|
+
`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.**
|
|
35
|
+
|
|
36
|
+
| Cause | Correct action |
|
|
37
|
+
|---|---|
|
|
38
|
+
| The change had no effect on behaviour | Revisit the change |
|
|
39
|
+
| The fixture never reaches the changed code path | Fix or extend the control — do **not** revert |
|
|
40
|
+
|
|
41
|
+
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".
|
|
42
|
+
|
|
43
|
+
**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.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
3
47
|
The full body behind the `control-reachability` eager head. It defines one vendor-neutral contract consumed by the three tracker writers (`lisa-jira-write-ticket`, `lisa-github-write-issue`, `lisa-linear-write-issue`), the three validators (`lisa-jira-validate-ticket`, `lisa-github-validate-issue`, `lisa-linear-validate-issue`) via gate **S20**, and the implementer surfaces `lisa-ticket-triage`, `lisa-tdd-implementation`, `lisa-reproduce-bug` and `lisa-implement`. Each surface cites this slug rather than growing its own prose, exactly as the vendor arms cite `leaf-only-lifecycle`, `repo-scope-split` and `derived-branch-plan`. One slug is what keeps a control rejected on JIRA from being accepted on Linear.
|
|
4
48
|
|
|
5
49
|
## The measured instance
|
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Convergent Review
|
|
2
2
|
|
|
3
|
+
> Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
|
|
4
|
+
> section below is the former eager head, preserved verbatim; the full
|
|
5
|
+
> contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
|
|
6
|
+
|
|
7
|
+
## Convergent Review
|
|
8
|
+
|
|
9
|
+
Review exists to get correct work merged, not to keep a PR in review orbit.
|
|
10
|
+
|
|
11
|
+
- Block only concrete correctness, security, data-loss, or contract-violation
|
|
12
|
+
failures. Lint-owned style, formatting, taste, and speculative improvements
|
|
13
|
+
are non-blocking unless the work item or repository rules make them release
|
|
14
|
+
criteria.
|
|
15
|
+
- Every finding must state severity, blocking yes/no, a concrete failure
|
|
16
|
+
scenario, evidence, and the smallest actionable fix — plus
|
|
17
|
+
`invariant_violated` (the property at risk) and `machinery_to_remove` (what
|
|
18
|
+
becomes deletable, or `none`), required for `readiness-rubric` findings and
|
|
19
|
+
recommended elsewhere.
|
|
20
|
+
- Present findings highest-consequence first, by severity and blast radius, not
|
|
21
|
+
by discovery order. Report section order stays stable.
|
|
22
|
+
- A blocking finding without a concrete failure scenario is malformed by
|
|
23
|
+
contract; downgrade it to non-blocking and ask for evidence.
|
|
24
|
+
- Resolve each finding as `fixed`, `deferred`, or `pushed-back`. If the reviewer
|
|
25
|
+
cannot refute a pushback with fresh evidence, the author's disposition stands.
|
|
26
|
+
- After suggestion implementation completes and gates pass, review does not
|
|
27
|
+
reopen absent new evidence: a relevant new commit, a failed gate, a newly cited
|
|
28
|
+
failure scenario, or a scope change.
|
|
29
|
+
- Irreconcilable blocking disagreement becomes a blocked work item with both
|
|
30
|
+
positions summarized for the operator, not an endless loop.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
3
34
|
Review exists to get correct work merged, not to keep a PR in review orbit.
|
|
4
35
|
Apply this contract to every product, quality, local, bot-parity, and suggestion
|
|
5
36
|
implementation pass.
|
|
@@ -1,5 +1,62 @@
|
|
|
1
1
|
# Credential-Substrate Precedence
|
|
2
2
|
|
|
3
|
+
> Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
|
|
4
|
+
> section below is the former eager head, preserved verbatim; the full
|
|
5
|
+
> contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
|
|
6
|
+
|
|
7
|
+
## Credential-Substrate Precedence (load-bearing)
|
|
8
|
+
|
|
9
|
+
**When more than one substrate can reach an external system, the configured credentials
|
|
10
|
+
provider's token/CLI path goes first and the interactive MCP is the fallback — and
|
|
11
|
+
identity-match verification is mandatory on every substrate, at every tier.**
|
|
12
|
+
|
|
13
|
+
**One shared, vendor-neutral contract cited by every `*-access` skill** (the
|
|
14
|
+
`leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never divergent
|
|
15
|
+
per-skill prose). An access skill states its per-vendor mechanics — which token, which
|
|
16
|
+
CLI, which identity anchor — and cites this rule for the ordering. It never restates,
|
|
17
|
+
narrows, or locally overrides that ordering.
|
|
18
|
+
|
|
19
|
+
Settled by decision record `2026-08-12-credential-substrate-precedence` (D6), and
|
|
20
|
+
settled in the `settled-decisions` sense: re-arguing MCP-first inside a skill is out of
|
|
21
|
+
scope for that skill's work.
|
|
22
|
+
|
|
23
|
+
## The ladder
|
|
24
|
+
|
|
25
|
+
1. **Tier 1 — configured-provider substrate.** The token or CLI path fed by
|
|
26
|
+
`lisa-secrets-access`, chosen whenever its bootstrap credential is available **and**
|
|
27
|
+
the resolved substrate identity-matches the configured tenant/workspace/site.
|
|
28
|
+
`lisa-secrets-access` is the single chokepoint — never read an OS keychain a second
|
|
29
|
+
time. The two legacy OS-keychain rungs that remain (`lisa-atlassian-access`,
|
|
30
|
+
`lisa-notion-access`) are a dated migration ramp with a **removal date of
|
|
31
|
+
2026-11-01**, not a standing exemption; no new access skill may add one.
|
|
32
|
+
2. **Tier 2 — interactive MCP**, used only when tier 1 is *genuinely* unavailable:
|
|
33
|
+
no bootstrap, no adapter for the operation (per-operation, not per-session), or a
|
|
34
|
+
provider outage. "The MCP happens to be authenticated" and "tier 1 is slower" are
|
|
35
|
+
**not** qualifying reasons.
|
|
36
|
+
3. **Tier 3 — loud, actionable failure** naming the exact credential to set and the exact
|
|
37
|
+
remediation. Never silently no-op, never blind-retry a failed or absent substrate,
|
|
38
|
+
never fall through to one that failed identity-match.
|
|
39
|
+
|
|
40
|
+
## Identity-match is mandatory on every substrate
|
|
41
|
+
|
|
42
|
+
Verified **in both directions** before any operation: the substrate must claim the
|
|
43
|
+
configured tenant, and the configured tenant must be one the substrate can reach. A
|
|
44
|
+
substrate authenticated as a different account is **skipped, never used — including at
|
|
45
|
+
tier 1**. A credential is not an identity claim; the identity claim is what the provider
|
|
46
|
+
says when asked. Skipping the check because "the user obviously meant this workspace" is
|
|
47
|
+
forbidden.
|
|
48
|
+
|
|
49
|
+
## Mutating operations: fallback is guarded, never routine
|
|
50
|
+
|
|
51
|
+
Falling back to an ambient-bound substrate for a **write** requires: switch profile and
|
|
52
|
+
assert identity immediately before the write → write → re-read the affected objects →
|
|
53
|
+
assert the tenant **from the response** (self URL host, cloudId in the path, response
|
|
54
|
+
metadata), not from the pre-flight check → on mismatch, stop, report a cross-tenant
|
|
55
|
+
hazard, and best-effort roll back. A successful pre-flight switch is not sufficient:
|
|
56
|
+
another process can mutate global state between the check and the write.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
3
60
|
**When more than one substrate can reach an external system, the configured credentials
|
|
4
61
|
provider's token/CLI path goes first and the interactive MCP is the fallback — and
|
|
5
62
|
identity-match verification is mandatory on every substrate, at every tier.**
|
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# Dependency Decisions
|
|
2
2
|
|
|
3
|
+
> Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
|
|
4
|
+
> section below is the former eager head, preserved verbatim; the full
|
|
5
|
+
> contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
|
|
6
|
+
|
|
7
|
+
## Dependency Decisions (load-bearing)
|
|
8
|
+
|
|
9
|
+
Material dependencies are recorded as decisions, not lockfile trivia. The
|
|
10
|
+
governed record is `.lisa/DEPENDENCY_DECISIONS.md`, seeded once by `lisa apply`
|
|
11
|
+
from the `all/create-only` template surface and never overwritten afterward.
|
|
12
|
+
|
|
13
|
+
A *material* dependency is one that owns a user-visible capability or would cost
|
|
14
|
+
real time to replace. Each record entry must name, in this order: why we keep it
|
|
15
|
+
in plain language, what it is, its owned capability, trust basis, exposure,
|
|
16
|
+
replacement cost, detection evidence, owner/review cadence, and last-reviewed
|
|
17
|
+
date. Field labels lead with the operator's question and keep the technical term
|
|
18
|
+
in parentheses. "Why we keep it" comes first on purpose — an entry that opens
|
|
19
|
+
with a version range opens with the trivia the record exists to replace.
|
|
20
|
+
|
|
21
|
+
When you add, upgrade across a major version, or remove a material dependency,
|
|
22
|
+
update its entry in the same change. When you cannot name the detection evidence
|
|
23
|
+
that would fail if an update broke the owned capability, write "nothing would
|
|
24
|
+
catch it" rather than inventing a check — the gap is the finding.
|
|
25
|
+
|
|
26
|
+
Write every entry so a non-technical operator can tell why the dependency is
|
|
27
|
+
kept and what evidence would detect a bad update. Lead with the outcome it
|
|
28
|
+
protects, not the mechanism.
|
|
29
|
+
|
|
30
|
+
Entries are repeatable blocks appended under `## Records`, so a seeding script
|
|
31
|
+
can add one without rewriting the file. An honest gap is written as
|
|
32
|
+
`_Not yet decided_` — never left blank.
|
|
33
|
+
|
|
34
|
+
Escalate, rather than just recording, when detection evidence says "nothing
|
|
35
|
+
would catch it", when `Last reviewed` predates the dependency's last major
|
|
36
|
+
upgrade, or when the trust basis names no maintainer or owner.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
3
40
|
Lisa already governs dependency *mechanics* — pinning, audit gates, override
|
|
4
41
|
resolution, duplicate detection. What those mechanics cannot tell anyone is
|
|
5
42
|
**why** a dependency is in the project at all, what capability it owns, how much
|
|
@@ -1,5 +1,52 @@
|
|
|
1
1
|
# Dependency Internalization Kit
|
|
2
2
|
|
|
3
|
+
> Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
|
|
4
|
+
> section below is the former eager head, preserved verbatim; the full
|
|
5
|
+
> contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
|
|
6
|
+
|
|
7
|
+
## Dependency Internalization Kit (load-bearing)
|
|
8
|
+
|
|
9
|
+
When a work item **removes, replaces, or internalizes** a material dependency,
|
|
10
|
+
ownership of that capability moves in-house. The risk moves with it: we stop
|
|
11
|
+
trusting an upstream project and start having to **prove we rebuilt the
|
|
12
|
+
capability correctly**. The confidence-rebuild kit is the standing acceptance
|
|
13
|
+
bar for that proof, so internalization work never has to guess at its own tests.
|
|
14
|
+
|
|
15
|
+
The kit is seven required evidence types. Each leads with the plain question it
|
|
16
|
+
answers:
|
|
17
|
+
|
|
18
|
+
1. **Real corpus** — did we test it on real inputs, not toy examples?
|
|
19
|
+
2. **Conformance fixtures** — does the new code do what the dependency did?
|
|
20
|
+
3. **Negative fixtures** — does it still reject what it should reject?
|
|
21
|
+
4. **Coverage as a gap detector** — what behavior is still untested?
|
|
22
|
+
5. **Provenance and license review** — where did this code come from, and are we
|
|
23
|
+
allowed to use it?
|
|
24
|
+
6. **Migration and update plan** — how do existing call sites move, and how does
|
|
25
|
+
the new code stay current?
|
|
26
|
+
7. **Rollback or replacement criteria** — what would make us go back, and to
|
|
27
|
+
what?
|
|
28
|
+
|
|
29
|
+
All seven are required. A partial kit is the finding: dropping the corpus leaves
|
|
30
|
+
a toy-example pass, dropping negative fixtures leaves code that accepts garbage,
|
|
31
|
+
and dropping rollback criteria leaves nobody able to say the internalization
|
|
32
|
+
failed.
|
|
33
|
+
|
|
34
|
+
**When the kit applies:** ownership moves in-house — the dependency is removed,
|
|
35
|
+
replaced with our own code, vendored, or forked and maintained by us. That is
|
|
36
|
+
usually a move into the `thin wrapper suitable for in-house ownership` trust
|
|
37
|
+
class, or out of the dependency set entirely.
|
|
38
|
+
|
|
39
|
+
**When the kit does NOT apply:** a routine version bump of a trusted dependency
|
|
40
|
+
**within its existing trust class**. Ownership does not move, so there is no
|
|
41
|
+
rebuilt capability to prove. Applying the kit there is over-application — it
|
|
42
|
+
buys no confidence and makes ordinary upkeep expensive.
|
|
43
|
+
|
|
44
|
+
A work item that removes, replaces, or internalizes a material dependency
|
|
45
|
+
inherits all seven criteria unless it explicitly justifies why the dependency is
|
|
46
|
+
**non-material**. Silence is not a justification.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
3
50
|
Taking a dependency is a decision about trust: we believe someone else's code
|
|
4
51
|
works. Dropping one reverses that decision without reversing the obligation —
|
|
5
52
|
the capability still has to work, and now it is ours. The risk does not
|
|
@@ -1,5 +1,53 @@
|
|
|
1
1
|
# Dependency Trust Classes
|
|
2
2
|
|
|
3
|
+
> Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
|
|
4
|
+
> section below is the former eager head, preserved verbatim; the full
|
|
5
|
+
> contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
|
|
6
|
+
|
|
7
|
+
## Dependency Trust Classes (load-bearing)
|
|
8
|
+
|
|
9
|
+
Every material dependency belongs to exactly one **trust class**. The class is
|
|
10
|
+
the answer to the decision record's "Why we believe it's safe (trust basis)"
|
|
11
|
+
field in `.lisa/DEPENDENCY_DECISIONS.md` — it says why we can trust a *kind* of
|
|
12
|
+
dependency, so each entry does not re-argue trust from scratch.
|
|
13
|
+
|
|
14
|
+
The six classes, from most to least self-evidently trustworthy:
|
|
15
|
+
|
|
16
|
+
1. **Mature ecosystem primitive** — so widely used that other people hit the
|
|
17
|
+
breakage first.
|
|
18
|
+
2. **Fast-moving standard implementation** — the standard implementation of
|
|
19
|
+
something we refuse to own, but it changes faster than we do.
|
|
20
|
+
3. **Build/development tool** — never runs in production; a bad update costs
|
|
21
|
+
developer time, not users.
|
|
22
|
+
4. **Runtime-critical service client** — reaches users, data, or money directly,
|
|
23
|
+
so it is the least trusted regardless of how mature it is.
|
|
24
|
+
5. **Thin wrapper suitable for in-house ownership** — small enough that we could
|
|
25
|
+
own the code, so the question is whether it earns its keep, not whether it is
|
|
26
|
+
safe.
|
|
27
|
+
6. **Temporary/experimental dependency** — not trusted at all; admitted on a
|
|
28
|
+
clock with a written expiry date and a named exit.
|
|
29
|
+
|
|
30
|
+
Each class fixes five review inputs: capability owner, update cadence, detection
|
|
31
|
+
evidence, replacement-cost threshold, and whether product/human ratification is
|
|
32
|
+
required. Higher exposure and lower trust buy stronger evidence and mandatory
|
|
33
|
+
ratification, not weaker: runtime-critical service clients always need human
|
|
34
|
+
ratification to add or major-upgrade; temporary dependencies need it to live
|
|
35
|
+
past their expiry date; thin wrappers need it to be kept rather than in-housed.
|
|
36
|
+
|
|
37
|
+
Every class also names one **human-review trigger** — the observable event that
|
|
38
|
+
takes the decision away from the agent. A class definition that cannot say what
|
|
39
|
+
would trigger human review is not finished.
|
|
40
|
+
|
|
41
|
+
A work item that proposes adding a new material dependency must name the
|
|
42
|
+
dependency's trust class and update its `.lisa/DEPENDENCY_DECISIONS.md` entry in
|
|
43
|
+
the same change. A proposal with no named class is not ready to build.
|
|
44
|
+
|
|
45
|
+
Reclassify — do not quietly re-trust — when a dependency's exposure changes: a
|
|
46
|
+
build tool that gains runtime reach or reads CI credentials becomes a
|
|
47
|
+
runtime-critical service client, and its stronger requirements apply immediately.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
3
51
|
Without named classes, every third-party package sits in one implicit bucket:
|
|
4
52
|
"we installed it, so presumably it's fine." That bucket makes a payment SDK and
|
|
5
53
|
a code formatter look identical at review time, and it forces every dependency
|
|
@@ -1,5 +1,57 @@
|
|
|
1
1
|
# Deployed-State Readback
|
|
2
2
|
|
|
3
|
+
> Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
|
|
4
|
+
> section below is the former eager head, preserved verbatim; the full
|
|
5
|
+
> contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
|
|
6
|
+
|
|
7
|
+
## Deployed-State Readback (load-bearing)
|
|
8
|
+
|
|
9
|
+
**A build ticket asserts that something is missing from a running system. That assertion must come from reading the running system, never from reading the source.** Source tells you what the code says; only the environment tells you what is deployed. A ticket authored from source alone specifies work against a system it has not observed.
|
|
10
|
+
|
|
11
|
+
**One vendor-neutral contract, cited by** the Phase 2 research step of `lisa-notion-to-tracker`, `lisa-github-to-tracker`, `lisa-linear-to-tracker`, and `lisa-confluence-to-tracker` (the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never four divergent forks).
|
|
12
|
+
|
|
13
|
+
## The waiver this replaces was scoped to the wrong axis
|
|
14
|
+
|
|
15
|
+
Phase 2 has two halves — codebase research and a live product walkthrough — and the walkthrough was waived for work that is *"purely backend with no user-visible surface."*
|
|
16
|
+
|
|
17
|
+
"Is it user-facing?" is a question about the **observation method**: browser, API client, or resource readback. It was being used to answer a different question — **"should we observe live state at all?"** Backend, infrastructure, CI, and dependency work all have live state. It simply is not visible through a browser. Waiving the browser step correctly, and live grounding along with it, is what let tickets be authored for work that had already shipped.
|
|
18
|
+
|
|
19
|
+
So the skip is **not** "no live check". It is **a different probe**.
|
|
20
|
+
|
|
21
|
+
## Routing
|
|
22
|
+
|
|
23
|
+
| The work | Probe |
|
|
24
|
+
|---|---|
|
|
25
|
+
| User-facing surface | `lisa-product-walkthrough` against the running app |
|
|
26
|
+
| HTTP / API backend | Call the deployed endpoint and read the response |
|
|
27
|
+
| Infrastructure / IaC | **Describe the deployed resource in the account** |
|
|
28
|
+
| CI / workflow config | Read the config the running pipeline actually used |
|
|
29
|
+
| Dependency / package pin | Read the **installed** artifact, and the registry |
|
|
30
|
+
| Screen that does not exist yet | No probe; record why |
|
|
31
|
+
|
|
32
|
+
## What is never accepted as evidence of deployment
|
|
33
|
+
|
|
34
|
+
**Git ancestry, a merge check, and `cdk synth` are not deployment evidence.** A commit can be an ancestor of the default branch and never have shipped: a pipeline running `executionMode: SUPERSEDED` discards queued executions, so an intermediate commit's deploy is silently dropped. `git log`, a merge check, and a synth all report "present" while the environment does not have it.
|
|
35
|
+
|
|
36
|
+
Read the deployed thing back. Do not infer it from anything upstream of the deploy.
|
|
37
|
+
|
|
38
|
+
**This does not conflict with `blocker-containment`, which requires exactly the ancestry test this rule rejects.** The two answer different questions and both are right:
|
|
39
|
+
|
|
40
|
+
- `blocker-containment` asks a **development** question — *is the blocker's code on the branch I will build from?* Ancestry is the correct and sufficient test.
|
|
41
|
+
- This rule asks a **deployment** question — *is this live?* Ancestry is provably insufficient, per the discarded-execution case above.
|
|
42
|
+
|
|
43
|
+
Neither may be used to answer the other's question.
|
|
44
|
+
|
|
45
|
+
## An unanswerable probe is not a "no"
|
|
46
|
+
|
|
47
|
+
If the deployed state cannot be read back — no credentials, no such environment, the resource is not addressable — **record that the check could not be performed**. Absence of evidence is not evidence of absence, and defaulting an unreadable probe to "not deployed" reintroduces the whole defect while appearing to satisfy the rule.
|
|
48
|
+
|
|
49
|
+
## Record the readback on the ticket
|
|
50
|
+
|
|
51
|
+
Write what was probed, how, and what came back. Claim-time triage then inherits evidence instead of re-deriving it from source — which is the same mistake one stage later.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
3
55
|
A build ticket is a claim about a running system: *this is missing, build it.* The claim is only as good as the observation behind it, and until this rule the observation was optional for everything that did not render in a browser.
|
|
4
56
|
|
|
5
57
|
It is a **single vendor-neutral contract** consumed by the Phase 2 research step of `lisa-notion-to-tracker`, `lisa-github-to-tracker`, `lisa-linear-to-tracker`, and `lisa-confluence-to-tracker`. Each cites this slug rather than restating the routing, exactly as they would cite `leaf-only-lifecycle` or `repo-scope-split`. Phase 2 had already forked into four near-identical copies; this is what stops them drifting further.
|
|
@@ -1,5 +1,57 @@
|
|
|
1
1
|
# Derived Branch Plan — reference
|
|
2
2
|
|
|
3
|
+
> Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
|
|
4
|
+
> section below is the former eager head, preserved verbatim; the full
|
|
5
|
+
> contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
|
|
6
|
+
|
|
7
|
+
## Derived Branch Plan (load-bearing)
|
|
8
|
+
|
|
9
|
+
**Every applicable leaf work item shows the branch it will be built from and the branch its PR lands in, as a generated `Branch Plan` section — and that section is derived data, not a second authority.** The authority is `## Target Backend Environment` resolved forward through `.lisa.config.json` `deploy.branches`. A work item that displays branches nobody can trace back to that mapping, or a flow that reads the displayed branches instead of recomputing them, is a contract violation.
|
|
10
|
+
|
|
11
|
+
**One vendor-neutral contract, cited by** `lisa-jira-write-ticket`, `lisa-github-write-issue`, `lisa-linear-write-issue`, `lisa-jira-validate-ticket`, `lisa-github-validate-issue`, `lisa-linear-validate-issue`, and `lisa-implement` (the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never divergent per-vendor prose).
|
|
12
|
+
|
|
13
|
+
## Why derived, and not two branch fields
|
|
14
|
+
|
|
15
|
+
The operator need is real: reading a ticket should not require resolving a config file to learn where the work starts and where it lands. But Lisa already owns that fact. Adding independent literal branch fields would create **a second source of truth that can drift** — and the failure mode of that drift is not a cosmetic mismatch, it is code silently shipped to the wrong environment. So the branches are rendered for humans and recomputed for machines. The rendered branches are **never read as input** by any flow, at any phase — a surface that needs the base branch derives it again from the environment.
|
|
16
|
+
|
|
17
|
+
## The rendered section
|
|
18
|
+
|
|
19
|
+
Exactly three lines, identical across vendors (`h2. Branch Plan` in JIRA wiki markup, `## Branch Plan` in GitHub/Linear markdown):
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
Branch from: <branch>
|
|
23
|
+
PR into: <branch>
|
|
24
|
+
Derived from: Target Backend Environment <env> via .lisa.config.json deploy.branches
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The third line is the **derivation provenance line**. It is what marks the section machine-authored: a `Branch Plan` without it is treated as hand-authored, and hand-authored branches are never obeyed.
|
|
28
|
+
|
|
29
|
+
`Branch from` and `PR into` name the **same branch by construction** — implementation checks the feature branch out of `origin/<base>` and targets the PR back into `<base>`. A plan naming two different branches is malformed and fails validation. (A fix that genuinely lands on one branch and must reach another travels as a linked follow-up work item with its own branch plan, never as a divergence inside one plan.)
|
|
30
|
+
|
|
31
|
+
## Derivation
|
|
32
|
+
|
|
33
|
+
1. Resolve the environment under the existing `Target Backend Environment` grammar (`config-resolution`, `pre-flight-autofill`) — human-confirmed wins, then validated `Inferred:`, then `Assumption:`.
|
|
34
|
+
2. Map that exact configured key forward through `deploy.branches`. The key must map uniquely and the mapped branch must exist on the remote.
|
|
35
|
+
3. Render both fields to that branch plus the provenance line.
|
|
36
|
+
|
|
37
|
+
A missing or **ambiguous** mapping, a key that is **not unique**, or a branch absent from the remote **stops** the flow — exactly as `lisa-implement` already stops. **Never default independently to `main`, to the remote default branch, or to any other branch** to keep a write from failing. The remote default is a legitimate input only through the `Assumption:` fallback the environment grammar already defines, and it must be recorded as such.
|
|
38
|
+
|
|
39
|
+
## Exemption
|
|
40
|
+
|
|
41
|
+
Work that declares no runtime behavior change — `runtime_behavior_change = false`, i.e. doc-only, config-only, and type-only items — has nothing to derive from and **requires no branch plan**. Its **absence is correct**, not a missing section, and no gate may demand one. Containers (an Epic, or a Story/Spike still holding child work) are exempt for the same reason: they are not built directly.
|
|
42
|
+
|
|
43
|
+
But the exemption is **declared, never inferred from an absent section**. `Target Backend Environment` is rendered on every leaf, because it is where `runtime_behavior_change` is persisted: an exact configured environment key means `true`, `None — no runtime behavior change: doc-only` (or `config-only` / `type-only`) means `false`, `None — container: state rolls up from children` marks a container, and an **absent section is underivable — never `false`**. On a live item the stored declaration beats any caller assertion, and a contradicting assertion fails S8 rather than being believed. Absence used to be the only signal, which meant the flag every one of S8, S11, S14, and S19 turns on could not be checked against the item at all.
|
|
44
|
+
|
|
45
|
+
The exemption is one-way. Exempt work that *carries* a branch plan fails validation — branches asserted for work that declared it has no runtime target are hand-authored by definition, which is the second-authority failure this rule exists to prevent.
|
|
46
|
+
|
|
47
|
+
## Conflict, legacy, and drift
|
|
48
|
+
|
|
49
|
+
- **Conflict** — a present plan that disagrees with the recomputed plan **fails**; the flow never silently picks a side. The remediation is always to correct the environment, never to edit the branches.
|
|
50
|
+
- **Legacy** — an item written before this rule has no plan. At claim time the implementing agent derives it, **writes the assumption onto the item as a comment**, and proceeds. Never a silent guess.
|
|
51
|
+
- **Drift** — config changed after the plan was rendered. Current config wins; the stale plan is re-rendered and never followed.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
3
55
|
The full body behind the `derived-branch-plan` eager head. It defines one vendor-neutral contract consumed by the three tracker writers (`lisa-jira-write-ticket`, `lisa-github-write-issue`, `lisa-linear-write-issue`), the three validators (`lisa-jira-validate-ticket`, `lisa-github-validate-issue`, `lisa-linear-validate-issue`) via gate **S19**, and `lisa-implement` at claim time. Each surface cites this slug rather than growing its own prose, exactly as the vendor arms cite `leaf-only-lifecycle` and `repo-scope-split`. One slug is what keeps a branch plan rejected on JIRA from being accepted on Linear.
|
|
4
56
|
|
|
5
57
|
## The problem this solves, and the one it must not create
|
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
# Design Source of Truth
|
|
2
2
|
|
|
3
|
+
> Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
|
|
4
|
+
> section below is the former eager head, preserved verbatim; the full
|
|
5
|
+
> contract follows it. Reachable on demand via `rules/eager/00-rule-index.md`.
|
|
6
|
+
|
|
7
|
+
## Design Source of Truth (load-bearing)
|
|
8
|
+
|
|
9
|
+
**Figma is the design source of truth, and every UI surface a change touches declares where its design came from.** A changed UI surface that neither cites a Figma node nor carries the designated marker is a contract violation — and so is a surface whose declaration the gate cannot resolve.
|
|
10
|
+
|
|
11
|
+
**One vendor-neutral contract, cited by** `lisa-implement`, `lisa-tdd-implementation`, `lisa-review-local`, `lisa-quality-review`, and `lisa-tracker-source-artifacts` (the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never divergent per-skill prose).
|
|
12
|
+
|
|
13
|
+
## Membership
|
|
14
|
+
|
|
15
|
+
Membership is **surface, not repo name or file extension**: a file is in scope the moment a change makes it render something user-observable — a screen, component, layout, style token, visual state, or markup a user reads. Barrels, pure-logic modules, tests, stories, generated output, and vendored code are out. Projects narrow or widen the default detection through `designSource.include` / `designSource.exclude` in `.lisa.config.json`; they never turn the obligation off.
|
|
16
|
+
|
|
17
|
+
## The two declarations
|
|
18
|
+
|
|
19
|
+
Exactly one of these, written as an ordinary comment in whatever syntax the file uses:
|
|
20
|
+
|
|
21
|
+
| Form | Means |
|
|
22
|
+
|---|---|
|
|
23
|
+
| `DESIGN-SOURCE: <figma-url>` | The surface is backed by a Figma node — it already existed there, or it was synced back. |
|
|
24
|
+
| `DESIGN-SOURCE: none — not in Figma` | The surface is deliberately not captured at the design source. |
|
|
25
|
+
|
|
26
|
+
The marker's spelling is fixed and load-bearing; a drifted spelling silently disarms the gate. An optional trailing ` — <reason>` records why. Only a `figma.com` URL seals a surface: a link to a screenshot, a Slack thread, or any other mock is **malformed**, not proof.
|
|
27
|
+
|
|
28
|
+
## Sync-back is the default; the marker is the exception, not the default
|
|
29
|
+
|
|
30
|
+
When the flow has proven Figma access (the `tool-access-gate` probe), reflecting the surface in Figma and citing the node is the expected outcome. Reach for the marker only when the surface genuinely does not belong in the design source — a debug affordance, a dev-only playground, a throwaway internal tool. The gate reports every marked exception so review can challenge it, and reports a reasonless exception separately when Figma access was available.
|
|
31
|
+
|
|
32
|
+
## Host design-system rules stay authoritative
|
|
33
|
+
|
|
34
|
+
Projects that carry their own design-system rules (`figma-design-system`, `design-system`, `use-the-design-library`, or an equivalent) keep them. This contract never restates component hierarchy, token vocabulary, or reuse policy, and never overrides them. It asks one orthogonal question the host rules do not: is the design source declared?
|
|
35
|
+
|
|
36
|
+
## The gate fails closed
|
|
37
|
+
|
|
38
|
+
`scripts/design-source-gate.mjs` decides the change deterministically. It fails on an undeclared surface, a malformed annotation, a file that both cites Figma and denies having a source, a changed file it could not read, and a diff it could not compute. **A design-source violation is a blocking review finding, never a warning** — it is not demoted to "optional", "if cheap", or a follow-up. A gate that passes on what it could not read proves nothing, so it never does.
|
|
39
|
+
|
|
40
|
+
## Bootstrap and degradation
|
|
41
|
+
|
|
42
|
+
Adoption never demands a retroactive backfill: the gate judges **only the surfaces this change touched**. Pre-existing unannotated UI is burndown, recorded and worked down, not this work item's blocker. If a project has no Figma at all, that is not an exemption — every changed surface carries the marker, and the resulting exception list is the honest record of how much of the product lives outside its design source. Behavior obligations for the same surfaces are unchanged and still governed by `bdd-e2e-coverage`.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
3
46
|
Design has always leaked in one direction. A ticket arrives with a Figma frame, the frame gets
|
|
4
47
|
built, and then — during implementation, during a bug fix, during a "quick" empty state nobody
|
|
5
48
|
specified — new UI gets invented directly in code. Nothing ever carries it back. A year later the
|