@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,46 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "The Factory Model (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# The Factory Model (load-bearing)
|
|
7
|
-
|
|
8
|
-
This project runs as a set of **software factories** — agent-operated production lines with as few
|
|
9
|
-
humans as possible. You are factory machinery, not a chat assistant. Four factories: **Research**
|
|
10
|
-
(creates PRDs) → **Plan** (PRDs → work units) → **Implement** (work units → quality software) →
|
|
11
|
-
**Verify** (go/no-go by using the software like a human; failures become build-ready tickets that
|
|
12
|
-
flow straight back into Implement).
|
|
13
|
-
|
|
14
|
-
The rules that follow from this:
|
|
15
|
-
|
|
16
|
-
1. **Humans are not inside the factories.** Never pause mid-flow to ask a human whether to proceed.
|
|
17
|
-
All handoff happens at the **gates** — the ready-role flips (`prd-ready`, `status:ready`) plus
|
|
18
|
-
intake's adversarial validation.
|
|
19
|
-
2. **The gate is adversarial.** An input enters a factory only when it is high-quality,
|
|
20
|
-
unambiguous, and the factory has the tooling *and provable access to that tooling* to execute it
|
|
21
|
-
(validator gate F5). Try to discover the answers to gaps first; what you genuinely cannot
|
|
22
|
-
resolve, reject to `blocked` and raise to a human with the exact missing thing named.
|
|
23
|
-
3. **Everything runs on schedule.** The intake, QA, Product Planning, and Monitoring loops run as
|
|
24
|
-
native automations (Claude Routines / Codex Automations). Every flow must therefore work
|
|
25
|
-
headless: no interactive prompts, idempotent re-runs, clean exits on empty queues.
|
|
26
|
-
4. **Quality is enforced, not requested.** The skills, hooks, quality checks, and guardrails exist
|
|
27
|
-
to keep the software enterprise-grade and maintainable. Never weaken a gate to get work through
|
|
28
|
-
it — fix the work.
|
|
29
|
-
5. **Write outward for a non-technical operator.** The goal of the factory setup is to let
|
|
30
|
-
non-technical people create scalable software. Everything that crosses a gate outward — blocked
|
|
31
|
-
reasons, clarifying questions, ticket descriptions, verification reports — must be readable by
|
|
32
|
-
someone who does not code; they own product intent, the factories own the engineering.
|
|
33
|
-
6. **Every supported coding agent is a first-class operator.** Claude Code, Codex, Cursor,
|
|
34
|
-
OpenCode, Antigravity, Copilot — behavior must stay in parity, and anything persisted for
|
|
35
|
-
agents must be visible to all of them.
|
|
36
|
-
|
|
37
|
-
Brownfield on-ramp: an existing codebase becomes agent-ready **before** the fleet runs unattended
|
|
38
|
-
— `/lisa:agent-ready` converges human knowledge through read-only, redacted source ingestion (every
|
|
39
|
-
source must be complete and the gaps loop must reach none), then standards adoption refactors to
|
|
40
|
-
conformance without behavior change.
|
|
41
|
-
|
|
42
|
-
End state: end users have zero direct contact with coding agents — they interact with the tracker,
|
|
43
|
-
the PRD source, and the shipped software.
|
|
44
|
-
|
|
45
|
-
Full reference (factory ↔ Lisa surface mapping, loop details, human exterior gates):
|
|
46
|
-
[reference/factory-model.md](factory-model-reference.mdc).
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Leaf-Only Build-Ready Invariant (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Leaf-Only Build-Ready Invariant (load-bearing)
|
|
7
|
-
|
|
8
|
-
**Build-ready means a directly implementable leaf work unit.** Containers never carry build-ready.
|
|
9
|
-
|
|
10
|
-
A leaf is structurally defined: **no open children** AND not an Epic — the by-design leaf types (Bug, Task, Sub-task, Improvement) plus a childless Story or Spike. A container is an **Epic**, or any item of any type that has acquired open child work.
|
|
11
|
-
|
|
12
|
-
## Invariant
|
|
13
|
-
|
|
14
|
-
- **At decomposition/write time** — only leaves receive the `ready` role. Parent containers are created in their non-ready state.
|
|
15
|
-
- **At validate time** — `*-validate-*` FAILs any container carrying the build-ready role. The parent-declared gate (S7) does **not** FAIL a build-ready leaf with no parent (flat Task/Improvement or childless Story/Spike); a Sub-task is the one exception and always needs a parent.
|
|
16
|
-
- **At claim time** — build-intake claims leaves only. A container with a stale build-ready role is rolled up or safe-blocked, NEVER implemented.
|
|
17
|
-
|
|
18
|
-
## Childless-parent exception
|
|
19
|
-
|
|
20
|
-
A childless item is structurally a leaf — and may be build-ready **unless its type is Epic**:
|
|
21
|
-
|
|
22
|
-
- **Task, Bug, Story, Spike, or Improvement with no children** → leaf → may be build-ready. A Story ships directly as one increment and a Spike *is* the investigation unit; neither needs sub-items to be implementable, so a childless one must not be stranded.
|
|
23
|
-
- **Epic with no children** → still NOT build-ready. An Epic is a pure rollup container by design — its body is a high-level summary, never directly implementable — so a childless build-ready Epic is an incomplete decomposition or a mis-applied role. Repair: decompose into leaves, or reclassify to a leaf type.
|
|
24
|
-
|
|
25
|
-
## Parent state rollup (priority order, first match wins)
|
|
26
|
-
|
|
27
|
-
Evaluate over the env ladder `in-progress < dev < staging < production` (the ordered keys of the project's env-keyed `done` map; single-env projects have only the production rung):
|
|
28
|
-
|
|
29
|
-
1. Any leaf is **blocked** → parent rolls up to **blocked / attention-needed**.
|
|
30
|
-
2. Else **every** required leaf has shipped to some env → parent rolls up to the **least-advanced** env among them (all `On Stg` → `On Stg`; mixed `On Dev`+`On Stg` → `On Dev`; all production → terminal `done`).
|
|
31
|
-
3. Else any leaf has **started** (claimed/in review, or shipped while a sibling has not) → parent is **in-progress** (`claimed`).
|
|
32
|
-
4. Else (leaves exist but none started) → parent unchanged.
|
|
33
|
-
|
|
34
|
-
**Blocked dominates — but it must say which leaf and which kind.** A parent that rolls up to `blocked` names the blocking leaf (with the path to it) and the **class** of the hold, derived by `rollup-blocker-classification` from recorded signals only:
|
|
35
|
-
|
|
36
|
-
| Class | Recorded signal on the leaf | Who must act |
|
|
37
|
-
|---|---|---|
|
|
38
|
-
| `spec-defect` | the `spec_defect` marker (human-applied only) | a person rewrites the acceptance criteria — nothing external will ever clear it |
|
|
39
|
-
| `human-input` | the `human_needed` marker | a person supplies the input (access, credential, product decision) |
|
|
40
|
-
| `hard-blocker` | an open `is blocked by` link | nobody — it clears when that work closes |
|
|
41
|
-
| `unknown` | none of the above | a person says which kind it is, and records it |
|
|
42
|
-
|
|
43
|
-
Never infer a class from prose, and never auto-apply `spec_defect`: judging a criterion unbuildable is a human call, and `unknown` is the honest answer. A rollup that examined nothing — unreadable tracker, no children, no readable child — **fails**; it never reports not-blocked.
|
|
44
|
-
|
|
45
|
-
**Blocked dominates.** A parent reaches an env only once all required leaves have reached at least that env. Intermediate-env rollup (`On Dev`/`On Stg`) happens, but native closure fires only at production `done`. Optional/won't-do children do not hold a parent open. Rollup is recursive — bottom-up. The parent never carries `ready`; a container found in `ready` is reconciled by rolling it up from its children.
|
|
46
|
-
|
|
47
|
-
## Terminal native closure
|
|
48
|
-
|
|
49
|
-
When a leaf reaches the true terminal `done` (the production / final-env value), also finalize via the tracker's native completion mechanism:
|
|
50
|
-
|
|
51
|
-
- **GitHub** — `gh issue close <n> --reason completed` after the terminal label.
|
|
52
|
-
- **Linear** — move workflow `state` to the team's Done.
|
|
53
|
-
- **JIRA** — transition to terminal Done/Resolved/Closed; verify `statusCategory = Done`.
|
|
54
|
-
|
|
55
|
-
Intermediate env-keyed states (`status:on-dev`, `On Stg`, etc.) remain open. Idempotent — if already closed, report and continue.
|
|
56
|
-
|
|
57
|
-
### Exactly one lifecycle role survives closure
|
|
58
|
-
|
|
59
|
-
The terminal transition retires **every** other lifecycle role the item carries, not only the one it was last known to hold. Resolve the complete configured set — `ready`, `claimed`, `review` where bound, `blocked`, and every env-keyed `done` value — and remove each one that is present, except the terminal role being applied. Type, component, priority, and provenance labels are untouched.
|
|
60
|
-
|
|
61
|
-
Retiring only the claimed role assumes the item travelled the happy path, and items skip stages: one reaches completion straight from `ready` having never been claimed, another is unblocked and closed still carrying `blocked`. Measured on a live tracker: 34 closed issues carried an active lifecycle role, six of them carrying `ready` and the terminal role at once.
|
|
62
|
-
|
|
63
|
-
**This is not cosmetic.** A queue scan filters on the synthesized role, not the native closed state, so a closed item still reading `ready` is handed back out — one already-shipped fix was independently rebuilt end to end before a push-time gate caught it.
|
|
64
|
-
|
|
65
|
-
Three constraints on how it is done:
|
|
66
|
-
|
|
67
|
-
- **Remove only roles the item actually carries.** Naming an absent label is a 404, which fails a clean closure and makes a repeat run fail where the first one succeeded.
|
|
68
|
-
- **Verify by re-reading.** Confirm the final closed state and the unique terminal role from a **fresh read of the item**, never from the write's own response. A write that reports success is not evidence of the state it intended to produce — asserting otherwise is the same defect as the drift being repaired, one layer up.
|
|
69
|
-
- **Never re-complete an abandoned item.** Applying a terminal `done` role to an item someone already closed as not-planned rewrites their decision that the work would not be done, and afterwards the two are indistinguishable. Refuse and say so. This does not restrict the duplicate closeout below, which is a flow deliberately closing an open item as not-planned rather than overwriting a closure that already exists.
|
|
70
|
-
|
|
71
|
-
Trackers with a native lifecycle field (JIRA, Linear) get exclusivity for free: the field that closes the item is the field a queue scan filters on, so the two cannot disagree. GitHub Issues has no lifecycle beyond open/closed, so Lisa synthesizes one in labels and inherits a reconciliation duty the others do not have. That asymmetry is tracked separately in `CodySwannGT/lisa#3479`; this section is the obligation, not the redesign.
|
|
72
|
-
|
|
73
|
-
Duplicate closeout is a narrow terminal exception: build intake may close a claimed item without a PR only when `ticket-triage` returns `DUPLICATE_ALREADY_FIXED` with a canonical item reference and empirical base-branch proof. Close it through provider duplicate semantics, not as completed build work. `BLOCKED`, ambiguous, duplicate-of-open, and other human-owned dispositions are not auto-closed.
|
|
74
|
-
|
|
75
|
-
Full vendor mechanics + the state machine in prose: [reference/leaf-only-lifecycle.md](leaf-only-lifecycle-reference.mdc).
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Observability Audit (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Observability Audit (load-bearing)
|
|
7
|
-
|
|
8
|
-
The **audit + file** arm of `lisa-monitor`. On top of its existing live-signal sweep, `monitor` audits how well the **current repo** is instrumented and files build-ready tickets for what it finds. `monitor` is **manual** (no cron) and **files only** — it never fixes; the `intake` / `tracker-build-intake` cron implements what it files.
|
|
9
|
-
|
|
10
|
-
## Invariants
|
|
11
|
-
|
|
12
|
-
- **Repo-scoped two ways.** Audit only the rubric dimensions in scope for the repo's detected profile (`frontend` / `backend` / `infra` — a frontend repo never evaluates backend tracing), and stamp every filed ticket `repo:<CURRENT_REPO>` as a single-repo leaf (resolve the repo via the `config-resolution` ladder; cannot resolve → report, do not file).
|
|
13
|
-
- **Two finding types → build-ready leaves.** A live signal over the conservative bar → a `Bug` leaf; an in-scope MISSING instrumentation dimension (gap, e.g. "no DB/query analytics") → a `Task`/`Improvement` leaf. Always via `lisa-tracker-write` with `build_ready: true` (never a vendor write skill directly); never an Epic/container (gate S15).
|
|
14
|
-
- **Conservative by default.** Only high-signal anomalies (over the documented thresholds) and `core` missing dimensions are filed. `--all-gaps` widens gap filing to `recommended` tiers; nothing lowers the anomaly bar.
|
|
15
|
-
- **Idempotent.** Every ticket carries a `<!-- lisa:monitor-finding: <fingerprint> -->` sentinel; search-before-create (including closed tickets) means a re-run never duplicates a live or just-resolved finding.
|
|
16
|
-
- **Capped.** At most `monitor.maxCandidates` tickets per run (default 20), highest-severity first; report filed-vs-dropped (and list the dropped) — never silently truncate.
|
|
17
|
-
- **Gate-passing.** Each ticket is a real authored artifact: three-audience description, Gherkin AC, single-repo, Target Backend Environment, and a Validation Journey with a typed `[EVIDENCE: <artifact-type>: <name>]` marker (unique kebab-case name) — so `tracker-validate` (S1–S15) accepts it. A finding that cannot be made into a credible ticket is reported, not filed.
|
|
18
|
-
- **Verify guard.** When `monitor` is the post-deploy step of `lisa-verify` it runs **report-only** — Verify invokes it as `lisa-monitor <env> --report-only`, so it never files there. Filing is a standalone-only action.
|
|
19
|
-
|
|
20
|
-
Full reference (profile detection, the rubric table, anomaly thresholds, ticket templates, idempotency contract, the cap, dry-run/report-only semantics): [reference/observability-audit.md](observability-audit-reference.mdc).
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "PRD Definition of Ready (requirement atoms)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# PRD Definition of Ready (requirement atoms)
|
|
7
|
-
|
|
8
|
-
**A requirements document is ready when a planner can decompose it mechanically and a verifier can check the result against it.** Both properties come from the shape of the requirements, not the prose around them. Modeled on ISO/IEC/IEEE 29148's requirement quality characteristics and the EARS sentence patterns; the fit criterion is Volere's.
|
|
9
|
-
|
|
10
|
-
## The atom
|
|
11
|
-
|
|
12
|
-
Every requirement is an **identified atom**:
|
|
13
|
-
|
|
14
|
-
- **Identified** — carries an id (`R1`, `R2`, …). Ids are per-generation; the verbatim text is the durable anchor (same convention as the `*-to-tracker` Requirement Register).
|
|
15
|
-
- **Singular** — one behavior per atom. "The system shall X and Y when Z" is two atoms.
|
|
16
|
-
- **Unambiguous** — no vagueness lexicon: *as appropriate, user-friendly, fast, robust, handle gracefully, etc., and/or, optimize, seamless, intuitive, support* (unbounded). Each is a word no test can check.
|
|
17
|
-
- **Verifiable** — carries a **fit criterion**: the measurable test of satisfaction ("p95 upload completes < 4s for files ≤ 25 MB"). A requirement no test could check is a wish.
|
|
18
|
-
- **Pattern-shaped (SHOULD)** — one of the EARS patterns, which decompose into Gherkin mechanically:
|
|
19
|
-
- Ubiquitous: *The `<system>` shall `<response>`*
|
|
20
|
-
- Event-driven: *When `<trigger>`, the `<system>` shall `<response>`*
|
|
21
|
-
- State-driven: *While `<state>`, the `<system>` shall `<response>`*
|
|
22
|
-
- Unwanted behavior: *If `<condition>`, then the `<system>` shall `<response>`*
|
|
23
|
-
- Optional feature: *Where `<feature>` is present, the `<system>` shall `<response>`*
|
|
24
|
-
|
|
25
|
-
## The document
|
|
26
|
-
|
|
27
|
-
Beyond the atoms, a ready PRD carries: problem statement · solution outline · user stories grouping their atoms · an explicit **non-functional checklist** (walk the ISO 25010 axes — performance, security, reliability, usability, compatibility, maintainability — and either state the requirement as an atom or state "no requirement"; silence is not a decision) · out of scope · open questions (the honest home for what is NOT ready).
|
|
28
|
-
|
|
29
|
-
## Enforcement points
|
|
30
|
-
|
|
31
|
-
- **Write time** — `lisa-research` authors to this shape; `*-write-prd` skills carry it as a body rule.
|
|
32
|
-
- **Intake time (the universal gate)** — `*-to-tracker` Phase 1.45 validates every register atom, because human-authored PRDs never pass through the write path. Failures are product clarifications quoting the atom verbatim with candidate rewrites.
|
|
33
|
-
- **Verify time** — `verify-prd` / spec-conformance consume the atoms; fit criteria become the conformance checks.
|
|
34
|
-
|
|
35
|
-
Downstream, ticket gate S16 quotes these atoms verbatim and `prd-ticket-coverage` audits atom→ticket coverage — both degrade when "one requirement" is secretly three welded together.
|
|
36
|
-
|
|
37
|
-
Full rationale, the vagueness lexicon, and worked rewrites: [the reference body of this rule](prd-definition-of-ready-reference.mdc).
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "PRD Lifecycle Rollup & Generated-Top-Level-Work Contract (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# PRD Lifecycle Rollup & Generated-Top-Level-Work Contract (load-bearing)
|
|
7
|
-
|
|
8
|
-
The vendor-neutral source of truth for how a PRD owns the work it generated and how its lifecycle rolls up to `shipped`. Companion to `leaf-only-lifecycle` (which governs build-lifecycle of leaves); this rule governs PRD lifecycle and rollup from generated top-level children.
|
|
9
|
-
|
|
10
|
-
## Generated top-level work (the contract)
|
|
11
|
-
|
|
12
|
-
A PRD owns the work units it created **at the top of the hierarchy** — the Epic(s) and any top-level Story it created directly. It does NOT own descendants (Sub-tasks, Stories under an Epic, leaves under a top-level unit) — those are owned by their top-level parent and roll up via `leaf-only-lifecycle`.
|
|
13
|
-
|
|
14
|
-
Leaf Sub-tasks are **never** direct children of a PRD when a top-level Epic/Story hierarchy exists.
|
|
15
|
-
|
|
16
|
-
## How each vendor records the PRD→child link
|
|
17
|
-
|
|
18
|
-
**Native hierarchy first**, machine-readable fallback section always written:
|
|
19
|
-
|
|
20
|
-
- **GitHub Issues** — native sub-issues when source and tracker are the same repo + supports sub-issues.
|
|
21
|
-
- **Linear** — `parentId` or generated Project grouping where the PRD also lives in Linear.
|
|
22
|
-
- **JIRA** — Epic link / parent field, or documented issue-link type.
|
|
23
|
-
- **Confluence / Notion** — no native issue hierarchy; the documented `## Tickets` / `## Generated Work` section IS the source of truth.
|
|
24
|
-
- **Cross-vendor** (e.g. Notion PRD → JIRA tracker) — always documented section in the PRD source.
|
|
25
|
-
|
|
26
|
-
The documented `## Tickets` section is ALWAYS written (additive to native links) so the generated set is readable without parsing comments.
|
|
27
|
-
|
|
28
|
-
## Rollup transition
|
|
29
|
-
|
|
30
|
-
PRD rolls from `ticketed` to `shipped` when every required generated top-level child is terminal. The PRD remains open for `/lisa:verify-prd` after `shipped` — verified PASS performs native closure (archive/close/transition), verified FAIL re-opens to `ticketed` with build-ready fix tickets (never `blocked`).
|
|
31
|
-
|
|
32
|
-
## Idempotency dedupe key
|
|
33
|
-
|
|
34
|
-
Re-runs of intake/backlink must dedupe by child-ref identity (e.g. `owner/repo#number` for GitHub, Linear issue UUID, JIRA key) — never by URL string, which varies by formatting.
|
|
35
|
-
|
|
36
|
-
Full vendor matrix, predicate definitions, non-goals: [reference/prd-lifecycle-rollup.md](prd-lifecycle-rollup-reference.mdc).
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Pre-Flight Spec Autofill — Draft-Then-Block (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Pre-Flight Spec Autofill — Draft-Then-Block (load-bearing)
|
|
7
|
-
|
|
8
|
-
When the pre-flight gate (`*-agent` Step 2) returns `FAIL` on **ticket-quality**
|
|
9
|
-
gaps, do **not** bounce a raw checklist back to the reporter. Most "missing
|
|
10
|
-
required spec content" gaps are **authorable** from material already on the work
|
|
11
|
-
item (title, description, screenshots, design links, repro steps) plus the
|
|
12
|
-
codebase. **Draft** a best-effort version of every authorable gap, write it into
|
|
13
|
-
the item as clearly-labeled **assumptions/recommendations**, and only **then**
|
|
14
|
-
block — turning the human ask from *"author all this"* into *"confirm or correct
|
|
15
|
-
my draft, then flip back to Ready."* Same shape as `repo-scope-split`: the agent
|
|
16
|
-
does the work it can; the human decides only what only a human can.
|
|
17
|
-
|
|
18
|
-
This does **not** widen the gate — every required section must still exist
|
|
19
|
-
before build. It replaces an empty demand with a defensible first draft, and it
|
|
20
|
-
breaks the `Ready ↔ Blocked` ping-pong loop that a raw checklist causes (the
|
|
21
|
-
information was already on the ticket; only the structure was missing).
|
|
22
|
-
|
|
23
|
-
## Two tiers
|
|
24
|
-
|
|
25
|
-
- **Tier A — authorable (always draft):** Technical Approach, Out of Scope,
|
|
26
|
-
Gherkin Acceptance Criteria (one scenario per fix), expected-vs-actual +
|
|
27
|
-
environment, Repository, Relationship Search (actually run the git+tracker
|
|
28
|
-
search — don't fabricate "none found"), Validation Journey **draft** (via the
|
|
29
|
-
vendor `*-add-journey` skill), Target Backend Environment. Preserve a bare
|
|
30
|
-
configured key or `Confirmed: <env>` as human-confirmed. Automation writes
|
|
31
|
-
`Inferred: <env> — evidence: <title|body|reproduction|hostname>` or
|
|
32
|
-
`Assumption: <env> — remote default branch <branch>`. Without a unique
|
|
33
|
-
reverse-map use `Assumption: remote default branch <branch>`; human confirmation
|
|
34
|
-
replaces the annotation with a bare key or `Confirmed: <env>`. For legacy bare
|
|
35
|
-
values, use managed draft markers and current ticket content only; provider
|
|
36
|
-
edit history is not required. A marker proves automation and requires
|
|
37
|
-
re-annotation; otherwise unknown provenance plus conflicting evidence stops.
|
|
38
|
-
Human-confirmed wins, then validated `Inferred:`
|
|
39
|
-
evidence. Otherwise use one unambiguous exact `deploy.branches` key from the
|
|
40
|
-
title, body, and reproduction steps or a URL hostname, excluding the complete
|
|
41
|
-
`Target Backend Environment` section and other machine-authored metadata/draft
|
|
42
|
-
blocks so annotations cannot become evidence. Evidence supersedes only
|
|
43
|
-
`Assumption:`. Normalize only built-in
|
|
44
|
-
`prod` ↔ `production` when exactly one is configured; no other aliases exist.
|
|
45
|
-
Never infer from arbitrary branch text, URL paths/query strings, or substrings.
|
|
46
|
-
Conflicting signals **stop** autofill. With no environment signal, use the
|
|
47
|
-
remote default and record the applicable `Assumption:` form; a non-unique
|
|
48
|
-
reverse-map alone never blocks. Require any selected mapping and remote branch.
|
|
49
|
-
Never overwrite human prose.
|
|
50
|
-
- **Tier B — irreducibly human:** real credentials/access that exist nowhere on
|
|
51
|
-
the item or in repo test-user docs; a genuine product/scoping decision with no
|
|
52
|
-
defensible default. Still propose a recommended default where one exists; ask
|
|
53
|
-
a specific question only where none does.
|
|
54
|
-
|
|
55
|
-
## Procedure
|
|
56
|
-
|
|
57
|
-
1. Enumerate FAIL categories from `*-verify`. If S10 failed, run
|
|
58
|
-
`repo-scope-split` first (split, not autofill).
|
|
59
|
-
2. Draft each Tier-A gap grounded in item material + codebase; tag every
|
|
60
|
-
inference as an assumption. **Never overwrite human prose** — add/augment
|
|
61
|
-
sections only.
|
|
62
|
-
3. Write the draft via the vendor write skill (`jira-write-ticket` /
|
|
63
|
-
`github-write-issue` / `linear-write-issue`); draft the Validation Journey
|
|
64
|
-
via `*-add-journey`.
|
|
65
|
-
4. Re-run `*-verify`. Structural gates should now PASS; anything still failing
|
|
66
|
-
is Tier B — name it in the comment.
|
|
67
|
-
5. Block as usual (`blocked` status + `human_needed` marker + reassign to
|
|
68
|
-
Reporter) but post the **confirmation comment**, not a checklist: disclose
|
|
69
|
-
it's a Claude draft, one line per drafted section + its key assumption,
|
|
70
|
-
Tier-B items as specific questions with defaults, and close with *"correct
|
|
71
|
-
anything wrong, then flip back to Ready and it builds — or reply with
|
|
72
|
-
corrections."*
|
|
73
|
-
6. **Loop-safety:** if the item already carries the agent's draft, refine only
|
|
74
|
-
the still-failing gaps; don't redraft. Re-readying after review is the
|
|
75
|
-
human's approval — the next claim's `*-verify` PASSes and build proceeds.
|
|
76
|
-
|
|
77
|
-
## When you genuinely cannot autofill
|
|
78
|
-
|
|
79
|
-
If drafting would be fabrication (no fix/expected behavior described, no usable
|
|
80
|
-
design ref, uninformative title, no codebase anchor), block as before — but
|
|
81
|
-
phrase each gap as a specific question with a default where defensible. Never a
|
|
82
|
-
bare checklist when a defensible draft is possible.
|
|
83
|
-
|
|
84
|
-
The agent writes **spec/criteria, never code**, at this gate — authoring AC and
|
|
85
|
-
a validation journey is explicitly permitted here (this supersedes the older
|
|
86
|
-
"the build agent does not author the missing spec content" stance).
|
|
87
|
-
|
|
88
|
-
Full procedure, tier detail, confirmation-comment template, and vendor mechanics:
|
|
89
|
-
[reference/pre-flight-autofill.md](pre-flight-autofill-reference.mdc).
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Project Learnings (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Project Learnings (load-bearing)
|
|
7
|
-
|
|
8
|
-
Before normal task work, resolve this repository's committed `.lisa.config.json`
|
|
9
|
-
and derive the machine-managed learnings ledger: the optional `learnings.file`
|
|
10
|
-
override, else the default `.lisa/PROJECT_LEARNINGS.md`. The ledger lives cold in
|
|
11
|
-
`.lisa/`, NOT in an auto-loaded rules tree — so it is never injected raw into the
|
|
12
|
-
session.
|
|
13
|
-
|
|
14
|
-
Consume it ONLY through the executable Lisa learnings contract exported by
|
|
15
|
-
`@codyswann/lisa/learnings`: parse and validate with `parseLearningsFile`, then
|
|
16
|
-
take the bounded serving slice from `projectLearnings` (the highest-priority
|
|
17
|
-
entries within the token/entry budget). **Never read the raw ledger file
|
|
18
|
-
wholesale into context** — the whole point of the relocation is that sessions
|
|
19
|
-
receive the contract's bounded projection, not the full file.
|
|
20
|
-
|
|
21
|
-
Missing learnings are a silent no-op. Malformed, non-canonical, unsafe, or
|
|
22
|
-
over-budget learnings produce one readable warning, apply no entry, and must not
|
|
23
|
-
block unrelated task work. Never append automated learnings to host rules
|
|
24
|
-
(`.agents/rules/`, or a surviving legacy `PROJECT_RULES.md`); project learnings
|
|
25
|
-
are a separate machine-managed document.
|
|
26
|
-
|
|
27
|
-
Full prose: [reference/project-learnings.md](project-learnings-reference.mdc).
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Promotion Contract (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Promotion Contract (load-bearing)
|
|
7
|
-
|
|
8
|
-
When implementing a learnings-ladder **promotion ticket** — turning prose
|
|
9
|
-
knowledge into an executable control (lint / ast-grep / type / test / hook /
|
|
10
|
-
`package.lisa.json` force) — the change must be **atomic**: one PR that
|
|
11
|
-
**enables the control**, **fixes the existing violation population**, **ships a
|
|
12
|
-
remediation-teaching diagnostic** (violated invariant + why + concrete fix),
|
|
13
|
-
and **deletes the superseded prose**. A PR missing any of the four is
|
|
14
|
-
**rejected by rule** — promote-without-remove double-pays forever;
|
|
15
|
-
remove-without-diagnostic strands agents.
|
|
16
|
-
|
|
17
|
-
Eager-tier admission is **demotion-biased** and earned only by repeated-miss
|
|
18
|
-
evidence; the gardener audits the eager tier every run, including Lisa's own
|
|
19
|
-
shipped eager rules.
|
|
20
|
-
|
|
21
|
-
Full contract, diagnostic-quality bar, and the AC template the gardener embeds
|
|
22
|
-
in EXECUTABLE-CONTROL promotion tickets:
|
|
23
|
-
[reference/promotion-contract.md](promotion-contract-reference.mdc).
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Repository Readiness Rubric (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Repository Readiness Rubric (load-bearing)
|
|
7
|
-
|
|
8
|
-
**"Lisa is installed correctly" and "an agent fleet may run here unattended" are two different
|
|
9
|
-
questions.** Doctor's shipped grouped checks answer the first — *installation readiness*. This rubric
|
|
10
|
-
answers the second — *repository readiness* — and it is the only place that question is written down.
|
|
11
|
-
A green test suite is not an answer to it.
|
|
12
|
-
|
|
13
|
-
## Eight ownership dimensions
|
|
14
|
-
|
|
15
|
-
Repository readiness is assessed across exactly eight dimensions, never fewer, and a dimension with
|
|
16
|
-
no applicable evidence renders `SKIP` **with a reason** rather than a blank:
|
|
17
|
-
|
|
18
|
-
1. **context/routing** — can an agent recover the real job from what is written down?
|
|
19
|
-
2. **capabilities/tools** — is every tool the work needs *provably* reachable, not merely installed?
|
|
20
|
-
3. **domain ownership** — are the business rules, glossary, and danger zones owned and written down?
|
|
21
|
-
4. **execution/proof** — can the claimed user-visible outcome be proved by running the system?
|
|
22
|
-
5. **feedback/guardrails** — does a failing loop produce a named outcome and a runbook?
|
|
23
|
-
6. **dependencies/supply chain** — is there a confidence model for what the repo depends on?
|
|
24
|
-
7. **delivery/authority** — does the thing that ships equal the thing that was validated, and does
|
|
25
|
-
the credential that ships it carry only the authority it needs?
|
|
26
|
-
8. **proportionality** — is the machinery proportional to the job, or is there scaffolding to
|
|
27
|
-
subtract?
|
|
28
|
-
|
|
29
|
-
## Seven ship blockers (closed set, v1)
|
|
30
|
-
|
|
31
|
-
A **ship blocker** is a condition that, standing alone, means the answer to "may an unattended fleet
|
|
32
|
-
run here?" is no. The set is closed in v1 — seven, no more — and extended only by editing this rule:
|
|
33
|
-
|
|
34
|
-
- **B1** a realistic path causes **silent data loss**
|
|
35
|
-
- **B2** a **release path bypasses the validated artifact**
|
|
36
|
-
- **B3** **credentials carry material unintended authority**
|
|
37
|
-
- **B4** a **consequential operation has no gate and no recovery**
|
|
38
|
-
- **B5** an **owned compatibility or security surface has no confidence model**
|
|
39
|
-
- **B6** **documentation overstates enforced guarantees**
|
|
40
|
-
- **B7** there is **no way to prove the claimed user-visible outcome**
|
|
41
|
-
|
|
42
|
-
## Verdict and narrowed claim
|
|
43
|
-
|
|
44
|
-
The verdict reuses the shipped `READY` / `READY_WITH_WARNINGS` / `NOT_READY` ladder — cite doctor's
|
|
45
|
-
ladder, never fork a parallel enum. **A standing blocker is `NOT_READY`**, and the report must also
|
|
46
|
-
state the **narrowed claim**: what the repository *is* ready for, in operator language ("ready for
|
|
47
|
-
supervised single-ticket work; not ready for unattended fleet operation, because …").
|
|
48
|
-
|
|
49
|
-
## Ordering
|
|
50
|
-
|
|
51
|
-
**Report section order stays stable and never silently omits a section; findings are ordered by
|
|
52
|
-
consequence** — highest-consequence first — within and across sections. The two contracts do not
|
|
53
|
-
collide: sections are fixed, findings are ranked.
|
|
54
|
-
|
|
55
|
-
## Warn-only
|
|
56
|
-
|
|
57
|
-
This rubric **gates a claim, not a process**. No Lisa surface hard-blocks on the verdict: a standing
|
|
58
|
-
blocker narrows what may be claimed and files tracker work; it never stops `lisa apply`, intake
|
|
59
|
-
dispatch, or cron registration. Where a surface this rule names is not installed in a given branch,
|
|
60
|
-
name what you can and continue — degrade, never block. Written to be read by someone who does not
|
|
61
|
-
code (`factory-model` rule 5).
|
|
62
|
-
|
|
63
|
-
Full rubric (eight-dimension table, seven ship blockers, consequence ordering, worked example): [reference/readiness-rubric.md](readiness-rubric-reference.mdc).
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Ready-Role Filing (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Ready-Role Filing (load-bearing)
|
|
7
|
-
|
|
8
|
-
Filing a work item without the ready role is an **incomplete handoff** — build-intake scans the ready lane and nothing else, so the item is never picked up. A correct write plus a missing role still loses the work.
|
|
9
|
-
|
|
10
|
-
## Omitted means NOT ready — on every tracker
|
|
11
|
-
|
|
12
|
-
**An omitted `build_ready` is NOT build-ready on JIRA, GitHub, and Linear alike.** Ready is an explicit claim, never an accident of which tracker a project configured. This is a **breaking change** for GitHub and Linear callers, which previously treated omission as ready; `lisa-github-validate-issue` F4's compensating omitted → `true` normalization is removed with it.
|
|
13
|
-
|
|
14
|
-
## Every filing declares one of three things
|
|
15
|
-
|
|
16
|
-
- **`build_ready: true`** — complete enough to build; enters the ready lane for auto-pickup. Required for any complete defect found during other work, so it is claimable next cycle with no human flipping status.
|
|
17
|
-
- **`human_gate: "<why a human must judge this first>"`** — deliberately held outside the queue. The writer stamps a visible line plus `<!-- [lisa-human-gate] reason=<short-slug> -->` so the hold is auditable.
|
|
18
|
-
- **The container declaration** — `None — container: state rolls up from children`, the canonical line `derived-branch-plan` defines and every writer stamps in place of a Target Backend Environment. A container is never build-ready (`leaf-only-lifecycle`) and needs no gate, so it declares the third thing instead. Deliberately **not** keyed on `--label type:Epic`: a declared type is a claim that costs a leaf nothing and leaves it looking buildable, where the container line costs the item the environment and Branch Plan a leaf needs to be built. It is refused alongside a by-design leaf type (`type:Bug` / `type:Task` / `type:Sub-task` / `type:Improvement`) — an item cannot be a container and a leaf at once.
|
|
19
|
-
|
|
20
|
-
Filed, not ready, and no `human_gate` is the **incomplete handoff** case — writers reject it and name both ways to resolve it. `build_ready: false` with no reason is the same omission with a value attached. `build_ready` stays subordinate to `leaf-only-lifecycle`: a container is never build-ready and needs no gate.
|
|
21
|
-
|
|
22
|
-
## The named exception
|
|
23
|
-
|
|
24
|
-
`lisa-exploratory-qa` files findings not-ready **by design** — its findings are candidate defects whose product significance a human should judge. It is the named human-gate exception, not drift: it pairs `ready=false` with an explicit `human_gate` reason. The sibling `e2e-coverage-gaps` skills are the contrast (a missing test is not a product question, so they file build-ready).
|
|
25
|
-
|
|
26
|
-
`lisa-repair-intake` sweeps for open items that are neither in the ready role nor marked `[lisa-human-gate]`, and surfaces them rather than promoting them.
|
|
27
|
-
|
|
28
|
-
## This rule is enforced
|
|
29
|
-
|
|
30
|
-
The PreToolUse guard `block-direct-issue-create.sh` refuses a direct tracker-creation command (`gh issue create`, `gh api` POST to an issues endpoint, `linear`/`jira`/`acli` creates, equivalent `curl` posts) that carries **none of the three declarations** — no configured build-ready role, no `[lisa-human-gate]` marker, and no container declaration. It shipped because this rule as prose did not bind: 13 of 13 issues filed during the session that merged it bypassed it, several by the agent that wrote it, while the one obligation backed by a git hook was honored 50 of 50 times. It stands down where no tracker is configured, and for an operator who set `LISA_ALLOW_DIRECT_ISSUE_CREATE` **in the ambient environment** — never from an inline assignment on the refused command.
|
|
31
|
-
|
|
32
|
-
**The role is the TARGET repository's, not the caller's.** A creation addressed at another repository — `--repo` / `-R`, or a `repos/<org>/<repo>/issues` endpoint — is judged against that repository's build-ready role: `hardening.upstreamReadyRole` (default `status:ready`) when the target is `hardening.upstreamRepo`, and the stock `status:ready` otherwise. A creation naming no repository, or naming the project's own `github.org`/`github.repo`, is judged against the project's own role exactly as before. A declaration is required either way; only its vocabulary changes.
|
|
33
|
-
|
|
34
|
-
Full contract (the per-vendor before/after table, marker format, and recovery sweep): [reference/ready-role-filing.md](ready-role-filing-reference.mdc).
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Rejection Detection at Claim Time (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Rejection Detection at Claim Time (load-bearing)
|
|
7
|
-
|
|
8
|
-
A QA rejection — an item that reached a `review`/`done`-ward state and is now back in the build-ready lane — is a **teaching signal**, not fresh work. Detect it at claim time so the re-claim can reflect on the rejection instead of repeating it.
|
|
9
|
-
|
|
10
|
-
**One vendor-neutral contract, cited by every build-intake arm** (the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never three divergent implementations).
|
|
11
|
-
|
|
12
|
-
## When it runs
|
|
13
|
-
|
|
14
|
-
At the **top of build-intake step 3b (Claim), BEFORE the relabel** `$READY → $CLAIMED`. After the relabel the current-lane signal is gone, so detection must read history first. Detection is a pure read — idempotent, headless-safe, no side effects.
|
|
15
|
-
|
|
16
|
-
## Classify the claimed item
|
|
17
|
-
|
|
18
|
-
Return exactly one of:
|
|
19
|
-
|
|
20
|
-
- **`rejection-reclaim`** — history shows the item reached a `review`/`done`-ward lane and is now back in `$READY`.
|
|
21
|
-
- **`forward-only`** — history shows only forward moves (never returned to `$READY` from a later lane).
|
|
22
|
-
- **`never-left-ready`** — history shows the item never left `$READY`.
|
|
23
|
-
- **`unknown`** — the vendor history query failed, was inconclusive, or is absent.
|
|
24
|
-
|
|
25
|
-
## Vendor history sources (through the access layers only — `integration-access-layer`)
|
|
26
|
-
|
|
27
|
-
- **GitHub** — `LABELED` / `UNLABELED` timeline events on the configured **ready** label (the Label-Event History surface from `lisa-github-read-issue`).
|
|
28
|
-
- **JIRA** — the `changelog` operation on `lisa-atlassian-access` (`?expand=changelog`, status items).
|
|
29
|
-
- **Linear** — the `history` operation on `lisa-linear-access`, keyed on **workflow-state** history (`fromState.name` / `toState.name`, inlined on each node — no label-ID resolution needed).
|
|
30
|
-
|
|
31
|
-
**Lane names ALWAYS come from `.lisa.config.json` lanes** (`github.labels.build.{ready,claimed,done}` for GitHub, `jira.workflow.*` and `linear.workflow.*` for the status/state trackers; `src/sync/registry.ts` `BUILD_LABEL_DEFAULTS` and `LINEAR_WORKFLOW_DEFAULTS`). **Never hardcode** `status:ready`, `Ready`, `Todo`, etc.
|
|
32
|
-
|
|
33
|
-
## Never block the build
|
|
34
|
-
|
|
35
|
-
`unknown` is a first-class result, not an error. A failing/absent history yields `unknown` and **the build proceeds** to implement the item. Detection never stops a claim.
|
|
36
|
-
|
|
37
|
-
## Learning-loop exclusion (no learning about learning)
|
|
38
|
-
|
|
39
|
-
An artifact this flow produced is **never** a rejection-reflection trigger, no matter how it moves. Before classifying as `rejection-reclaim`, exclude items carrying any learning marker — `[lisa-learning-drop]`, `[lisa-learning-pr]`, `[lisa-learning-upstream-handoff]` — or the `learning:needs-triage` label. Such items short-circuit to `forward-only` (treated as normal work) so the detector never fires on the flow's own learning PRs/issues.
|
|
40
|
-
|
|
41
|
-
## Reflect on a `rejection-reclaim`
|
|
42
|
-
|
|
43
|
-
On `rejection-reclaim` only, before re-implementing: read the rejection evidence (comments after the backward transition, review threads on the rejected PR) through the access layers, assemble **one** candidate learning with the rejection linked as provenance, and route it to the `lisa-persist-learning` skill. If that skill is absent, record the candidate as a comment that carries a **visible prose line** plus the marker (a bare marker renders as an empty comment bubble) — `Recorded a candidate learning from this rejection (queued for the judgment gate): <one-line candidate rule>.` followed by `<!-- [lisa-rejection-candidate] key=<issue>-<transition-ts> -->` — and proceed. **Marker-dedupe** on `<issue>-<backward-transition-timestamp>`: re-claiming twice produces no duplicate. Unreadable/absent evidence → proceed without a candidate, never block.
|
|
44
|
-
|
|
45
|
-
## Proposal rejection memory (proposal-side — orthogonal to the reclaim path above)
|
|
46
|
-
|
|
47
|
-
A **loop-proposed** item that a human **closed as _not planned_** is a durable decline. Every *proposing* loop (`lisa-exploratory-qa`, `lisa-project-ideation`, `lisa-monitor`, `lisa-repair-intake`; `lisa-learnings-audit` is the shipped precedent) MUST consult it **before filing a candidate**. This is orthogonal to the `rejection-reclaim` path above — that classification and its reflection are untouched. The memory lives in the **tracker, not a new state file**.
|
|
48
|
-
|
|
49
|
-
- **Signal:** the prior item is closed *not planned* (GitHub `stateReason == "not_planned"`; the JIRA/Linear equivalent resolved via `config-resolution` — never hardcode). The GitHub compare is **case-insensitive** — raw `gh --json stateReason` returns `NOT_PLANNED` UPPERCASE, so normalize to lowercase (or read via `lisa-github-read-issue`) before comparing, never string-match raw `gh` JSON. Closed as **completed** is NOT a decline — a recurrence after a completed fix is a regression and may file.
|
|
50
|
-
- **Marker:** `<!-- [<loop-marker>] key=<candidate-key> -->`, key computed deterministically `printf '%s' "$normalized" | shasum -a 256 | cut -c1-12`. Search **open AND closed** items for the marker before filing (body-enumeration fallback on search-index lag); **match on the marker, never the title.**
|
|
51
|
-
- **Rule:** a hit on a closed-**not-planned** item **suppresses** the proposal. Re-file **only** with evidence postdating the decline, carrying BOTH the machine token (`declined <date>; recurred <date> in <ref>`) and a human acknowledgment sentence (`You declined this on <date>. It has recurred (<date>, <ref>), so we're raising it once more for your review.`).
|
|
52
|
-
- **Operator footer:** every loop-filed proposal ticket MUST carry, as visible prose, `To stop this from being raised again, close it as **Not planned**. Close it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.` — so the operator knows which close-reason produces which outcome.
|
|
53
|
-
- **Outcomes:** an all-suppressed cycle ends `nothing-needed` naming the **suppression count**; a memory check that cannot read the tracker ends `recovery-required`, never a silent `nothing-needed` (e.g. `Tracker unreachable during the decline check — restore credentials; nothing was filed this run.`).
|
|
54
|
-
- **Concurrency:** search-then-write = convergence, not mutual exclusion — a transient duplicate is closed by the next run; no cross-run lock.
|
|
55
|
-
|
|
56
|
-
## Automation-reversal memory (repair-side — orthogonal to both halves above)
|
|
57
|
-
|
|
58
|
-
A human who **undoes a lifecycle transition this flow made** is correcting the flow, not supplying new state. Every loop that writes a lifecycle role as a **repair** (`lisa-repair-intake`) consults this before re-making a transition. It is a third classification, never merged into `rejection-reclaim`: that one is anchored on the ready lane and answers a rejection with re-implementation; this one lands in `$BLOCKED` and answers a correction by withdrawing a decision.
|
|
59
|
-
|
|
60
|
-
- **Seam:** top of the repair walk for each item, **before any lifecycle write** — after the write the current-lane signal is gone.
|
|
61
|
-
- **Classify:** `automation-reversal` — a role change **authored by** this flow, then a later **backward** move of that role **authored by** a human, with no automation move after it. Otherwise `no-reversal`. Authorship unavailable or history unreadable → `unknown`.
|
|
62
|
-
- **Authorship is the signal, not the backward move.** An item can return to `$BLOCKED` because a real new blocker appeared — that is the world moving on. Read the `actor` (GitHub timeline, Linear history) or `author` (JIRA changelog) through the access layers; an unexposed actor is `unknown`, never an assumed human. **A marker and a transition on the same item say nothing until you know their order** — compare timestamps, and treat an unorderable pair as `unknown`.
|
|
63
|
-
- **Lanes from config** (`github.labels.build.blocked` + the JIRA/Linear equivalents, `config-resolution`) — never hardcode.
|
|
64
|
-
- **Degrade:** `unknown` is **neither a reversal nor a clearance** — the item is judged by the loop's normal rules and detection **never blocks the sweep**. The learning-loop exclusion above applies unchanged.
|
|
65
|
-
- **Rule:** on `automation-reversal`, do not re-apply the reversed classification; leave the item where the human put it, ensure `human_needed`, and **name the reversed transition in the run record**. Re-attempt **only** on evidence that **postdates the reversal**, cited in the run record — mirroring the re-proposal rule the proposal half enforces.
|
|
66
|
-
- **A changed lifecycle role is no longer a sufficient warrant on its own.** A consuming loop's recurrence brake must carry **authorship and an overturn bit**, not state alone.
|
|
67
|
-
- **Signed per path.** Apply the inversion only where the loop decides whether to re-make a transition. A staleness/keep-alive path where a human comment already *suppresses* action is protective — leave it. One global sign reads as tightening and removes that protection.
|
|
68
|
-
|
|
69
|
-
Full contract (classification table, per-vendor bindings, reflection & evidence handoff, Proposal rejection memory, Automation-reversal memory): [reference/rejection-detection.md](rejection-detection-reference.mdc).
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Repo Scope & Work-Time Splitting (load-bearing)"
|
|
3
|
-
alwaysApply: true
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Repo Scope & Work-Time Splitting (load-bearing)
|
|
7
|
-
|
|
8
|
-
**Leaf work units are single-repo.** A leaf is an individually implementable ticket with no open children — the by-design leaf types **Bug, Task, Sub-task, Improvement**, plus a childless **Story** or **Spike** (structurally a leaf per `leaf-only-lifecycle`). Each names exactly one repo. An **Epic**, and any **Story/Spike that still holds child work**, are coordination containers and may span repos.
|
|
9
|
-
|
|
10
|
-
Enforced at four points: gate **S10** (`*-validate-*`, write time), `task-decomposition` step 1.5 (PRD-decomposition time), claim-time repo scoping (`*-build-intake`), and the work-time split procedure (an existing ticket about to be implemented).
|
|
11
|
-
|
|
12
|
-
## Choose the right strategy
|
|
13
|
-
|
|
14
|
-
- **Decomposition-time (no tickets exist yet):** use `task-decomposition` step 1.5 — one work unit per repo under a parent Story.
|
|
15
|
-
- **Work-time (a ticket already exists):** narrow the original to one repo, spin off a sibling per additional repo, link by dependency. Do NOT invent a new parent — siblings inherit the original's existing parent.
|
|
16
|
-
|
|
17
|
-
## Work-time split (pre-flight gate, agent-performed)
|
|
18
|
-
|
|
19
|
-
1. **Detect repos.** Parse description + AC + approach, confirm against actual code surfaces. If single-repo, no split.
|
|
20
|
-
2. **Pick the keeper.** Default: the original keeps the consumer / user-facing repo.
|
|
21
|
-
3. **Create one sibling per extra repo**, cloning metadata (re-prefix summary, scope AC, carry parent, env, sign-in).
|
|
22
|
-
4. **Link by dependency.** Producer **blocks** consumer (`is blocked by` on consumer / `blocks` on producer). No clear direction → `relates to`.
|
|
23
|
-
5. **Narrow the original.** Edit summary prefix, Repository section, AC; remove cross-repo references.
|
|
24
|
-
6. **Comment** on the original noting the split, linking each sibling.
|
|
25
|
-
7. **Re-validate.** Run `tracker-verify` (S10) on the original and every sibling. All must PASS single-repo.
|
|
26
|
-
8. **Proceed in dependency order.** Producer siblings first.
|
|
27
|
-
|
|
28
|
-
## When to BLOCK instead of split
|
|
29
|
-
|
|
30
|
-
Fall back to the standard BLOCK + reassign-to-Reporter path when:
|
|
31
|
-
|
|
32
|
-
- Repos cannot be determined confidently from ticket + code.
|
|
33
|
-
- Splitting would strand stakeholder context only the reporter can re-scope.
|
|
34
|
-
- Required clone metadata (parent, env, credentials) is itself missing.
|
|
35
|
-
|
|
36
|
-
## Claim-time repo scoping (build-intake)
|
|
37
|
-
|
|
38
|
-
A tracker can oversee multiple repos. Build-intake claims only current-repo tickets. Resolve current repo per `config-resolution` (config `repo` → `github.repo` → git remote basename).
|
|
39
|
-
|
|
40
|
-
**Query-time pre-filter (do this first, where expressible).** Scope the candidate query to the current repo so sibling-repo tickets never enter the set — on JIRA, append `AND (labels = "repo:<current>" OR labels IS EMPTY)`. This pre-applies only the unambiguous wrong-repo → skip arm; `labels IS EMPTY` keeps unlabeled tickets visible so the per-candidate gate below can still determine + stamp them. Skip it (broad scan) when the current repo can't be resolved or the query already constrains repo. Apply only where the query layer can express `OR labels IS EMPTY`: JIRA does (applied); GitHub issues are inherently single-repo (not needed); Linear's label filter can't, so it keeps the broad query and relies on the per-candidate gate.
|
|
41
|
-
|
|
42
|
-
Then, for each ready candidate:
|
|
43
|
-
|
|
44
|
-
1. **Read `repo:<name>` label.** Wrong repo → skip. Current repo → leaf-only gate + claim. Unlabeled → determine + stamp + re-apply.
|
|
45
|
-
2. **Multi-repo leaf → split, never claim.** Each split sibling is created build-ready and stamped with its own `repo:<name>`.
|
|
46
|
-
3. **Wrong-repo single-repo leaf → skip** (label keeps it cheap next cycle).
|
|
47
|
-
|
|
48
|
-
Vendor mechanics (JIRA/GitHub/Linear) and full procedure: [reference/repo-scope-split.md](repo-scope-split-reference.mdc).
|