@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
|
@@ -56,7 +56,7 @@ const LisaBlockInstructionFileEdits = async () => {
|
|
|
56
56
|
"1. Every agent needs it every session, only in this project? That is a",
|
|
57
57
|
" project rule — capture it with /lisa:persist-learning so it lands in",
|
|
58
58
|
" the learnings ledger. The gardener (/lisa:learnings:audit) proposes",
|
|
59
|
-
" promotion into .
|
|
59
|
+
" promotion into the host-rules directory .agents/rules/ as a human-gated ticket.",
|
|
60
60
|
"2. It changes how an existing skill behaves? Edit that skill's SKILL.md.",
|
|
61
61
|
"3. It is true beyond this project? Propose it upstream via",
|
|
62
62
|
" /lisa:cross-pollinate, or open an issue on CodySwannGT/lisa.",
|
|
@@ -21,12 +21,19 @@ export declare class CopyOverwriteStrategy implements ICopyStrategy {
|
|
|
21
21
|
/**
|
|
22
22
|
* Resolve a differing managed file on a non-interactive apply.
|
|
23
23
|
*
|
|
24
|
-
* There is no prompt available here, so
|
|
25
|
-
* as `stale` — unless
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
24
|
+
* There is no prompt available here, so a file the project may have
|
|
25
|
+
* customised is left alone and reported as `stale` — unless
|
|
26
|
+
* `--refresh-templates` covers it, which is the operator deciding in advance
|
|
27
|
+
* to take upstream's version.
|
|
28
|
+
*
|
|
29
|
+
* Lisa's own artifacts are not in that category and never wait for the flag.
|
|
30
|
+
* A version bump is how the fleet takes an upgrade, and it passes no flags, so
|
|
31
|
+
* gating `scripts/lisa-hooks/*` behind one meant a released security fix
|
|
32
|
+
* reached nobody: the fail-open fixes in #2374 shipped while installed repos
|
|
33
|
+
* kept running the vulnerable guard, until someone deleted the files by hand
|
|
34
|
+
* so the create path would recreate them. Lisa owns those files outright —
|
|
35
|
+
* see `isLisaOwnedTemplate` — so they refresh here, backed up first, and a
|
|
36
|
+
* project that wants to keep its own copy says so in `.lisaignore`.
|
|
30
37
|
* @param sourcePath - Packaged template path
|
|
31
38
|
* @param destPath - Installed file path
|
|
32
39
|
* @param relativePath - Repo-relative path for reporting
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-overwrite.d.ts","sourceRoot":"","sources":["../../src/strategies/copy-overwrite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"copy-overwrite.d.ts","sourceRoot":"","sources":["../../src/strategies/copy-overwrite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG9E;;;;;;GAMG;AACH,qBAAa,qBAAsB,YAAW,aAAa;IACzD,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;IAE1C;;;;;;;OAOG;IACG,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,mBAAmB,CAAC;IAuD/B;;;;;;;;;;;;;;;;;;;;;OAqBG;YACW,mBAAmB;CAuBlC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as fse from "fs-extra";
|
|
2
2
|
import { copyFile } from "node:fs/promises";
|
|
3
3
|
import { mayRefreshTemplate } from "../core/config.js";
|
|
4
|
+
import { isLisaOwnedTemplate } from "../core/lisa-owned-templates.js";
|
|
4
5
|
import { filesIdentical, ensureParentDir } from "../utils/file-operations.js";
|
|
5
6
|
/**
|
|
6
7
|
* Copy-overwrite strategy: Replace file if exists (prompts on conflict)
|
|
@@ -60,12 +61,19 @@ export class CopyOverwriteStrategy {
|
|
|
60
61
|
/**
|
|
61
62
|
* Resolve a differing managed file on a non-interactive apply.
|
|
62
63
|
*
|
|
63
|
-
* There is no prompt available here, so
|
|
64
|
-
* as `stale` — unless
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
64
|
+
* There is no prompt available here, so a file the project may have
|
|
65
|
+
* customised is left alone and reported as `stale` — unless
|
|
66
|
+
* `--refresh-templates` covers it, which is the operator deciding in advance
|
|
67
|
+
* to take upstream's version.
|
|
68
|
+
*
|
|
69
|
+
* Lisa's own artifacts are not in that category and never wait for the flag.
|
|
70
|
+
* A version bump is how the fleet takes an upgrade, and it passes no flags, so
|
|
71
|
+
* gating `scripts/lisa-hooks/*` behind one meant a released security fix
|
|
72
|
+
* reached nobody: the fail-open fixes in #2374 shipped while installed repos
|
|
73
|
+
* kept running the vulnerable guard, until someone deleted the files by hand
|
|
74
|
+
* so the create path would recreate them. Lisa owns those files outright —
|
|
75
|
+
* see `isLisaOwnedTemplate` — so they refresh here, backed up first, and a
|
|
76
|
+
* project that wants to keep its own copy says so in `.lisaignore`.
|
|
69
77
|
* @param sourcePath - Packaged template path
|
|
70
78
|
* @param destPath - Installed file path
|
|
71
79
|
* @param relativePath - Repo-relative path for reporting
|
|
@@ -74,7 +82,8 @@ export class CopyOverwriteStrategy {
|
|
|
74
82
|
*/
|
|
75
83
|
async applyNonInteractive(sourcePath, destPath, relativePath, context) {
|
|
76
84
|
const { config, backupFile } = context;
|
|
77
|
-
if (!
|
|
85
|
+
if (!isLisaOwnedTemplate(relativePath) &&
|
|
86
|
+
!mayRefreshTemplate(relativePath, config.refreshTemplates)) {
|
|
78
87
|
return { relativePath, strategy: this.name, action: "stale" };
|
|
79
88
|
}
|
|
80
89
|
// Backed up first: opting in to an overwrite is not opting out of being
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-overwrite.js","sourceRoot":"","sources":["../../src/strategies/copy-overwrite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"copy-overwrite.js","sourceRoot":"","sources":["../../src/strategies/copy-overwrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/sync/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/sync/registry.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAO9D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvD,uEAAuE;IACvE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,sDAAsD;IACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AASD,iDAAiD;AACjD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC;IACjD,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAC5D,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;CAC5D,CAkCA,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,aAAa,EAiKjD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EA0C/C,CAAC"}
|
package/dist/sync/registry.js
CHANGED
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
* completely missing.
|
|
11
11
|
* @module sync/registry
|
|
12
12
|
*/
|
|
13
|
-
import { DEFAULT_PROJECT_RULES_FILE } from "../core/project-config.js";
|
|
14
13
|
import { validateHealthSchedule } from "../health/contract.js";
|
|
15
14
|
import { BUILD_LABEL_DEFAULTS, LINEAR_WORKFLOW_DEFAULTS, PRD_LABEL_DEFAULTS, } from "./lifecycle-defaults.js";
|
|
16
15
|
const WHEN_TRACKER_JIRA = "tracker=jira";
|
|
@@ -73,11 +72,6 @@ export const SYNC_REGISTRY = [
|
|
|
73
72
|
defaultValue: "claude",
|
|
74
73
|
description: "Target coding-agent harness(es)",
|
|
75
74
|
},
|
|
76
|
-
{
|
|
77
|
-
key: "projectRulesFile",
|
|
78
|
-
defaultValue: DEFAULT_PROJECT_RULES_FILE,
|
|
79
|
-
description: "Hand-authored project rules file (independent of the ledger)",
|
|
80
|
-
},
|
|
81
75
|
{
|
|
82
76
|
key: "health.schedule",
|
|
83
77
|
defaultValue: "off",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/sync/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/sync/registry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
}
|
|
121
121
|
},
|
|
122
122
|
"name": "@codyswann/lisa",
|
|
123
|
-
"version": "2.
|
|
123
|
+
"version": "2.352.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": {
|
|
@@ -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.
|
|
@@ -65,18 +65,40 @@ Error: no Linear access substrate available. Authenticate the Linear MCP or set
|
|
|
65
65
|
All GraphQL calls use:
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
|
+
# Resolve the key through the chokepoint before giving up on the environment.
|
|
69
|
+
# Without this rung a project that keeps its credentials in Bitwarden, Doppler,
|
|
70
|
+
# or AWS has no path to the key at all — the ladder stopped at rung one, which
|
|
71
|
+
# is also what left `/lisa:setup:linear` reading an OS keychain directly with
|
|
72
|
+
# nowhere to migrate to. Mirrors `atlassian-access` and `notion-access`.
|
|
73
|
+
read_linear_key() {
|
|
74
|
+
[ -n "${LINEAR_API_KEY:-}" ] && { echo "$LINEAR_API_KEY"; return; }
|
|
75
|
+
local resolver
|
|
76
|
+
for resolver in .claude/skills/lisa-secrets-access/scripts/resolve-secret.mjs \
|
|
77
|
+
.agents/skills/lisa-secrets-access/scripts/resolve-secret.mjs; do
|
|
78
|
+
if [ -f "$resolver" ]; then
|
|
79
|
+
local via_lisa
|
|
80
|
+
via_lisa=$(node "$resolver" get LINEAR_API_KEY 2>/dev/null) \
|
|
81
|
+
&& [ -n "$via_lisa" ] && { echo "$via_lisa"; return; }
|
|
82
|
+
break
|
|
83
|
+
fi
|
|
84
|
+
done
|
|
85
|
+
return 1
|
|
86
|
+
}
|
|
87
|
+
|
|
68
88
|
linear_graphql() {
|
|
69
89
|
local query="$1"
|
|
70
90
|
local variables="${2:-{}}"
|
|
71
|
-
|
|
72
|
-
|
|
91
|
+
local key
|
|
92
|
+
key=$(read_linear_key) || {
|
|
93
|
+
echo "Error: no Linear API key. Set LINEAR_API_KEY, or store it as" >&2
|
|
94
|
+
echo "LINEAR_API_KEY in this project's secrets provider." >&2
|
|
73
95
|
return 1
|
|
74
96
|
}
|
|
75
97
|
jq -n --arg query "$query" --argjson variables "$variables" \
|
|
76
98
|
'{query:$query, variables:$variables}' |
|
|
77
99
|
curl -sS -X POST "https://api.linear.app/graphql" \
|
|
78
100
|
-H "Content-Type: application/json" \
|
|
79
|
-
-H "Authorization:
|
|
101
|
+
-H "Authorization: $key" \
|
|
80
102
|
--data-binary @-
|
|
81
103
|
}
|
|
82
104
|
```
|
|
@@ -96,6 +96,7 @@ Per-type content requirements are defined once in the vendor-neutral `work-item-
|
|
|
96
96
|
| S16 Source Requirement traceability | `product-clarity` | true |
|
|
97
97
|
| S17 Improvement measurability | `acceptance-criteria` | true |
|
|
98
98
|
| S18 Stateless-pickup dry-run | `product-clarity` | true |
|
|
99
|
+
| S19 Branch Plan derivation | `technical` | false |
|
|
99
100
|
| F1 Issue type valid in team | `structural` | false |
|
|
100
101
|
| F2 Project parent exists and is in same team | `structural` | false |
|
|
101
102
|
| F3 Linked items exist | `structural` | false |
|
|
@@ -303,6 +304,26 @@ The autonomy gate, run last, on every build-ready leaf (use the S15 classificati
|
|
|
303
304
|
|
|
304
305
|
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`).
|
|
305
306
|
|
|
307
|
+
#### S19 — Branch Plan derivation
|
|
308
|
+
|
|
309
|
+
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.
|
|
310
|
+
|
|
311
|
+
| Case | Verdict |
|
|
312
|
+
|---|---|
|
|
313
|
+
| `runtime_behavior_change = false` (doc-only / config-only / type-only) or a Project/container, with no plan | `N/A` — absence is correct; never demand one |
|
|
314
|
+
| Exempt work **carrying** a `## Branch Plan` | **FAIL** — hand-authored branches on work that declared no runtime target |
|
|
315
|
+
| Plan matches the recomputed plan | PASS |
|
|
316
|
+
| Plan conflicts with the recomputed plan | **FAIL** |
|
|
317
|
+
| Plan missing the `Derived from:` provenance line and disagreeing | **FAIL** — treated as hand-authored |
|
|
318
|
+
| `Branch from` and `PR into` name two different branches | **FAIL** — malformed; they are the same branch by construction |
|
|
319
|
+
| 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 |
|
|
320
|
+
| Proposed spec (pre-write) for applicable work with no plan | **FAIL** — `lisa-linear-write-issue` must render it before the write |
|
|
321
|
+
| 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 |
|
|
322
|
+
|
|
323
|
+
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.
|
|
324
|
+
|
|
325
|
+
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.
|
|
326
|
+
|
|
306
327
|
### Feasibility Gates (require Linear lookups; skip in dry-run if requested)
|
|
307
328
|
|
|
308
329
|
#### F1 — Issue type valid in team
|
|
@@ -394,6 +415,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
394
415
|
- [PASS|FAIL|N/A] S16 Source Requirement traceability — <one-line reason>
|
|
395
416
|
- [PASS|FAIL|N/A] S17 Improvement measurability — <one-line reason>
|
|
396
417
|
- [PASS|FAIL|N/A] S18 Stateless-pickup dry-run — <one-line reason>
|
|
418
|
+
- [PASS|FAIL|N/A] S19 Branch Plan derivation — <one-line reason>
|
|
397
419
|
|
|
398
420
|
### Feasibility Gates (omit when --spec-only)
|
|
399
421
|
- [PASS|FAIL|N/A] F1 Issue type valid in team — <one-line reason>
|
|
@@ -112,6 +112,21 @@ Linear descriptions are markdown (NOT Jira wiki markup — no `h2.` headings, us
|
|
|
112
112
|
Human confirmation replaces the automated annotation with a bare key or
|
|
113
113
|
`Confirmed: <env>`. Skip only for doc/config/type-only items.]
|
|
114
114
|
|
|
115
|
+
## Branch Plan
|
|
116
|
+
[GENERATED, never hand-authored. Render only when the item has a Target
|
|
117
|
+
Backend Environment; omit entirely when `runtime_behavior_change = false`
|
|
118
|
+
(doc-only / config-only / type-only) or for a Project/container — absence is
|
|
119
|
+
correct there. Derive per the `derived-branch-plan` rule: resolve the
|
|
120
|
+
environment, map it forward through `.lisa.config.json` `deploy.branches`,
|
|
121
|
+
and prove the branch exists on the remote. Do not accept caller-supplied
|
|
122
|
+
branches; recompute them. Exactly three lines:
|
|
123
|
+
Branch from: <branch>
|
|
124
|
+
PR into: <branch>
|
|
125
|
+
Derived from: Target Backend Environment <env> via .lisa.config.json deploy.branches
|
|
126
|
+
Both fields name the same branch by construction. A missing, ambiguous, or
|
|
127
|
+
non-unique mapping, or a branch absent from the remote, STOPS the write —
|
|
128
|
+
never default to `main` or the remote default to keep the write alive.]
|
|
129
|
+
|
|
115
130
|
## Sign-in Required
|
|
116
131
|
[Include this section ONLY if the work touches authenticated surfaces.
|
|
117
132
|
Specify: the account/role to sign in as, where to get the credentials
|
|
@@ -116,9 +116,11 @@ Every provider has a description field — Bitwarden `note`, 1Password notes, AW
|
|
|
116
116
|
|
|
117
117
|
These are two different rules and should not be conflated:
|
|
118
118
|
|
|
119
|
-
- **Rule A — the note must exist and be well-formed.** Universal: every secret, every provider, every surface. Enforced **statically** by `verify` and by `doctor
|
|
119
|
+
- **Rule A — the note must exist and be well-formed.** Universal: every secret, every provider, every surface. Enforced **statically** by `verify` and by `doctor`, and it **blocks** — a malformed note is an error, not a warning. Nothing to do with agents.
|
|
120
120
|
- **Rule B — an agent must read the note before first use.** Runtime, and **only in lanes where a consumer has latitude**. An agent could do anything with a write-scoped token, and the note is what bounds it. A reviewed workflow step resolving one credential by exact name has no latitude, so gating it there is ceremony that can only fail-closed and never inform.
|
|
121
121
|
|
|
122
|
+
Rule A blocks because a warning enforced nothing. Both checks previously tested only whether a note was *present*, and reported a warning either way, so a vault of empty notes reported clean — which is precisely why the notes stayed empty. A check that cannot fail is a check nobody acts on.
|
|
123
|
+
|
|
122
124
|
Format — first line prose, then `key: value` lines:
|
|
123
125
|
|
|
124
126
|
```text
|
|
@@ -129,6 +131,22 @@ ci: yes - injected by <mechanism>
|
|
|
129
131
|
docs: <path>
|
|
130
132
|
```
|
|
131
133
|
|
|
134
|
+
### What "well-formed" means, exactly
|
|
135
|
+
|
|
136
|
+
`scripts/note-format.mjs` is the one validator; `verify` and `doctor` both call it, so they cannot reach different verdicts about the same note. It **blocks** on:
|
|
137
|
+
|
|
138
|
+
| Defect | Why it blocks |
|
|
139
|
+
| --- | --- |
|
|
140
|
+
| `missing-note` | No note at all, empty, or only whitespace. |
|
|
141
|
+
| `no-prose` | Every line is a `key: value` line, so nothing states what the credential *is*. |
|
|
142
|
+
| `empty-field` | A field with nothing after the colon — it promises a fact the reader cannot find. |
|
|
143
|
+
| `empty-tool-line` | A `tool:` line naming no tool: it asks for an install and supplies nothing. |
|
|
144
|
+
| `bad-tool-name` | A `tool:` entry that is not a bare name, so the reader drops it silently. |
|
|
145
|
+
|
|
146
|
+
It **warns**, without blocking, on `stray-separator` — a trailing or doubled comma in a tool list. The reader handles it; failing a vault over punctuation would only teach operators that the check is noise.
|
|
147
|
+
|
|
148
|
+
Deliberately **not** checked: which fields a note carries, and how informative the prose is. The documented format mandates neither, and enforcing beyond the prose is the same defect as prose beyond the enforcement, pointing the other way. A line is treated as prose unless the text before its colon is a single bare lowercase token — so "Attio CRM: system of record" is a sentence, not a field.
|
|
149
|
+
|
|
132
150
|
### `tool:` — the CLI a secret implies
|
|
133
151
|
|
|
134
152
|
One key is read by more than a human. A credential and the CLI that consumes it belong together — `SONARQUBE_CLI_TOKEN` is only useful with `sonar` — so a `tool:` (or `tools: a, b`) line declares that pairing where it cannot drift from the secret:
|
|
@@ -229,7 +247,7 @@ Cache **in-process only**. Never write a resolved value to disk except through t
|
|
|
229
247
|
|
|
230
248
|
- Every name in `require` resolves.
|
|
231
249
|
- Every key matches `^[A-Z][A-Z0-9_]*$`.
|
|
232
|
-
-
|
|
250
|
+
- Every secret's note exists and is well-formed, per the table above. This is an **error**, so a vault that was passing on warnings will newly fail until its notes are written.
|
|
233
251
|
- Every name in `rotating` has a resolvable bootstrap, so its replacement could be persisted.
|
|
234
252
|
- **No secret is readable from two stores.** A value present in both the provider and a local cache is not a duplicate — it is **two live credentials**, one of which is untracked. This is the check most worth having: it catches drift before a deletion turns the forgotten copy into an orphan nobody can revoke.
|
|
235
253
|
|