@codyswann/lisa 2.350.0 → 2.352.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh +1 -1
- package/all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh +1 -1
- package/all/create-only/.agents/rules/README.md +45 -0
- package/dist/cli/doctor-lisa-owned-artifacts.d.ts +18 -0
- package/dist/cli/doctor-lisa-owned-artifacts.d.ts.map +1 -0
- package/dist/cli/doctor-lisa-owned-artifacts.js +129 -0
- package/dist/cli/doctor-lisa-owned-artifacts.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +2 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/codex/scripts/_extract-edit-paths.sh +1 -1
- package/dist/codex/scripts/format-on-edit.sh +1 -1
- package/dist/codex/scripts/lint-on-edit.sh +1 -1
- package/dist/codex/scripts/rubocop-on-edit.sh +1 -1
- package/dist/codex/scripts/sg-scan-on-edit.sh +1 -1
- package/dist/configs/eslint/cdk.js +2 -2
- package/dist/configs/eslint/cdk.js.map +1 -1
- package/dist/configs/eslint/nestjs.js +2 -2
- package/dist/configs/eslint/nestjs.js.map +1 -1
- package/dist/configs/eslint/typescript.js +2 -2
- package/dist/configs/eslint/typescript.js.map +1 -1
- package/dist/core/host-rules-pointer.d.ts +33 -0
- package/dist/core/host-rules-pointer.d.ts.map +1 -0
- package/dist/core/host-rules-pointer.js +115 -0
- package/dist/core/host-rules-pointer.js.map +1 -0
- package/dist/core/instruction-files-migration.d.ts +3 -2
- package/dist/core/instruction-files-migration.d.ts.map +1 -1
- package/dist/core/instruction-files-migration.js +62 -64
- package/dist/core/instruction-files-migration.js.map +1 -1
- package/dist/core/learnings.d.ts +1 -1
- package/dist/core/learnings.d.ts.map +1 -1
- package/dist/core/learnings.js +1 -1
- package/dist/core/learnings.js.map +1 -1
- package/dist/core/lisa-owned-templates.d.ts +34 -0
- package/dist/core/lisa-owned-templates.d.ts.map +1 -0
- package/dist/core/lisa-owned-templates.js +41 -0
- package/dist/core/lisa-owned-templates.js.map +1 -0
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +5 -1
- package/dist/core/lisa.js.map +1 -1
- package/dist/core/project-config.d.ts +39 -9
- package/dist/core/project-config.d.ts.map +1 -1
- package/dist/core/project-config.js +37 -10
- package/dist/core/project-config.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +73 -37
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/plugin-templates/lisa-block-instruction-file-edits.ts +1 -1
- package/dist/strategies/copy-overwrite.d.ts +13 -6
- package/dist/strategies/copy-overwrite.d.ts.map +1 -1
- package/dist/strategies/copy-overwrite.js +16 -7
- package/dist/strategies/copy-overwrite.js.map +1 -1
- package/dist/sync/registry.d.ts.map +1 -1
- package/dist/sync/registry.js +0 -6
- package/dist/sync/registry.js.map +1 -1
- 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-debrief/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/SKILL.md +3 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +4 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-github-read-issue/SKILL.md +1 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +15 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +6 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-harness/SKILL.md +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +15 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-learnings-audit/SKILL.md +6 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +25 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +15 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/SKILL.md +20 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/SKILL.md +17 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +17 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +17 -0
- package/plugins/lisa/agents/learnings-synthesizer.md +1 -1
- package/plugins/lisa/agents/skill-evaluator.md +1 -1
- package/plugins/lisa/hooks/block-instruction-file-edits.sh +1 -1
- package/plugins/lisa/hooks/block-shell-json-parsing.sh +1 -1
- package/plugins/lisa/rules/eager/config-resolution.md +6 -3
- package/plugins/lisa/rules/eager/derived-branch-plan.md +45 -0
- package/plugins/lisa/rules/eager/project-learnings.md +3 -2
- package/plugins/lisa/rules/reference/config-resolution.md +26 -2
- package/plugins/lisa/rules/reference/derived-branch-plan.md +112 -0
- package/plugins/lisa/rules/reference/intent-routing.md +1 -1
- package/plugins/lisa/rules/reference/project-learnings.md +6 -4
- package/plugins/lisa/rules/reference/promotion-contract.md +2 -1
- package/plugins/lisa/skills/lisa-debrief/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-debrief-apply/SKILL.md +3 -3
- package/plugins/lisa/skills/lisa-doctor/SKILL.md +4 -1
- package/plugins/lisa/skills/lisa-github-read-issue/SKILL.md +1 -0
- package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +15 -0
- package/plugins/lisa/skills/lisa-implement/SKILL.md +6 -0
- package/plugins/lisa/skills/lisa-improve-harness/SKILL.md +2 -2
- package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +15 -0
- package/plugins/lisa/skills/lisa-learnings-audit/SKILL.md +6 -3
- package/plugins/lisa/skills/lisa-linear-access/SKILL.md +25 -3
- package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +15 -0
- package/plugins/lisa/skills/lisa-secrets-access/SKILL.md +20 -2
- package/plugins/lisa/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
- package/plugins/lisa/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
- package/plugins/lisa/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
- package/plugins/lisa/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
- package/plugins/lisa/skills/lisa-setup-atlassian/SKILL.md +17 -0
- package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +17 -0
- package/plugins/lisa/skills/lisa-setup-notion/SKILL.md +17 -0
- package/plugins/lisa-agy/agents/learnings-synthesizer.md +1 -1
- package/plugins/lisa-agy/agents/skill-evaluator.md +1 -1
- package/plugins/lisa-agy/hooks/block-instruction-file-edits.sh +1 -1
- package/plugins/lisa-agy/hooks/block-shell-json-parsing.sh +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-debrief/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-debrief-apply/SKILL.md +3 -3
- package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +4 -1
- package/plugins/lisa-agy/skills/lisa-github-read-issue/SKILL.md +1 -0
- package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +15 -0
- package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +6 -0
- package/plugins/lisa-agy/skills/lisa-improve-harness/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +15 -0
- package/plugins/lisa-agy/skills/lisa-learnings-audit/SKILL.md +6 -3
- package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +25 -3
- package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +15 -0
- package/plugins/lisa-agy/skills/lisa-secrets-access/SKILL.md +20 -2
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
- package/plugins/lisa-agy/skills/lisa-setup-atlassian/SKILL.md +17 -0
- package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +17 -0
- package/plugins/lisa-agy/skills/lisa-setup-notion/SKILL.md +17 -0
- 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/agents/learnings-synthesizer.agent.md +1 -1
- package/plugins/lisa-copilot/agents/skill-evaluator.agent.md +1 -1
- package/plugins/lisa-copilot/hooks/block-instruction-file-edits.sh +1 -1
- package/plugins/lisa-copilot/hooks/block-shell-json-parsing.sh +1 -1
- package/plugins/lisa-copilot/rules/eager/config-resolution.md +6 -3
- package/plugins/lisa-copilot/rules/eager/derived-branch-plan.md +45 -0
- package/plugins/lisa-copilot/rules/eager/project-learnings.md +3 -2
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +26 -2
- package/plugins/lisa-copilot/rules/reference/derived-branch-plan.md +112 -0
- package/plugins/lisa-copilot/rules/reference/intent-routing.md +1 -1
- package/plugins/lisa-copilot/rules/reference/project-learnings.md +6 -4
- package/plugins/lisa-copilot/rules/reference/promotion-contract.md +2 -1
- package/plugins/lisa-copilot/skills/lisa-debrief/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-debrief-apply/SKILL.md +3 -3
- package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +4 -1
- package/plugins/lisa-copilot/skills/lisa-github-read-issue/SKILL.md +1 -0
- package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +15 -0
- package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +6 -0
- package/plugins/lisa-copilot/skills/lisa-improve-harness/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +15 -0
- package/plugins/lisa-copilot/skills/lisa-learnings-audit/SKILL.md +6 -3
- package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +25 -3
- package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +15 -0
- package/plugins/lisa-copilot/skills/lisa-secrets-access/SKILL.md +20 -2
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
- package/plugins/lisa-copilot/skills/lisa-setup-atlassian/SKILL.md +17 -0
- package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +17 -0
- package/plugins/lisa-copilot/skills/lisa-setup-notion/SKILL.md +17 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/learnings-synthesizer.md +1 -1
- package/plugins/lisa-cursor/agents/skill-evaluator.md +1 -1
- package/plugins/lisa-cursor/hooks/block-instruction-file-edits.sh +1 -1
- package/plugins/lisa-cursor/hooks/block-shell-json-parsing.sh +1 -1
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +26 -2
- package/plugins/lisa-cursor/rules/config-resolution.mdc +6 -3
- package/plugins/lisa-cursor/rules/derived-branch-plan-reference.mdc +117 -0
- package/plugins/lisa-cursor/rules/derived-branch-plan.mdc +50 -0
- package/plugins/lisa-cursor/rules/intent-routing-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/project-learnings-reference.mdc +6 -4
- package/plugins/lisa-cursor/rules/project-learnings.mdc +3 -2
- package/plugins/lisa-cursor/rules/promotion-contract-reference.mdc +2 -1
- package/plugins/lisa-cursor/skills/lisa-debrief/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-debrief-apply/SKILL.md +3 -3
- package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +4 -1
- package/plugins/lisa-cursor/skills/lisa-github-read-issue/SKILL.md +1 -0
- package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +15 -0
- package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +6 -0
- package/plugins/lisa-cursor/skills/lisa-improve-harness/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +15 -0
- package/plugins/lisa-cursor/skills/lisa-learnings-audit/SKILL.md +6 -3
- package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +25 -3
- package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +15 -0
- package/plugins/lisa-cursor/skills/lisa-secrets-access/SKILL.md +20 -2
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
- package/plugins/lisa-cursor/skills/lisa-setup-atlassian/SKILL.md +17 -0
- package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +17 -0
- package/plugins/lisa-cursor/skills/lisa-setup-notion/SKILL.md +17 -0
- 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/hooks/block-suppress-directives.sh +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-copilot/hooks/block-suppress-directives.sh +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/hooks/block-suppress-directives.sh +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/agents/learnings-synthesizer.md +1 -1
- package/plugins/src/base/agents/skill-evaluator.md +1 -1
- package/plugins/src/base/hooks/block-instruction-file-edits.sh +1 -1
- package/plugins/src/base/hooks/block-shell-json-parsing.sh +1 -1
- package/plugins/src/base/rules/eager/config-resolution.md +6 -3
- package/plugins/src/base/rules/eager/derived-branch-plan.md +45 -0
- package/plugins/src/base/rules/eager/project-learnings.md +3 -2
- package/plugins/src/base/rules/reference/config-resolution.md +26 -2
- package/plugins/src/base/rules/reference/derived-branch-plan.md +112 -0
- package/plugins/src/base/rules/reference/intent-routing.md +1 -1
- package/plugins/src/base/rules/reference/project-learnings.md +6 -4
- package/plugins/src/base/rules/reference/promotion-contract.md +2 -1
- package/plugins/src/base/skills/lisa-debrief/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-debrief-apply/SKILL.md +3 -3
- package/plugins/src/base/skills/lisa-doctor/SKILL.md +4 -1
- package/plugins/src/base/skills/lisa-github-read-issue/SKILL.md +1 -0
- package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +22 -0
- package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +15 -0
- package/plugins/src/base/skills/lisa-implement/SKILL.md +6 -0
- package/plugins/src/base/skills/lisa-improve-harness/SKILL.md +2 -2
- package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
- package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +15 -0
- package/plugins/src/base/skills/lisa-learnings-audit/SKILL.md +6 -3
- package/plugins/src/base/skills/lisa-linear-access/SKILL.md +25 -3
- package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +22 -0
- package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +15 -0
- package/plugins/src/base/skills/lisa-secrets-access/SKILL.md +20 -2
- package/plugins/src/base/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
- package/plugins/src/base/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
- package/plugins/src/base/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
- package/plugins/src/base/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
- package/plugins/src/base/skills/lisa-setup-atlassian/SKILL.md +17 -0
- package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +17 -0
- package/plugins/src/base/skills/lisa-setup-notion/SKILL.md +17 -0
- package/plugins/src/typescript/hooks/block-suppress-directives.sh +1 -1
- package/scripts/github-status-check.sh +22 -7
- package/all/create-only/.claude/rules/PROJECT_RULES.md +0 -17
|
@@ -38,7 +38,6 @@ fi
|
|
|
38
38
|
{
|
|
39
39
|
"tracker": "jira",
|
|
40
40
|
"source": "notion",
|
|
41
|
-
"projectRulesFile": ".claude/rules/PROJECT_RULES.md",
|
|
42
41
|
|
|
43
42
|
"atlassian": { "cloudId": "<uuid>", "site": "<host>" },
|
|
44
43
|
"jira": {
|
|
@@ -184,12 +183,21 @@ fi
|
|
|
184
183
|
|-------|----------|---------|-------|
|
|
185
184
|
| `tracker` | **yes** | — | Destination for ticket writes. One of `"jira"`, `"github"`, `"linear"`. Missing → fail with instruction to run the matching `/lisa:setup:*` skill. |
|
|
186
185
|
| `source` | no | — | Default PRD source for batch skills (`/lisa:intake`) and arg-less single-PRD skills. One of `"notion"`, `"confluence"`, `"linear"`, `"github"`, `"jira"`. Explicit URLs/keys passed to a skill always win over `source`; this is a default, not a lock. |
|
|
187
|
-
|
|
|
186
|
+
| ~~`projectRulesFile`~~ | — | — | **Retired.** Host-authored rules now live in the fixed, agent-neutral directory `.agents/rules/` — not a configurable file. An existing key is still parsed and preserved so installed projects keep applying, but nothing serves rules from it. See **Host rules** below. |
|
|
188
187
|
| `learnings.file` | no | `.lisa/PROJECT_LEARNINGS.md` | Safe repo-relative Markdown path for the machine-managed learnings ledger, overriding the `.lisa/` default. Rejected if it resolves inside any auto-loaded rules tree (`.claude/rules`, `.cursor/rules`, `.github/instructions`, `.agents/rules`) — the ledger must stay out of eager context. |
|
|
189
188
|
| `health.schedule` | no | `off` | Health cadence contract: `off`, `daily`, or `weekly`. `lisa sync` populates the default with `_lisaSync.populated` provenance and rejects values outside this closed vocabulary. Runtime results live only at the gitignored `.lisa/health/latest.json`, never in either config file. |
|
|
190
189
|
| `usage` | no | — | Optional token/cost pricing metadata consumed by the `usage-accounting` rule. Missing pricing never blocks a lifecycle flow; Lisa records token counts with `estimated_cost: null` when no trustworthy price source is configured. |
|
|
191
190
|
| `wiki` | no | — | Wiki location for the `wiki-knowledge-source` rule. Omit for a local in-repo wiki (`wiki/`). See **Wiki source** below. |
|
|
192
191
|
|
|
192
|
+
### Host rules (`.agents/rules/`)
|
|
193
|
+
|
|
194
|
+
Host-authored operating rules live in `.agents/rules/` — **fixed, not configurable**. One directory, every agent.
|
|
195
|
+
|
|
196
|
+
- **Not a native auto-load tree.** `.claude/rules`, `.cursor/rules`, and `.github/instructions` are; `.agents/rules` deliberately is not. Every agent reaches it through the single Lisa-managed pointer block in `AGENTS.md` (Claude via the `@AGENTS.md` import in `CLAUDE.md`), so no agent loads host rules twice.
|
|
197
|
+
- **Host-owned.** Lisa never writes rule bodies into `.agents/rules/`, and never edits or deletes a file there. Lisa's own rules originate in its plugins and arrive by their own route.
|
|
198
|
+
- **Not the learnings ledger.** `.agents/rules` is reserved in the auto-loaded-tree blocklist, so a `learnings.file` override can never resolve inside it.
|
|
199
|
+
- **Transition.** A project that still has the retired `.claude/rules/PROJECT_RULES.md` keeps it, untouched and authoritative. The pointer block names it so agents whose runtime does not auto-load `.claude/rules/` still find it. Moving that content is a human-gated decision, never an automated rewrite.
|
|
200
|
+
|
|
193
201
|
### Wiki source (`wiki`)
|
|
194
202
|
|
|
195
203
|
Declares **where this repo's LLM Wiki lives** so the query/ingest skills can resolve and (for a remote wiki) mirror it. `wiki.source` has two shapes — **local** (`path`) and **remote** (`url`) — and the block belongs in the **consumer** repo's `.lisa.config.json`, not in `wiki/lisa-wiki.config.json` (which describes a wiki from the inside and is unavailable until a remote wiki is mirrored — chicken-and-egg). The whole `wiki` block is optional; omit it and the resolver falls back to the in-repo `wiki/` convention.
|
|
@@ -852,6 +860,22 @@ read_notion_token() {
|
|
|
852
860
|
local slug=$(echo "$workspace" | tr '[:upper:]-' '[:lower:]_')
|
|
853
861
|
local varname="NOTION_API_TOKEN_${slug}"
|
|
854
862
|
[ -n "${!varname}" ] && { echo "${!varname}"; return; }
|
|
863
|
+
# Preferred path: the single secrets chokepoint, which owns the one-store rule
|
|
864
|
+
# and the surface ladder. An agent following this reference must try it before
|
|
865
|
+
# any keychain — a second reader is how one credential ends up in two places.
|
|
866
|
+
local resolver
|
|
867
|
+
for resolver in .claude/skills/lisa-secrets-access/scripts/resolve-secret.mjs \
|
|
868
|
+
.agents/skills/lisa-secrets-access/scripts/resolve-secret.mjs; do
|
|
869
|
+
if [ -f "$resolver" ]; then
|
|
870
|
+
local via_lisa
|
|
871
|
+
via_lisa=$(node "$resolver" get NOTION_API_TOKEN 2>/dev/null) \
|
|
872
|
+
&& [ -n "$via_lisa" ] && { echo "$via_lisa"; return; }
|
|
873
|
+
break
|
|
874
|
+
fi
|
|
875
|
+
done
|
|
876
|
+
# Legacy fallback: the OS keychain written by the guided setup flow, for
|
|
877
|
+
# projects with no credentials provider. Reached only when the chokepoint is
|
|
878
|
+
# absent or has no entry.
|
|
855
879
|
case "$(uname -s)" in
|
|
856
880
|
Darwin) security find-generic-password -s lisa-notion -a "$workspace" -w 2>/dev/null ;;
|
|
857
881
|
Linux) command -v secret-tool >/dev/null && \
|
|
@@ -42,9 +42,12 @@ This is the shared slug for the config-bound-transitions policy (the `leaf-only-
|
|
|
42
42
|
|
|
43
43
|
## Project rules and learnings
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
Host-authored project rules live in the fixed, agent-neutral directory
|
|
46
|
+
`.agents/rules/` — not a configurable file. Every agent reaches it through the
|
|
47
|
+
Lisa-managed pointer block in `AGENTS.md`, so it is read once, on demand. A
|
|
48
|
+
project that still carries the retired `.claude/rules/PROJECT_RULES.md` keeps
|
|
49
|
+
it, untouched and authoritative; the pointer names it too. Automated
|
|
50
|
+
learnings never append to host rules: they use the separate machine-managed
|
|
48
51
|
ledger resolved from `.lisa.config.json` — the optional `learnings.file`
|
|
49
52
|
override, else the default `.lisa/PROJECT_LEARNINGS.md`. The ledger lives in the
|
|
50
53
|
cold `.lisa/` tree (never an auto-loaded rules directory) and is consumed only
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Derived Branch Plan — reference"
|
|
3
|
+
alwaysApply: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Derived Branch Plan — reference
|
|
7
|
+
|
|
8
|
+
The full body behind the `derived-branch-plan` eager head. It defines one vendor-neutral contract consumed by the three tracker writers (`lisa-jira-write-ticket`, `lisa-github-write-issue`, `lisa-linear-write-issue`), the three validators (`lisa-jira-validate-ticket`, `lisa-github-validate-issue`, `lisa-linear-validate-issue`) via gate **S19**, and `lisa-implement` at claim time. Each surface cites this slug rather than growing its own prose, exactly as the vendor arms cite `leaf-only-lifecycle` and `repo-scope-split`. One slug is what keeps a branch plan rejected on JIRA from being accepted on Linear.
|
|
9
|
+
|
|
10
|
+
## The problem this solves, and the one it must not create
|
|
11
|
+
|
|
12
|
+
An operator reading a work item cannot see which branch the work starts from or which branch the PR lands in. Both facts are knowable, but only by resolving `.lisa.config.json` — which is exactly the kind of engineering step the factory model says a non-technical operator standing at the gate should not have to take.
|
|
13
|
+
|
|
14
|
+
The obvious fix — add a "source branch" field and a "PR target" field to the ticket template — is wrong, and it is worth being explicit about why, because it will look like the simple answer every time someone revisits this. Those fields would be **a second source of truth** for a fact Lisa already derives authoritatively from `## Target Backend Environment` + `deploy.branches`. Two authorities do not stay equal. They drift the first time an environment is corrected on a ticket whose branch fields nobody updated, or the first time `deploy.branches` is remapped. And the consequence of that drift is not a stale label: it is an agent branching from, and merging into, the wrong environment's branch — shipping unreviewed code to production, or shipping a production fix into a staging branch where nobody sees it.
|
|
15
|
+
|
|
16
|
+
So the contract renders the branches **for humans** and recomputes them **for machines**. The rendered section is output. It is never input.
|
|
17
|
+
|
|
18
|
+
Precedence is therefore not a negotiation: whenever a rendered plan and the resolved environment disagree, **the environment wins** — the authority wins, in every phase, on every vendor, with no exception for a plan a human edited by hand. The only question a disagreement raises is whether to re-render silently (staleness) or stop for a human (a conflict with a confirmed environment or an open PR base). It is never "which branch did they mean?"
|
|
19
|
+
|
|
20
|
+
## The rendered section
|
|
21
|
+
|
|
22
|
+
| Vendor | Heading form |
|
|
23
|
+
|---|---|
|
|
24
|
+
| JIRA | `h2. Branch Plan` (ADF heading in live JIRA) |
|
|
25
|
+
| GitHub | `## Branch Plan` |
|
|
26
|
+
| Linear | `## Branch Plan` |
|
|
27
|
+
|
|
28
|
+
Body, identical on all three:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
Branch from: <branch>
|
|
32
|
+
PR into: <branch>
|
|
33
|
+
Derived from: Target Backend Environment <env> via .lisa.config.json deploy.branches
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### The derivation provenance line
|
|
37
|
+
|
|
38
|
+
The third line is load-bearing. It is the discriminator between a section this contract produced and one a human typed, and it is deliberately visible prose rather than an HTML comment — the same reason the `Target Backend Environment` grammar uses visible `Inferred:` / `Assumption:` annotations: JIRA's ADF has no comment node, so a marker that only exists in markdown cannot be a vendor-neutral discriminator.
|
|
39
|
+
|
|
40
|
+
A `Branch Plan` **without the provenance line is treated as hand-authored**, and hand-authored branches are never obeyed — they are compared against the recomputed plan and, on any disagreement, fail. A provenance line naming an `<env>` that is not an exact configured `deploy.branches` key is itself malformed and fails.
|
|
41
|
+
|
|
42
|
+
### One branch, two labels
|
|
43
|
+
|
|
44
|
+
`Branch from` and `PR into` always name the **same branch**. That is not a simplification, it is the invariant `lisa-implement` already implements: the feature branch is cut from `origin/<base>` and the PR targets `<base>`. Both labels exist because operators asked to see both questions answered, and because naming them separately gives the contract somewhere to say they are equal instead of leaving it implicit.
|
|
45
|
+
|
|
46
|
+
A plan whose two fields name **two different branches** is malformed and fails validation. The case that looks like a counter-example — a bug fixed on a non-integration environment branch that must also reach the integration branch — is handled the way `lisa-implement` already handles it: as a **linked forward cherry-pick follow-up item**, which is its own work item with its own single-branch plan. It is never a divergence inside one plan.
|
|
47
|
+
|
|
48
|
+
## Derivation algorithm
|
|
49
|
+
|
|
50
|
+
1. **Resolve the environment.** Use the existing grammar and precedence defined in `config-resolution` and `pre-flight-autofill`: a human-confirmed bare configured key or `Confirmed: <env>` wins; then a validated `Inferred: <env> — evidence: <title|body|reproduction|hostname>`; then `Assumption: <env> — remote default branch <branch>`, or the branch-only `Assumption: remote default branch <branch>` when the reverse-map is not unique. This rule adds no new resolution logic and no new aliases.
|
|
51
|
+
2. **Map forward.** Look the exact configured key up in `deploy.branches`. The key must resolve to exactly one branch.
|
|
52
|
+
3. **Prove the branch.** The mapped branch must exist on the remote.
|
|
53
|
+
4. **Render.** Both fields to that branch, plus the provenance line naming the `<env>` used.
|
|
54
|
+
|
|
55
|
+
### Stop conditions
|
|
56
|
+
|
|
57
|
+
| Condition | Behavior |
|
|
58
|
+
|---|---|
|
|
59
|
+
| No environment resolvable and the item is not exempt | Stop — the `Target Backend Environment` gate (S8) already owns this |
|
|
60
|
+
| Environment key absent from `deploy.branches` | Stop |
|
|
61
|
+
| Mapping ambiguous / not unique | Stop |
|
|
62
|
+
| Mapped branch missing on the remote | Stop |
|
|
63
|
+
|
|
64
|
+
**Never guess.** There is no fallback that quietly substitutes `main`, the remote default branch, or the branch of a sibling environment to keep a write from failing — a silent guess here is the exact failure this contract exists to prevent, and a stopped write is cheap next to a wrong-branch merge. The remote default branch enters only through the `Assumption:` form the environment grammar already defines, and only recorded as an assumption.
|
|
65
|
+
|
|
66
|
+
## Gate S19 — Branch Plan derivation
|
|
67
|
+
|
|
68
|
+
Registered in all three validators as `| S19 Branch Plan derivation | technical | false |`. The gate **recomputes** the plan from current config and compares; it never reads the rendered branches as input.
|
|
69
|
+
|
|
70
|
+
| Case | Verdict |
|
|
71
|
+
|---|---|
|
|
72
|
+
| Exempt work (`runtime_behavior_change = false`, or a container) with no plan | `N/A` |
|
|
73
|
+
| Exempt work **carrying** a plan | **FAIL** — hand-authored branches on work that declared no runtime target |
|
|
74
|
+
| Applicable work, plan present, matches recomputed plan | PASS |
|
|
75
|
+
| Applicable work, plan present, disagrees with recomputed plan | **FAIL** |
|
|
76
|
+
| Applicable work, plan present, missing the provenance line and disagreeing | **FAIL** (hand-authored) |
|
|
77
|
+
| Applicable work, two fields naming different branches | **FAIL** — malformed |
|
|
78
|
+
| Applicable work, derivation hits a stop condition | **FAIL** — same stop as implement |
|
|
79
|
+
| Applicable work, **proposed spec** (pre-write) with no plan | **FAIL** — the writer must render it before the write |
|
|
80
|
+
| Applicable work, **live legacy item** with no plan | `N/A` with a repair note routed to claim time |
|
|
81
|
+
|
|
82
|
+
The last two rows are the asymmetry that matters. Failing a *proposed* spec is free — the writer just renders the section. Failing every *existing* item would turn a whole legacy queue red overnight for a section no human ever had a way to add, so those are repaired at claim time instead, where the derivation is written onto the item as evidence.
|
|
83
|
+
|
|
84
|
+
### Failure remediation
|
|
85
|
+
|
|
86
|
+
Every S19 failure names both plans (rendered and recomputed) and points the fix at **the environment, never the branches**:
|
|
87
|
+
|
|
88
|
+
> Branch Plan conflicts with the environment mapping. Rendered `Branch from: release/staging`; recomputed from `Target Backend Environment: production` via `deploy.branches` → `main`. Correct the environment, not the branch — the branches are derived. Then re-render.
|
|
89
|
+
|
|
90
|
+
The gate never silently chooses between the two. Picking one would be a guess wearing a verdict.
|
|
91
|
+
|
|
92
|
+
## Claim-time behavior (`lisa-implement`)
|
|
93
|
+
|
|
94
|
+
At claim time the plan is recomputed against **current config and the remote** — never trusted from the item — and one of four arms runs:
|
|
95
|
+
|
|
96
|
+
- **Match** — proceed. The already-existing base-branch validation, feature-branch sync, and `target_branch=<base>` handoff are unchanged.
|
|
97
|
+
- **Legacy (no plan)** — derive it, **write the assumption onto the item as a comment**, then proceed. The comment carries a visible prose line plus a dedupe marker so a re-claim produces no duplicate:
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
Branch plan derived for this item: branch from `main`, PR into `main` (Target Backend
|
|
101
|
+
Environment: production via .lisa.config.json deploy.branches).
|
|
102
|
+
<!-- [lisa-branch-plan] key=<work-item-ref>::<branch> -->
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Marker-dedupe is on `<work-item-ref>::<branch>`, so the comment reappears only if the derived branch actually changes. Where a vendor cannot host an HTML comment, the visible line alone carries it. If the comment cannot be written, that is a stop, not a shrug — proceeding would make it exactly the silent guess this rule forbids.
|
|
106
|
+
- **Conflict with a human-confirmed environment, or with an existing open PR's base** — **stop under the existing confirmation rules**. `lisa-implement` already surfaces a PR-base mismatch and re-targets only with confirmation, on the stated grounds that the ticket's environment is the source of truth; a branch plan never overrides that, and never supplies the confirmation itself.
|
|
107
|
+
- **Stale (config changed since the plan was rendered)** — **current config wins**. Re-render the section onto the item, record the change, and never follow the stale plan. A stale plan is not a conflict to escalate; it is output that fell behind its input.
|
|
108
|
+
|
|
109
|
+
## Why the gate is `technical` / not product-relevant
|
|
110
|
+
|
|
111
|
+
S19 is categorized `technical`, `product_relevant: false`, matching S8 — the fact it checks is a deployment-topology fact, and a PRD-intake comment aimed at a product author cannot act on it. The operator-facing value of the section is that it is *visible on the item*, not that its failures are routed to product.
|
|
112
|
+
|
|
113
|
+
## What this rule deliberately does not do
|
|
114
|
+
|
|
115
|
+
- It defines **no new environment resolution**, no new aliases, and no new provenance grammar. All of that stays in `config-resolution` / `pre-flight-autofill`, and this rule reads the result.
|
|
116
|
+
- It does **not** let a branch plan influence which environment is chosen, in any direction, at any phase.
|
|
117
|
+
- It does **not** introduce branch fields on PRDs. PRDs are not built directly; their generated leaves carry the plan.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Derived Branch Plan (load-bearing)"
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Derived Branch Plan (load-bearing)
|
|
7
|
+
|
|
8
|
+
**Every applicable leaf work item shows the branch it will be built from and the branch its PR lands in, as a generated `Branch Plan` section — and that section is derived data, not a second authority.** The authority is `## Target Backend Environment` resolved forward through `.lisa.config.json` `deploy.branches`. A work item that displays branches nobody can trace back to that mapping, or a flow that reads the displayed branches instead of recomputing them, is a contract violation.
|
|
9
|
+
|
|
10
|
+
**One vendor-neutral contract, cited by** `lisa-jira-write-ticket`, `lisa-github-write-issue`, `lisa-linear-write-issue`, `lisa-jira-validate-ticket`, `lisa-github-validate-issue`, `lisa-linear-validate-issue`, and `lisa-implement` (the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never divergent per-vendor prose).
|
|
11
|
+
|
|
12
|
+
## Why derived, and not two branch fields
|
|
13
|
+
|
|
14
|
+
The operator need is real: reading a ticket should not require resolving a config file to learn where the work starts and where it lands. But Lisa already owns that fact. Adding independent literal branch fields would create **a second source of truth that can drift** — and the failure mode of that drift is not a cosmetic mismatch, it is code silently shipped to the wrong environment. So the branches are rendered for humans and recomputed for machines. The rendered branches are **never read as input** by any flow, at any phase — a surface that needs the base branch derives it again from the environment.
|
|
15
|
+
|
|
16
|
+
## The rendered section
|
|
17
|
+
|
|
18
|
+
Exactly three lines, identical across vendors (`h2. Branch Plan` in JIRA wiki markup, `## Branch Plan` in GitHub/Linear markdown):
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Branch from: <branch>
|
|
22
|
+
PR into: <branch>
|
|
23
|
+
Derived from: Target Backend Environment <env> via .lisa.config.json deploy.branches
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The third line is the **derivation provenance line**. It is what marks the section machine-authored: a `Branch Plan` without it is treated as hand-authored, and hand-authored branches are never obeyed.
|
|
27
|
+
|
|
28
|
+
`Branch from` and `PR into` name the **same branch by construction** — implementation checks the feature branch out of `origin/<base>` and targets the PR back into `<base>`. A plan naming two different branches is malformed and fails validation. (A fix that genuinely lands on one branch and must reach another travels as a linked follow-up work item with its own branch plan, never as a divergence inside one plan.)
|
|
29
|
+
|
|
30
|
+
## Derivation
|
|
31
|
+
|
|
32
|
+
1. Resolve the environment under the existing `Target Backend Environment` grammar (`config-resolution`, `pre-flight-autofill`) — human-confirmed wins, then validated `Inferred:`, then `Assumption:`.
|
|
33
|
+
2. Map that exact configured key forward through `deploy.branches`. The key must map uniquely and the mapped branch must exist on the remote.
|
|
34
|
+
3. Render both fields to that branch plus the provenance line.
|
|
35
|
+
|
|
36
|
+
A missing or **ambiguous** mapping, a key that is **not unique**, or a branch absent from the remote **stops** the flow — exactly as `lisa-implement` already stops. **Never default independently to `main`, to the remote default branch, or to any other branch** to keep a write from failing. The remote default is a legitimate input only through the `Assumption:` fallback the environment grammar already defines, and it must be recorded as such.
|
|
37
|
+
|
|
38
|
+
## Exemption
|
|
39
|
+
|
|
40
|
+
Work that declares no runtime behavior change — `runtime_behavior_change = false`, i.e. doc-only, config-only, and type-only items — carries **no `Target Backend Environment`**, therefore has nothing to derive from and **requires no branch plan**. Its **absence is correct**, not a missing section, and no gate may demand one. Containers (an Epic, or a Story/Spike still holding child work) are exempt for the same reason: they are not built directly.
|
|
41
|
+
|
|
42
|
+
The exemption is one-way. Exempt work that *carries* a branch plan fails validation — branches asserted for work that declared it has no runtime target are hand-authored by definition, which is the second-authority failure this rule exists to prevent.
|
|
43
|
+
|
|
44
|
+
## Conflict, legacy, and drift
|
|
45
|
+
|
|
46
|
+
- **Conflict** — a present plan that disagrees with the recomputed plan **fails**; the flow never silently picks a side. The remediation is always to correct the environment, never to edit the branches.
|
|
47
|
+
- **Legacy** — an item written before this rule has no plan. At claim time the implementing agent derives it, **writes the assumption onto the item as a comment**, and proceeds. Never a silent guess.
|
|
48
|
+
- **Drift** — config changed after the plan was rendered. Current config wins; the stale plan is re-rendered and never followed.
|
|
49
|
+
|
|
50
|
+
Full derivation table, gate S19 semantics, the claim-time arms, and the vendor rendering details: [reference/derived-branch-plan.md](derived-branch-plan-reference.mdc).
|
|
@@ -228,7 +228,7 @@ Sequence:
|
|
|
228
228
|
- **PRD defect** — the ticket faithfully captured the PRD, but the PRD itself was wrong, ambiguous, or missing the failing case
|
|
229
229
|
- **Missing tool access** — an agent lacked a tool, credential, environment, or permission the work required
|
|
230
230
|
|
|
231
|
-
The three knowledge categories (recurring gotcha, process friction, convention drift) persist to the committed learnings ledger through the executable contract — never to machine-local memory,
|
|
231
|
+
The three knowledge categories (recurring gotcha, process friction, convention drift) persist to the committed learnings ledger through the executable contract — never to machine-local memory, host rules (`.agents/rules/`), or `AGENTS.md`.
|
|
232
232
|
4. **Produce the human-triage document** — a markdown file with one row per candidate learning showing: category, summary, evidence (links to the source ticket comment / PR comment / commit), recommended persistence destination, and a checkbox-style disposition field the human will mark (Accept / Reject / Defer). Surface step-1 anomalies (work items missing PRs, etc.) in a separate section. The document is exhaustive — it lists every candidate, even ones the synthesizer rates low confidence — because the human, not the agent, decides what is worth keeping.
|
|
233
233
|
5. **Record Debrief usage on the triage document** — invoke `lisa-usage-accounting` against the generated markdown artifact so the document carries its own direct `debrief` usage entry in the canonical `## Lisa Usage` section. If runtime usage is unavailable, write the entry with `source: unavailable` and nullable token/cost fields rather than skipping it.
|
|
234
234
|
6. **Stop and hand the document to the human.** Debrief does NOT persist accepted learnings itself. The human triages, marks dispositions, and runs the **`/lisa:debrief:apply`** command (skill: `debrief-apply`) to route the accepted items to their destinations.
|
|
@@ -39,7 +39,7 @@ Each persisted entry has seven fields:
|
|
|
39
39
|
|
|
40
40
|
- The **learner agent** at capture time appends or consolidates new entries
|
|
41
41
|
(`persistLearningEntry` / `persistConsolidatedLearning`) from task learnings.
|
|
42
|
-
It is capture-only: it never appends to
|
|
42
|
+
It is capture-only: it never appends to host rules, creates skills, or
|
|
43
43
|
files upstream issues — promotion is the gardener's ticket-gated job.
|
|
44
44
|
- **`lisa-debrief-apply`** routes accepted debrief findings in the three
|
|
45
45
|
knowledge categories — recurring gotcha, process friction, convention drift —
|
|
@@ -47,7 +47,8 @@ Each persisted entry has seven fields:
|
|
|
47
47
|
`persistConsolidatedLearning`, with consolidation-at-write), provenance drawn
|
|
48
48
|
from the triage row's evidence links and a `high` starting confidence because
|
|
49
49
|
a human Accept is corroboration. It no longer writes to machine-local memory,
|
|
50
|
-
|
|
50
|
+
the host-rules directory `.agents/rules/` (or a surviving legacy
|
|
51
|
+
`PROJECT_RULES.md`), or `AGENTS.md` (the human-authored source of truth, of
|
|
51
52
|
which `CLAUDE.md` is only a `@AGENTS.md` pointer) for these categories.
|
|
52
53
|
- The **build-intake flows** advance `last_confirmed` at claim time
|
|
53
54
|
(`confirmLearningEntry`, below).
|
|
@@ -82,9 +83,10 @@ warning, apply no entry, and do not block unrelated work.
|
|
|
82
83
|
Precedence:
|
|
83
84
|
|
|
84
85
|
1. System, developer, user, and repo instructions still outrank learnings.
|
|
85
|
-
2. Committed
|
|
86
|
+
2. Committed host rules (`.agents/rules/`) remain durable human-authored
|
|
87
|
+
guidance.
|
|
86
88
|
3. Project learnings add recent operational knowledge, but never rewrite or
|
|
87
|
-
append to
|
|
89
|
+
append to host rules.
|
|
88
90
|
|
|
89
91
|
## Task telemetry (MLD) is not context
|
|
90
92
|
|
|
@@ -20,7 +20,8 @@ receive the contract's bounded projection, not the full file.
|
|
|
20
20
|
|
|
21
21
|
Missing learnings are a silent no-op. Malformed, non-canonical, unsafe, or
|
|
22
22
|
over-budget learnings produce one readable warning, apply no entry, and must not
|
|
23
|
-
block unrelated task work. Never append automated learnings to
|
|
24
|
-
`PROJECT_RULES.md
|
|
23
|
+
block unrelated task work. Never append automated learnings to host rules
|
|
24
|
+
(`.agents/rules/`, or a surviving legacy `PROJECT_RULES.md`); project learnings
|
|
25
|
+
are a separate machine-managed document.
|
|
25
26
|
|
|
26
27
|
Full prose: [reference/project-learnings.md](project-learnings-reference.mdc).
|
|
@@ -126,6 +126,7 @@ and lets reviewers diff against a single source of truth.
|
|
|
126
126
|
- **The gardener** (`lisa-learnings-audit`): embeds the AC template above into
|
|
127
127
|
EXECUTABLE-CONTROL promotion tickets and applies the eager-tier admission
|
|
128
128
|
policy when auditing.
|
|
129
|
-
- **
|
|
129
|
+
- **Host-rules owners** (`.agents/rules/`, plus any surviving legacy
|
|
130
|
+
`PROJECT_RULES.md`): that surface is human-authored only; machine
|
|
130
131
|
writes go to the learnings ledger, and promotions out of it arrive as
|
|
131
132
|
gardener tickets governed by this contract.
|
|
@@ -72,7 +72,7 @@ A markdown triage document at `./debrief/<initiative-slug>-<YYYY-MM-DD>.md` (or
|
|
|
72
72
|
- `Summary` — one sentence
|
|
73
73
|
- `Category`
|
|
74
74
|
- `Evidence` — links to the source ticket comment / PR comment / commit / test file (multiple allowed)
|
|
75
|
-
- `Recommended persistence destination` — the agent's best guess for where this should land if accepted (e.g., "Edge Case Brainstorm checklist → Navigation & URL state", "learnings ledger via the executable contract", "new tooling-gap ticket", "upstream Lisa issue"). Never name machine-local auto-memory,
|
|
75
|
+
- `Recommended persistence destination` — the agent's best guess for where this should land if accepted (e.g., "Edge Case Brainstorm checklist → Navigation & URL state", "learnings ledger via the executable contract", "new tooling-gap ticket", "upstream Lisa issue"). Never name machine-local auto-memory, the host-rules directory `.agents/rules/`, or `AGENTS.md` — those are not persistence destinations.
|
|
76
76
|
- `Disposition` — empty checkbox-style field the human will fill: `[ ] Accept` / `[ ] Reject` / `[ ] Defer` plus a free-text reason
|
|
77
77
|
4. **Source map** — appendix listing every work item and PR walked, so the human can verify completeness.
|
|
78
78
|
|
|
@@ -18,7 +18,7 @@ A path or URL to a Debrief triage document produced by `lisa-debrief`. The docum
|
|
|
18
18
|
|
|
19
19
|
1. **Verify the doc exists and parses.** If the file cannot be read or the expected sections are missing, stop and report — do not guess.
|
|
20
20
|
2. **Confirm dispositions exist.** If every row is unmarked, stop and ask the human to triage first. A pristine doc is a no-op, not an error to silently swallow.
|
|
21
|
-
3. **Identify the destination map.** Read the project's `.lisa.config.json` (or stack defaults) for: edge-case checklist file (default: `plugins/src/base/rules/intent-routing.md`'s Edge Case Brainstorm sub-flow), the committed learnings ledger path (resolve it — never hardcode — via `resolveProjectLearningsFile` from `@codyswann/lisa/learnings`: the `learnings.file` override, else the default `.lisa/PROJECT_LEARNINGS.md`), tracker for new tickets. The three knowledge categories (recurring gotcha, process friction, convention drift) all land in the ledger now; machine-local auto-memory and
|
|
21
|
+
3. **Identify the destination map.** Read the project's `.lisa.config.json` (or stack defaults) for: edge-case checklist file (default: `plugins/src/base/rules/intent-routing.md`'s Edge Case Brainstorm sub-flow), the committed learnings ledger path (resolve it — never hardcode — via `resolveProjectLearningsFile` from `@codyswann/lisa/learnings`: the `learnings.file` override, else the default `.lisa/PROJECT_LEARNINGS.md`), tracker for new tickets. The three knowledge categories (recurring gotcha, process friction, convention drift) all land in the ledger now; machine-local auto-memory and host rules (`.agents/rules/`) / `AGENTS.md` are no longer knowledge destinations (see [Ledger persistence](#ledger-persistence-knowledge-categories)).
|
|
22
22
|
|
|
23
23
|
## Routing rules
|
|
24
24
|
|
|
@@ -61,13 +61,13 @@ For each such Accepted row:
|
|
|
61
61
|
- `first_learned` = `last_confirmed` = today (ISO date; on consolidation keep the superseded entry's earliest `first_learned`).
|
|
62
62
|
- `confidence` = **`high`**. A human marking the row **Accept** is corroboration — an independent human judgement that the learning is real — so a debrief-accepted entry starts higher than the learner's single-occurrence auto-capture (which defaults to `low`). The writer re-asserts the entry and token budgets; an over-budget failure means consolidate harder or drop, never truncate by hand.
|
|
63
63
|
|
|
64
|
-
**Machine-local memory is no longer a knowledge destination.** Auto-memory (`project_*.md`, `MEMORY.md`) remains available only for the assistant's *personal* collaboration notes — it is invisible to cloud runs and to teammates, so it can never hold shared project knowledge. **`AGENTS.md` is human-authored** agent operating instruction — it is the source of truth, and `CLAUDE.md` is only a one-line `@AGENTS.md` pointer — and
|
|
64
|
+
**Machine-local memory is no longer a knowledge destination.** Auto-memory (`project_*.md`, `MEMORY.md`) remains available only for the assistant's *personal* collaboration notes — it is invisible to cloud runs and to teammates, so it can never hold shared project knowledge. **`AGENTS.md` is human-authored** agent operating instruction — it is the source of truth, and `CLAUDE.md` is only a one-line `@AGENTS.md` pointer — and the host-rules directory `.agents/rules/` is durable human-authored guidance; `apply` never writes to any of the three for these categories.
|
|
65
65
|
|
|
66
66
|
## Idempotency
|
|
67
67
|
|
|
68
68
|
`apply` is safe to re-run. Each Accepted row carries an evidence link that doubles as a fingerprint. Before writing, check whether the destination already cites that fingerprint:
|
|
69
69
|
|
|
70
|
-
- **Knowledge categories (gotcha, friction, drift) → ledger.** Parse the ledger once with `parseLearningsFile` from `@codyswann/lisa/learnings` and scan the entries' `provenance` for the row's evidence link. If any entry's provenance already contains it, the row is already persisted — skip the write. This replaces the old scattered-file greps (memory files,
|
|
70
|
+
- **Knowledge categories (gotcha, friction, drift) → ledger.** Parse the ledger once with `parseLearningsFile` from `@codyswann/lisa/learnings` and scan the entries' `provenance` for the row's evidence link. If any entry's provenance already contains it, the row is already persisted — skip the write. This replaces the old scattered-file greps (memory files, host rules, `AGENTS.md`): provenance in the single governed ledger is now the one fingerprint surface.
|
|
71
71
|
- **Other categories** keep their existing destination check (the tracker for the ticket marker, the PRD for the defect comment, `intent-routing.md` for the edge-case citation).
|
|
72
72
|
|
|
73
73
|
If the fingerprint is already present, skip the write and note the row as `already-applied` in the run summary. This lets the human triage a doc incrementally (mark a few, run apply, mark more, run apply again) without producing duplicates.
|
|
@@ -56,7 +56,10 @@ as applicable to the current repo:
|
|
|
56
56
|
and `source` only. If a required CLI, MCP surface, or auth context is unavailable in the current
|
|
57
57
|
runtime, report that explicitly instead of pretending the repo is ready.
|
|
58
58
|
4. **Runtime distribution surfaces** — confirm the command, skill, hook, and related distribution
|
|
59
|
-
surfaces relevant to this repo are present where Lisa expects them on the active runtime
|
|
59
|
+
surfaces relevant to this repo are present where Lisa expects them on the active runtime, and
|
|
60
|
+
that the Lisa-owned enforcement artifacts (`scripts/lisa-hooks/*`,
|
|
61
|
+
`scripts/lisa-enforcement-fallback.sh`) match the installed Lisa version rather than an older
|
|
62
|
+
copy. Present-but-stale is a finding: a guard whose fix never landed enforces the old behavior.
|
|
60
63
|
5. **Automation readiness** — inspect whether the configured queue source/tracker and scheduling
|
|
61
64
|
prerequisites are observable, but do **not** create, edit, or delete automations during doctor.
|
|
62
65
|
6. **Optional GitHub Project coordination** — when `github.projects.v2` is configured, delegate
|
|
@@ -48,6 +48,7 @@ Walk the markdown body and capture each top-level `## ` section by name. Standar
|
|
|
48
48
|
- `Acceptance Criteria` (preserve the Gherkin code-fence verbatim)
|
|
49
49
|
- `Out of Scope`
|
|
50
50
|
- `Target Backend Environment`
|
|
51
|
+
- `Branch Plan` (derived output per `derived-branch-plan` — parsed so callers can *compare* it against a recomputation, never so they can use it as the base branch)
|
|
51
52
|
- `Sign-in Required`
|
|
52
53
|
- `Repository`
|
|
53
54
|
- `Source Artifacts`
|
|
@@ -98,6 +98,7 @@ Per-type content requirements are defined once in the vendor-neutral `work-item-
|
|
|
98
98
|
| S16 Source Requirement traceability | `product-clarity` | true |
|
|
99
99
|
| S17 Improvement measurability | `acceptance-criteria` | true |
|
|
100
100
|
| S18 Stateless-pickup dry-run | `product-clarity` | true |
|
|
101
|
+
| S19 Branch Plan derivation | `technical` | false |
|
|
101
102
|
| F1 Issue type label exists in repo | `structural` | false |
|
|
102
103
|
| F2 Parent sub-issue exists and is the right type | `structural` | false |
|
|
103
104
|
| F3 Linked issues exist | `structural` | false |
|
|
@@ -299,6 +300,26 @@ The autonomy gate, run last, on every build-ready leaf (use the S15 classificati
|
|
|
299
300
|
|
|
300
301
|
Zero questions → PASS. Any question → FAIL, with each question listed verbatim as its own remediation line — these are exactly the clarifying comments the caller posts to the source. The structure gates are proxies; this gate checks the readiness property itself: `ready` means a stateless agent can drive this item to its terminal state with zero human clarification (see `work-item-definition-of-ready`).
|
|
301
302
|
|
|
303
|
+
#### S19 — Branch Plan derivation
|
|
304
|
+
|
|
305
|
+
Enforces the `derived-branch-plan` rule: the `## Branch Plan` section is **derived only** — recompute it from current config and compare; never trust the rendered branches or read them as input. Resolve the environment under the S8 grammar, map that exact configured key forward through `.lisa.config.json` `deploy.branches`, and require the mapped branch on the remote.
|
|
306
|
+
|
|
307
|
+
| Case | Verdict |
|
|
308
|
+
|---|---|
|
|
309
|
+
| `runtime_behavior_change = false` (doc-only / config-only / type-only) or an Epic/container, with no plan | `N/A` — absence is correct; never demand one |
|
|
310
|
+
| Exempt work **carrying** a `## Branch Plan` | **FAIL** — hand-authored branches on work that declared no runtime target |
|
|
311
|
+
| Plan matches the recomputed plan | PASS |
|
|
312
|
+
| Plan conflicts with the recomputed plan | **FAIL** |
|
|
313
|
+
| Plan missing the `Derived from:` provenance line and disagreeing | **FAIL** — treated as hand-authored |
|
|
314
|
+
| `Branch from` and `PR into` name two different branches | **FAIL** — malformed; they are the same branch by construction |
|
|
315
|
+
| Derivation hits a stop condition (env absent from `deploy.branches`, ambiguous / non-unique mapping, branch missing on the remote) | **FAIL** — the same stop `lisa-implement` takes; never default to `main` or the remote default |
|
|
316
|
+
| Proposed spec (pre-write) for applicable work with no plan | **FAIL** — `lisa-github-write-issue` must render it before the write |
|
|
317
|
+
| Live **legacy** issue for applicable work with no plan | `N/A` with a repair note — routed to claim time, where `lisa-implement` writes the derived assumption as a comment and proceeds |
|
|
318
|
+
|
|
319
|
+
Failing a proposed spec is free; failing every existing issue would turn a legacy queue red for a section no human had a way to add, so legacy absence is repaired at claim time instead.
|
|
320
|
+
|
|
321
|
+
FAIL names both plans (rendered and recomputed) and points the remediation at **the environment, never the branch** — e.g. `"Branch Plan conflicts with the environment mapping. Rendered 'Branch from: release/staging'; recomputed from Target Backend Environment 'production' via deploy.branches → 'main'. Correct the environment, not the branch — the branches are derived. Then re-render."` Never silently choose between the two plans.
|
|
322
|
+
|
|
302
323
|
### Feasibility Gates (require GitHub lookups; skip in `--spec-only`)
|
|
303
324
|
|
|
304
325
|
#### F1 — Issue type label exists in repo
|
|
@@ -455,6 +476,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
455
476
|
- [PASS|FAIL|N/A] S16 Source Requirement traceability — <one-line reason>
|
|
456
477
|
- [PASS|FAIL|N/A] S17 Improvement measurability — <one-line reason>
|
|
457
478
|
- [PASS|FAIL|N/A] S18 Stateless-pickup dry-run — <one-line reason>
|
|
479
|
+
- [PASS|FAIL|N/A] S19 Branch Plan derivation — <one-line reason>
|
|
458
480
|
|
|
459
481
|
### Feasibility Gates (omit this section when --spec-only)
|
|
460
482
|
- [PASS|FAIL|N/A] F1 Issue type label exists in repo — <one-line reason>
|
|
@@ -100,6 +100,21 @@ Scenario: <name>
|
|
|
100
100
|
Human confirmation replaces the automated annotation with a bare key or
|
|
101
101
|
`Confirmed: <env>`. Skip only for doc/config/type-only issues.]
|
|
102
102
|
|
|
103
|
+
## Branch Plan
|
|
104
|
+
[GENERATED, never hand-authored. Render only when the issue has a Target
|
|
105
|
+
Backend Environment; omit entirely when `runtime_behavior_change = false`
|
|
106
|
+
(doc-only / config-only / type-only) or for an Epic/container — absence is
|
|
107
|
+
correct there. Derive per the `derived-branch-plan` rule: resolve the
|
|
108
|
+
environment, map it forward through `.lisa.config.json` `deploy.branches`,
|
|
109
|
+
and prove the branch exists on the remote. Do not accept caller-supplied
|
|
110
|
+
branches; recompute them. Exactly three lines:
|
|
111
|
+
Branch from: <branch>
|
|
112
|
+
PR into: <branch>
|
|
113
|
+
Derived from: Target Backend Environment <env> via .lisa.config.json deploy.branches
|
|
114
|
+
Both fields name the same branch by construction. A missing, ambiguous, or
|
|
115
|
+
non-unique mapping, or a branch absent from the remote, STOPS the write —
|
|
116
|
+
never default to `main` or the remote default to keep the write alive.]
|
|
117
|
+
|
|
103
118
|
## Sign-in Required
|
|
104
119
|
[Include this section ONLY if the work touches authenticated surfaces.
|
|
105
120
|
Specify: the account/role, where to get the credentials (1Password item,
|
|
@@ -107,6 +107,12 @@ Using the general-purpose agent in Team Lead session, **determine the base branc
|
|
|
107
107
|
- The only normalization is built-in `prod` ↔ `production`, and only when exactly one of those keys exists in `deploy.branches`; normalize to that configured key. No other aliases exist.
|
|
108
108
|
- Never infer from arbitrary branch text, URL paths or query strings, or substrings inside other words or hostname labels. Multiple conflicting signals after normalization **stop** the flow. If there are no signals, resolve the remote default branch (`gh repo view --json defaultBranchRef -q .defaultBranchRef.name`, or `git remote set-head origin -a` then `origin/HEAD`). When it reverse-maps uniquely, write the env-bearing `Assumption:` form; when the reverse-map is not unique, write the branch-only form and continue on the remote default without inventing an environment or blocking solely for that ambiguity. Record the fallback assumption in the plan/tracker artifact.
|
|
109
109
|
2. **Map the resolved environment to a base branch** through `.lisa.config.json` `deploy.branches` — the forward direction of the env-keyed `done` resolution. The selected exact configured key must map uniquely, and the mapped branch must exist on the remote. A missing/ambiguous mapping or remote branch **stops** the flow; never guess or silently fall back.
|
|
110
|
+
- **Reconcile the ticket's `## Branch Plan` (`derived-branch-plan` rule).** The rendered plan is derived output, never input: **recompute** it here from current config and the remote — the mapping you just resolved — and compare. Four arms, no fifth:
|
|
111
|
+
- **Match** → proceed.
|
|
112
|
+
- **Legacy (no plan)** → derive it, **write the assumption onto the ticket as a comment**, then proceed. Visible prose plus a dedupe marker, e.g. ``Branch plan derived for this item: branch from `main`, PR into `main` (Target Backend Environment: production via .lisa.config.json deploy.branches).`` followed by `<!-- [lisa-branch-plan] key=<work-item-ref>::<branch> -->` (marker-dedupe on `<work-item-ref>::<branch>`, so a re-claim adds no duplicate; where a vendor cannot host an HTML comment the visible line alone carries it). **No silent guess** — if the comment cannot be written, that is a stop, because proceeding would make the inference invisible.
|
|
113
|
+
- **Conflict with a human-confirmed environment, or with an existing open PR's base** → **stop under the existing confirmation rules** below. A branch plan never overrides the environment and never supplies the confirmation itself.
|
|
114
|
+
- **Stale (config changed since the plan was rendered)** → current config wins: re-render the section onto the ticket, record the change, and never follow the stale plan. Staleness is output falling behind its input, not a conflict to escalate.
|
|
115
|
+
- Exempt work carries no plan and needs none: `runtime_behavior_change = false` (doc-only / config-only / type-only) and containers have no `## Target Backend Environment` to derive from, so **absence is correct** — never demand or invent one.
|
|
110
116
|
3. **Establish the feature branch off the latest base, conflict-free:**
|
|
111
117
|
- `git fetch origin`.
|
|
112
118
|
- Already on a feature branch with an **open PR** → reuse it. If the PR's base ≠ the resolved base branch, surface the mismatch and re-target only with confirmation — the ticket's environment is the source of truth.
|
|
@@ -341,7 +341,7 @@ Any durable lesson the loop produced is **submitted** to `lisa-persist-learning`
|
|
|
341
341
|
only write path per the `project-learnings` rule) as a candidate; its hostile-default judge — not
|
|
342
342
|
this skill, and not the caller — decides the disposition. A dropped candidate is recorded in
|
|
343
343
|
`Known limits`, never reported as routed or owned. This skill never writes the learnings file,
|
|
344
|
-
|
|
344
|
+
host rules (`.agents/rules/`), or `CLAUDE.md` itself, and never promotes a learning to a higher rung (that
|
|
345
345
|
is the gardener's ticket-gated job).
|
|
346
346
|
|
|
347
347
|
## Idempotency
|
|
@@ -483,5 +483,5 @@ its face, because a single-trajectory loop always has limits.
|
|
|
483
483
|
- **Bounded claims.** One trajectory supports one trajectory's claim. No comparative,
|
|
484
484
|
longitudinal, or population claims; `Known limits` is never empty.
|
|
485
485
|
- **One write path for learnings.** Durable lessons are submitted to `lisa-persist-learning` for
|
|
486
|
-
judgment; this skill never edits the learnings ledger
|
|
486
|
+
judgment; this skill never edits the learnings ledger or any rules tree (host `.agents/rules/` included),
|
|
487
487
|
and never promotes a learning to a higher rung.
|
|
@@ -95,6 +95,7 @@ Per-type content requirements are defined once in the vendor-neutral `work-item-
|
|
|
95
95
|
| S16 Source Requirement traceability | `product-clarity` | true |
|
|
96
96
|
| S17 Improvement measurability | `acceptance-criteria` | true |
|
|
97
97
|
| S18 Stateless-pickup dry-run | `product-clarity` | true |
|
|
98
|
+
| S19 Branch Plan derivation | `technical` | false |
|
|
98
99
|
| F1 Issue type valid in project | `structural` | false |
|
|
99
100
|
| F2 Epic parent exists and is an Epic | `structural` | false |
|
|
100
101
|
| F3 Linked tickets exist | `structural` | false |
|
|
@@ -301,6 +302,26 @@ The autonomy gate, run last, on every build-ready leaf (use the S15 classificati
|
|
|
301
302
|
|
|
302
303
|
Zero questions → PASS. Any question → FAIL, with each question listed verbatim as its own remediation line — these are exactly the clarifying comments the caller posts to the source. The structure gates are proxies; this gate checks the readiness property itself: `ready` means a stateless agent can drive this item to its terminal state with zero human clarification (see `work-item-definition-of-ready`).
|
|
303
304
|
|
|
305
|
+
#### S19 — Branch Plan derivation
|
|
306
|
+
|
|
307
|
+
Enforces the `derived-branch-plan` rule: the `Branch Plan` section (`h2.` / `##` in proposed text, or an ADF heading in live JIRA) is **derived only** — recompute it from current config and compare; never trust the rendered branches or read them as input. Resolve the environment under the S8 grammar, map that exact configured key forward through `.lisa.config.json` `deploy.branches`, and require the mapped branch on the remote.
|
|
308
|
+
|
|
309
|
+
| Case | Verdict |
|
|
310
|
+
|---|---|
|
|
311
|
+
| `runtime_behavior_change = false` (doc-only / config-only / type-only) or an Epic/container, with no plan | `N/A` — absence is correct; never demand one |
|
|
312
|
+
| Exempt work **carrying** a `Branch Plan` | **FAIL** — hand-authored branches on work that declared no runtime target |
|
|
313
|
+
| Plan matches the recomputed plan | PASS |
|
|
314
|
+
| Plan conflicts with the recomputed plan | **FAIL** |
|
|
315
|
+
| Plan missing the `Derived from:` provenance line and disagreeing | **FAIL** — treated as hand-authored |
|
|
316
|
+
| `Branch from` and `PR into` name two different branches | **FAIL** — malformed; they are the same branch by construction |
|
|
317
|
+
| Derivation hits a stop condition (env absent from `deploy.branches`, ambiguous / non-unique mapping, branch missing on the remote) | **FAIL** — the same stop `lisa-implement` takes; never default to `main` or the remote default |
|
|
318
|
+
| Proposed spec (pre-write) for applicable work with no plan | **FAIL** — `lisa-jira-write-ticket` must render it before the write |
|
|
319
|
+
| Live **legacy** ticket for applicable work with no plan | `N/A` with a repair note — routed to claim time, where `lisa-implement` writes the derived assumption as a comment and proceeds |
|
|
320
|
+
|
|
321
|
+
Failing a proposed spec is free; failing every existing ticket would turn a legacy queue red for a section no human had a way to add, so legacy absence is repaired at claim time instead.
|
|
322
|
+
|
|
323
|
+
FAIL names both plans (rendered and recomputed) and points the remediation at **the environment, never the branch** — e.g. `"Branch Plan conflicts with the environment mapping. Rendered 'Branch from: release/staging'; recomputed from Target Backend Environment 'production' via deploy.branches → 'main'. Correct the environment, not the branch — the branches are derived. Then re-render."` Never silently choose between the two plans.
|
|
324
|
+
|
|
304
325
|
### Feasibility Gates (require JIRA lookups; skip in dry-run if requested)
|
|
305
326
|
|
|
306
327
|
#### F1 — Issue type valid in project
|
|
@@ -388,6 +409,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
388
409
|
- [PASS|FAIL|N/A] S16 Source Requirement traceability — <one-line reason>
|
|
389
410
|
- [PASS|FAIL|N/A] S17 Improvement measurability — <one-line reason>
|
|
390
411
|
- [PASS|FAIL|N/A] S18 Stateless-pickup dry-run — <one-line reason>
|
|
412
|
+
- [PASS|FAIL|N/A] S19 Branch Plan derivation — <one-line reason>
|
|
391
413
|
|
|
392
414
|
### Feasibility Gates (omit this section when --spec-only)
|
|
393
415
|
- [PASS|FAIL|N/A] F1 Issue type valid in project — <one-line reason>
|
|
@@ -92,6 +92,21 @@ h2. Target Backend Environment
|
|
|
92
92
|
Human confirmation replaces the automated annotation with a bare key or
|
|
93
93
|
`Confirmed: <env>`. Skip only for doc/config/type-only tickets.]
|
|
94
94
|
|
|
95
|
+
h2. Branch Plan
|
|
96
|
+
[GENERATED, never hand-authored. Render only when the ticket has a Target
|
|
97
|
+
Backend Environment; omit entirely when `runtime_behavior_change = false`
|
|
98
|
+
(doc-only / config-only / type-only) or for an Epic/container — absence is
|
|
99
|
+
correct there. Derive per the `derived-branch-plan` rule: resolve the
|
|
100
|
+
environment, map it forward through `.lisa.config.json` `deploy.branches`,
|
|
101
|
+
and prove the branch exists on the remote. Do not accept caller-supplied
|
|
102
|
+
branches; recompute them. Exactly three lines:
|
|
103
|
+
Branch from: <branch>
|
|
104
|
+
PR into: <branch>
|
|
105
|
+
Derived from: Target Backend Environment <env> via .lisa.config.json deploy.branches
|
|
106
|
+
Both fields name the same branch by construction. A missing, ambiguous, or
|
|
107
|
+
non-unique mapping, or a branch absent from the remote, STOPS the write —
|
|
108
|
+
never default to `main` or the remote default to keep the write alive.]
|
|
109
|
+
|
|
95
110
|
h2. Sign-in Required
|
|
96
111
|
[Include this section ONLY if the work touches authenticated surfaces.
|
|
97
112
|
Specify: the account/role to sign in as, where to get the credentials
|
|
@@ -49,9 +49,12 @@ memorized list:
|
|
|
49
49
|
— stronger than an omission count, because room was not merely tight, a real
|
|
50
50
|
capture was turned away. Drain it every run (see The audit cycle).
|
|
51
51
|
3. **Rules trees** — the plugin `rules/eager/` + `rules/reference/` pairs AND
|
|
52
|
-
the host project's `.
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
the host project's canonical host-rules directory `.agents/rules/`, plus any
|
|
53
|
+
retired-but-surviving single-file rules the project still carries
|
|
54
|
+
(`.claude/rules/PROJECT_RULES.md`, or a legacy `projectRulesFile` path).
|
|
55
|
+
All of it is human-authored only — the gardener proposes, it never rewrites —
|
|
56
|
+
and its existing sections are still audit candidates; first-run candidates
|
|
57
|
+
come from exactly there.
|
|
55
58
|
4. **Skills** — `.claude/skills/` and the plugin skill roots the runtime
|
|
56
59
|
exposes (descriptions are eager context; bodies load on invoke).
|
|
57
60
|
5. **The wiki index** — `wiki/index.md` when the project has a wiki.
|