@codyswann/lisa 4.27.2 → 4.27.4

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.
Files changed (125) hide show
  1. package/cdk/create-only/.github/workflows/ci.yml +79 -4
  2. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  3. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  4. package/dist/core/upstream-evidence-manifest.js +24 -12
  5. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  6. package/package.json +3 -3
  7. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  8. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  9. package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +84 -1
  10. package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +3 -3
  11. package/plugins/lisa/.codex-plugin/skills/lisa-linear-claim/SKILL.md +2 -2
  12. package/plugins/lisa/.codex-plugin/skills/lisa-linear-evidence/SKILL.md +4 -4
  13. package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +5 -2
  14. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +5 -5
  15. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +3 -2
  16. package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +11 -1
  17. package/plugins/lisa/.codex-plugin/skills/lisa-validate-tracker-mapping/SKILL.md +3 -1
  18. package/plugins/lisa/agents/linear-agent.md +12 -12
  19. package/plugins/lisa/agents/linear-build-intake.md +1 -1
  20. package/plugins/lisa/scripts/linear-state-write-target.mjs +362 -0
  21. package/plugins/lisa/skills/lisa-linear-access/SKILL.md +84 -1
  22. package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +3 -3
  23. package/plugins/lisa/skills/lisa-linear-claim/SKILL.md +2 -2
  24. package/plugins/lisa/skills/lisa-linear-evidence/SKILL.md +5 -5
  25. package/plugins/lisa/skills/lisa-linear-sync/SKILL.md +5 -2
  26. package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +5 -5
  27. package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +3 -2
  28. package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +11 -1
  29. package/plugins/lisa/skills/lisa-validate-tracker-mapping/SKILL.md +3 -1
  30. package/plugins/lisa-agy/agents/linear-agent.md +12 -12
  31. package/plugins/lisa-agy/agents/linear-build-intake.md +1 -1
  32. package/plugins/lisa-agy/plugin.json +1 -1
  33. package/plugins/lisa-agy/scripts/linear-state-write-target.mjs +362 -0
  34. package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +84 -1
  35. package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +3 -3
  36. package/plugins/lisa-agy/skills/lisa-linear-claim/SKILL.md +2 -2
  37. package/plugins/lisa-agy/skills/lisa-linear-evidence/SKILL.md +5 -5
  38. package/plugins/lisa-agy/skills/lisa-linear-sync/SKILL.md +5 -2
  39. package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +5 -5
  40. package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +3 -2
  41. package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +11 -1
  42. package/plugins/lisa-agy/skills/lisa-validate-tracker-mapping/SKILL.md +3 -1
  43. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  45. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  46. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-copilot/agents/linear-agent.agent.md +12 -12
  50. package/plugins/lisa-copilot/agents/linear-build-intake.agent.md +1 -1
  51. package/plugins/lisa-copilot/scripts/linear-state-write-target.mjs +362 -0
  52. package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +84 -1
  53. package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +3 -3
  54. package/plugins/lisa-copilot/skills/lisa-linear-claim/SKILL.md +2 -2
  55. package/plugins/lisa-copilot/skills/lisa-linear-evidence/SKILL.md +5 -5
  56. package/plugins/lisa-copilot/skills/lisa-linear-sync/SKILL.md +5 -2
  57. package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +5 -5
  58. package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +3 -2
  59. package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +11 -1
  60. package/plugins/lisa-copilot/skills/lisa-validate-tracker-mapping/SKILL.md +3 -1
  61. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-cursor/agents/linear-agent.md +12 -12
  63. package/plugins/lisa-cursor/agents/linear-build-intake.md +1 -1
  64. package/plugins/lisa-cursor/scripts/linear-state-write-target.mjs +362 -0
  65. package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +84 -1
  66. package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +3 -3
  67. package/plugins/lisa-cursor/skills/lisa-linear-claim/SKILL.md +2 -2
  68. package/plugins/lisa-cursor/skills/lisa-linear-evidence/SKILL.md +5 -5
  69. package/plugins/lisa-cursor/skills/lisa-linear-sync/SKILL.md +5 -2
  70. package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +5 -5
  71. package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +3 -2
  72. package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +11 -1
  73. package/plugins/lisa-cursor/skills/lisa-validate-tracker-mapping/SKILL.md +3 -1
  74. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-expo-agy/plugin.json +1 -1
  77. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  82. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  86. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  87. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  91. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  92. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  96. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  97. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  101. package/plugins/lisa-rails-agy/plugin.json +1 -1
  102. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  104. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  106. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  107. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  108. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  109. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  110. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  111. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  112. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  113. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  114. package/plugins/src/base/agents/linear-agent.md +12 -12
  115. package/plugins/src/base/agents/linear-build-intake.md +1 -1
  116. package/plugins/src/base/scripts/linear-state-write-target.mjs +362 -0
  117. package/plugins/src/base/skills/lisa-linear-access/SKILL.md +84 -1
  118. package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +3 -3
  119. package/plugins/src/base/skills/lisa-linear-claim/SKILL.md +2 -2
  120. package/plugins/src/base/skills/lisa-linear-evidence/SKILL.md +5 -5
  121. package/plugins/src/base/skills/lisa-linear-sync/SKILL.md +5 -2
  122. package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +5 -5
  123. package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +3 -2
  124. package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +11 -1
  125. package/plugins/src/base/skills/lisa-validate-tracker-mapping/SKILL.md +3 -1
@@ -18,9 +18,17 @@ jobs:
18
18
  cdk_env: ${{ steps.env.outputs.cdk_env }}
19
19
  aws_account_id: ${{ steps.env.outputs.aws_account_id }}
20
20
  role_arn: ${{ steps.env.outputs.role_arn }}
21
+ role_name: ${{ steps.env.outputs.role_name }}
21
22
  steps:
22
23
  - name: 🔄 Set environment
23
24
  id: env
25
+ env:
26
+ # Non-secret REPOSITORY VARIABLE (Settings → Variables), not a secret
27
+ # — a role name is not sensitive and secrets are unreadable when you
28
+ # need to debug this. Read through `env:` rather than interpolated
29
+ # straight into the shell below, because `${{ vars.* }}` pasted into a
30
+ # `run:` body is a script-injection seam.
31
+ CDK_CI_READ_ONLY_ROLE_NAME: ${{ vars.CDK_CI_READ_ONLY_ROLE_NAME }}
24
32
  run: |
25
33
  # For workflow dispatch, use the input
26
34
  if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
@@ -48,25 +56,72 @@ jobs:
48
56
 
49
57
  echo "environment=$TARGET_ENV" >> $GITHUB_OUTPUT
50
58
 
59
+ # ─────────────────────────────────────────────────────────────────
60
+ # Pick the AWS identity by TRIGGER, not by environment.
61
+ #
62
+ # This job only READS — cdk synth, cdk diff, unit tests — so a pull
63
+ # request must not be able to obtain deploy credentials. GitHub emits
64
+ # the SAME OIDC subject for every pull request no matter which branch
65
+ # it targets:
66
+ #
67
+ # pull_request -> repo:<owner>/<repo>:pull_request
68
+ # workflow_dispatch -> repo:<owner>/<repo>:ref:refs/heads/<branch>
69
+ #
70
+ # Because this workflow maps base branch -> account, a deploy role
71
+ # used here has to trust `...:pull_request` in EVERY account this
72
+ # repo validates against, production included. Anyone who can open a
73
+ # pull request could then assume the production deploy role.
74
+ #
75
+ # ⚠️ Do NOT collapse this to a single role. The branch is the whole
76
+ # point. A read-only role whose trust policy admits only the
77
+ # `pull_request` subject will REFUSE the `ref:refs/heads/<branch>`
78
+ # subject that workflow_dispatch presents, and the failure is opaque:
79
+ #
80
+ # Not authorized to perform sts:AssumeRoleWithWebIdentity
81
+ #
82
+ # with nothing in it naming the subject that was rejected. You would
83
+ # only discover it the day you reach for the manual-dispatch path.
84
+ #
85
+ # To adopt the least-privileged default, create a role (default name
86
+ # CiReadOnlyServiceRole) in each account, with:
87
+ # - a trust policy on the GitHub OIDC provider whose
88
+ # token.actions.githubusercontent.com:sub condition is
89
+ # repo:<owner>/<repo>:pull_request
90
+ # - read-only permissions, plus whatever the CDK bootstrap lookup
91
+ # role needs for `cdk synth` / `cdk diff`.
92
+ # Name it something else? Set the repository VARIABLE
93
+ # CDK_CI_READ_ONLY_ROLE_NAME. Haven't provisioned it yet? Set that
94
+ # same variable to DeployServiceRole — behaviour is then identical to
95
+ # a repo scaffolded before this seam existed, and nothing here breaks.
96
+ # ─────────────────────────────────────────────────────────────────
97
+ if [ "${{ github.event_name }}" == "pull_request" ]; then
98
+ ROLE_NAME="${CDK_CI_READ_ONLY_ROLE_NAME:-CiReadOnlyServiceRole}"
99
+ else
100
+ ROLE_NAME="DeployServiceRole"
101
+ fi
102
+
103
+ echo "role_name=$ROLE_NAME" >> $GITHUB_OUTPUT
104
+
51
105
  # Map to CDK environment name.
52
106
  # Set your per-environment AWS account IDs as repository or environment
53
107
  # secrets: AWS_ACCOUNT_ID_PRODUCTION / AWS_ACCOUNT_ID_STAGING / AWS_ACCOUNT_ID_DEV.
54
- # The deploy role name defaults to DeployServiceRole; change it below if yours differs.
108
+ # The role name comes from the trigger-based selection above — do not
109
+ # hardcode one here, or the pull-request narrowing is silently undone.
55
110
  case $TARGET_ENV in
56
111
  production)
57
112
  echo "cdk_env=production" >> $GITHUB_OUTPUT
58
113
  echo "aws_account_id=${{ secrets.AWS_ACCOUNT_ID_PRODUCTION }}" >> $GITHUB_OUTPUT
59
- echo "role_arn=arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID_PRODUCTION }}:role/DeployServiceRole" >> $GITHUB_OUTPUT
114
+ echo "role_arn=arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID_PRODUCTION }}:role/$ROLE_NAME" >> $GITHUB_OUTPUT
60
115
  ;;
61
116
  staging)
62
117
  echo "cdk_env=staging" >> $GITHUB_OUTPUT
63
118
  echo "aws_account_id=${{ secrets.AWS_ACCOUNT_ID_STAGING }}" >> $GITHUB_OUTPUT
64
- echo "role_arn=arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID_STAGING }}:role/DeployServiceRole" >> $GITHUB_OUTPUT
119
+ echo "role_arn=arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID_STAGING }}:role/$ROLE_NAME" >> $GITHUB_OUTPUT
65
120
  ;;
66
121
  dev|*)
67
122
  echo "cdk_env=dev" >> $GITHUB_OUTPUT
68
123
  echo "aws_account_id=${{ secrets.AWS_ACCOUNT_ID_DEV }}" >> $GITHUB_OUTPUT
69
- echo "role_arn=arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID_DEV }}:role/DeployServiceRole" >> $GITHUB_OUTPUT
124
+ echo "role_arn=arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID_DEV }}:role/$ROLE_NAME" >> $GITHUB_OUTPUT
70
125
  ;;
71
126
  esac
72
127
 
@@ -104,6 +159,26 @@ jobs:
104
159
  role-session-name: cdk-ci-checks
105
160
  aws-region: us-east-1
106
161
 
162
+ - name: 🪪 Verify assumed identity
163
+ id: verify_identity
164
+ env:
165
+ EXPECTED_ROLE: ${{ needs.determine_environment.outputs.role_name }}
166
+ run: |
167
+ # Every remaining step in this job only reads, so a silent revert to
168
+ # the deploy role would pass all of them. Without this assertion the
169
+ # over-privilege regression is invisible. sts:GetCallerIdentity needs
170
+ # no IAM permissions at all, so it works under the read-only role.
171
+ CALLER_ARN="$(aws sts get-caller-identity --query Arn --output text)"
172
+ case "${CALLER_ARN}" in
173
+ *":assumed-role/${EXPECTED_ROLE}/"*)
174
+ echo "✅ assumed ${EXPECTED_ROLE}"
175
+ ;;
176
+ *)
177
+ echo "::error::Expected to assume ${EXPECTED_ROLE}, but the caller identity is ${CALLER_ARN}"
178
+ exit 1
179
+ ;;
180
+ esac
181
+
107
182
  - name: 📋 CDK Synth
108
183
  run: |
109
184
  echo "🔍 Running CDK synth for ${{ needs.determine_environment.outputs.environment }} environment..."
@@ -20,9 +20,9 @@ export const NIGHTLY_E2E_GUARD_BEHAVIOR_CERTIFICATES = Object.freeze({
20
20
  }),
21
21
  "312e8962e21be2f3c6c6c0235b0c6159b8dc39425508b4965c7df87fb1333380": Object.freeze({
22
22
  contractVersion: "1.9.0",
23
- packageVersions: Object.freeze(["4.27.2"]),
23
+ packageVersions: Object.freeze(["4.27.4"]),
24
24
  provenances: Object.freeze([
25
- "workspace package @codyswann/lisa@4.27.2 (typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs)",
25
+ "workspace package @codyswann/lisa@4.27.4 (typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs)",
26
26
  ]),
27
27
  }),
28
28
  "898ee0247806c7aa6e98328662d80bcff22ff067999298865462a58daef8bb22": Object.freeze({
@@ -1 +1 @@
1
- {"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAw8EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAi4PjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
1
+ {"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA08EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA44PjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
@@ -56,7 +56,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
56
56
  "cdk/copy-overwrite/tsconfig.json": "bd960df819bb1ce01163ac4b28721eea3f07d482f6c454cfea9a8dc90191033a",
57
57
  "cdk/copy-overwrite/vitest.cdk.ts": "030158b11bec4f10b39585feb98f498981f307faa1fa314c7522e6def5d73c94",
58
58
  "cdk/copy-overwrite/vitest.config.ts": "c7f309d4f43d9188b9c067cb4900b2bdbacfbd28d135a6a2e6313cb0a37b030f",
59
- "cdk/create-only/.github/workflows/ci.yml": "98bd4b784a5a0a96bedc40c209f5bf5afe97fa422c200533d4544990a69a5c1a",
59
+ "cdk/create-only/.github/workflows/ci.yml": "2cb902c76ebd5235c8152f1fa0f2caae3a20a409ac0da747d19d29185047a418",
60
60
  "cdk/create-only/.github/workflows/deploy.yml": "f32ec7eecc7451812213fc66f1a6fa4b360137c586d47ede06747f04eb557251",
61
61
  "cdk/create-only/cdk.json": "f89030d8fe145a1dbabd59d89ddee4e16984f222d737f7fcf6b778d911e9fe40",
62
62
  "cdk/create-only/tsconfig.local.json": "d26253827e21fd7c41d30565fe3d339675f119e00bb24c5713a01f57ccd06602",
@@ -263,8 +263,8 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
263
263
  "plugins/src/base/agents/learner.md": "1e43e74801354e3ed29beed787a673b99599b442d69d8f769829273fdd1c293b",
264
264
  "plugins/src/base/agents/learning-judge.md": "28618c3e20a0f790e4d254a9c8118645774233f19e3042b3cfeddf4ffbaf783a",
265
265
  "plugins/src/base/agents/learnings-synthesizer.md": "d3ffc4294df44813772d8c2641ebbd79a97cbc9051fa88b407ef7bfdc5b8e0d9",
266
- "plugins/src/base/agents/linear-agent.md": "d55664da47505d702d9bbbb96f9f98930d871acc5fc2972d35e1ae143f2dbde7",
267
- "plugins/src/base/agents/linear-build-intake.md": "1dbc43b74857a1f6d99394a206a510d95c0875946fa6f4d94f90706cbd29e7b4",
266
+ "plugins/src/base/agents/linear-agent.md": "165a7ec3df84402c12d768e61e5cea8530abdd68030024e3a5131136e9f1f75f",
267
+ "plugins/src/base/agents/linear-build-intake.md": "8cb476b76bf4a00e0e91c2d6224b2a54b7c6892436b79bec57ff6e88f3d8ff49",
268
268
  "plugins/src/base/agents/linear-prd-intake.md": "28c4ee9f2ebbb4f089dd54bb4633063b48ea8099327a0bf2923825d83c3fe07c",
269
269
  "plugins/src/base/agents/notion-prd-intake.md": "53df0fba395b10b17bafe1a82c8c2706e4ec029d2aee8f3a2e7d5afe38d9be98",
270
270
  "plugins/src/base/agents/performance-specialist.md": "39c088eaf9347410988a82310e3a151034cbac28a756b1c7b28bb4c1c32a6a5d",
@@ -501,6 +501,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
501
501
  "plugins/src/base/scripts/intake-blocker-reprobe.mjs": "135a9b5a0894f70562b54d2071caff1e679c0fe542a606caca39e9e6a5b65f24",
502
502
  "plugins/src/base/scripts/intake-prework-denominator.mjs": "0a40cb91ab1c0e810f42d035d9652af3033e97c692b93b911de851991c12eca1",
503
503
  "plugins/src/base/scripts/lifecycle-label-trust.mjs": "0a9892890da6011733bf9b1186fbe936253c2796c4ac448f1a55f63b8daaa154",
504
+ "plugins/src/base/scripts/linear-state-write-target.mjs": "2c06525345b47a93e8ad75566d4a7d0cac6850ce30cf0481120ad88146d4c220",
504
505
  "plugins/src/base/scripts/plugin-sync-explain.mjs": "17cc7dde8f269b0cbc848c6385d6630a5926327c24e5769b2a16ed7d6aba2d76",
505
506
  "plugins/src/base/scripts/project-ideation-idempotency-harness.mjs": "5722de5c53efb033051442f965d0873beb9cdb18aa1d3f5cd82151b5fb9ed529",
506
507
  "plugins/src/base/scripts/queue-contract-resolution.mjs": "5944dd862f949155db1f4e43279041407dc2c920723cee808fa353dc0bdd2c6e",
@@ -589,20 +590,20 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
589
590
  "plugins/src/base/skills/lisa-jsdoc-best-practices/SKILL.md": "7cf0729966ac0afcab6e2c043f192772a9e9e7c72fae61e55b300e97308f970e",
590
591
  "plugins/src/base/skills/lisa-kane-browser/SKILL.md": "e082517cb42f437eeb22b3935aa0fef09299874736e55184e88d2b64f7860a7d",
591
592
  "plugins/src/base/skills/lisa-learnings-audit/SKILL.md": "98a1c4916f376a3f85008c43a4dde033c374ed0a6111a8094f72296973c5d21b",
592
- "plugins/src/base/skills/lisa-linear-access/SKILL.md": "f6644b11ad2d730795471acf826e52b284e310de70923b65a78f14b58242cf15",
593
+ "plugins/src/base/skills/lisa-linear-access/SKILL.md": "2f25e54f3f91a8b3b4c0cdb7dc53f0314a20bb78e2fe102edd93fc4380cefbe0",
593
594
  "plugins/src/base/skills/lisa-linear-add-journey/SKILL.md": "0a9f2bd0e19fbaa4794537e436c22748c7621644253a91923d84bc77ca43f793",
594
- "plugins/src/base/skills/lisa-linear-build-intake/SKILL.md": "9c2d59a903ef2778ccf249136d8b561a6c381596631b6d35e6f469fd74497cee",
595
- "plugins/src/base/skills/lisa-linear-claim/SKILL.md": "d3fee9a0435e93402be53769313f971c77b847521826fbaee0d19a0bdbc34b93",
595
+ "plugins/src/base/skills/lisa-linear-build-intake/SKILL.md": "969da0c138ad3297900149507039f848f9b42919ade4b46f6f5a1167d1944df6",
596
+ "plugins/src/base/skills/lisa-linear-claim/SKILL.md": "efde30b5eac8b2cc56499ce391bd3d43ebb017c4ce948b5d547b52acb66715bb",
596
597
  "plugins/src/base/skills/lisa-linear-create/SKILL.md": "b9b0b89903fc980e7b591109cffcf377f7397cc6c7b6110975d0b21bafb6de2e",
597
- "plugins/src/base/skills/lisa-linear-evidence/SKILL.md": "aaf40dc38149b160a2ec9edf72de94813305b17425104eb6ed6502197212dfb6",
598
+ "plugins/src/base/skills/lisa-linear-evidence/SKILL.md": "e25f8ab93f5204ac55c99c6cba5fe53cc4ad792c0140553eef7d3478ffb69694",
598
599
  "plugins/src/base/skills/lisa-linear-journey/SKILL.md": "6f189eba5d96f8537883277de1d2d6c87d08226e90df5dd73f16852b0a46224e",
599
600
  "plugins/src/base/skills/lisa-linear-prd-intake/SKILL.md": "39753c2143e88a685c2b804ada37c950989f67f2c300771bb2df67829dfbfb71",
600
601
  "plugins/src/base/skills/lisa-linear-read-issue/SKILL.md": "a6b8241648ba4b7b9f1196a37e9924ffaccc5461f3ac2ee8ae283c58559e9717",
601
- "plugins/src/base/skills/lisa-linear-sync/SKILL.md": "2d75d9954a6c8a7ef43d55c18c9894d0b34358f67fb53ced0ee568f142dbc268",
602
+ "plugins/src/base/skills/lisa-linear-sync/SKILL.md": "30ef30a6f6dbf173437b25bb2bddca6d9adf63fa3db7ec499ae24d7510fa0e90",
602
603
  "plugins/src/base/skills/lisa-linear-to-tracker/SKILL.md": "3190bbf85223c7a0508f8bc894fd2c21fc9dce4c977a5af2252191d09c0c6f97",
603
604
  "plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md": "db1c68a80c29e0d7b1f8431eaa02f43c0e7c65ff4f0af0f3d54ca772f22c0d4c",
604
605
  "plugins/src/base/skills/lisa-linear-verify/SKILL.md": "d11a58bd7c2b773a973fe8f8ad19a2621f038327ee2d8afa3039bd72885f5e97",
605
- "plugins/src/base/skills/lisa-linear-write-issue/SKILL.md": "37fdce274949ecaaaa38f0cfe9208add08a0e47ca73acf976549b47b49f841a6",
606
+ "plugins/src/base/skills/lisa-linear-write-issue/SKILL.md": "cc3298e2b3f1cb1df12e0af3736fd5f1f64c90246c150c7cdf55587adb34b3c9",
606
607
  "plugins/src/base/skills/lisa-linear-write-prd/SKILL.md": "ad4289b5530d65d3b61b27da54db8cd7f8e9133f97326d8961f853f364c5b457",
607
608
  "plugins/src/base/skills/lisa-monitor/SKILL.md": "e441767176da88484b8034df9589cb33240d5d895339ee96926917a52a103423",
608
609
  "plugins/src/base/skills/lisa-nightly-add-test-coverage/SKILL.md": "1e8d7c9519e107ca21aaa9438515b4d51fac4cd25f2a0f80bdb4e037ac89856c",
@@ -643,7 +644,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
643
644
  "plugins/src/base/skills/lisa-queue-status/SKILL.md": "87c6d34d0511d4afd812d1af3fee80fa3b7aa47db8449760b12f2699fedc1d78",
644
645
  "plugins/src/base/skills/lisa-remote-dispatch/SKILL.md": "f3c48120a206d01db45f849ca5b61690d572abc16bc36d559a4cacc8f9422c06",
645
646
  "plugins/src/base/skills/lisa-remote-dispatch/scripts/dispatch.mjs": "2c51d388ecb681905f6b2280ffefc03434f91bfe4901e637869b716be81ccc93",
646
- "plugins/src/base/skills/lisa-repair-intake/SKILL.md": "1a35f239dbd763129ba6f5aeb00ffaa5b2e6d67cf08a956d91710874e8b6779b",
647
+ "plugins/src/base/skills/lisa-repair-intake/SKILL.md": "760c05581d5ac8cf3b4b7c3ab46b097367807828238461cdc07d8086a1dd40e7",
647
648
  "plugins/src/base/skills/lisa-reproduce-bug/SKILL.md": "4d460993fac6021219ca23eee29b1b9afa7c37479dddc662b2fcfaca510edd68",
648
649
  "plugins/src/base/skills/lisa-research/SKILL.md": "9e2e7f3d02a18d9bb34f0b9e8c43d6b9b454d0f81987390839d40a84331b20f7",
649
650
  "plugins/src/base/skills/lisa-review-implementation/SKILL.md": "42134253cca50e384f36eaa085c0a1e6b8772e9f3e912a8d1231f1cd69199858",
@@ -681,7 +682,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
681
682
  "plugins/src/base/skills/lisa-setup-github/SKILL.md": "75435e81130abd21c678d302b7a220da95a19868d122ca93168278628b200666",
682
683
  "plugins/src/base/skills/lisa-setup-jira/SKILL.md": "261acaeb2923cc9238f468dcf986a0e1323a67e1e51d175b2c1b700dacab2fb8",
683
684
  "plugins/src/base/skills/lisa-setup-kane/SKILL.md": "fe50024a4f896af01716f2435f57227b1f8de61803e80bf3e3c3247ec179b103",
684
- "plugins/src/base/skills/lisa-setup-linear/SKILL.md": "b4a495927481bba1341edc841a6c487161de86aede3f423d740967641c66983e",
685
+ "plugins/src/base/skills/lisa-setup-linear/SKILL.md": "dff849db2697c122aa2f09c4d7f7237edac550077725a1e4149e078723fc0442",
685
686
  "plugins/src/base/skills/lisa-setup-local-env/SKILL.md": "4d4b8c92e3616256f5f689fbe433f09c31d39c623508bc4ec0d8c1770caddf22",
686
687
  "plugins/src/base/skills/lisa-setup-local-env/scripts/local-env.mjs": "6f3713451139d9d4fd8eed8f11f49e472667394c4f9a7cae63897b7702115687",
687
688
  "plugins/src/base/skills/lisa-setup-notion/SKILL.md": "667d3767dfb06056145d1ad3f64a6ebfa012b61c19cb2c5f82cf1f6534499c38",
@@ -726,7 +727,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
726
727
  "plugins/src/base/skills/lisa-tracker-write/SKILL.md": "3c2e12ef37a8e20abe4d7ce4d01799dc2bc7b5304f6a18108da8f2318be31da1",
727
728
  "plugins/src/base/skills/lisa-usage-accounting/SKILL.md": "838da4ca08fb6e6a4bc14b6cb5446be93c4565f468f169a1ec68435d275d1ef8",
728
729
  "plugins/src/base/skills/lisa-use-the-product/SKILL.md": "ab3f3ab475b7c97c3409f502b80d688816b1ff4b8e3dfeec7715d93ca41e3fa0",
729
- "plugins/src/base/skills/lisa-validate-tracker-mapping/SKILL.md": "b8a5082205428b43d463fa63e4629cc50bf1b417a2615db6fa0660474c55f1ae",
730
+ "plugins/src/base/skills/lisa-validate-tracker-mapping/SKILL.md": "092958f58fb6db9ca37e8e11b7e8eaf0d1ec8d882ab35ad88ea59d1b16501ba1",
730
731
  "plugins/src/base/skills/lisa-verification-lifecycle/SKILL.md": "3fbcb619281a91f229e4564549b7f7d0ea68e7fd2d874820515846f8cbd6e0e7",
731
732
  "plugins/src/base/skills/lisa-verify-prd/SKILL.md": "fd4dc76c42c1083f5223e650f6c25d53694138860ebcb02588689f6eb6d0b416",
732
733
  "plugins/src/base/skills/lisa-verify-workflow-change/SKILL.md": "d89740a4dc350a9ac0d26b1b955bf74f009775b60ee0275df3f9a50fe8be3048",
@@ -2279,6 +2280,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2279
2280
  "plugins/lisa-agy/scripts/intake-blocker-reprobe.mjs": true,
2280
2281
  "plugins/lisa-agy/scripts/intake-prework-denominator.mjs": true,
2281
2282
  "plugins/lisa-agy/scripts/lifecycle-label-trust.mjs": true,
2283
+ "plugins/lisa-agy/scripts/linear-state-write-target.mjs": true,
2282
2284
  "plugins/lisa-agy/scripts/plugin-sync-explain.mjs": true,
2283
2285
  "plugins/lisa-agy/scripts/project-ideation-idempotency-harness.mjs": true,
2284
2286
  "plugins/lisa-agy/scripts/queue-contract-resolution.mjs": true,
@@ -2767,6 +2769,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2767
2769
  "plugins/lisa-copilot/scripts/intake-blocker-reprobe.mjs": true,
2768
2770
  "plugins/lisa-copilot/scripts/intake-prework-denominator.mjs": true,
2769
2771
  "plugins/lisa-copilot/scripts/lifecycle-label-trust.mjs": true,
2772
+ "plugins/lisa-copilot/scripts/linear-state-write-target.mjs": true,
2770
2773
  "plugins/lisa-copilot/scripts/plugin-sync-explain.mjs": true,
2771
2774
  "plugins/lisa-copilot/scripts/project-ideation-idempotency-harness.mjs": true,
2772
2775
  "plugins/lisa-copilot/scripts/queue-contract-resolution.mjs": true,
@@ -3241,6 +3244,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
3241
3244
  "plugins/lisa-cursor/scripts/intake-blocker-reprobe.mjs": true,
3242
3245
  "plugins/lisa-cursor/scripts/intake-prework-denominator.mjs": true,
3243
3246
  "plugins/lisa-cursor/scripts/lifecycle-label-trust.mjs": true,
3247
+ "plugins/lisa-cursor/scripts/linear-state-write-target.mjs": true,
3244
3248
  "plugins/lisa-cursor/scripts/plugin-sync-explain.mjs": true,
3245
3249
  "plugins/lisa-cursor/scripts/project-ideation-idempotency-harness.mjs": true,
3246
3250
  "plugins/lisa-cursor/scripts/queue-contract-resolution.mjs": true,
@@ -5830,6 +5834,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5830
5834
  "plugins/lisa/scripts/intake-blocker-reprobe.mjs": true,
5831
5835
  "plugins/lisa/scripts/intake-prework-denominator.mjs": true,
5832
5836
  "plugins/lisa/scripts/lifecycle-label-trust.mjs": true,
5837
+ "plugins/lisa/scripts/linear-state-write-target.mjs": true,
5833
5838
  "plugins/lisa/scripts/plugin-sync-explain.mjs": true,
5834
5839
  "plugins/lisa/scripts/project-ideation-idempotency-harness.mjs": true,
5835
5840
  "plugins/lisa/scripts/queue-contract-resolution.mjs": true,
@@ -6487,6 +6492,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
6487
6492
  "plugins/src/base/scripts/intake-blocker-reprobe.mjs": true,
6488
6493
  "plugins/src/base/scripts/intake-prework-denominator.mjs": true,
6489
6494
  "plugins/src/base/scripts/lifecycle-label-trust.mjs": true,
6495
+ "plugins/src/base/scripts/linear-state-write-target.mjs": true,
6490
6496
  "plugins/src/base/scripts/plugin-sync-explain.mjs": true,
6491
6497
  "plugins/src/base/scripts/project-ideation-idempotency-harness.mjs": true,
6492
6498
  "plugins/src/base/scripts/queue-contract-resolution.mjs": true,
@@ -7830,6 +7836,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7830
7836
  "tests/integration/apply-reports-unchanged-manifest.test.ts": true,
7831
7837
  "tests/integration/apply-unattended-preserves-host-config.test.ts": true,
7832
7838
  "tests/integration/bootstrap-keychain.test.ts": true,
7839
+ "tests/integration/cdk-ci-role-selection.test.ts": true,
7833
7840
  "tests/integration/cli-smoke.test.ts": true,
7834
7841
  "tests/integration/coverage-scratch-debris.test.ts": true,
7835
7842
  "tests/integration/deletion-reference-guard.test.ts": true,
@@ -7940,6 +7947,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7940
7947
  "tests/integration/standards-proof-tamper.test.ts": true,
7941
7948
  "tests/integration/standards-proof-timeout.test.ts": true,
7942
7949
  "tests/integration/standards-proof-typescript.test.ts": true,
7950
+ "tests/integration/support/cdk-ci-role-selection-harness.ts": true,
7943
7951
  "tests/integration/support/maestro-android-retry-fixtures.ts": true,
7944
7952
  "tests/integration/support/maestro-android-retry-harness.ts": true,
7945
7953
  "tests/integration/support/maestro-build-step-harness.ts": true,
@@ -8854,7 +8862,11 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8854
8862
  "tests/unit/strategies/lifecycle-label-trust.test.ts": true,
8855
8863
  "tests/unit/strategies/linear-access-history.test.ts": true,
8856
8864
  "tests/unit/strategies/linear-key-resolver-ladder-parity.test.ts": true,
8865
+ "tests/unit/strategies/linear-lifecycle-guard-parity.test.ts": true,
8857
8866
  "tests/unit/strategies/linear-ready-state-inversion.test.ts": true,
8867
+ "tests/unit/strategies/linear-state-write-fixtures.ts": true,
8868
+ "tests/unit/strategies/linear-state-write-guard.test.ts": true,
8869
+ "tests/unit/strategies/linear-state-write-sink.test.ts": true,
8858
8870
  "tests/unit/strategies/merge.test.ts": true,
8859
8871
  "tests/unit/strategies/mld-telemetry-contract.test.ts": true,
8860
8872
  "tests/unit/strategies/monitor-threshold-compatibility.test.ts": true,