@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
|
@@ -238,11 +238,21 @@ Before create/update, verify each field is populated where applicable:
|
|
|
238
238
|
|
|
239
239
|
### Build-ready control input (`build_ready`)
|
|
240
240
|
|
|
241
|
-
`build_ready` is
|
|
241
|
+
`build_ready` is a write-control input governed by the `ready-role-filing` rule — cite that slug for the full contract; do not restate its per-vendor normalization table here. It decides whether a **leaf** work unit is promoted to the build-ready role on create. It never overrides `leaf-only-lifecycle` — a container is never promoted regardless of `build_ready`. Unlike the label-based trackers, JIRA tickets are **already created not-ready** (in the project's default initial status, e.g. `TODO`/`Backlog`); the build-ready role is the configured `ready` status (`jira.workflow.ready`, default `Ready`), reached by an explicit transition. JIRA is the vendor whose behavior the other two converged onto — this arm is unchanged by that normalization.
|
|
242
242
|
|
|
243
|
-
- **Omitted**
|
|
243
|
+
- **Omitted** → **not build-ready**: leave the ticket in the project's default created status. No transition. Ready is an explicit claim, never a vendor default.
|
|
244
|
+
- **`build_ready: false`** → same outcome as omitted, stated deliberately: the ticket waits in the project's default status for a human to promote it.
|
|
244
245
|
- **`build_ready: true`** → after create, transition the **leaf** to the resolved `ready` role so `lisa-intake` / `lisa-jira-build-intake` auto-picks it up (see Phase 6 CREATE step). Resolve the role name with the standard pattern (`.jira.workflow.ready` // `Ready`, local overrides global). Best-effort: if the transition is unreachable, record it and leave the ticket in its default status rather than failing the write.
|
|
245
246
|
|
|
247
|
+
**A filing with neither is an incomplete handoff.** A leaf that is not build-ready must carry an explicit `human_gate: "<why a human must judge this first>"`; nothing in the ready status means nothing ever claims it. When `human_gate` is supplied, stamp the hold on the ticket so it is auditable — a visible line plus the verbatim marker:
|
|
248
|
+
|
|
249
|
+
```text
|
|
250
|
+
Held for a human product call: <reason>.
|
|
251
|
+
<!-- [lisa-human-gate] reason=<short-slug> -->
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
If a leaf arrives with `build_ready` omitted or `false` **and** no `human_gate`, do not create it: report the incomplete handoff and name both ways to resolve it (`build_ready: true`, or a `human_gate` reason). Containers are exempt — their status rolls up from children, so they need neither.
|
|
255
|
+
|
|
246
256
|
## Phase 5.5 — Validate (Pre-write Gate)
|
|
247
257
|
|
|
248
258
|
Before any write, invoke `lisa-jira-validate-ticket` with the full proposed spec assembled from Phases 2 / 3 / 4 / 5. Pass it as a YAML block per the `lisa-jira-validate-ticket` schema, including `runtime_behavior_change`, `authenticated_surface`, and `artifacts_attached` flags so the right gates run.
|
|
@@ -172,7 +172,12 @@ audits the auditor without re-running it.
|
|
|
172
172
|
|
|
173
173
|
All project-tracker writes go through **`lisa-tracker-write`** so gardener
|
|
174
174
|
tickets pass the same validation gates as all factory work. Nothing is created
|
|
175
|
-
`status:ready` — the human flips.
|
|
175
|
+
`status:ready` — the human flips. Per `ready-role-filing` that hold is
|
|
176
|
+
**declared, not implied**: every gardener ticket passes
|
|
177
|
+
`human_gate: "a human decides whether this knowledge is promoted, demoted, or
|
|
178
|
+
retired"` so the writer stamps the auditable `[lisa-human-gate]` marker. An
|
|
179
|
+
omitted flag would be indistinguishable from the accidental non-ready filing
|
|
180
|
+
the rule exists to catch.
|
|
176
181
|
|
|
177
182
|
**Per-item tickets — PROMOTE / DEMOTE** (`issue_type: Task`; GitHub trackers
|
|
178
183
|
carry the `type:Task` label) — one ticket per recommendation, capped by
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lisa-linear-access
|
|
3
|
-
description: "Vendor-neutral access layer for Linear. Linear skills MUST delegate through this skill rather than calling Linear MCP tools or Linear GraphQL directly.
|
|
3
|
+
description: "Vendor-neutral access layer for Linear. Linear skills MUST delegate through this skill rather than calling Linear MCP tools or Linear GraphQL directly. Per the credential-substrate-precedence contract, resolves LINEAR_API_KEY + Linear GraphQL first — ahead of the Linear MCP — whenever the key is present and identity-matches the configured workspace/team, and falls back to the Linear MCP when the token path is unavailable. Identity-match is mandatory on both substrates."
|
|
4
4
|
allowed-tools: ["Bash", "Read", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -46,15 +46,27 @@ WORKSPACE=$(jq -r '.linear.workspace // empty' .lisa.config.json 2>/dev/null)
|
|
|
46
46
|
TEAM_KEY=$(jq -r '.linear.teamKey // empty' .lisa.config.json 2>/dev/null)
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
Probe in order
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
Probe in order — the ordering is the shared `credential-substrate-precedence`
|
|
50
|
+
contract, not a Linear-local choice. The first tier that is ready **and**
|
|
51
|
+
identity-matches wins; a substrate authenticated against a different
|
|
52
|
+
workspace/team is **skipped, never used**, at either tier.
|
|
53
|
+
|
|
54
|
+
1. **Tier 1 — configured-provider substrate: `LINEAR_API_KEY` with Linear GraphQL**
|
|
55
|
+
(`https://api.linear.app/graphql`), resolved through `lisa-secrets-access`.
|
|
56
|
+
Identity-match by querying `viewer { organization { urlKey } }` (plus
|
|
57
|
+
`teams` when `linear.teamKey` is configured) and comparing to
|
|
58
|
+
`.lisa.config.json`. A key that resolves to a different organization fails the
|
|
59
|
+
gate — warn, skip the tier, and continue down the ladder.
|
|
60
|
+
2. **Tier 2 — interactive MCP fallback: Linear MCP**, if
|
|
61
|
+
`mcp__linear-server__list_teams` is available and can list the configured
|
|
62
|
+
workspace/team (that listing *is* the identity match). Used when tier 1 is
|
|
63
|
+
genuinely unavailable: no `LINEAR_API_KEY`, no GraphQL adapter for the
|
|
64
|
+
operation, or a Linear API outage.
|
|
54
65
|
|
|
55
66
|
The Linear GraphQL docs support personal API keys for scripts and authenticate
|
|
56
|
-
with an `Authorization: <API_KEY>` header
|
|
57
|
-
|
|
67
|
+
with an `Authorization: <API_KEY>` header, so the token tier works identically on
|
|
68
|
+
a developer laptop, in CI, in a cloud routine, and in a subagent — which is why it
|
|
69
|
+
leads. If neither tier works, fail with:
|
|
58
70
|
|
|
59
71
|
```text
|
|
60
72
|
Error: no Linear access substrate available. Authenticate the Linear MCP or set LINEAR_API_KEY.
|
|
@@ -204,8 +216,16 @@ query($id:String!){
|
|
|
204
216
|
|
|
205
217
|
## Invariants
|
|
206
218
|
|
|
207
|
-
-
|
|
208
|
-
|
|
209
|
-
|
|
219
|
+
- Tier order is the shared `credential-substrate-precedence` contract:
|
|
220
|
+
`LINEAR_API_KEY` + GraphQL first when present and identity-matched, then the
|
|
221
|
+
Linear MCP. Do not restate or locally override the ordering here.
|
|
222
|
+
- The Linear MCP remains a first-class **fallback**, not a removed tier: it stays
|
|
223
|
+
the substrate whenever `LINEAR_API_KEY` is absent, the operation has no GraphQL
|
|
224
|
+
adapter, or the token path is failing.
|
|
225
|
+
- Identity-match is mandatory on **both** substrates. A substrate authenticated
|
|
226
|
+
against a different Linear organization or team is skipped, never used — that
|
|
227
|
+
includes a present-but-wrong `LINEAR_API_KEY`, which fails the gate loudly
|
|
228
|
+
instead of silently deferring to an authenticated MCP.
|
|
229
|
+
- Missing token plus missing MCP is a hard failure naming `LINEAR_API_KEY`.
|
|
210
230
|
- Mutations send only the fields being changed, matching existing Linear skill
|
|
211
231
|
guidance that `save_*` style updates should not clobber unrelated fields.
|
|
@@ -203,6 +203,11 @@ This gate never blocks a legitimate flat Task/Bug: those have no open children a
|
|
|
203
203
|
|
|
204
204
|
**Claim-time archaeology runs second — after rejection detection, still before the transition below.** Classify this Issue per the vendor-neutral `claim-archaeology` rule, with the rejection classification above as its input. All shared semantics — ancestry signals, classification, learning-loop exclusion, cost budget, candidate derivation, marker dedupe, and the never-block degrade — live in that one slug; change them there, never here. Linear wiring only: the native relations are already in the read bundle; text-similarity searches run through `lisa-linear-access operation: list-issues` filtered to recently-closed Issues; the fallback candidate comment is posted via `lisa-linear-access operation: save-comment`.
|
|
205
205
|
|
|
206
|
+
**The two `claim-time-guards` run third and fourth — still before the transition below.** Both semantics live in that one vendor-neutral slug; do not restate them here. Linear wiring only:
|
|
207
|
+
|
|
208
|
+
1. **`two-failed-attempts` valve.** Count `[lisa-build-attempt]` markers on the Issue from the read bundle's comments (match on the marker, never the title). With two or more, do **not** claim: set `stateId` to the configured blocked state via `lisa-linear-access operation: save-issue` (resolved from `linear.workflow.blocked` per `config-resolution`), post the operator-readable comment naming both attempts via `save-comment`, and **stop the cycle** at Phase 3e. Every non-success terminal outcome recorded in 3c/3d also appends a fresh `<!-- [lisa-build-attempt] n=<N> outcome=<outcome> -->` marker so the next cycle can count it.
|
|
209
|
+
2. **`already-implemented` check.** Probe for this Issue's own key — `git log --all --grep "<IDENTIFIER>"` and the merged/open PRs referencing `<IDENTIFIER>` (`gh pr list --state all --search "<IDENTIFIER>"` in the bound repo; Linear's own GitHub attachments in the read bundle are the cheaper first look). On a hit, claim as normal but route 3c to **verify-and-close** instead of `lisa-implement`: verify what shipped against the Issue's acceptance criteria, post evidence via `lisa-linear-evidence` naming the shipping PR/commit, then run the ordinary 3d transition and rollup. A partial hit implements only the remaining gap. An unreadable history degrades to "no hit" and the ordinary path proceeds — the guard never blocks the claim. This is not `DUPLICATE_ALREADY_FIXED` (a *different* canonical Issue) and not `claim-archaeology` (a *different* ancestor Issue); it is this Issue's own work already having shipped without a transition.
|
|
210
|
+
|
|
206
211
|
Transition the Issue via `lisa-linear-access operation: save-issue` by setting `stateId` to the `$CLAIMED` state. Resolve state IDs via `list-workflow-states`; a missing `$CLAIMED` state is a setup defect (see the pre-flight check) — never create one here.
|
|
207
212
|
|
|
208
213
|
**Assign to the authenticated user when the Issue is unassigned.** A claim must be attributable. If the Issue has no assignee, set its `assigneeId` to the authenticated viewer (resolve the viewer's id via the Linear MCP identity — e.g. `get_user` for the current actor) through `lisa-linear-access operation: save-issue`. Leave an already-assigned Issue's assignee untouched — never reassign work that already has an owner.
|
|
@@ -124,7 +124,9 @@ Items must be created in parent-before-child order so each child can be passed i
|
|
|
124
124
|
|
|
125
125
|
1. Invoke `lisa-linear-write-issue` for the Epic (Project). Capture the returned Project ID.
|
|
126
126
|
2. For each Story, invoke `lisa-linear-write-issue` with the Project ID as `parent_project_id`. Capture each Issue identifier.
|
|
127
|
-
3. For each Sub-task, invoke `lisa-linear-write-issue` with the Story Issue ID as `parent_issue_id`.
|
|
127
|
+
3. For each Sub-task, invoke `lisa-linear-write-issue` with the Story Issue ID as `parent_issue_id` and explicit `build_ready: true`.
|
|
128
|
+
|
|
129
|
+
- **Declare readiness on every leaf write.** Per the `ready-role-filing` rule an omitted `build_ready` is **not build-ready** on any tracker, so pass `build_ready: true` on each Sub-task (the leaf work units this skill plans) and never on the Epic or Stories, which are containers per `leaf-only-lifecycle`. A leaf that is deliberately held instead passes `human_gate: "<why a human must judge this first>"`. Filing a leaf with neither is an incomplete handoff and `lisa-linear-write-issue` rejects it.
|
|
128
130
|
|
|
129
131
|
### What to pass to each invocation
|
|
130
132
|
|
|
@@ -340,7 +340,7 @@ Each sub-task MUST:
|
|
|
340
340
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking
|
|
341
341
|
3. **Carry its own `## Source Requirement` section** (shared format above) with the full verbatim quote(s) from the Phase 1.4 register — a leaf claimed by build-intake in isolation must be self-explanatory. When a sub-task is split per-repo, every split child inherits the same requirement quote(s).
|
|
342
342
|
|
|
343
|
-
**Leaf-only build-ready (`leaf-only-lifecycle`)**: Sub-tasks are the **leaf work units** of the decomposition — they are the ONLY items in the hierarchy that receive the build-ready role. `lisa-tracker-write` applies the build-ready role here so downstream build intake (`lisa-tracker-build-intake`) claims the leaves and never the Epic or Stories. Apply the build-ready role to each Sub-task; never to its parent Story or Epic (Phases 3–4). `lisa-tracker-write` enforces the same invariant on the write side, so a Sub-task split into per-repo children (the cross-repo case above) carries build-ready on the children, not on any intermediate parent that gains child work.
|
|
343
|
+
**Leaf-only build-ready (`leaf-only-lifecycle`)**: Sub-tasks are the **leaf work units** of the decomposition — they are the ONLY items in the hierarchy that receive the build-ready role. `lisa-tracker-write` applies the build-ready role here so downstream build intake (`lisa-tracker-build-intake`) claims the leaves and never the Epic or Stories. **Pass `build_ready: true` explicitly on every Sub-task create** — per the `ready-role-filing` rule an omitted `build_ready` is NOT build-ready on any tracker, so a decomposition that relies on a vendor default silently produces a queue nothing ever claims. Apply the build-ready role to each Sub-task; never to its parent Story or Epic (Phases 3–4). `lisa-tracker-write` enforces the same invariant on the write side, so a Sub-task split into per-repo children (the cross-repo case above) carries build-ready on the children, not on any intermediate parent that gains child work.
|
|
344
344
|
|
|
345
345
|
Sub-tasks inherit their parent story's artifacts by reference (the parent link). Do not pass the same artifact list to every sub-task.
|
|
346
346
|
|
|
@@ -408,6 +408,7 @@ produces broken tickets that downstream skills (triage, journey, evidence) canno
|
|
|
408
408
|
|
|
409
409
|
For each sub-task, invoke `lisa-tracker-write` with:
|
|
410
410
|
- issue_type: "Sub-task"
|
|
411
|
+
- build_ready: true # explicit per `ready-role-filing`; omitted is NOT build-ready on any tracker
|
|
411
412
|
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
412
413
|
- parent: the parent story key
|
|
413
414
|
- project_key: [PROJECT]
|
|
@@ -31,7 +31,7 @@ Linear's data model maps Epic / Story / Sub-task to **different entity types**.
|
|
|
31
31
|
| `Bug` | **Issue** | `lisa-linear-access operation: save-issue` | `projectId` if part of an Epic; else top-level |
|
|
32
32
|
| `Spike` | **Issue** | `lisa-linear-access operation: save-issue` | `projectId` if part of an Epic; else top-level |
|
|
33
33
|
|
|
34
|
-
The build lifecycle uses native **workflow states** (`Ready`, `In Progress`, `In Review`, `Blocked`, `On Dev`, `On Stg`, `Done`), resolved per role from `linear.workflow` — see "Why Linear uses states, not labels" in `config-resolution`. A new **leaf** work unit is created in the configured `ready` state
|
|
34
|
+
The build lifecycle uses native **workflow states** (`Ready`, `In Progress`, `In Review`, `Blocked`, `On Dev`, `On Stg`, `Done`), resolved per role from `linear.workflow` — see "Why Linear uses states, not labels" in `config-resolution`. A new **leaf** work unit is created in the configured `ready` state only on explicit `build_ready: true`; omitted or `false` leaves it in the team's default backlog state, and a container is never put in `ready` at all (see the Build-ready control input below).
|
|
35
35
|
|
|
36
36
|
## Phase 1 — Resolve Intent
|
|
37
37
|
|
|
@@ -242,7 +242,7 @@ If the item modifies an existing user-facing surface, a `lisa-product-walkthroug
|
|
|
242
242
|
|
|
243
243
|
Before create/update, verify each field is populated where applicable:
|
|
244
244
|
|
|
245
|
-
- **Workflow state**: set the resolved `ready` state (`linear.workflow.ready`, default `Ready`) on a new **leaf** work unit (Bug / Task / Sub-task / Improvement with no child work) per `leaf-only-lifecycle`, **
|
|
245
|
+
- **Workflow state**: set the resolved `ready` state (`linear.workflow.ready`, default `Ready`) on a new **leaf** work unit (Bug / Task / Sub-task / Improvement with no child work) per `leaf-only-lifecycle`, **only on explicit `build_ready: true`** (see the Build-ready control input below). A container (Epic Project / Story with sub-issues / Spike) is never put in the build-ready state.
|
|
246
246
|
- **Labels**: taxonomy only — `type:<Kind>`, `repo:<name>`, `component:<name>`, and the `prd-intake-feedback` sentinel. Lifecycle is **not** a label on Linear; do not add `status:*` labels.
|
|
247
247
|
- **Native priority field**: 0–4 per Linear's scale; explicit, not "unset".
|
|
248
248
|
- **Native estimate**: per Linear's team-configured estimate scale (often 0–8 Fibonacci); skip for Epic / Spike.
|
|
@@ -254,12 +254,21 @@ For Bug / Task / Sub-task, ensure the summary is prefixed with `[<repo-name>]`.
|
|
|
254
254
|
|
|
255
255
|
### Build-ready control input (`build_ready`)
|
|
256
256
|
|
|
257
|
-
`build_ready` is
|
|
257
|
+
`build_ready` is a write-control input governed by the `ready-role-filing` rule — cite that slug for the full contract; do not restate its per-vendor normalization table here. It decides whether a **leaf** work unit is created **in the resolved `ready` workflow state**. It never overrides `leaf-only-lifecycle` — a container is never stamped build-ready regardless of `build_ready`. "Not build-ready" is not a special state: the Issue is simply left in the team's default backlog/unstarted state, which a human can promote later. This mirrors `lisa-jira-write-ticket`, because Linear is a state-driven tracker like JIRA, not a label-driven one like GitHub.
|
|
258
258
|
|
|
259
|
-
- **Omitted** →
|
|
259
|
+
- **Omitted** → **not build-ready**: the leaf is left in the team's default backlog state. Ready is an explicit claim, never a vendor default. **This is a breaking change** — Linear previously created a leaf directly in the `ready` state on omission, so a caller that relied on that must now pass `build_ready: true`.
|
|
260
260
|
- **`build_ready: false`** → create the leaf **without** the `ready` state, leaving it in the team's default backlog state so it waits for a human to review and promote it into the queue.
|
|
261
261
|
- **`build_ready: true`** → transition the **leaf** to the resolved `ready` state (`.linear.workflow.ready`) so `lisa-intake` / `lisa-linear-build-intake` auto-picks it up. Best-effort: if the state cannot be resolved or the transition is rejected, do not fail the write — leave the Issue in its default state and record the reason.
|
|
262
262
|
|
|
263
|
+
**A filing with neither is an incomplete handoff.** A leaf that is not build-ready must carry an explicit `human_gate: "<why a human must judge this first>"`; nothing in the ready lane means nothing ever claims it. When `human_gate` is supplied, stamp the hold on the Issue so it is auditable — a visible line plus the verbatim marker:
|
|
264
|
+
|
|
265
|
+
```text
|
|
266
|
+
Held for a human product call: <reason>.
|
|
267
|
+
<!-- [lisa-human-gate] reason=<short-slug> -->
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
If a leaf arrives with `build_ready` omitted or `false` **and** no `human_gate`, do not create it: report the incomplete handoff and name both ways to resolve it (`build_ready: true`, or a `human_gate` reason). Containers are exempt — their state rolls up from children, so they need neither.
|
|
271
|
+
|
|
263
272
|
## Phase 5.5 — Validate (Pre-write Gate)
|
|
264
273
|
|
|
265
274
|
Before any write, invoke `lisa-linear-validate-issue` with the full proposed spec assembled from Phases 2 / 3 / 4 / 5. Pass it as a YAML block per the `lisa-linear-validate-issue` schema, including `runtime_behavior_change`, `authenticated_surface`, and `artifacts_attached` flags so the right gates run.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lisa-notion-access
|
|
3
|
-
description: "Vendor-neutral access layer for Notion. Every notion-* skill MUST delegate through this skill rather than invoking the Notion REST API or any Notion MCP directly.
|
|
3
|
+
description: "Vendor-neutral access layer for Notion. Every notion-* skill MUST delegate through this skill rather than invoking the Notion REST API or any Notion MCP directly. Per the credential-substrate-precedence contract, resolves a substrate per operation in this order: (1) curl + Bearer auth + internal-integration token when the token is present and identity-matches the configured workspace, (2) Notion MCP as fallback if authenticated and the configured prdDatabaseId is fetchable through it. Verifies the active connection matches `.lisa.config.json` before every operation — substrates authenticated as a different Notion workspace are skipped, not used."
|
|
4
4
|
allowed-tools: ["Bash", "Read", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -38,20 +38,15 @@ DB_ID=$(jq -r '.notion.prdDatabaseId // empty' .lisa.config.json)
|
|
|
38
38
|
[ -z "$DB_ID" ] && { echo "Error: notion.prdDatabaseId not set. Run /lisa:setup:notion." >&2; exit 1; }
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
Probe each tier in order; the first that's ready AND identity-matches is the substrate for this operation. Identity-match is verified before any operation; substrates authenticated as a different workspace are skipped, not used.
|
|
41
|
+
Probe each tier in order; the first that's ready AND identity-matches is the substrate for this operation. The ordering is the shared `credential-substrate-precedence` contract — the configured-provider token substrate leads, the interactive MCP is the fallback — not a Notion-local choice. Identity-match is verified before any operation; substrates authenticated as a different workspace are skipped, not used, at **every** tier.
|
|
42
42
|
|
|
43
43
|
```bash
|
|
44
44
|
substrate=""
|
|
45
45
|
|
|
46
|
-
# Tier 1:
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
if mcp_notion_can_fetch_database "$DB_ID"; then
|
|
51
|
-
substrate="mcp"
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
# Tier 2: curl + API token
|
|
46
|
+
# Tier 1: curl + API token — the configured-provider substrate, resolved through
|
|
47
|
+
# lisa-secrets-access. Leads because it is identical on a laptop, in CI, in a cloud
|
|
48
|
+
# routine, and in a subagent, and because its workspace binding travels with the
|
|
49
|
+
# request instead of coming from ambient browser-session state.
|
|
55
50
|
read_notion_token() {
|
|
56
51
|
local workspace="$1"
|
|
57
52
|
[ -n "$NOTION_API_TOKEN" ] && { echo "$NOTION_API_TOKEN"; return; }
|
|
@@ -120,12 +115,28 @@ if [ -n "$TOKEN" ]; then
|
|
|
120
115
|
"https://api.notion.com/v1/users/me")
|
|
121
116
|
me_workspace=$(echo "$me" | jq -r '.bot.workspace_name // .bot.workspace_id // empty')
|
|
122
117
|
if [ -n "$me_workspace" ] && [ "$me_workspace" = "$WORKSPACE" ]; then
|
|
123
|
-
|
|
118
|
+
substrate="curl"
|
|
124
119
|
elif [ -n "$me_workspace" ]; then
|
|
120
|
+
# A present-but-wrong token fails the gate rather than deferring to the MCP.
|
|
121
|
+
# Silently succeeding through an MCP authenticated elsewhere is the exact bug
|
|
122
|
+
# the precedence contract exists to surface.
|
|
125
123
|
echo "Warning: Notion token belongs to workspace '$me_workspace' but config declares '$WORKSPACE'. Skipping curl tier." >&2
|
|
126
124
|
fi
|
|
127
125
|
fi
|
|
128
126
|
|
|
127
|
+
# Tier 2: Notion MCP — first-class fallback, used when tier 1 is genuinely
|
|
128
|
+
# unavailable (no token, no curl adapter for the operation, or Notion API outage).
|
|
129
|
+
# Identity-matched by fetching the configured PRD database.
|
|
130
|
+
# Pseudo-code; actual call is the MCP tool invocation.
|
|
131
|
+
# Try to fetch DB_ID through the MCP. Success → MCP is authed to the right workspace.
|
|
132
|
+
# 404 / object_not_found → MCP is authed elsewhere (or unauthenticated). Skip.
|
|
133
|
+
if mcp_notion_can_fetch_database "$DB_ID"; then
|
|
134
|
+
: ${substrate:=mcp}
|
|
135
|
+
# Mark the MCP available even when curl already won tier 1 — the dispatch table
|
|
136
|
+
# falls through to it for operations curl has no adapter for.
|
|
137
|
+
mcp_available=true
|
|
138
|
+
fi
|
|
139
|
+
|
|
129
140
|
# Fail loudly with actionable remediation if nothing works.
|
|
130
141
|
if [ -z "$substrate" ]; then
|
|
131
142
|
# Detect plugin enablement state for the suggestion.
|
|
@@ -136,14 +147,19 @@ if [ -z "$substrate" ]; then
|
|
|
136
147
|
cat >&2 <<EOF
|
|
137
148
|
Error: no Notion access substrate available for workspace '$WORKSPACE'.
|
|
138
149
|
|
|
139
|
-
Attempted:
|
|
140
|
-
MCP — $([ "$plugin_enabled_global" = "true" ] || [ "$plugin_enabled_project" = "true" ] || [ "$plugin_enabled_local" = "true" ] && echo "plugin enabled but not authenticated or cannot fetch configured prdDatabaseId" || echo "plugin not enabled in any settings.json scope")
|
|
150
|
+
Attempted (in credential-substrate-precedence order):
|
|
141
151
|
curl — no NOTION_API_TOKEN found for $WORKSPACE (env, slug-suffixed env, or keychain) OR token belongs to a different workspace
|
|
152
|
+
MCP — $([ "$plugin_enabled_global" = "true" ] || [ "$plugin_enabled_project" = "true" ] || [ "$plugin_enabled_local" = "true" ] && echo "plugin enabled but not authenticated or cannot fetch configured prdDatabaseId" || echo "plugin not enabled in any settings.json scope")
|
|
153
|
+
|
|
154
|
+
Remediation paths (the first is the contract's primary path):
|
|
142
155
|
|
|
143
|
-
|
|
156
|
+
1. Provision an internal-integration API token — works headless, in CI, and in
|
|
157
|
+
multi-workspace setups, and is the substrate this project resolves first.
|
|
144
158
|
|
|
145
|
-
|
|
146
|
-
|
|
159
|
+
Run /lisa:setup:notion — guided flow with clipboard-piped keychain store.
|
|
160
|
+
|
|
161
|
+
2. Install the Notion MCP plugin (local scope — per-developer, gitignored).
|
|
162
|
+
The supported fallback when no credentials provider is configured.
|
|
147
163
|
|
|
148
164
|
Run in your terminal:
|
|
149
165
|
|
|
@@ -157,10 +173,6 @@ Remediation paths (pick one):
|
|
|
157
173
|
Also share the configured prdDatabaseId with the integration via
|
|
158
174
|
the page's '•••' menu → Connections.
|
|
159
175
|
|
|
160
|
-
2. Provision an internal-integration API token (headless / CI / multi-workspace).
|
|
161
|
-
|
|
162
|
-
Run /lisa:setup:notion — guided flow with clipboard-piped keychain store.
|
|
163
|
-
|
|
164
176
|
EOF
|
|
165
177
|
exit 1
|
|
166
178
|
fi
|
|
@@ -225,14 +237,15 @@ exec_op() {
|
|
|
225
237
|
## Invariants
|
|
226
238
|
|
|
227
239
|
- Caller skills never call `curl https://api.notion.com/...` or any `mcp__*notion*` tool directly. They invoke this skill via the Skill tool with an operation name and arguments.
|
|
228
|
-
- Substrate is selected per skill invocation following the tier ladder. The first tier that's available AND identity-matches `notion.workspaceId` wins.
|
|
229
|
-
- The
|
|
240
|
+
- Substrate is selected per skill invocation following the tier ladder defined by the shared `credential-substrate-precedence` contract — internal-integration token first, Notion MCP as fallback. The first tier that's available AND identity-matches `notion.workspaceId` wins. Do not restate or locally override the ordering here.
|
|
241
|
+
- The Notion MCP stays a first-class fallback, not a removed tier: it is the substrate whenever no token is configured, the operation has no curl adapter, or the Notion API is failing.
|
|
242
|
+
- The connection-match check is mandatory at every tier. Skipping it (because "the user obviously meant this workspace") is forbidden — silent cross-workspace operations are exactly the multi-account hazard this design exists to prevent. A present-but-wrong token fails the gate rather than deferring to an MCP authenticated somewhere else.
|
|
230
243
|
- API tokens never mutate. If the configured workspace's token is wrong or missing, fail loudly and tell the user to run `/lisa:setup:notion`.
|
|
231
244
|
- `Notion-Version` is pinned to `2022-06-28` — the version every existing notion-* skill targets. Bumping it is a coordinated change across the access skill and all callers.
|
|
232
245
|
|
|
233
246
|
## Headless behavior
|
|
234
247
|
|
|
235
|
-
In a headless / non-interactive context (no TTY, `CI=true`, or `-p` mode), the MCP tier is unavailable (its OAuth flow needs a browser)
|
|
248
|
+
In a headless / non-interactive context (no TTY, `CI=true`, or `-p` mode), the MCP tier is unavailable (its OAuth flow needs a browser) and the ladder collapses to curl + `NOTION_API_TOKEN` — which is already tier 1 interactively. That is the point of the ordering: headless and interactive sessions take the **same primary path**, so a credential problem reproduces on a laptop instead of only in cron (`credential-substrate-precedence`, "headless parity"). Same skill code runs identically; only the availability of the fallback changes.
|
|
236
249
|
|
|
237
250
|
## Per-page sharing prerequisite
|
|
238
251
|
|
|
@@ -342,7 +342,7 @@ Each sub-task MUST:
|
|
|
342
342
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking
|
|
343
343
|
3. **Carry its own `## Source Requirement` section** (shared format above) with the full verbatim quote(s) from the Phase 1.4 register — a leaf claimed by build-intake in isolation must be self-explanatory. When a sub-task is split per-repo, every split child inherits the same requirement quote(s).
|
|
344
344
|
|
|
345
|
-
**Leaf-only build-ready (`leaf-only-lifecycle`)**: Sub-tasks are the **leaf work units** of the decomposition — they are the ONLY items in the hierarchy that receive the build-ready role. `lisa-tracker-write` applies the build-ready role here so downstream build intake (`lisa-tracker-build-intake`) claims the leaves and never the Epic or Stories. Apply the build-ready role to each Sub-task; never to its parent Story or Epic (Phases 3–4). `lisa-tracker-write` enforces the same invariant on the write side, so a Sub-task split into per-repo children (the cross-repo case above) carries build-ready on the children, not on any intermediate parent that gains child work.
|
|
345
|
+
**Leaf-only build-ready (`leaf-only-lifecycle`)**: Sub-tasks are the **leaf work units** of the decomposition — they are the ONLY items in the hierarchy that receive the build-ready role. `lisa-tracker-write` applies the build-ready role here so downstream build intake (`lisa-tracker-build-intake`) claims the leaves and never the Epic or Stories. **Pass `build_ready: true` explicitly on every Sub-task create** — per the `ready-role-filing` rule an omitted `build_ready` is NOT build-ready on any tracker, so a decomposition that relies on a vendor default silently produces a queue nothing ever claims. Apply the build-ready role to each Sub-task; never to its parent Story or Epic (Phases 3–4). `lisa-tracker-write` enforces the same invariant on the write side, so a Sub-task split into per-repo children (the cross-repo case above) carries build-ready on the children, not on any intermediate parent that gains child work.
|
|
346
346
|
|
|
347
347
|
**Verification plan examples by stack:**
|
|
348
348
|
- **Backend APIs**: curl GraphQL/REST calls with auth token, database queries, checking audit entries
|
|
@@ -426,6 +426,7 @@ produces broken tickets that downstream skills (triage, journey, evidence) canno
|
|
|
426
426
|
|
|
427
427
|
For each sub-task, invoke `lisa-tracker-write` with:
|
|
428
428
|
- issue_type: "Sub-task"
|
|
429
|
+
- build_ready: true # explicit per `ready-role-filing`; omitted is NOT build-ready on any tracker
|
|
429
430
|
- parent: the parent story key
|
|
430
431
|
- project_key: [PROJECT]
|
|
431
432
|
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
@@ -112,7 +112,7 @@ This disposition completes the SLL-5 loop (#1583): on a Lisa-attributed failure
|
|
|
112
112
|
|
|
113
113
|
Resolve the upstream repo from `.lisa.config.json` `hardening.upstreamRepo` (default `CodySwannGT/lisa`). Search **all issue states** for an existing issue carrying the marker — a closed marker-bearing ticket still owns this root cause, and searching only open issues would mint a duplicate the moment the original closes. Match on the **MARKER, never the title** — with the same eventual-consistency guard as above (`gh issue list -R <upstream> --state all --search '"<marker>" in:body' --json number,state,url`, and when the search index returns nothing, also `gh issue list -R <upstream> --state all --json number,state,body` and grep the bodies for the marker before concluding no ticket exists).
|
|
114
114
|
|
|
115
|
-
- **No existing ticket** → compose the body EXCLUSIVELY through the executable builder, then file its stdout verbatim via `lisa-github-write-issue` targeting the upstream repo with the `self-hardening` label:
|
|
115
|
+
- **No existing ticket** → compose the body EXCLUSIVELY through the executable builder, then file its stdout verbatim via `lisa-github-write-issue` targeting the upstream repo with the `self-hardening` label and explicit `build_ready: true` (per `ready-role-filing`; the upstream repo runs its own build queue off the ready role, and an omitted flag would strand the hardening ticket there):
|
|
116
116
|
|
|
117
117
|
```bash
|
|
118
118
|
bunx @codyswann/lisa file-upstream --input filing-event.json # or pipe the JSON on stdin
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lisa-posthog-access
|
|
3
|
-
description: "Vendor-neutral access layer for PostHog. PostHog skills and observability rules MUST delegate through this skill rather than calling PostHog MCP tools or REST directly.
|
|
3
|
+
description: "Vendor-neutral access layer for PostHog. PostHog skills and observability rules MUST delegate through this skill rather than calling PostHog MCP tools or REST directly. Per the credential-substrate-precedence contract, resolves POSTHOG_PERSONAL_API_KEY bearer auth first when present and identity-matched to the configured project, then falls back to the PostHog MCP."
|
|
4
4
|
allowed-tools: ["Bash", "Read", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -22,13 +22,21 @@ Return parsed JSON in a `<result>` block.
|
|
|
22
22
|
|
|
23
23
|
## Substrate Selection
|
|
24
24
|
|
|
25
|
-
Probe in order
|
|
25
|
+
Probe in order — the ordering is the shared `credential-substrate-precedence`
|
|
26
|
+
contract, not a PostHog-local choice. The first tier that is ready **and**
|
|
27
|
+
identity-matches the configured project is used; a substrate authenticated against
|
|
28
|
+
a different project is skipped, never used.
|
|
26
29
|
|
|
27
|
-
1.
|
|
28
|
-
|
|
30
|
+
1. **Tier 1 — configured-provider substrate: `POSTHOG_PERSONAL_API_KEY`** bearer
|
|
31
|
+
token against the configured PostHog host, resolved through
|
|
32
|
+
`lisa-secrets-access`.
|
|
33
|
+
2. **Tier 2 — interactive MCP fallback: PostHog MCP**, if available and
|
|
34
|
+
authenticated. Used when tier 1 is genuinely unavailable: no
|
|
35
|
+
`POSTHOG_PERSONAL_API_KEY`, no REST adapter for the operation, or a PostHog
|
|
36
|
+
outage.
|
|
29
37
|
|
|
30
|
-
PostHog documents personal API keys and bearer authentication
|
|
31
|
-
tier uses:
|
|
38
|
+
PostHog documents personal API keys and bearer authentication, and the same key
|
|
39
|
+
works interactively and headlessly — which is why it leads. The REST tier uses:
|
|
32
40
|
|
|
33
41
|
```bash
|
|
34
42
|
POSTHOG_HOST=${POSTHOG_HOST:-https://app.posthog.com}
|
|
@@ -54,7 +62,9 @@ Error: no PostHog access substrate available. Authenticate the PostHog MCP or se
|
|
|
54
62
|
|
|
55
63
|
## Invariants
|
|
56
64
|
|
|
57
|
-
-
|
|
65
|
+
- Tier order is `credential-substrate-precedence`: `POSTHOG_PERSONAL_API_KEY`
|
|
66
|
+
first, the PostHog MCP as a preserved first-class fallback. Identity-match
|
|
67
|
+
against the configured project is mandatory on every tier.
|
|
58
68
|
- `POSTHOG_HOST` defaults to PostHog Cloud but can point at a self-hosted
|
|
59
69
|
deployment.
|
|
60
70
|
- Consumer skills do not embed PostHog REST paths.
|
|
@@ -48,8 +48,10 @@ ideation_ledger_payload: # optional; forwarded unchanged to the ven
|
|
|
48
48
|
- **`ready`** → the PRD is created in the source's `ready` PRD role (`prd-ready`), so the PRD-side of
|
|
49
49
|
`lisa-intake` / the `*-prd-intake` scanner auto-claims it on the next cycle.
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
Omitted means `draft` — the not-ready default. This matches the ticket-side `build_ready` contract
|
|
52
|
+
in `ready-role-filing`: on both sides of the pipeline, entering a queue is an **explicit claim** and
|
|
53
|
+
omission is the safe direction. (The ticket side reached that position by removing a per-vendor
|
|
54
|
+
legacy default; the PRD side never had one to remove.)
|
|
53
55
|
|
|
54
56
|
## Workflow
|
|
55
57
|
|
|
@@ -20,7 +20,9 @@ plus any screenshots).
|
|
|
20
20
|
recently-closed tickets in the affected area, and the current QA-queue set. If an existing ticket
|
|
21
21
|
covers it, that ticket is the target — update it, never file a twin. Only when the
|
|
22
22
|
search documents no match, create a new Bug via `lisa-tracker-write` (which enforces
|
|
23
|
-
the full quality gates)
|
|
23
|
+
the full quality gates) with explicit `build_ready: true` per the `ready-role-filing`
|
|
24
|
+
rule — omitted is NOT build-ready on any tracker, and a rework Bug nothing claims is
|
|
25
|
+
an incomplete handoff — and treat it as the target. Report which path was taken.
|
|
24
26
|
|
|
25
27
|
## Phase 2 — Structured failure report
|
|
26
28
|
|
|
@@ -752,6 +752,34 @@ with labels like `build-ready`, or with no Lisa status label at all, that are in
|
|
|
752
752
|
applied. Include the normalization result in the loop-prevention fingerprint so repeated repair
|
|
753
753
|
cycles do not spam comments.
|
|
754
754
|
|
|
755
|
+
### Ungated non-ready filing → surface as an incomplete handoff (read-only)
|
|
756
|
+
|
|
757
|
+
The recovery net for the failure `ready-role-filing` prevents: an agent files a real defect it found
|
|
758
|
+
during other work, never gives it the ready role, and the ticket sits forever because build-intake
|
|
759
|
+
scans the ready lane and nothing else. Under that rule every filing declares either
|
|
760
|
+
`build_ready: true` or a `human_gate` reason; an item carrying neither is an **incomplete handoff**.
|
|
761
|
+
|
|
762
|
+
1. Enumerate open items filed recently (within the configured staleness window — same resolution as
|
|
763
|
+
every other candidate class) that are **not** in the configured `ready` role for their lifecycle
|
|
764
|
+
and are not in a claimed / blocked / terminal role either. On GitHub that is the absence of the
|
|
765
|
+
configured build `ready` label; on JIRA and Linear it is a status/state outside the configured
|
|
766
|
+
`ready` role. Items whose role is simply "the tracker's default created lane" are the target.
|
|
767
|
+
2. Exclude anything carrying the `[lisa-human-gate]` marker — those are deliberate holds and the rule
|
|
768
|
+
ratifies them. Exclude containers (their state rolls up per `leaf-only-lifecycle`), and exclude
|
|
769
|
+
`[lisa-exploratory-qa]`-marked findings, which are the rule's **named** human-gate exception even
|
|
770
|
+
on an older item written before the marker existed.
|
|
771
|
+
3. **Report each survivor read-only; never promote it.** Name the item, when it was filed, and what
|
|
772
|
+
filed it, and state the two ways to resolve it — flip it to the configured `ready` role, or mark
|
|
773
|
+
it as a deliberate human gate. A filing whose readiness nobody declared is exactly the input the
|
|
774
|
+
gate model says a human should see, so guessing "it was probably meant to be ready" would
|
|
775
|
+
re-introduce the accidental-queue-entry failure this rule exists to eliminate.
|
|
776
|
+
4. Post at most one idempotent `[lisa-repair-intake]` note per item and include the finding in the
|
|
777
|
+
loop-prevention fingerprint so repeated cycles do not spam.
|
|
778
|
+
|
|
779
|
+
This is distinct from the GitHub label-normalization repair above, which targets items carrying **no
|
|
780
|
+
Lisa lifecycle label at all** (created by older tools or by hand) and does normalize them. This sweep
|
|
781
|
+
targets items inside the Lisa lifecycle whose readiness was never declared.
|
|
782
|
+
|
|
755
783
|
## Blocker classification & clearing (conservative, vendor-specific extraction)
|
|
756
784
|
|
|
757
785
|
A `blocked` build item is held by one or more of three blocker classes. Identify which are present
|
|
@@ -96,8 +96,8 @@ Lisa work item.
|
|
|
96
96
|
|---------------|-------------|--------|
|
|
97
97
|
| `decomposition-infidelity` | **Upstream Lisa issue** | The decomposition pipeline produced an unfaithful ticket and every gate passed it — that is a harness defect. File per "Filing upstream" below, citing the PRD text, the distorted ticket AC, and which gate should have caught it. |
|
|
98
98
|
| `verification-gap` | **Upstream Lisa issue** | The verification lifecycle passed work it should have failed. File per "Filing upstream", citing the missed failure class and the weak/missing codified test. |
|
|
99
|
-
| `missing-tool-access` | Project tracker | Create a provisioning ticket via `lisa-tracker-write` (`issue_type: Task`, labeled `type:tooling`) describing the missing tool/credential/environment and which flow needs it. Link it `blocks` the rework ticket. |
|
|
100
|
-
| `environment-data` | Project tracker | Create an environment-hardening ticket via `lisa-tracker-write` citing the drift/fixture/shared-state evidence. Link `relates to` the rework ticket. |
|
|
99
|
+
| `missing-tool-access` | Project tracker | Create a provisioning ticket via `lisa-tracker-write` (`issue_type: Task`, labeled `type:tooling`) describing the missing tool/credential/environment and which flow needs it. Link it `blocks` the rework ticket. Pass `human_gate: "a human must grant the missing access"` per `ready-role-filing` — the factory cannot provision its own credentials, so this is a declared gate rather than an unclaimed filing. |
|
|
100
|
+
| `environment-data` | Project tracker | Create an environment-hardening ticket via `lisa-tracker-write` citing the drift/fixture/shared-state evidence. Link `relates to` the rework ticket. Pass `build_ready: true` when the hardening is a code/fixture change the factory can make, or `human_gate: "<the shared-environment decision a human owns>"` when it is not — per `ready-role-filing`, never neither. |
|
|
101
101
|
| `prd-defect` | Source PRD | Comment on the PRD (via the `lisa-prd-backlink` lineage) quoting the defective requirement and the QA failure; flag for product review. Do NOT silently edit the PRD — spec changes are a human gate. |
|
|
102
102
|
| `implementation-defect` (no secondary) | None | Normal fix path; the classification comment is the record. Pass the pattern to the `learner` phase — repeated implementation defects of the same shape escalate to `verification-gap`. |
|
|
103
103
|
|
|
@@ -10,6 +10,14 @@ Single chokepoint for reading credentials. Caller skills MUST go through this
|
|
|
10
10
|
|
|
11
11
|
The rule this exists to enforce: **a secret lives in exactly one store.** Every local cache is a copy that will eventually drift from its source, and a drifted copy is indistinguishable from a valid one until something fails in production.
|
|
12
12
|
|
|
13
|
+
This skill is also the chokepoint that feeds **tier 1** of the shared
|
|
14
|
+
`credential-substrate-precedence` contract: every `*-access` skill resolves its
|
|
15
|
+
configured-provider token or CLI credential here, ahead of any interactive MCP. That
|
|
16
|
+
is what makes "provider-first" actionable rather than aspirational — including the
|
|
17
|
+
`tool:` note line below, which declares which CLI a given credential is expected to
|
|
18
|
+
drive. This skill decides *where a credential comes from*; it never decides substrate
|
|
19
|
+
ordering, which is settled once in that contract.
|
|
20
|
+
|
|
13
21
|
## Two axes, not one
|
|
14
22
|
|
|
15
23
|
A **provider** is where secrets live. A **surface** is where the running code lives, and it determines how secrets reach that code. These are independent: the same Bitwarden project serves a laptop, a CI runner, and a remote agent container, but each obtains its values differently.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lisa-sentry-access
|
|
3
|
-
description: "Vendor-neutral access layer for Sentry. Sentry-oriented skills MUST delegate through this skill rather than calling Sentry MCP tools, sentry-cli, or REST directly.
|
|
3
|
+
description: "Vendor-neutral access layer for Sentry. Sentry-oriented skills MUST delegate through this skill rather than calling Sentry MCP tools, sentry-cli, or REST directly. Per the credential-substrate-precedence contract, resolves SENTRY_AUTH_TOKEN (REST, or sentry-cli authenticated from the same token) first when present and identity-matched to the configured org/project, then falls back to the Sentry MCP."
|
|
4
4
|
allowed-tools: ["Bash", "Read", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -22,13 +22,21 @@ Return parsed JSON in a `<result>` block.
|
|
|
22
22
|
|
|
23
23
|
## Substrate Selection
|
|
24
24
|
|
|
25
|
-
Probe in order
|
|
25
|
+
Probe in order — the ordering is the shared `credential-substrate-precedence`
|
|
26
|
+
contract, not a Sentry-local choice. The first tier that is ready **and**
|
|
27
|
+
identity-matches the configured org/project is used; a substrate authenticated
|
|
28
|
+
against a different org is skipped, never used.
|
|
26
29
|
|
|
27
|
-
1.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
1. **Tier 1 — configured-provider substrate: `SENTRY_AUTH_TOKEN`** bearer token
|
|
31
|
+
against Sentry REST, resolved through `lisa-secrets-access`.
|
|
32
|
+
2. **Tier 1a — `sentry-cli`**, if installed and authenticated to the requested
|
|
33
|
+
org/project from that same token (the CLI arm of the provider substrate).
|
|
34
|
+
3. **Tier 2 — interactive MCP fallback: Sentry MCP**, if available and
|
|
35
|
+
authenticated. Used when tier 1 is genuinely unavailable: no
|
|
36
|
+
`SENTRY_AUTH_TOKEN`, no REST/CLI adapter for the operation, or a Sentry outage.
|
|
30
37
|
|
|
31
|
-
Sentry documents API auth tokens for REST API calls
|
|
38
|
+
Sentry documents API auth tokens for REST API calls, and the same token works
|
|
39
|
+
interactively and headlessly — which is why it leads. The REST tier uses:
|
|
32
40
|
|
|
33
41
|
```bash
|
|
34
42
|
sentry_api() {
|
|
@@ -50,7 +58,9 @@ Error: no Sentry access substrate available. Authenticate Sentry MCP/CLI or set
|
|
|
50
58
|
|
|
51
59
|
## Invariants
|
|
52
60
|
|
|
53
|
-
-
|
|
61
|
+
- Tier order is `credential-substrate-precedence`: `SENTRY_AUTH_TOKEN` first, the
|
|
62
|
+
Sentry MCP as a preserved first-class fallback. Identity-match against the
|
|
63
|
+
configured org/project is mandatory on every tier.
|
|
54
64
|
- Org/project come from `.sentryclirc`, `.lisa.config.json`, or explicit
|
|
55
65
|
operation args; never infer by searching all accessible orgs.
|
|
56
66
|
- Consumer skills do not embed Sentry REST paths.
|
|
@@ -15,7 +15,13 @@ this skill owns the tool selection.
|
|
|
15
15
|
There is exactly one substrate: the **official SonarQube MCP server**, provided by
|
|
16
16
|
the `sonarqube` plugin and launched by the `sonar` CLI (`sonar run mcp`). It
|
|
17
17
|
authenticates headlessly from environment variables — no browser, no OS keychain —
|
|
18
|
-
so it is the same substrate on a developer machine and in a headless cloud routine
|
|
18
|
+
so it is the same substrate on a developer machine and in a headless cloud routine.
|
|
19
|
+
|
|
20
|
+
That makes this skill conformant with `credential-substrate-precedence` as a
|
|
21
|
+
single-substrate access layer: this MCP **is** the configured-provider substrate
|
|
22
|
+
(it is token-authenticated, not browser-OAuth), so there is no interactive tier to
|
|
23
|
+
demote and no second REST tier to add. Identity-match against the configured org
|
|
24
|
+
remains mandatory, as on every substrate.
|
|
19
25
|
|
|
20
26
|
- `SONARQUBE_CLI_TOKEN` — required (Sonar user/analysis token).
|
|
21
27
|
- `SONARQUBE_CLI_ORG` — required for SonarQube Cloud.
|
|
@@ -83,4 +83,5 @@ If the canonical fix is merged but not yet on the production branch, the close c
|
|
|
83
83
|
- **Leaf-only dispatch, every vendor.** Per the `leaf-only-lifecycle` rule, each vendor scanner dispatches leaf work units only and moves or safe-blocks a container (open child work, or a childless Epic) carrying a stale build-ready role according to its lifecycle semantics. This shim does not re-implement the gate — it relies on the vendor scanner's Phase 3a — but the contract is uniform across `jira`, `github`, and `linear` so behavior never drifts by tracker.
|
|
84
84
|
- **Terminal native closure, every capable vendor.** Per the same rule, each vendor scanner finalizes native open/closed state only at the true terminal `done` value. This shim never performs native closure itself, but callers can rely on the dispatched vendor scanner to apply the contract.
|
|
85
85
|
- **Duplicate already fixed, every vendor.** Auto-close without a PR is allowed only for `DUPLICATE_ALREADY_FIXED` with canonical reference and empirical base-branch evidence. Do not conflate this with `BLOCKED`.
|
|
86
|
+
- **Claim-time guards, every vendor.** Per the `claim-time-guards` rule, each vendor scanner runs both guards inside its Phase 3b before the claim transition: an item whose own key already appears in git history or an open/merged PR routes to **verify-and-close** rather than being built twice, and the **`two-failed-attempts`** valve moves an item with two `[lisa-build-attempt]` markers to the configured blocked role and stops the cycle. This shim does not re-implement either guard; it forwards the contract so behavior never drifts by tracker.
|
|
86
87
|
- Never run two intake cycles concurrently against overlapping queues — the scheduling layer is responsible for serialization.
|
|
@@ -24,4 +24,5 @@ See the `config-resolution` rule for configuration and dispatch table.
|
|
|
24
24
|
## Rules
|
|
25
25
|
|
|
26
26
|
- All vendor skills delegate every individual ticket write through `lisa-tracker-write`. They never call vendor-specific write tools directly.
|
|
27
|
+
- **Declare readiness on every leaf write.** Per the `ready-role-filing` rule an omitted `build_ready` is **not build-ready** on any tracker, so pass `build_ready: true` on each Sub-task (the leaf work units this skill plans) and never on the Epic or Stories, which are containers per `leaf-only-lifecycle`. A leaf that is deliberately held instead passes `human_gate: "<why a human must judge this first>"`. Filing a leaf with neither is an incomplete handoff and `lisa-tracker-write` rejects it.
|
|
27
28
|
- This shim is for ad-hoc creation from code files / descriptions. PRD-driven creation goes through the `*-to-tracker` skills (notion / confluence / linear / github).
|
|
@@ -52,3 +52,4 @@ See the `config-resolution` rule for the full configuration schema and skill-map
|
|
|
52
52
|
- Never accept a tracker value outside `{jira, github, linear}`.
|
|
53
53
|
- Never mutate `$ARGUMENTS` between layers. The vendor skills define their own input contract.
|
|
54
54
|
- Never inline gate logic here. All validation rules live in the vendor skills (`lisa-jira-validate-ticket` / `lisa-github-validate-issue` / `lisa-linear-validate-issue`); this skill only routes.
|
|
55
|
+
- **Readiness is the caller's explicit claim, not this shim's default.** Per the `ready-role-filing` rule, an omitted `build_ready` is **not build-ready** on every vendor, so a caller filing work it expects build-intake to pick up must pass `build_ready: true`, and a caller deliberately holding work outside the queue must pass a `human_gate` reason. This shim normalizes nothing — it forwards `$ARGUMENTS` verbatim and the vendor writers enforce the contract — which is exactly why the caller cannot rely on a vendor default here.
|