@codyswann/lisa 2.353.0 → 3.1.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/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +83 -47
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/expo/copy-overwrite/scripts/bdd/discover.mjs +502 -0
- package/expo/copy-overwrite/scripts/bdd/envelope.mjs +10 -1
- package/expo/copy-overwrite/scripts/bdd/render.mjs +53 -0
- package/expo/copy-overwrite/scripts/bdd/report.mjs +46 -0
- package/expo/copy-overwrite/scripts/check-bdd-coverage.mjs +39 -4
- package/expo/create-only/.github/workflows/nightly-e2e-report.yml +71 -0
- package/expo/create-only/bdd/coverage-map.json +16 -0
- package/package.json +1 -1
- 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-agent-ready/SKILL.md +5 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/SKILL.md +75 -64
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-to-tracker/SKILL.md +2 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/SKILL.md +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-exploratory-qa/SKILL.md +7 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +5 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-create/SKILL.md +3 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-github-to-tracker/SKILL.md +2 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +7 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +16 -6
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-harness/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/SKILL.md +13 -5
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +5 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-create/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +12 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-learnings-audit/SKILL.md +6 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +30 -10
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +5 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-create/SKILL.md +3 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +2 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +13 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/SKILL.md +36 -23
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-to-tracker/SKILL.md +2 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-persist-learning/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/SKILL.md +16 -6
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-source-write/SKILL.md +4 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-qa-fail/SKILL.md +3 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +28 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/SKILL.md +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/SKILL.md +8 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/SKILL.md +16 -6
- package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/SKILL.md +7 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-build-intake/SKILL.md +1 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-create/SKILL.md +1 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-write/SKILL.md +1 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify/SKILL.md +1 -1
- package/plugins/lisa/rules/eager/bdd-e2e-coverage.md +3 -1
- package/plugins/lisa/rules/eager/claim-time-guards.md +30 -0
- package/plugins/lisa/rules/eager/integration-access-layer.md +7 -3
- package/plugins/lisa/rules/eager/ready-role-filing.md +22 -0
- package/plugins/lisa/rules/reference/automation-runbook-contract.md +8 -1
- package/plugins/lisa/rules/reference/bdd-e2e-coverage.md +42 -6
- package/plugins/lisa/rules/reference/claim-time-guards.md +69 -0
- package/plugins/lisa/rules/reference/credential-substrate-precedence.md +166 -0
- package/plugins/lisa/rules/reference/integration-access-layer.md +27 -15
- package/plugins/lisa/rules/reference/ready-role-filing.md +66 -0
- package/plugins/lisa/skills/lisa-agent-ready/SKILL.md +5 -3
- package/plugins/lisa/skills/lisa-atlassian-access/SKILL.md +76 -65
- package/plugins/lisa/skills/lisa-confluence-to-tracker/SKILL.md +2 -1
- package/plugins/lisa/skills/lisa-debrief-apply/SKILL.md +2 -2
- package/plugins/lisa/skills/lisa-exploratory-qa/SKILL.md +7 -1
- package/plugins/lisa/skills/lisa-github-build-intake/SKILL.md +5 -0
- package/plugins/lisa/skills/lisa-github-create/SKILL.md +3 -1
- package/plugins/lisa/skills/lisa-github-to-tracker/SKILL.md +2 -1
- package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +7 -3
- package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +16 -6
- package/plugins/lisa/skills/lisa-improve-harness/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-jam-access/SKILL.md +14 -6
- package/plugins/lisa/skills/lisa-jira-build-intake/SKILL.md +5 -0
- package/plugins/lisa/skills/lisa-jira-create/SKILL.md +2 -0
- package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +12 -2
- package/plugins/lisa/skills/lisa-learnings-audit/SKILL.md +6 -1
- package/plugins/lisa/skills/lisa-linear-access/SKILL.md +31 -11
- package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +5 -0
- package/plugins/lisa/skills/lisa-linear-create/SKILL.md +3 -1
- package/plugins/lisa/skills/lisa-linear-to-tracker/SKILL.md +2 -1
- package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +13 -4
- package/plugins/lisa/skills/lisa-notion-access/SKILL.md +37 -24
- package/plugins/lisa/skills/lisa-notion-to-tracker/SKILL.md +2 -1
- package/plugins/lisa/skills/lisa-persist-learning/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-posthog-access/SKILL.md +17 -7
- package/plugins/lisa/skills/lisa-prd-source-write/SKILL.md +4 -2
- package/plugins/lisa/skills/lisa-qa-fail/SKILL.md +3 -1
- package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +28 -0
- package/plugins/lisa/skills/lisa-rework-triage/SKILL.md +2 -2
- package/plugins/lisa/skills/lisa-secrets-access/SKILL.md +8 -0
- package/plugins/lisa/skills/lisa-sentry-access/SKILL.md +17 -7
- package/plugins/lisa/skills/lisa-sonarcloud-access/SKILL.md +7 -1
- package/plugins/lisa/skills/lisa-tracker-build-intake/SKILL.md +1 -0
- package/plugins/lisa/skills/lisa-tracker-create/SKILL.md +1 -0
- package/plugins/lisa/skills/lisa-tracker-write/SKILL.md +1 -0
- package/plugins/lisa/skills/lisa-verify/SKILL.md +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-agent-ready/SKILL.md +5 -3
- package/plugins/lisa-agy/skills/lisa-atlassian-access/SKILL.md +76 -65
- package/plugins/lisa-agy/skills/lisa-confluence-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-agy/skills/lisa-debrief-apply/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/lisa-exploratory-qa/SKILL.md +7 -1
- package/plugins/lisa-agy/skills/lisa-github-build-intake/SKILL.md +5 -0
- package/plugins/lisa-agy/skills/lisa-github-create/SKILL.md +3 -1
- package/plugins/lisa-agy/skills/lisa-github-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +7 -3
- package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +16 -6
- package/plugins/lisa-agy/skills/lisa-improve-harness/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-jam-access/SKILL.md +14 -6
- package/plugins/lisa-agy/skills/lisa-jira-build-intake/SKILL.md +5 -0
- package/plugins/lisa-agy/skills/lisa-jira-create/SKILL.md +2 -0
- package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +12 -2
- package/plugins/lisa-agy/skills/lisa-learnings-audit/SKILL.md +6 -1
- package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +31 -11
- package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +5 -0
- package/plugins/lisa-agy/skills/lisa-linear-create/SKILL.md +3 -1
- package/plugins/lisa-agy/skills/lisa-linear-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +13 -4
- package/plugins/lisa-agy/skills/lisa-notion-access/SKILL.md +37 -24
- package/plugins/lisa-agy/skills/lisa-notion-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-agy/skills/lisa-persist-learning/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-posthog-access/SKILL.md +17 -7
- package/plugins/lisa-agy/skills/lisa-prd-source-write/SKILL.md +4 -2
- package/plugins/lisa-agy/skills/lisa-qa-fail/SKILL.md +3 -1
- package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +28 -0
- package/plugins/lisa-agy/skills/lisa-rework-triage/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/lisa-secrets-access/SKILL.md +8 -0
- package/plugins/lisa-agy/skills/lisa-sentry-access/SKILL.md +17 -7
- package/plugins/lisa-agy/skills/lisa-sonarcloud-access/SKILL.md +7 -1
- package/plugins/lisa-agy/skills/lisa-tracker-build-intake/SKILL.md +1 -0
- package/plugins/lisa-agy/skills/lisa-tracker-create/SKILL.md +1 -0
- package/plugins/lisa-agy/skills/lisa-tracker-write/SKILL.md +1 -0
- package/plugins/lisa-agy/skills/lisa-verify/SKILL.md +1 -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/rules/eager/bdd-e2e-coverage.md +3 -1
- package/plugins/lisa-copilot/rules/eager/claim-time-guards.md +30 -0
- package/plugins/lisa-copilot/rules/eager/integration-access-layer.md +7 -3
- package/plugins/lisa-copilot/rules/eager/ready-role-filing.md +22 -0
- package/plugins/lisa-copilot/rules/reference/automation-runbook-contract.md +8 -1
- package/plugins/lisa-copilot/rules/reference/bdd-e2e-coverage.md +42 -6
- package/plugins/lisa-copilot/rules/reference/claim-time-guards.md +69 -0
- package/plugins/lisa-copilot/rules/reference/credential-substrate-precedence.md +166 -0
- package/plugins/lisa-copilot/rules/reference/integration-access-layer.md +27 -15
- package/plugins/lisa-copilot/rules/reference/ready-role-filing.md +66 -0
- package/plugins/lisa-copilot/skills/lisa-agent-ready/SKILL.md +5 -3
- package/plugins/lisa-copilot/skills/lisa-atlassian-access/SKILL.md +76 -65
- package/plugins/lisa-copilot/skills/lisa-confluence-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-copilot/skills/lisa-debrief-apply/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/lisa-exploratory-qa/SKILL.md +7 -1
- package/plugins/lisa-copilot/skills/lisa-github-build-intake/SKILL.md +5 -0
- package/plugins/lisa-copilot/skills/lisa-github-create/SKILL.md +3 -1
- package/plugins/lisa-copilot/skills/lisa-github-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +7 -3
- package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +16 -6
- package/plugins/lisa-copilot/skills/lisa-improve-harness/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-jam-access/SKILL.md +14 -6
- package/plugins/lisa-copilot/skills/lisa-jira-build-intake/SKILL.md +5 -0
- package/plugins/lisa-copilot/skills/lisa-jira-create/SKILL.md +2 -0
- package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +12 -2
- package/plugins/lisa-copilot/skills/lisa-learnings-audit/SKILL.md +6 -1
- package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +31 -11
- package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +5 -0
- package/plugins/lisa-copilot/skills/lisa-linear-create/SKILL.md +3 -1
- package/plugins/lisa-copilot/skills/lisa-linear-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +13 -4
- package/plugins/lisa-copilot/skills/lisa-notion-access/SKILL.md +37 -24
- package/plugins/lisa-copilot/skills/lisa-notion-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-copilot/skills/lisa-persist-learning/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-posthog-access/SKILL.md +17 -7
- package/plugins/lisa-copilot/skills/lisa-prd-source-write/SKILL.md +4 -2
- package/plugins/lisa-copilot/skills/lisa-qa-fail/SKILL.md +3 -1
- package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +28 -0
- package/plugins/lisa-copilot/skills/lisa-rework-triage/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/lisa-secrets-access/SKILL.md +8 -0
- package/plugins/lisa-copilot/skills/lisa-sentry-access/SKILL.md +17 -7
- package/plugins/lisa-copilot/skills/lisa-sonarcloud-access/SKILL.md +7 -1
- package/plugins/lisa-copilot/skills/lisa-tracker-build-intake/SKILL.md +1 -0
- package/plugins/lisa-copilot/skills/lisa-tracker-create/SKILL.md +1 -0
- package/plugins/lisa-copilot/skills/lisa-tracker-write/SKILL.md +1 -0
- package/plugins/lisa-copilot/skills/lisa-verify/SKILL.md +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/automation-runbook-contract-reference.mdc +8 -1
- package/plugins/lisa-cursor/rules/bdd-e2e-coverage-reference.mdc +42 -6
- package/plugins/lisa-cursor/rules/bdd-e2e-coverage.mdc +3 -1
- package/plugins/lisa-cursor/rules/claim-time-guards-reference.mdc +74 -0
- package/plugins/lisa-cursor/rules/claim-time-guards.mdc +35 -0
- package/plugins/lisa-cursor/rules/credential-substrate-precedence-reference.mdc +171 -0
- package/plugins/lisa-cursor/rules/integration-access-layer-reference.mdc +27 -15
- package/plugins/lisa-cursor/rules/integration-access-layer.mdc +7 -3
- package/plugins/lisa-cursor/rules/ready-role-filing-reference.mdc +71 -0
- package/plugins/lisa-cursor/rules/ready-role-filing.mdc +27 -0
- package/plugins/lisa-cursor/skills/lisa-agent-ready/SKILL.md +5 -3
- package/plugins/lisa-cursor/skills/lisa-atlassian-access/SKILL.md +76 -65
- package/plugins/lisa-cursor/skills/lisa-confluence-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-cursor/skills/lisa-debrief-apply/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/lisa-exploratory-qa/SKILL.md +7 -1
- package/plugins/lisa-cursor/skills/lisa-github-build-intake/SKILL.md +5 -0
- package/plugins/lisa-cursor/skills/lisa-github-create/SKILL.md +3 -1
- package/plugins/lisa-cursor/skills/lisa-github-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +7 -3
- package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +16 -6
- package/plugins/lisa-cursor/skills/lisa-improve-harness/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-jam-access/SKILL.md +14 -6
- package/plugins/lisa-cursor/skills/lisa-jira-build-intake/SKILL.md +5 -0
- package/plugins/lisa-cursor/skills/lisa-jira-create/SKILL.md +2 -0
- package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +12 -2
- package/plugins/lisa-cursor/skills/lisa-learnings-audit/SKILL.md +6 -1
- package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +31 -11
- package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +5 -0
- package/plugins/lisa-cursor/skills/lisa-linear-create/SKILL.md +3 -1
- package/plugins/lisa-cursor/skills/lisa-linear-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +13 -4
- package/plugins/lisa-cursor/skills/lisa-notion-access/SKILL.md +37 -24
- package/plugins/lisa-cursor/skills/lisa-notion-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-cursor/skills/lisa-persist-learning/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-posthog-access/SKILL.md +17 -7
- package/plugins/lisa-cursor/skills/lisa-prd-source-write/SKILL.md +4 -2
- package/plugins/lisa-cursor/skills/lisa-qa-fail/SKILL.md +3 -1
- package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +28 -0
- package/plugins/lisa-cursor/skills/lisa-rework-triage/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/lisa-secrets-access/SKILL.md +8 -0
- package/plugins/lisa-cursor/skills/lisa-sentry-access/SKILL.md +17 -7
- package/plugins/lisa-cursor/skills/lisa-sonarcloud-access/SKILL.md +7 -1
- package/plugins/lisa-cursor/skills/lisa-tracker-build-intake/SKILL.md +1 -0
- package/plugins/lisa-cursor/skills/lisa-tracker-create/SKILL.md +1 -0
- package/plugins/lisa-cursor/skills/lisa-tracker-write/SKILL.md +1 -0
- package/plugins/lisa-cursor/skills/lisa-verify/SKILL.md +1 -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/rules/eager/bdd-e2e-coverage.md +3 -1
- package/plugins/src/base/rules/eager/claim-time-guards.md +30 -0
- package/plugins/src/base/rules/eager/integration-access-layer.md +7 -3
- package/plugins/src/base/rules/eager/ready-role-filing.md +22 -0
- package/plugins/src/base/rules/reference/automation-runbook-contract.md +8 -1
- package/plugins/src/base/rules/reference/bdd-e2e-coverage.md +42 -6
- package/plugins/src/base/rules/reference/claim-time-guards.md +69 -0
- package/plugins/src/base/rules/reference/credential-substrate-precedence.md +166 -0
- package/plugins/src/base/rules/reference/integration-access-layer.md +27 -15
- package/plugins/src/base/rules/reference/ready-role-filing.md +66 -0
- package/plugins/src/base/skills/lisa-agent-ready/SKILL.md +5 -3
- package/plugins/src/base/skills/lisa-atlassian-access/SKILL.md +76 -65
- package/plugins/src/base/skills/lisa-confluence-to-tracker/SKILL.md +2 -1
- package/plugins/src/base/skills/lisa-debrief-apply/SKILL.md +2 -2
- package/plugins/src/base/skills/lisa-exploratory-qa/SKILL.md +7 -1
- package/plugins/src/base/skills/lisa-github-build-intake/SKILL.md +5 -0
- package/plugins/src/base/skills/lisa-github-create/SKILL.md +3 -1
- package/plugins/src/base/skills/lisa-github-to-tracker/SKILL.md +2 -1
- package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +7 -3
- package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +16 -6
- package/plugins/src/base/skills/lisa-improve-harness/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-jam-access/SKILL.md +14 -6
- package/plugins/src/base/skills/lisa-jira-build-intake/SKILL.md +5 -0
- package/plugins/src/base/skills/lisa-jira-create/SKILL.md +2 -0
- package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +12 -2
- package/plugins/src/base/skills/lisa-learnings-audit/SKILL.md +6 -1
- package/plugins/src/base/skills/lisa-linear-access/SKILL.md +31 -11
- package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +5 -0
- package/plugins/src/base/skills/lisa-linear-create/SKILL.md +3 -1
- package/plugins/src/base/skills/lisa-linear-to-tracker/SKILL.md +2 -1
- package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +13 -4
- package/plugins/src/base/skills/lisa-notion-access/SKILL.md +37 -24
- package/plugins/src/base/skills/lisa-notion-to-tracker/SKILL.md +2 -1
- package/plugins/src/base/skills/lisa-persist-learning/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-posthog-access/SKILL.md +17 -7
- package/plugins/src/base/skills/lisa-prd-source-write/SKILL.md +4 -2
- package/plugins/src/base/skills/lisa-qa-fail/SKILL.md +3 -1
- package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +28 -0
- package/plugins/src/base/skills/lisa-rework-triage/SKILL.md +2 -2
- package/plugins/src/base/skills/lisa-secrets-access/SKILL.md +8 -0
- package/plugins/src/base/skills/lisa-sentry-access/SKILL.md +17 -7
- package/plugins/src/base/skills/lisa-sonarcloud-access/SKILL.md +7 -1
- package/plugins/src/base/skills/lisa-tracker-build-intake/SKILL.md +1 -0
- package/plugins/src/base/skills/lisa-tracker-create/SKILL.md +1 -0
- package/plugins/src/base/skills/lisa-tracker-write/SKILL.md +1 -0
- package/plugins/src/base/skills/lisa-verify/SKILL.md +1 -1
- package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +631 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -15,7 +15,7 @@ Default locations (a project that already has an equivalent contract keeps its o
|
|
|
15
15
|
| Artifact | Default path | What it is |
|
|
16
16
|
|---|---|---|
|
|
17
17
|
| Scenarios | `bdd/features/*.feature` | Gherkin, the product-level behavior contract |
|
|
18
|
-
| Coverage map | `bdd/coverage-map.json` | scenario → runner/platform/file/evidence mappings, plus waivers |
|
|
18
|
+
| Coverage map | `bdd/coverage-map.json` | scenario → runner/platform/file/evidence mappings, plus waivers, per-runner test-discovery roots, and exclusions |
|
|
19
19
|
| Generated matrix | `docs/bdd-scenario-matrix.md` | regenerated, never hand-edited |
|
|
20
20
|
| Burndown | `docs/e2e-bdd-coverage.md` | current coverage per platform |
|
|
21
21
|
|
|
@@ -36,6 +36,8 @@ The last three are out of the denominator. Deleting a committed capability to ma
|
|
|
36
36
|
|
|
37
37
|
Coverage is counted per **required scenario-platform obligation**, and an obligation is sealed only by **aligned e2e automation in the project's configured runner for that platform** — the runner→platform mapping is project configuration (e.g. a web runner covering `web`, a device runner covering `ios`/`android`), never named by this contract. A unit test, a route boot, a screenshot, a fixture, an API test, or a passing test on a *different* platform never seals an obligation: they prove something else. Each mapping names the runner, the platforms, the file, and the evidence string inside it, so the gate can prove the mapping still resolves.
|
|
38
38
|
|
|
39
|
+
**The gate reads in both directions.** It also walks the test roots the project declares per runner, so an e2e test that exists but that the contract never mentions is a violation — map it to a scenario, or record an exclusion stating why it aligns to no product behavior. Roots are configuration: a subflow or helper directory left undeclared is structurally invisible, which is the same failure as having no gate for it.
|
|
40
|
+
|
|
39
41
|
**Waivers are dated IOUs, never coverage.** An obligation whose runner genuinely cannot decide it today (no camera on the simulator, no request interception, no provisioned provider credential) is recorded with scenario, platforms, reason, and `recordedAt`. It leaves the denominator; it never counts as covered, and nothing about it asserts the behavior works. A waiver is invalid — and fails the gate — when it names a nonexistent scenario or an undeclared platform, covers an already-excluded scenario, or masks a scenario-platform that already has a mapping. Revisit a waiver when its reason dies.
|
|
40
42
|
|
|
41
43
|
## Definition of done
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Claim-Time Guards (load-bearing)
|
|
2
|
+
|
|
3
|
+
Two guards that run when build-intake claims a ready item, both from failures observed in the fleet: an item built twice because it had already shipped, and a loop burning cycles re-attempting an item that was never going to succeed.
|
|
4
|
+
|
|
5
|
+
**One vendor-neutral contract, cited by every build-intake arm** (the `leaf-only-lifecycle` / `repo-scope-split` / `rejection-detection` / `claim-archaeology` precedent: one shared slug, never three divergent implementations).
|
|
6
|
+
|
|
7
|
+
## When they run
|
|
8
|
+
|
|
9
|
+
Inside build-intake step `3b`, after `rejection-detection` and `claim-archaeology`, still before the `$READY → $CLAIMED` transition. The `two-failed-attempts` valve runs first — it is cheaper and it is the only pass that can stop the claim outright.
|
|
10
|
+
|
|
11
|
+
## `already-implemented` → `verify-and-close`
|
|
12
|
+
|
|
13
|
+
A ready item may already be implemented, because agents ship without transitioning. Before implementing, probe for the item's **own** key:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git log --all --grep "<key>" --format='%H %aI %s' -n 10
|
|
17
|
+
gh pr list --repo <org>/<repo> --state all --search "<key>" --json number,state,mergedAt,url
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
On a hit, do not build it twice — switch `3c` to **verify-and-close**: verify what shipped against this item's acceptance criteria, post evidence naming the shipping PR/commit, then run the ordinary `3d` transition and rollup. If the shipped change only partially satisfies the criteria, implement the remaining gap instead of closing.
|
|
21
|
+
|
|
22
|
+
Distinct from `claim-archaeology` (finds a **different** ancestor issue) and from `DUPLICATE_ALREADY_FIXED` (a **different** canonical issue). Unreadable history degrades to "no hit"; the guard never blocks the claim.
|
|
23
|
+
|
|
24
|
+
## `two-failed-attempts` → blocked
|
|
25
|
+
|
|
26
|
+
Every non-success terminal outcome records a durable marker on the item — a visible line plus `<!-- [lisa-build-attempt] n=<N> outcome=<outcome> -->` (match on the marker, never the title). A cron holds no memory between cycles, so the item carries the count.
|
|
27
|
+
|
|
28
|
+
With **two or more** markers at claim time: do not claim. Move the item to the configured `blocked` role (resolved per `config-resolution`, never hardcoded), post an operator-readable comment naming both attempts and what a human must decide or supply, and **stop the loop** for this cycle. Recovery is deliberate — a human or a `lisa-repair-intake` cycle with the blocker provably cleared returns it to the queue.
|
|
29
|
+
|
|
30
|
+
Full contract (probe bounds, verify-and-close steps, partial-hit handling, marker mechanics): [reference/claim-time-guards.md](../reference/claim-time-guards.md).
|
|
@@ -4,7 +4,11 @@ Skills and rules that use external integrations route through the matching
|
|
|
4
4
|
`*-access` skill. Do not call vendor MCP tools or REST APIs directly from a
|
|
5
5
|
consumer skill.
|
|
6
6
|
|
|
7
|
-
Resolution order is
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
Resolution order is the configured-provider token/CLI substrate first when its
|
|
8
|
+
bootstrap credential is present and identity-matched, then the interactive MCP as
|
|
9
|
+
fallback, then a loud error naming the exact credential to set. Identity-match is
|
|
10
|
+
mandatory on every substrate — one authenticated as a different tenant is skipped,
|
|
11
|
+
never used. The ordering itself is settled in
|
|
12
|
+
[reference/credential-substrate-precedence.md](../reference/credential-substrate-precedence.md);
|
|
13
|
+
full matrix and migration rules:
|
|
10
14
|
[reference/integration-access-layer.md](../reference/integration-access-layer.md).
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Ready-Role Filing (load-bearing)
|
|
2
|
+
|
|
3
|
+
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.
|
|
4
|
+
|
|
5
|
+
## Omitted means NOT ready — on every tracker
|
|
6
|
+
|
|
7
|
+
**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.
|
|
8
|
+
|
|
9
|
+
## Every filing declares one of two things
|
|
10
|
+
|
|
11
|
+
- **`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.
|
|
12
|
+
- **`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.
|
|
13
|
+
|
|
14
|
+
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.
|
|
15
|
+
|
|
16
|
+
## The named exception
|
|
17
|
+
|
|
18
|
+
`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).
|
|
19
|
+
|
|
20
|
+
`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.
|
|
21
|
+
|
|
22
|
+
Full contract (the per-vendor before/after table, marker format, and recovery sweep): [reference/ready-role-filing.md](../reference/ready-role-filing.md).
|
|
@@ -159,7 +159,14 @@ fleet verdict.
|
|
|
159
159
|
|
|
160
160
|
A loop that cannot proceed escalates by filing a tracker item (through `lisa-tracker-write`, per
|
|
161
161
|
`tracked-work` and `integration-access-layer`) labeled **`status:blocked`** and **`human-needed`**,
|
|
162
|
-
containing exactly these fields
|
|
162
|
+
containing exactly these fields.
|
|
163
|
+
|
|
164
|
+
Every escalation is a **declared human gate** under `ready-role-filing`: it passes
|
|
165
|
+
`human_gate: "<the smallest unresolved choice>"` so the writer stamps the auditable
|
|
166
|
+
`[lisa-human-gate]` marker. An escalation is precisely a filing whose readiness a human owns, so
|
|
167
|
+
omitting the flag and relying on a tracker default would make a deliberate gate indistinguishable
|
|
168
|
+
from the accidental non-ready filing that rule exists to catch.
|
|
169
|
+
|
|
163
170
|
|
|
164
171
|
| Field | Content |
|
|
165
172
|
|---|---|
|
|
@@ -68,16 +68,43 @@ platforms it requires and that each named platform has a configured runner.
|
|
|
68
68
|
"level": "behavioral"
|
|
69
69
|
}
|
|
70
70
|
],
|
|
71
|
+
"testDiscovery": {
|
|
72
|
+
"<runner>": {
|
|
73
|
+
"roots": ["<repo-relative directory>", "..."],
|
|
74
|
+
"extensions": [".<suffix>", "..."],
|
|
75
|
+
"ignore": ["<optional repo-relative path prefix>"],
|
|
76
|
+
"evidence": { "kind": "call-title", "functions": ["test", "it"] }
|
|
77
|
+
}
|
|
78
|
+
},
|
|
71
79
|
"exclusions": [
|
|
72
|
-
{
|
|
80
|
+
{
|
|
81
|
+
"file": "<path>",
|
|
82
|
+
"evidence": "<optional exact title; omit to excuse the whole file>",
|
|
83
|
+
"reason": "why this test aligns to no product behavior"
|
|
84
|
+
}
|
|
73
85
|
]
|
|
74
86
|
}
|
|
75
87
|
```
|
|
76
88
|
|
|
77
89
|
`evidence` is what makes a mapping falsifiable: the gate reads the mapped file and confirms the
|
|
78
90
|
string is still there, so renaming or deleting a test breaks the map loudly instead of leaving a
|
|
79
|
-
scenario silently unguarded.
|
|
80
|
-
|
|
91
|
+
scenario silently unguarded.
|
|
92
|
+
|
|
93
|
+
`testDiscovery` closes the other direction. Validating only what the map DECLARES can never see a
|
|
94
|
+
test file nobody declared, so the gate walks the project's own roots and requires **every test it
|
|
95
|
+
finds to be named by a mapping or excused by an exclusion**. Roots and the evidence grammar are
|
|
96
|
+
per-runner configuration — list every directory, including subflow and helper directories, because
|
|
97
|
+
a directory omitted here is structurally invisible to the gate. Evidence grammars are an allowlist
|
|
98
|
+
of two (`call-title` reads `test("…")`-style declarations; `line-field` reads a leading `name:`
|
|
99
|
+
field), never a project-supplied regular expression, and a template-literal title is used verbatim
|
|
100
|
+
from the source rather than rewritten. A missing block is a defect in enforced mode
|
|
101
|
+
(`discovery-missing`); a malformed one is refused in **every** state (`discovery-invalid`), because
|
|
102
|
+
discovery that silently finds nothing looks exactly like a clean repo.
|
|
103
|
+
|
|
104
|
+
`exclusions` records tests that deliberately map to nothing — starter templates, source-level
|
|
105
|
+
corroboration — so "unmapped test" stays a meaningful signal. Each entry states a `reason`, and an
|
|
106
|
+
exclusion whose file is gone, whose title was renamed, or that no discovery root covers is
|
|
107
|
+
`exclusion-stale`: a standing claim about nothing, never a permanent excuse.
|
|
81
108
|
|
|
82
109
|
## The gate
|
|
83
110
|
|
|
@@ -94,8 +121,14 @@ Two commands, wired into the project's script surface and into CI:
|
|
|
94
121
|
- an invalid waiver (nonexistent scenario, undeclared platform, already-excluded scenario, a
|
|
95
122
|
`runner` that does not cover the waived platform under `runnerPlatforms`, or one that masks an
|
|
96
123
|
existing mapping);
|
|
124
|
+
- a discovered test named by no mapping and no exclusion, or an exclusion that no longer excuses
|
|
125
|
+
anything;
|
|
97
126
|
- a regression against the project's committed `coverageFloor` per platform.
|
|
98
127
|
|
|
128
|
+
Regeneration is never blocked by the check: `--write` rewrites the report and burndown whenever a
|
|
129
|
+
report can be built at all, so a stale evidence string can never hold hostage the paperwork that
|
|
130
|
+
documents it.
|
|
131
|
+
|
|
99
132
|
The percentage measures **aligned automation inventory, not the latest run result**. A mapped test
|
|
100
133
|
that currently fails is a red CI check, a separate signal; the map only asserts the automation
|
|
101
134
|
exists and still says what it claimed. Both facts are required — a green gate over a red suite is
|
|
@@ -157,9 +190,12 @@ A repo with no contract yet, taking its first frontend work item:
|
|
|
157
190
|
|
|
158
191
|
1. **Detect runners.** Find the e2e harnesses the project actually has, per the Tool Discovery
|
|
159
192
|
Process in `verification-lifecycle`. Record which platforms each covers.
|
|
160
|
-
2. **Scaffold the minimum** — `bdd/features/`, `bdd/coverage-map.json` (with `runnerPlatforms`
|
|
161
|
-
step 1
|
|
162
|
-
|
|
193
|
+
2. **Scaffold the minimum** — `bdd/features/`, `bdd/coverage-map.json` (with `runnerPlatforms` and
|
|
194
|
+
`testDiscovery` from step 1 — every root each runner's tests actually live in, subflow and helper
|
|
195
|
+
directories included — and a coverage floor of the current, honest number), the regenerate +
|
|
196
|
+
check scripts wired into the project's script surface, and the CI invocation of the check.
|
|
197
|
+
Pre-existing tests that align to no product behavior are recorded as `exclusions` with reasons
|
|
198
|
+
during this step, never left undisclosed.
|
|
163
199
|
3. **Write only this item's scenarios.** The first item is not a backfill project. Pre-existing
|
|
164
200
|
uncovered behavior becomes burndown in `docs/e2e-bdd-coverage.md`, and the floor starts where the
|
|
165
201
|
repo actually is.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Claim-Time Guards
|
|
2
|
+
|
|
3
|
+
Two guards that run when build-intake claims a ready item. Both come from geminisportsai's hand-rolled `sprint-loop` and both address failures actually observed there — an item built twice because it had already shipped, and a loop burning cycles re-attempting an item that was never going to succeed.
|
|
4
|
+
|
|
5
|
+
It is a **single vendor-neutral contract** consumed by all three build-intake skills (`lisa-github-build-intake`, `lisa-jira-build-intake`, `lisa-linear-build-intake`). Each arm cites this slug in its claim step rather than growing its own copy, exactly as the arms cite `leaf-only-lifecycle`, `repo-scope-split`, `rejection-detection`, and `claim-archaeology`. One slug is what keeps a guard that fires on GitHub from being absent on Linear.
|
|
6
|
+
|
|
7
|
+
## Sequencing
|
|
8
|
+
|
|
9
|
+
The shared claim phase is `3a.0` repo-scope gate → `3a` leaf-only claim gate → `3b` Claim → `3c` run lifecycle → `3d` transition to done. Inside `3b`, the pre-transition window now runs four passes in a fixed order:
|
|
10
|
+
|
|
11
|
+
1. **`rejection-detection`** — needs the current-lane signal the relabel destroys.
|
|
12
|
+
2. **`claim-archaeology`** — consumes the rejection classification.
|
|
13
|
+
3. **`two-failed-attempts` valve** (this rule) — may end the cycle before any claim happens.
|
|
14
|
+
4. **`already-implemented` check** (this rule) — decides whether `3c` implements or verifies.
|
|
15
|
+
|
|
16
|
+
The valve runs before the already-implemented probe because it is cheaper and it is the only one of the four that can stop the claim outright: there is no point spending git and PR queries on an item that is about to be blocked.
|
|
17
|
+
|
|
18
|
+
## Guard 1 — already-implemented → verify-and-close
|
|
19
|
+
|
|
20
|
+
**Why it exists.** A ready item may already be implemented. Agents ship without transitioning: the PR merges, the work is done, and the item sits in the ready lane looking untouched. Claiming it normally means building the same change a second time — at best a no-op PR, at worst a conflicting reimplementation of work that already landed.
|
|
21
|
+
|
|
22
|
+
**The probe.** Two deterministic searches for the item's **own** canonical key (the ref carried by the `Work-Item:` trailer), bounded and never interactive:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Commits anywhere in history — branches and merged work included — that carry the key.
|
|
26
|
+
git log --all --grep "<key>" --format='%H %aI %s' -n 10
|
|
27
|
+
|
|
28
|
+
# Open and merged PRs referencing the key (GitHub shown; JIRA and Linear use the
|
|
29
|
+
# equivalent search through their access layers, never a direct vendor API call).
|
|
30
|
+
gh pr list --repo <org>/<repo> --state all --search "<key>" --json number,state,mergedAt,url
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
A hit counts only when it names **this** key. Branch-name coincidence, a similar title, or a reference from an unrelated item is not a hit — that is `claim-archaeology`'s job, not this one.
|
|
34
|
+
|
|
35
|
+
**The outcome.** On a hit, do not implement. Switch `3c` to **verify-and-close**:
|
|
36
|
+
|
|
37
|
+
1. Read the referenced commits/PR and establish what actually shipped.
|
|
38
|
+
2. Verify the shipped change against this item's acceptance criteria — the ordinary verification path, not a fresh build.
|
|
39
|
+
3. On a pass: post evidence naming the shipping PR/commit, then run the normal `3d` transition (which still gates on the PR being merged) and the `3d.1` rollup.
|
|
40
|
+
4. On a fail — the shipped change does not satisfy the criteria — record that the item is only **partially** implemented, and proceed with the ordinary implement path for the remaining gap. A partial hit must never close an item whose criteria are unmet.
|
|
41
|
+
|
|
42
|
+
**What this is not.** Three nearby behaviors it must not be conflated with:
|
|
43
|
+
|
|
44
|
+
- **`claim-archaeology`** answers "is this item round 2 of a *different* past failure?" — it looks for an **ancestor** issue. This guard looks for **this same item** already having shipped. Different question, different key, different outcome.
|
|
45
|
+
- **`DUPLICATE_ALREADY_FIXED`** (from `lisa-ticket-triage`) is about a **different canonical issue** whose fix covers this one; it closes as a duplicate. This guard finds work done **under this item's own key** and closes it as completed, not as a duplicate.
|
|
46
|
+
- **Rejection reclaim** is about work that shipped and was pushed back. Verify-and-close applies to work that shipped and nobody noticed.
|
|
47
|
+
|
|
48
|
+
**Never block.** An unreadable history, an absent `gh`, or a failed search degrades to "no hit" and the ordinary implement path proceeds. A speculative probe must never strand a ready item.
|
|
49
|
+
|
|
50
|
+
## Guard 2 — two-failed-attempts → blocked
|
|
51
|
+
|
|
52
|
+
**Why it exists.** Without a valve, a scheduled loop re-claims the same failing item every cycle forever. Each attempt costs a full build flow, and the third attempt is not more likely to succeed than the second — what changed between them was nothing.
|
|
53
|
+
|
|
54
|
+
**The counter.** Attempts are counted from durable markers on the item itself, not from session memory (a cron process holds no state between cycles). On every **non-success terminal outcome** for a claimed item — errored, blocked by a gate, PR abandoned unmerged — the intake arm records a visible comment plus a marker:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
Build attempt <N> did not complete: <one-line operator-readable reason>.
|
|
58
|
+
<!-- [lisa-build-attempt] n=<N> outcome=<outcome> -->
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The marker line is verbatim; the count is the number of `[lisa-build-attempt]` markers on the item. Match on the **marker, never the title**. A successful build records no marker, so an item that shipped after one bad attempt starts clean if it is ever re-filed.
|
|
62
|
+
|
|
63
|
+
**The threshold is two.** At the top of the claim, count existing markers. With **two or more**, do not claim:
|
|
64
|
+
|
|
65
|
+
1. Move the item to the configured `blocked` role (`build.blocked` / `workflow.blocked`, resolved per `config-resolution` — never a hardcoded lane).
|
|
66
|
+
2. Post an operator-readable comment naming both prior attempts, what each one hit, and what a human would need to decide or supply. Written for a non-technical operator, per `report-actionability`.
|
|
67
|
+
3. **Stop the loop** — end the cycle without claiming anything else. Stopping is the point: the next scheduled invocation should not immediately pick up the next item as though nothing happened.
|
|
68
|
+
|
|
69
|
+
**Recovery is deliberate.** A blocked item returns to the queue only when a human (or `lisa-repair-intake`, once the named blocker is provably cleared) moves it back. The attempt markers stay on the item as history; re-entering the ready lane after a real fix is a fresh claim whose markers describe why it was hard, not a silent reset of the counter.
|