@codyswann/lisa 2.352.0 → 3.0.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 +70 -43
- 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/maestro-e2e.yml +10 -1
- package/expo/create-only/.github/workflows/nightly-e2e-health.yml +5 -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-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-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 +34 -0
- 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-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-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-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-validate-tracker-mapping/SKILL.md +33 -4
- 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/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/config-resolution.md +7 -0
- package/plugins/lisa/rules/reference/ready-role-filing.md +66 -0
- package/plugins/lisa/scripts/queue-contract-resolution.mjs +50 -1
- package/plugins/lisa/skills/lisa-agent-ready/SKILL.md +5 -3
- 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-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 +34 -0
- 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-to-tracker/SKILL.md +2 -1
- package/plugins/lisa/skills/lisa-persist-learning/SKILL.md +1 -1
- 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-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-validate-tracker-mapping/SKILL.md +33 -4
- package/plugins/lisa/skills/lisa-verify/SKILL.md +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/scripts/queue-contract-resolution.mjs +50 -1
- package/plugins/lisa-agy/skills/lisa-agent-ready/SKILL.md +5 -3
- 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-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 +34 -0
- 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-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-agy/skills/lisa-persist-learning/SKILL.md +1 -1
- 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-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-validate-tracker-mapping/SKILL.md +33 -4
- 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/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/config-resolution.md +7 -0
- package/plugins/lisa-copilot/rules/reference/ready-role-filing.md +66 -0
- package/plugins/lisa-copilot/scripts/queue-contract-resolution.mjs +50 -1
- package/plugins/lisa-copilot/skills/lisa-agent-ready/SKILL.md +5 -3
- 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-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 +34 -0
- 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-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-copilot/skills/lisa-persist-learning/SKILL.md +1 -1
- 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-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-validate-tracker-mapping/SKILL.md +33 -4
- 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/config-resolution-reference.mdc +7 -0
- 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/scripts/queue-contract-resolution.mjs +50 -1
- package/plugins/lisa-cursor/skills/lisa-agent-ready/SKILL.md +5 -3
- 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-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 +34 -0
- 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-to-tracker/SKILL.md +2 -1
- package/plugins/lisa-cursor/skills/lisa-persist-learning/SKILL.md +1 -1
- 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-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-validate-tracker-mapping/SKILL.md +33 -4
- 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/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/config-resolution.md +7 -0
- package/plugins/src/base/rules/reference/ready-role-filing.md +66 -0
- package/plugins/src/base/scripts/queue-contract-resolution.mjs +50 -1
- package/plugins/src/base/skills/lisa-agent-ready/SKILL.md +5 -3
- 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-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 +34 -0
- 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-to-tracker/SKILL.md +2 -1
- package/plugins/src/base/skills/lisa-persist-learning/SKILL.md +1 -1
- 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-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-validate-tracker-mapping/SKILL.md +33 -4
- package/plugins/src/base/skills/lisa-verify/SKILL.md +1 -1
- package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +76 -10
|
@@ -50,6 +50,11 @@ import {
|
|
|
50
50
|
subjectFor,
|
|
51
51
|
} from "./bdd/envelope.mjs";
|
|
52
52
|
import { checkDeletions, checkRatchet, loadBaseline } from "./bdd/baseline.mjs";
|
|
53
|
+
import {
|
|
54
|
+
disclosureDefects,
|
|
55
|
+
discoverSpecs,
|
|
56
|
+
missingDiscoveryDefects,
|
|
57
|
+
} from "./bdd/discover.mjs";
|
|
53
58
|
import { loadScenarios } from "./bdd/parse.mjs";
|
|
54
59
|
import { buildReport } from "./bdd/report.mjs";
|
|
55
60
|
import { renderBurndown } from "./bdd/render.mjs";
|
|
@@ -236,12 +241,22 @@ export function loadExecutionResults(root, files) {
|
|
|
236
241
|
* @param {object} input - Root, contract, scenarios, platforms, and options.
|
|
237
242
|
* @returns {object[]} Defects found.
|
|
238
243
|
*/
|
|
239
|
-
function validateAll({
|
|
244
|
+
function validateAll({
|
|
245
|
+
root,
|
|
246
|
+
contract,
|
|
247
|
+
scenarios,
|
|
248
|
+
platforms,
|
|
249
|
+
options,
|
|
250
|
+
cache,
|
|
251
|
+
discovery,
|
|
252
|
+
}) {
|
|
240
253
|
const defects = [
|
|
241
254
|
...validateScenarios(scenarios, platforms),
|
|
242
255
|
...validateTrackerTags(scenarios, contract.trackers),
|
|
243
256
|
...validateMappings({ root, scenarios, contract, cache }),
|
|
244
257
|
...validateWaivers({ scenarios, contract, today: options.today }),
|
|
258
|
+
...discovery.defects,
|
|
259
|
+
...disclosureDefects({ root, contract, discovery }),
|
|
245
260
|
];
|
|
246
261
|
if (!options.baseSha) return defects;
|
|
247
262
|
const baseline = loadBaseline(root, options.baseSha);
|
|
@@ -294,7 +309,13 @@ function floorIntegrityDefects(report) {
|
|
|
294
309
|
* @param {object} input - Contract, scenarios, report, and platforms.
|
|
295
310
|
* @returns {object[]} Defects found.
|
|
296
311
|
*/
|
|
297
|
-
function enforcedDefects({
|
|
312
|
+
function enforcedDefects({
|
|
313
|
+
contract,
|
|
314
|
+
scenarios,
|
|
315
|
+
report,
|
|
316
|
+
platforms,
|
|
317
|
+
discovery,
|
|
318
|
+
}) {
|
|
298
319
|
const defects = [];
|
|
299
320
|
if (scenarios.length === 0) {
|
|
300
321
|
defects.push(
|
|
@@ -320,6 +341,7 @@ function enforcedDefects({ contract, scenarios, report, platforms }) {
|
|
|
320
341
|
)
|
|
321
342
|
);
|
|
322
343
|
}
|
|
344
|
+
defects.push(...missingDiscoveryDefects(contract, discovery));
|
|
323
345
|
for (const platform of report.floor.unset) {
|
|
324
346
|
defects.push(
|
|
325
347
|
defect(
|
|
@@ -366,21 +388,34 @@ export function run(root, options) {
|
|
|
366
388
|
// so each mapped file is read once no matter how large the manifest.
|
|
367
389
|
const cache = new Map();
|
|
368
390
|
const unresolved = unresolvedEvidenceKeys({ root, contract, cache });
|
|
391
|
+
// Discovery answers the question the declared half cannot: which tests exist
|
|
392
|
+
// that the manifest never mentions. It runs before the report so the report
|
|
393
|
+
// can carry the inventory it produced.
|
|
394
|
+
const discovery = discoverSpecs({ root, contract });
|
|
369
395
|
const report = buildReport({
|
|
370
396
|
scenarios,
|
|
371
397
|
contract,
|
|
372
398
|
runs: execution.runs,
|
|
373
399
|
platforms,
|
|
374
400
|
unresolved,
|
|
401
|
+
discovery,
|
|
375
402
|
});
|
|
376
403
|
const defects = [
|
|
377
404
|
...(versionDefect ? [versionDefect] : []),
|
|
378
405
|
...validateAdoption(contract, mode, options.today),
|
|
379
406
|
...execution.defects,
|
|
380
407
|
...floorIntegrityDefects(report),
|
|
381
|
-
...validateAll({
|
|
408
|
+
...validateAll({
|
|
409
|
+
root,
|
|
410
|
+
contract,
|
|
411
|
+
scenarios,
|
|
412
|
+
platforms,
|
|
413
|
+
options,
|
|
414
|
+
cache,
|
|
415
|
+
discovery,
|
|
416
|
+
}),
|
|
382
417
|
...(mode === "enforced"
|
|
383
|
-
? enforcedDefects({ contract, scenarios, report, platforms })
|
|
418
|
+
? enforcedDefects({ contract, scenarios, report, platforms, discovery })
|
|
384
419
|
: []),
|
|
385
420
|
];
|
|
386
421
|
return result({ mode, defects, report, contract });
|
|
@@ -31,7 +31,16 @@ on:
|
|
|
31
31
|
workflow_dispatch:
|
|
32
32
|
inputs:
|
|
33
33
|
platform:
|
|
34
|
-
|
|
34
|
+
# NARROWING THIS DOES NOT CLEAR THE NIGHTLY GATE. Picking `android` or
|
|
35
|
+
# `ios` skips the other platform's job, and GitHub still concludes the
|
|
36
|
+
# run `success` — a skipped job does not redden its run. The
|
|
37
|
+
# nightly-e2e-health gate reads the jobs behind a `success` run for
|
|
38
|
+
# exactly this reason (truth-table row 26 in Lisa's
|
|
39
|
+
# `docs/nightly-e2e-gate.md`), so a narrowed run reports
|
|
40
|
+
# `incomplete_run` and keeps blocking. Use these options to iterate on
|
|
41
|
+
# one platform; dispatch with `all` when the point is to clear a red
|
|
42
|
+
# nightly.
|
|
43
|
+
description: 'Platform(s) to run — use `all` when dispatching to clear the nightly gate'
|
|
35
44
|
type: choice
|
|
36
45
|
default: all
|
|
37
46
|
options:
|
|
@@ -102,6 +102,11 @@ jobs:
|
|
|
102
102
|
# `{"mode":"job_pattern","pattern":"^…$"}` only for matrix job names that
|
|
103
103
|
# no single string can cover.
|
|
104
104
|
#
|
|
105
|
+
# `{"mode":"run"}` reads the run's conclusion AND every job behind it,
|
|
106
|
+
# because GitHub concludes a run `success` when jobs were skipped — a
|
|
107
|
+
# suite dispatched for one platform only would otherwise report green
|
|
108
|
+
# about the platform it never tested (row 26 / §2.4 of the contract).
|
|
109
|
+
#
|
|
105
110
|
# ONLY `maestro-e2e.yml` by default, because that is the only nightly
|
|
106
111
|
# suite this template actually ships. Naming a workflow file that does not
|
|
107
112
|
# exist is truth-table row 11 — a HARD failure, not missing evidence —
|
|
@@ -13,6 +13,21 @@
|
|
|
13
13
|
"playwright": ["web"],
|
|
14
14
|
"maestro": ["ios", "android"]
|
|
15
15
|
},
|
|
16
|
+
"testDiscovery": {
|
|
17
|
+
"_comment": "Where each runner's tests live, so the gate can find a test NOBODY DECLARED. Keys must be runners declared in runnerPlatforms. `roots` are repo-relative directories (list every one — a subflow or helper directory omitted here is structurally invisible to the gate), `extensions` are filename suffixes, optional `ignore` holds repo-relative path prefixes to skip, and `evidence` says how a test is titled: {\"kind\": \"call-title\", \"functions\": [...]} reads test(\"...\") style declarations, {\"kind\": \"line-field\", \"field\": \"name\"} reads a leading document field. Edit these to match this project; a malformed block is refused rather than ignored, because silently discovering nothing looks exactly like a clean repo.",
|
|
18
|
+
"playwright": {
|
|
19
|
+
"roots": ["e2e"],
|
|
20
|
+
"extensions": [".spec.ts", ".spec.tsx", ".spec.js", ".spec.jsx"],
|
|
21
|
+
"ignore": [],
|
|
22
|
+
"evidence": { "kind": "call-title", "functions": ["test", "it"] }
|
|
23
|
+
},
|
|
24
|
+
"maestro": {
|
|
25
|
+
"roots": [".maestro/flows", ".maestro/subflows"],
|
|
26
|
+
"extensions": [".yaml", ".yml"],
|
|
27
|
+
"ignore": [],
|
|
28
|
+
"evidence": { "kind": "line-field", "field": "name" }
|
|
29
|
+
}
|
|
30
|
+
},
|
|
16
31
|
"coverageFloor": {
|
|
17
32
|
"_comment": "Committed traceability floor per platform. A ratchet: may rise, may never fall. Seeded at 0 so adopting on a brownfield app never red-gates CI before any scenario exists. Lowering one requires a coverageFloorBaseline record naming the exact change AND the maintainer-applied `bdd-floor-baseline` pull-request label.",
|
|
18
33
|
"web": 0,
|
|
@@ -34,5 +49,6 @@
|
|
|
34
49
|
},
|
|
35
50
|
"platformWaivers": [],
|
|
36
51
|
"mappings": [],
|
|
52
|
+
"_exclusionsComment": "A discovered test must be named by a mapping or by an exclusion. Each entry is {\"file\": \"<path>\", \"evidence\": \"<optional exact title; omit to excuse the whole file>\", \"reason\": \"<why this test aligns to no product behavior>\"} — an exclusion whose file is gone, whose title was renamed, or that no discovery root covers is a defect, never a permanent excuse.",
|
|
37
53
|
"exclusions": []
|
|
38
54
|
}
|
package/package.json
CHANGED
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
}
|
|
121
121
|
},
|
|
122
122
|
"name": "@codyswann/lisa",
|
|
123
|
-
"version": "
|
|
123
|
+
"version": "3.0.0",
|
|
124
124
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
125
125
|
"main": "dist/index.js",
|
|
126
126
|
"exports": {
|
|
@@ -217,9 +217,11 @@ vocabulary; it consumes it.
|
|
|
217
217
|
|
|
218
218
|
3. **File each standing blocker as a tracker work item — never an in-session question.** For every
|
|
219
219
|
standing ship blocker, create **one** Lisa work item through the vendor-neutral `lisa-tracker-write`
|
|
220
|
-
skill (never a vendor write skill directly), carrying the five finding fields in the body.
|
|
221
|
-
|
|
222
|
-
|
|
220
|
+
skill (never a vendor write skill directly), carrying the five finding fields in the body. Per the `ready-role-filing` rule each
|
|
221
|
+
create declares its readiness explicitly: pass **`build_ready: true`** when the correction is
|
|
222
|
+
mechanical (an omitted flag is NOT build-ready on any tracker, so the mechanical branch would
|
|
223
|
+
otherwise file work nothing ever claims), and pass **`human_gate: "<the decision only a human can
|
|
224
|
+
make>"`** plus the `human-needed` marker when it is a genuine human decision. This is the skill's **only tracker write**, and it creates Lisa's *own* work item —
|
|
223
225
|
it **never edits, comments on, transitions, or otherwise mutates any ingested source** (see the
|
|
224
226
|
connected-source safety boundary above). The shipped never-ask posture is preserved: a blocker
|
|
225
227
|
becomes a filed ticket, **never** a prompt, and the session **never pauses to ask a human anything**,
|
|
@@ -350,7 +350,7 @@ Each sub-task MUST:
|
|
|
350
350
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking
|
|
351
351
|
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).
|
|
352
352
|
|
|
353
|
-
**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.
|
|
353
|
+
**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.
|
|
354
354
|
|
|
355
355
|
Sub-tasks inherit their parent story's artifacts by reference (the parent link). Do not pass the same artifact list to every sub-task.
|
|
356
356
|
|
|
@@ -419,6 +419,7 @@ tickets that downstream skills (triage, journey, evidence) cannot use.
|
|
|
419
419
|
|
|
420
420
|
For each sub-task, invoke `lisa-tracker-write` with:
|
|
421
421
|
- issue_type: "Sub-task"
|
|
422
|
+
- build_ready: true # explicit per `ready-role-filing`; omitted is NOT build-ready on any tracker
|
|
422
423
|
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
423
424
|
- parent: the parent story key
|
|
424
425
|
- project_key: [PROJECT]
|
|
@@ -29,11 +29,11 @@ For every row marked **Accept**:
|
|
|
29
29
|
| Edge case | Edge Case Brainstorm checklist in `intent-routing.md` | Append the new pattern + question to the matching group (Navigation, Data, Failure, Input, Auth, or a new group if none fit). Use the row's `Summary` and `Evidence` link as a citation comment. |
|
|
30
30
|
| Recurring gotcha | Committed learnings ledger (via contract) | Persist a ledger entry per [Ledger persistence](#ledger-persistence-knowledge-categories). The `rule` is the recurring gotcha and the guard against it; `why` is the causal claim. |
|
|
31
31
|
| Process friction | Committed learnings ledger (via contract) | Persist a ledger entry per [Ledger persistence](#ledger-persistence-knowledge-categories). The `rule` is the friction-avoiding guideline; `why` names the friction it prevents. |
|
|
32
|
-
| Tooling gap | Configured tracker — or upstream Lisa when harness-level | **Split by level.** Project-level (a missing project script, hook, or automation) → create a ticket via `lisa-tracker-write` with `issue_type: Task`, summary derived from the row's `Summary`, description citing the evidence and the originating debrief doc, labeled `type:tooling` / `lifecycle-improvement
|
|
32
|
+
| Tooling gap | Configured tracker — or upstream Lisa when harness-level | **Split by level.** Project-level (a missing project script, hook, or automation) → create a ticket via `lisa-tracker-write` with `issue_type: Task`, summary derived from the row's `Summary`, description citing the evidence and the originating debrief doc, labeled `type:tooling` / `lifecycle-improvement`, and explicit `build_ready: true` per `ready-role-filing` (a tooling gap the factory can close itself is queue work, and an omitted flag is NOT build-ready on any tracker). Harness-level (a Lisa skill/gate/agent that should have caught the issue but didn't) → file an upstream Lisa issue exactly per the "Filing upstream" procedure in `lisa-rework-triage` (dedupe search first, three-audience description, evidence chain, `self-hardening` label; repo from `.lisa.config.json` `hardening.upstreamRepo`, default `CodySwannGT/lisa`). |
|
|
33
33
|
| Convention drift | Committed learnings ledger (via contract) | Persist a ledger entry per [Ledger persistence](#ledger-persistence-knowledge-categories). The `rule` is the correct convention; `why` records the drift it corrects. |
|
|
34
34
|
| Decomposition infidelity | Upstream Lisa repo | File an upstream Lisa issue per the "Filing upstream" procedure in `lisa-rework-triage`, citing the PRD text vs. the distorted ticket AC and naming the gate that passed it. |
|
|
35
35
|
| PRD defect | Source PRD | Comment on the PRD via the `lisa-prd-backlink` lineage quoting the defective requirement and the failure it missed; flag for product review. Never silently edit the spec. |
|
|
36
|
-
| Missing tool access | Configured tracker | Create a provisioning ticket via `lisa-tracker-write` (`issue_type: Task`, `type:tooling`) describing the missing tool/credential/environment and which flow needs it. |
|
|
36
|
+
| Missing tool access | Configured tracker | Create a provisioning ticket via `lisa-tracker-write` (`issue_type: Task`, `type:tooling`) describing the missing tool/credential/environment and which flow needs it. Pass `human_gate: "a human must grant the missing access"` per `ready-role-filing` — the factory cannot provision its own credentials. |
|
|
37
37
|
| Uncategorized | **No route — requires reclassification** | `Uncategorized` records that the synthesizer could not fit the finding to a category; it is not itself a destination. Do NOT guess a route and do NOT silently skip the row. Leave the row unapplied, mark it `[!] Needs reclassification — <the synthesizer's "why no category fit" note>`, and list it under its own heading in the run summary so the human can retag it to one of the eight and re-run `apply`. A row that stays `Uncategorized` across runs is a signal the category set itself is missing a case — worth an upstream Lisa issue, not a forced fit. |
|
|
38
38
|
|
|
39
39
|
For every row marked **Reject** or **Defer**: no action. Defer is a no-op for `apply` but worth surfacing in the run summary — the human may want to revisit at the next debrief.
|
|
@@ -70,7 +70,13 @@ Kane never files the work item itself. Even when it marks a failure as a confirm
|
|
|
70
70
|
| User-visible **bug** (broken behavior) | `Bug` | the `ready` flag (default `false`) |
|
|
71
71
|
| **Usability / UX / clarity issue** | `Improvement` | the `ready` flag (default `false`) |
|
|
72
72
|
|
|
73
|
-
Each finding is a flat leaf, so `build_ready` applies directly — pass it explicitly on every create.
|
|
73
|
+
Each finding is a flat leaf, so `build_ready` applies directly — pass it explicitly on every create.
|
|
74
|
+
|
|
75
|
+
**This skill is the named human-gate exception under `ready-role-filing`.** Everywhere else in Lisa, a complete defect found during other work is filed with explicit `build_ready: true` so build-intake claims it next cycle. Exploratory QA is deliberately different, and that difference is ratified rather than drift: its findings are *candidate* defects and usability observations whose **product significance is a human call**, so auto-readying them would push judgment work into the build queue — precisely the failure the gate model exists to prevent. Its default `ready=false` is therefore an **explicit human-gate marker, never a bare omission**: every not-ready create passes `human_gate: "exploratory finding — product significance is a human product call"` alongside `build_ready: false`, and the writer stamps the auditable `[lisa-human-gate]` marker. An operator who wants a pass to feed the queue directly opts in with `ready=true`.
|
|
76
|
+
|
|
77
|
+
(The sibling `e2e-coverage-gaps` skills are the contrast: a missing automated test is not a product question, so they file `build_ready: true` by default.)
|
|
78
|
+
|
|
79
|
+
Each ticket MUST be a complete spec (the validator rejects thin tickets): a **three-audience description**; for a **bug**, exact reproduction steps, observed-vs-expected, the env / account / interface it occurred at, and evidence; for a **usability issue**, the observed friction, who it affects, **where**, and the proposed improvement; and **Gherkin acceptance criteria** for the fixed behavior.
|
|
74
80
|
|
|
75
81
|
### Idempotency — don't spam duplicates
|
|
76
82
|
|
|
@@ -258,6 +258,11 @@ A blocker is active if it is open and has no cleared status label. Treat `status
|
|
|
258
258
|
|
|
259
259
|
**Claim-time archaeology runs second — after rejection detection, still before the relabel below.** Classify this item 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. GitHub wiring only: the typed relations and `closingIssuesReferences` are already in the read bundle; text-similarity searches use `gh search issues` over recently-closed issues; the fallback candidate comment is posted with `gh issue comment`.
|
|
260
260
|
|
|
261
|
+
**The two `claim-time-guards` run third and fourth — still before the relabel below.** Both semantics live in that one vendor-neutral slug; do not restate them here. GitHub wiring only:
|
|
262
|
+
|
|
263
|
+
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: relabel to the configured blocked role (`gh issue edit <number> --repo <org>/<repo> --remove-label "$READY" --add-label "$BLOCKED"`, resolved from `github.labels.build.blocked` per `config-resolution`), post the operator-readable comment naming both attempts, 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.
|
|
264
|
+
2. **`already-implemented` check.** Probe for this issue's own key — `git log --all --grep "<org>/<repo>#<number>"` and `gh pr list --repo <org>/<repo> --state all --search "<org>/<repo>#<number>" --json number,state,mergedAt,url`. 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-github-evidence` naming the shipping PR/commit, then run the ordinary 3d transition and 3d.1 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.
|
|
265
|
+
|
|
261
266
|
```bash
|
|
262
267
|
gh issue edit <number> --repo <org>/<repo> --remove-label "$READY" --add-label "$CLAIMED"
|
|
263
268
|
# Assign to the authenticated user ONLY when the issue is currently unassigned (attributable claim;
|
|
@@ -80,7 +80,9 @@ Issues must be created in parent-before-child order:
|
|
|
80
80
|
|
|
81
81
|
1. Invoke `lisa-github-write-issue` for the Epic. Capture the returned issue number.
|
|
82
82
|
2. For each Story, invoke `lisa-github-write-issue` with the Epic ref as `parent_ref`. Capture each Story number.
|
|
83
|
-
3. For each Sub-task, invoke `lisa-github-write-issue` with the Story ref as `parent_ref`.
|
|
83
|
+
3. For each Sub-task, invoke `lisa-github-write-issue` with the Story ref as `parent_ref` and explicit `build_ready: true`.
|
|
84
|
+
|
|
85
|
+
- **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-github-write-issue` rejects it.
|
|
84
86
|
|
|
85
87
|
### What to pass to each invocation
|
|
86
88
|
|
|
@@ -335,7 +335,7 @@ Each sub-task MUST:
|
|
|
335
335
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking.
|
|
336
336
|
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).
|
|
337
337
|
|
|
338
|
-
**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 label. `lisa-tracker-write` applies `status:ready` here so downstream build intake (`lisa-github-build-intake`) claims the leaves and never the Epic or Stories. Apply `status:ready` to each Sub-task; never to its parent Story or Epic (Phases 3–4). `lisa-github-write-issue` 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.
|
|
338
|
+
**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 label. `lisa-tracker-write` applies `status:ready` here so downstream build intake (`lisa-github-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 `status:ready` to each Sub-task; never to its parent Story or Epic (Phases 3–4). `lisa-github-write-issue` 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.
|
|
339
339
|
|
|
340
340
|
Sub-tasks inherit their parent Story's artifacts by reference (the parent link). Do not pass the same artifact list to every sub-task.
|
|
341
341
|
|
|
@@ -404,6 +404,7 @@ that downstream skills (triage, journey, evidence) cannot use.
|
|
|
404
404
|
|
|
405
405
|
For each sub-task, invoke `lisa-tracker-write` with:
|
|
406
406
|
- issue_type: "Sub-task"
|
|
407
|
+
- build_ready: true # explicit per `ready-role-filing`; omitted is NOT build-ready on any tracker
|
|
407
408
|
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
408
409
|
- parent_ref: the parent story ref
|
|
409
410
|
- summary: prefixed with the repo in brackets, e.g. "[backend-api] Add audit log table"
|
|
@@ -382,13 +382,17 @@ Per `Phase 5` of `lisa-github-write-issue`, every issue MUST carry
|
|
|
382
382
|
missing from the proposed spec or live issue, FAIL with the missing label name.
|
|
383
383
|
|
|
384
384
|
The `status:*` requirement uses this validator's S15 leaf/container classification while preserving
|
|
385
|
-
the writer's documented `build_ready` control-input defaults
|
|
385
|
+
the writer's documented `build_ready` control-input defaults, which the `ready-role-filing` rule
|
|
386
|
+
fixes at "omitted is NOT build-ready" for every vendor:
|
|
386
387
|
|
|
387
388
|
1. Classify the issue structurally using the S15 child-resolution rules. A container (any issue
|
|
388
389
|
with child work, plus a childless `Epic`) may omit `status:*`; its state rolls up rather than
|
|
389
390
|
being assigned directly.
|
|
390
|
-
2. For a proposed leaf spec, normalize omitted `build_ready` to `
|
|
391
|
-
|
|
391
|
+
2. For a proposed leaf spec, normalize omitted `build_ready` to `false`, per `ready-role-filing`:
|
|
392
|
+
ready is an explicit claim, so only `build_ready: true` asserts it. Explicit `build_ready: false`
|
|
393
|
+
means the same backlog mode. (This validator previously normalized omitted → `true` to mirror
|
|
394
|
+
GitHub's implicit-ready writer default; both were removed together, and re-introducing either
|
|
395
|
+
here would just move the leak.)
|
|
392
396
|
3. For a live issue ref, derive `build_ready` from the labels (`true` exactly when the S15-resolved
|
|
393
397
|
`READY_ROLE` from `github.labels.build.ready`, default `status:ready`, is present). A live backlog leaf without a status label
|
|
394
398
|
therefore validates as `build_ready: false`; live data cannot distinguish an explicit false from
|
|
@@ -253,12 +253,21 @@ For non-build-ready issues created fresh (Epics, Stories, and other containers),
|
|
|
253
253
|
|
|
254
254
|
### Build-ready control input (`build_ready`)
|
|
255
255
|
|
|
256
|
-
`build_ready` is
|
|
256
|
+
`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 stamped with the build-ready role on create. It never overrides `leaf-only-lifecycle` — a container is never stamped build-ready regardless of `build_ready`. "Not build-ready" is not a special status: it simply means the issue is created in its natural default (a plain open issue with **no `status:ready` label**), which a human can promote later.
|
|
257
257
|
|
|
258
|
-
- **Omitted** →
|
|
258
|
+
- **Omitted** → **not build-ready**: the leaf is created without `status:ready`. Ready is an explicit claim, never a vendor default. **This is a breaking change** — GitHub previously applied `status:ready` on omission, so a caller that relied on that must now pass `build_ready: true`.
|
|
259
259
|
- **`build_ready: false`** → create the leaf **without** `status:ready`, so it sits in the backlog for a human to review and promote into the queue.
|
|
260
260
|
- **`build_ready: true`** → ensure the leaf carries `status:ready` so `lisa-intake` / `lisa-github-build-intake` auto-picks it up.
|
|
261
261
|
|
|
262
|
+
**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:
|
|
263
|
+
|
|
264
|
+
```text
|
|
265
|
+
Held for a human product call: <reason>.
|
|
266
|
+
<!-- [lisa-human-gate] reason=<short-slug> -->
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
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.
|
|
270
|
+
|
|
262
271
|
## Phase 5.5 — Validate (Pre-write Gate)
|
|
263
272
|
|
|
264
273
|
Before any write, invoke `lisa-github-validate-issue` with the full proposed spec assembled from Phases 2 / 3 / 4 / 5. Pass it as a YAML block per the `lisa-github-validate-issue` schema, including `runtime_behavior_change`, `authenticated_surface`, and `artifacts_attached` flags so the right gates run.
|
|
@@ -271,9 +280,9 @@ If the validator reports `FAIL`, do NOT proceed to Phase 6. Fix the spec and re-
|
|
|
271
280
|
|
|
272
281
|
### CREATE
|
|
273
282
|
|
|
274
|
-
1. Compose the body markdown from Phases 2/3/4 in a temp file (avoid quoting hell). Apply `status:ready` **only for a leaf work unit** per the Phase 5 leaf-only rule (`leaf-only-lifecycle`) — omit it for `Epic` / `Story` / `Spike` and any issue that has child work, **and** only when `build_ready` is
|
|
283
|
+
1. Compose the body markdown from Phases 2/3/4 in a temp file (avoid quoting hell). Apply `status:ready` **only for a leaf work unit** per the Phase 5 leaf-only rule (`leaf-only-lifecycle`) — omit it for `Epic` / `Story` / `Spike` and any issue that has child work, **and** only when `build_ready` is explicitly `true` (a leaf with `build_ready` omitted or `false` is created without `status:ready`; see the Build-ready control input):
|
|
275
284
|
```bash
|
|
276
|
-
# Leaf work unit (Bug / Task / Sub-task / Improvement with no children), build_ready
|
|
285
|
+
# Leaf work unit (Bug / Task / Sub-task / Improvement with no children), build_ready: true:
|
|
277
286
|
gh issue create \
|
|
278
287
|
--repo <org>/<repo> \
|
|
279
288
|
--title "<summary>" \
|
|
@@ -282,9 +291,10 @@ If the validator reports `FAIL`, do NOT proceed to Phase 6. Fix the spec and re-
|
|
|
282
291
|
[--label "component:<name>" ...] [--milestone "<milestone>"] \
|
|
283
292
|
[--assignee "<login>"]
|
|
284
293
|
|
|
285
|
-
# Container (Epic / Story / Spike / any issue with child work), OR a leaf
|
|
294
|
+
# Container (Epic / Story / Spike / any issue with child work), OR a leaf whose build_ready is
|
|
295
|
+
# omitted or false (and which therefore carries an explicit human_gate):
|
|
286
296
|
# identical, but WITHOUT --label "status:ready" — a container's state rolls up from children;
|
|
287
|
-
# a
|
|
297
|
+
# a human-gated leaf waits in the backlog for a human to promote it.
|
|
288
298
|
gh issue create \
|
|
289
299
|
--repo <org>/<repo> \
|
|
290
300
|
--title "<summary>" \
|
|
@@ -191,7 +191,7 @@ authority — if any of these hold:
|
|
|
191
191
|
**On any of those: file a proposed-intervention ticket via `lisa-tracker-write` and STOP.** The
|
|
192
192
|
ticket carries the job contract, the earliest failed handoff, the gap classification with
|
|
193
193
|
evidence, and the proposed change with its expected mechanism; labels `type:harness`,
|
|
194
|
-
`status:blocked` (human-flipped to `status:ready` when approved). Post the result record with
|
|
194
|
+
`status:blocked` plus an explicit `human_gate: "a human approves the proposed harness intervention"` per `ready-role-filing` (human-flipped to `status:ready` when approved). Post the result record with
|
|
195
195
|
`Verdict: bounded-authority-stop`, `Decision: n/a (proposed-intervention, <url>)`, and
|
|
196
196
|
terminate. Implementing it anyway is the failure mode this phase exists to prevent.
|
|
197
197
|
|
|
@@ -202,6 +202,11 @@ This gate never blocks a legitimate flat Task/Bug: those have no open children a
|
|
|
202
202
|
|
|
203
203
|
**Claim-time archaeology runs second — after rejection detection, still before the transition below.** Classify this ticket 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. JIRA wiring only: the typed relations are already in the read bundle; text-similarity searches run through `lisa-atlassian-access operation: search-issues jql:` over recently-closed tickets; the fallback candidate comment is posted via `lisa-atlassian-access operation: comment`.
|
|
204
204
|
|
|
205
|
+
**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. JIRA wiring only:
|
|
206
|
+
|
|
207
|
+
1. **`two-failed-attempts` valve.** Count `[lisa-build-attempt]` markers on the ticket from the read bundle's comments (match on the marker, never the summary). With two or more, do **not** claim: transition to the configured blocked status (`lisa-atlassian-access operation: transition to: "$BLOCKED"`, resolved from `jira.workflow.blocked` per `config-resolution`), post the operator-readable comment naming both attempts, 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.
|
|
208
|
+
2. **`already-implemented` check.** Probe for this ticket's own key — `git log --all --grep "<TICKET>"` and the merged/open PRs referencing `<TICKET>` (`gh pr list --state all --search "<TICKET>"` in the bound repo). On a hit, claim as normal but route 3c to **verify-and-close** instead of `lisa-implement`: verify what shipped against the ticket's acceptance criteria, post evidence via `lisa-jira-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 ticket) and not `claim-archaeology` (a *different* ancestor ticket); it is this ticket's own work already having shipped without a transition.
|
|
209
|
+
|
|
205
210
|
Transition the ticket from `$READY` to `$CLAIMED` by invoking `lisa-atlassian-access` `operation: transition key: <TICKET> to: "$CLAIMED"`.
|
|
206
211
|
- **Assign to the authenticated user when the ticket is unassigned.** A claim must be attributable. If the ticket has no assignee, assign it to the authenticated account — prefer acli `--assignee @me` (resolves server-side to the authenticated user, which avoids the federated-`accountId` mis-assignment), or `write-ticket` with the `accountId` from the `/rest/api/3/myself` identity probe the access skill already documents. Leave an already-assigned ticket's assignee untouched — never reassign work that already has an owner.
|
|
207
212
|
- Post a `[claude-build-intake]` comment via `lisa-atlassian-access` `operation: comment key: <TICKET> body: "Claimed by Claude. Starting build."`
|
|
@@ -125,6 +125,8 @@ Exclude unless requested: migration plans, performance tests
|
|
|
125
125
|
- Sign-in account and target environment recorded in description
|
|
126
126
|
- Post-create verification
|
|
127
127
|
|
|
128
|
+
**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-jira-write-ticket` rejects it.
|
|
129
|
+
|
|
128
130
|
### Invocation order
|
|
129
131
|
|
|
130
132
|
Tickets must be created in parent-before-child order so each child can be passed its parent key:
|
|
@@ -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
|
|
@@ -106,6 +106,40 @@ linear_graphql() {
|
|
|
106
106
|
Map operation names to Linear GraphQL queries/mutations in this access skill.
|
|
107
107
|
Consumers pass business-shaped arguments only; they do not embed GraphQL.
|
|
108
108
|
|
|
109
|
+
## `list-workflow-states` — the team's states, and which one it creates into
|
|
110
|
+
|
|
111
|
+
`list-workflow-states team:<ID>` returns one node per state with `id`, `name`,
|
|
112
|
+
`type`, `position`, and **`isTeamDefault`**.
|
|
113
|
+
|
|
114
|
+
`isTeamDefault` is `true` for the single state named by the team's
|
|
115
|
+
`defaultIssueState` — where Linear puts every brand-new Issue. Callers need it to
|
|
116
|
+
enforce the rule that `linear.workflow.ready` must be a lane a human moves an
|
|
117
|
+
Issue **into**: pointing `ready` at the default inverts the gate, so the
|
|
118
|
+
claimable lane means "nobody has touched this" rather than "a human marked this
|
|
119
|
+
ready", and build-intake dispatches unapproved work. `/lisa:setup:linear` refuses
|
|
120
|
+
to resolve `ready` onto it, and `/lisa:validate-tracker-mapping` classifies a
|
|
121
|
+
config that already does as `INVERTED`.
|
|
122
|
+
|
|
123
|
+
It belongs on this operation rather than in a separate `get-team` call because
|
|
124
|
+
every caller that needs it is already enumerating states, and a second round trip
|
|
125
|
+
is a second chance for the two answers to disagree. A team with no
|
|
126
|
+
`defaultIssueState` set yields `isTeamDefault: false` on every node — report that
|
|
127
|
+
honestly; do not fall back to guessing by name or position.
|
|
128
|
+
|
|
129
|
+
```graphql
|
|
130
|
+
query($teamId:String!){
|
|
131
|
+
team(id:$teamId){
|
|
132
|
+
defaultIssueState{ id }
|
|
133
|
+
states(first:100){ nodes{ id name type position } }
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Set `isTeamDefault` per node by comparing `node.id` against
|
|
139
|
+
`team.defaultIssueState.id`. On the MCP substrate, which exposes states without
|
|
140
|
+
the team's default, resolve the default through the team record and join on `id`
|
|
141
|
+
the same way.
|
|
142
|
+
|
|
109
143
|
## `history` — transition history (read-only)
|
|
110
144
|
|
|
111
145
|
`history id:<ID>` returns an Issue's ordered past state changes — the raw
|
|
@@ -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
|
|
|
@@ -335,7 +335,7 @@ Each sub-task MUST:
|
|
|
335
335
|
2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking
|
|
336
336
|
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).
|
|
337
337
|
|
|
338
|
-
**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.
|
|
338
|
+
**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.
|
|
339
339
|
|
|
340
340
|
Sub-tasks inherit their parent story's artifacts by reference (the parent link). Do not pass the same artifact list to every sub-task.
|
|
341
341
|
|
|
@@ -403,6 +403,7 @@ produces broken tickets that downstream skills (triage, journey, evidence) canno
|
|
|
403
403
|
|
|
404
404
|
For each sub-task, invoke `lisa-tracker-write` with:
|
|
405
405
|
- issue_type: "Sub-task"
|
|
406
|
+
- build_ready: true # explicit per `ready-role-filing`; omitted is NOT build-ready on any tracker
|
|
406
407
|
- prd_source: [the originating PRD URL — mandatory; arms the S16 traceability gate]
|
|
407
408
|
- parent: the parent story key
|
|
408
409
|
- project_key: [PROJECT]
|