@juangcarmona/lighthouse-sdlc 0.17.1 → 0.18.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.
Files changed (61) hide show
  1. package/README.md +15 -3
  2. package/capabilities.json +2 -1
  3. package/epic-delivery.md +35 -0
  4. package/github-actions.md +19 -3
  5. package/host-contract.md +2 -0
  6. package/package.json +4 -1
  7. package/schemas/product-change.schema.json +23 -4
  8. package/schemas/stage-result.schema.json +23 -1
  9. package/skills/product-change/SKILL.md +3 -3
  10. package/skills/refine/SKILL.md +3 -2
  11. package/src/completion-actions.mjs +49 -12
  12. package/src/completion.mjs +1 -1
  13. package/src/contracts.mjs +10 -0
  14. package/src/decompose.mjs +5 -2
  15. package/src/epic-dispatch.mjs +59 -0
  16. package/src/epic-github.mjs +111 -0
  17. package/src/epic-journal.mjs +104 -0
  18. package/src/epic-merge.mjs +91 -0
  19. package/src/epic-native.mjs +465 -0
  20. package/src/epic.mjs +86 -0
  21. package/src/handoff.mjs +97 -0
  22. package/src/host-contract.mjs +22 -6
  23. package/src/implementation.mjs +33 -5
  24. package/src/install-workflows.mjs +1 -1
  25. package/src/issue-actions.mjs +360 -78
  26. package/src/opencode-execute.mjs +20 -0
  27. package/src/pr-state-actions.mjs +21 -7
  28. package/src/pr-state.mjs +18 -1
  29. package/src/product-change-actions.mjs +158 -46
  30. package/src/product-change.mjs +92 -11
  31. package/src/proposal-review.mjs +16 -6
  32. package/src/proposal.mjs +13 -1
  33. package/src/stacked.mjs +14 -3
  34. package/src/stage-dispatch.mjs +66 -19
  35. package/src/stage-transition.mjs +151 -2
  36. package/src/triage.mjs +4 -2
  37. package/src/unattended-actions.mjs +39 -12
  38. package/src/unattended.mjs +1 -1
  39. package/src/worker-maintenance.mjs +15 -3
  40. package/src/worker-recovery.mjs +204 -6
  41. package/workflows/lighthouse-sdlc-apply-product-change.lock.yml +97 -11
  42. package/workflows/lighthouse-sdlc-apply-product-change.md +75 -6
  43. package/workflows/lighthouse-sdlc-apply-review.lock.yml +33 -2
  44. package/workflows/lighthouse-sdlc-apply-review.md +29 -1
  45. package/workflows/lighthouse-sdlc-epic.yml +79 -0
  46. package/workflows/lighthouse-sdlc-implement.lock.yml +38 -2
  47. package/workflows/lighthouse-sdlc-implement.md +33 -2
  48. package/workflows/lighthouse-sdlc-integrate.lock.yml +4 -1
  49. package/workflows/lighthouse-sdlc-integrate.md +3 -0
  50. package/workflows/lighthouse-sdlc-product-change.lock.yml +39 -4
  51. package/workflows/lighthouse-sdlc-product-change.md +39 -6
  52. package/workflows/lighthouse-sdlc-propose.lock.yml +13 -1
  53. package/workflows/lighthouse-sdlc-propose.md +11 -1
  54. package/workflows/lighthouse-sdlc-refine.lock.yml +29 -2
  55. package/workflows/lighthouse-sdlc-refine.md +25 -2
  56. package/workflows/lighthouse-sdlc-review.lock.yml +4 -1
  57. package/workflows/lighthouse-sdlc-review.md +3 -0
  58. package/workflows/lighthouse-sdlc-router.yml +47 -3
  59. package/workflows/lighthouse-sdlc-triage.lock.yml +30 -3
  60. package/workflows/lighthouse-sdlc-triage.md +26 -3
  61. package/workflows/lighthouse-worker-maintenance.yml +70 -1
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  # Owned by lighthouse-sdlc. Regenerate the lock with gh aw v0.93.2.
3
3
  name: product-change
4
- description: Prepare and publish an authenticated Product Change candidate for an authorized issue idea.
4
+ description: Prepare and publish an authenticated Product Change candidate for an idea or issue prerequisite.
5
5
  run-name: "product change #${{ inputs.issue }} · request ${{ inputs.dispatch-request }}"
6
6
  concurrency:
7
7
  group: lighthouse-issue-${{ inputs.issue }}
@@ -73,6 +73,11 @@ steps:
73
73
  with:
74
74
  name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
75
75
  path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
76
+ - name: Load ProductShape inspection evidence
77
+ uses: actions/download-artifact@v8
78
+ with:
79
+ name: lighthouse-product-evidence-${{ inputs.issue }}-${{ github.run_attempt }}
80
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/product-evidence
76
81
  post-steps:
77
82
  - name: Validate the Lighthouse result
78
83
  run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs validate
@@ -97,6 +102,7 @@ jobs:
97
102
  actions: read
98
103
  contents: read
99
104
  issues: write
105
+ pull-requests: read
100
106
  env:
101
107
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
102
108
  LIGHTHOUSE_PRODUCT_CHANGE_ENABLED: "true"
@@ -106,6 +112,12 @@ jobs:
106
112
  repository: juangcarmona/lighthouse
107
113
  ref: __LIGHTHOUSE_REF__
108
114
  persist-credentials: false
115
+ - name: Check out the adopter's current product source
116
+ uses: actions/checkout@v5
117
+ with:
118
+ ref: ${{ github.event.repository.default_branch }}
119
+ path: .lighthouse-product-source
120
+ persist-credentials: false
109
121
  - uses: actions/setup-node@v5
110
122
  with:
111
123
  node-version: 24
@@ -117,26 +129,42 @@ jobs:
117
129
  id: prepare
118
130
  env:
119
131
  GH_TOKEN: ${{ github.token }}
120
- run: node src/packages/sdlc/src/issue-actions.mjs prepare
132
+ working-directory: .lighthouse-product-source
133
+ run: node "$GITHUB_WORKSPACE/src/packages/sdlc/src/issue-actions.mjs" prepare
121
134
  - name: Preserve the execution request
122
135
  if: steps.prepare.outputs.eligible == 'true'
123
136
  uses: actions/upload-artifact@v7
124
137
  with:
125
138
  name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
126
- path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/
139
+ path: |
140
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/admission.json
141
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/request.json
142
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/issue.json
143
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/context.json
144
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/reserved
145
+ if-no-files-found: error
146
+ retention-days: 14
147
+ - name: Preserve ProductShape inspection evidence
148
+ if: steps.prepare.outputs.eligible == 'true'
149
+ uses: actions/upload-artifact@v7
150
+ with:
151
+ name: lighthouse-product-evidence-${{ inputs.issue }}-${{ github.run_attempt }}
152
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/product-evidence/
127
153
  if-no-files-found: error
128
154
  retention-days: 14
129
155
  - name: Release reservation if preparation failed
130
156
  if: failure()
131
157
  env:
132
158
  GH_TOKEN: ${{ github.token }}
159
+ LIGHTHOUSE_PREPARE_FAILED: "true"
133
160
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
134
161
  publish:
135
162
  name: Validate and publish the product candidate
136
- needs: [prepare, agent]
163
+ needs: [prepare, pre_activation, activation, agent]
137
164
  if: always() && needs.prepare.result == 'success' && needs.prepare.outputs.eligible == 'true'
138
165
  runs-on: ubuntu-24.04
139
166
  permissions:
167
+ actions: read
140
168
  contents: write
141
169
  issues: write
142
170
  pull-requests: write
@@ -157,6 +185,7 @@ jobs:
157
185
  with:
158
186
  node-version: 24
159
187
  - name: Install the repository and optional product provider
188
+ working-directory: .lighthouse-harness
160
189
  run: |
161
190
  npm ci --ignore-scripts
162
191
  npm install --no-save --package-lock=false --ignore-scripts @prodshape/integration-openspec@0.6.6
@@ -183,6 +212,10 @@ jobs:
183
212
  if: always()
184
213
  env:
185
214
  GH_TOKEN: ${{ github.token }}
215
+ LIGHTHOUSE_PRE_ACTIVATION_RESULT: ${{ needs.pre_activation.result }}
216
+ LIGHTHOUSE_ACTIVATION_RESULT: ${{ needs.activation.result }}
217
+ LIGHTHOUSE_AGENT_RESULT: ${{ needs.agent.result }}
218
+ LIGHTHOUSE_PUBLISH_STATUS: ${{ job.status }}
186
219
  run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs cleanup
187
220
  ---
188
221
 
@@ -190,6 +223,6 @@ jobs:
190
223
 
191
224
  Read the authenticated context and follow `/harness/skills/product-change/SKILL.md`. Use the installed ProductShape schema instructions included in `context.productChange`. The issue title and body define the idea and the host's `context.productChange.parent` defines the scope and authorization. Compare it with the accepted product model, then return one of `aligned`, `candidate` or `blocked` in `result.output.productChange`.
192
225
 
193
- For a candidate, return the complete provider-owned change files under `context.productChange.root`, the host-assigned `changeName`, CHG ID, proposal digest, baseline digest and successful provider validation summary. Keep the manifest in draft status. Do not approve, apply, alter the accepted model, publish a branch or continue implementation. The trusted publisher rechecks the exact candidate, validates it against the current accepted model, publishes the PR and requests an explicit product decision. Product approval, apply, implementation, merge and release are separate effects.
226
+ For a candidate, return the complete provider-owned change files under `context.productChange.root`, the host-assigned `changeName`, CHG ID, baseline digest and pending provider validation. Copy `context.productChange.schemaPin` into `.openspec.yaml` and omit the proposal digest; the host calculates it after validation. Keep the manifest in draft status. Do not approve, apply, alter the accepted model, publish a branch or continue implementation. The trusted publisher rechecks the exact candidate, validates it against the current accepted model, publishes the PR and requests an explicit product decision. Product approval, apply, implementation, merge and release are separate effects.
194
227
 
195
- Return the supplied stage result identity and keep the enclosing lifecycle stage as `propose`. A product idea does not grant implementation authority. The host owns all GitHub effects and releases execution resources when the decision request is durable.
228
+ Return the supplied stage result identity and retain its enclosing lifecycle stage. An idea or parent prerequisite grants no new implementation authority. The host owns all GitHub effects and releases execution resources when the decision request is durable.
@@ -1,4 +1,4 @@
1
- # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"c27655e49e0c2a6bbcc2f99a4a861c3bcc504599303ed34da08fd0fa7020b692","body_hash":"837f36195c7a0bf8859d78018be1060568e04a8743c44b1f3fd89c7344bc4752","compiler_version":"v0.93.2","agent_id":"opencode","engine_versions":{"opencode":"2.1.0"},"agent_image_runner":"[\"self-hosted\",\"linux\",\"lighthouse-workflow\"]"}
1
+ # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"e2cc0df8da555f8f423902c0c5a3b1610f56f3923a51c02b1821231b20e86a66","body_hash":"837f36195c7a0bf8859d78018be1060568e04a8743c44b1f3fd89c7344bc4752","compiler_version":"v0.93.2","agent_id":"opencode","engine_versions":{"opencode":"2.1.0"},"agent_image_runner":"[\"self-hosted\",\"linux\",\"lighthouse-workflow\"]"}
2
2
  # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/checkout","sha":"fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09","version":"v5"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"949feb2413d6458794dcd2491c4babbbce0c15c1","version":"v7.1.0"},{"repo":"actions/setup-node","sha":"a0853c24544627f65ddf259abe73b1d18a591444","version":"v5"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw-actions/setup","sha":"d9128eb3ea40c18b77c76184eda03c0ff2608d79","version":"v0.93.2"}],"containers":[{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:41835613992df88f51e923bad486f96dfb2e6cda29f13e217df41833284ae382","pinned_image":"ghcr.io/github/gh-aw-node@sha256:41835613992df88f51e923bad486f96dfb2e6cda29f13e217df41833284ae382"}],"mcp_servers":[{"name":"safeoutputs","tools":["noop"]}],"threat_detection":{"mode":"disabled"},"admission":false}
3
3
  # This file was automatically generated by gh-aw (v0.93.2). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
4
4
  #
@@ -1263,16 +1263,20 @@ jobs:
1263
1263
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
1264
1264
  env:
1265
1265
  GH_TOKEN: ${{ github.token }}
1266
+ LIGHTHOUSE_PREPARE_FAILED: "true"
1266
1267
 
1267
1268
  publish:
1268
1269
  name: Validate, publish and release
1269
1270
  needs:
1271
+ - activation
1270
1272
  - agent
1273
+ - pre_activation
1271
1274
  - prepare
1272
1275
  if: always() && needs.prepare.result == 'success' && needs.prepare.outputs.eligible == 'true'
1273
1276
  runs-on: ubuntu-24.04
1274
1277
  # Permissions for the publish job (workflow permissions default to none).
1275
1278
  permissions:
1279
+ actions: write
1276
1280
  contents: write
1277
1281
  issues: write
1278
1282
  pull-requests: write
@@ -1322,3 +1326,11 @@ jobs:
1322
1326
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
1323
1327
  env:
1324
1328
  GH_TOKEN: ${{ github.token }}
1329
+ LIGHTHOUSE_ACTIVATION_RESULT: ${{ needs.activation.result }}
1330
+ LIGHTHOUSE_AGENT_RESULT: ${{ needs.agent.result }}
1331
+ LIGHTHOUSE_PRE_ACTIVATION_RESULT: ${{ needs.pre_activation.result }}
1332
+ LIGHTHOUSE_PUBLISH_STATUS: ${{ job.status }}
1333
+ - name: Request the verified product prerequisite
1334
+ run: node src/packages/sdlc/src/issue-actions.mjs continue-product-gap
1335
+ env:
1336
+ GH_TOKEN: ${{ github.token }}
@@ -136,13 +136,15 @@ jobs:
136
136
  if: failure()
137
137
  env:
138
138
  GH_TOKEN: ${{ github.token }}
139
+ LIGHTHOUSE_PREPARE_FAILED: "true"
139
140
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
140
141
  publish:
141
142
  name: Validate, publish and release
142
- needs: [prepare, agent]
143
+ needs: [prepare, pre_activation, activation, agent]
143
144
  if: always() && needs.prepare.result == 'success' && needs.prepare.outputs.eligible == 'true'
144
145
  runs-on: ubuntu-24.04
145
146
  permissions:
147
+ actions: write
146
148
  contents: write
147
149
  issues: write
148
150
  pull-requests: write
@@ -182,7 +184,15 @@ jobs:
182
184
  if: always()
183
185
  env:
184
186
  GH_TOKEN: ${{ github.token }}
187
+ LIGHTHOUSE_PRE_ACTIVATION_RESULT: ${{ needs.pre_activation.result }}
188
+ LIGHTHOUSE_ACTIVATION_RESULT: ${{ needs.activation.result }}
189
+ LIGHTHOUSE_AGENT_RESULT: ${{ needs.agent.result }}
190
+ LIGHTHOUSE_PUBLISH_STATUS: ${{ job.status }}
185
191
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
192
+ - name: Request the verified product prerequisite
193
+ env:
194
+ GH_TOKEN: ${{ github.token }}
195
+ run: node src/packages/sdlc/src/issue-actions.mjs continue-product-gap
186
196
  ---
187
197
 
188
198
  # Propose the authorized change
@@ -1,4 +1,4 @@
1
- # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"a5265cd1fefec15589c48dd95878589ed94bf99e08e50b1ee574951bd90e175c","body_hash":"00aaac0798637a281758028c249e7c1086c7ca9e32ea9cb2ef51af769c3e2586","compiler_version":"v0.93.2","agent_id":"opencode","engine_versions":{"opencode":"2.1.0"},"agent_image_runner":"[\"self-hosted\",\"linux\",\"lighthouse-workflow\"]"}
1
+ # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"75a6e72b471b0702be6cca0331d37ac405d8fa53e8dd552e50b1f6493da4ca7e","body_hash":"00aaac0798637a281758028c249e7c1086c7ca9e32ea9cb2ef51af769c3e2586","compiler_version":"v0.93.2","agent_id":"opencode","engine_versions":{"opencode":"2.1.0"},"agent_image_runner":"[\"self-hosted\",\"linux\",\"lighthouse-workflow\"]"}
2
2
  # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/checkout","sha":"fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09","version":"v5"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"949feb2413d6458794dcd2491c4babbbce0c15c1","version":"v7.1.0"},{"repo":"actions/setup-node","sha":"a0853c24544627f65ddf259abe73b1d18a591444","version":"v5"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw-actions/setup","sha":"d9128eb3ea40c18b77c76184eda03c0ff2608d79","version":"v0.93.2"}],"containers":[{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:41835613992df88f51e923bad486f96dfb2e6cda29f13e217df41833284ae382","pinned_image":"ghcr.io/github/gh-aw-node@sha256:41835613992df88f51e923bad486f96dfb2e6cda29f13e217df41833284ae382"}],"mcp_servers":[{"name":"safeoutputs","tools":["noop"]}],"threat_detection":{"mode":"disabled"},"admission":false}
3
3
  # This file was automatically generated by gh-aw (v0.93.2). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
4
4
  #
@@ -69,6 +69,10 @@ on:
69
69
  description: Authenticated router receipt comment ID
70
70
  required: true
71
71
  type: string
72
+ epic-parent:
73
+ description: Authenticated parent issue for shared epic serialization
74
+ required: false
75
+ type: string
72
76
  issue:
73
77
  description: Source issue
74
78
  required: true
@@ -79,7 +83,7 @@ permissions: {}
79
83
 
80
84
  concurrency:
81
85
  cancel-in-progress: false
82
- group: lighthouse-issue-${{ inputs.issue }}
86
+ group: ${{ inputs.epic-parent && format('lighthouse-epic-child-{0}', inputs.issue) || format('lighthouse-issue-{0}', inputs.issue) }}
83
87
  queue: max
84
88
 
85
89
  run-name: "refine #${{ inputs.issue }} · request ${{ inputs.dispatch-request }}"
@@ -1221,6 +1225,12 @@ jobs:
1221
1225
  actions: read
1222
1226
  contents: read
1223
1227
  issues: write
1228
+ pull-requests: read
1229
+ concurrency:
1230
+ cancel-in-progress: false
1231
+ group: ${{ inputs.epic-parent && format('lighthouse-issue-{0}', inputs.epic-parent) || format('lighthouse-prepare-{0}', github.run_id) }}
1232
+ queue: max
1233
+
1224
1234
  env:
1225
1235
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
1226
1236
  outputs:
@@ -1262,11 +1272,14 @@ jobs:
1262
1272
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
1263
1273
  env:
1264
1274
  GH_TOKEN: ${{ github.token }}
1275
+ LIGHTHOUSE_PREPARE_FAILED: "true"
1265
1276
 
1266
1277
  publish:
1267
1278
  name: Validate, publish and release
1268
1279
  needs:
1280
+ - activation
1269
1281
  - agent
1282
+ - pre_activation
1270
1283
  - prepare
1271
1284
  if: always() && needs.prepare.result == 'success' && needs.prepare.outputs.eligible == 'true'
1272
1285
  runs-on: ubuntu-24.04
@@ -1275,6 +1288,12 @@ jobs:
1275
1288
  actions: write
1276
1289
  contents: read
1277
1290
  issues: write
1291
+ pull-requests: read
1292
+ concurrency:
1293
+ cancel-in-progress: false
1294
+ group: ${{ inputs.epic-parent && format('lighthouse-issue-{0}', inputs.epic-parent) || format('lighthouse-publish-{0}', github.run_id) }}
1295
+ queue: max
1296
+
1278
1297
  env:
1279
1298
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
1280
1299
  steps:
@@ -1322,7 +1341,15 @@ jobs:
1322
1341
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
1323
1342
  env:
1324
1343
  GH_TOKEN: ${{ github.token }}
1344
+ LIGHTHOUSE_ACTIVATION_RESULT: ${{ needs.activation.result }}
1345
+ LIGHTHOUSE_AGENT_RESULT: ${{ needs.agent.result }}
1346
+ LIGHTHOUSE_PRE_ACTIVATION_RESULT: ${{ needs.pre_activation.result }}
1347
+ LIGHTHOUSE_PUBLISH_STATUS: ${{ job.status }}
1325
1348
  - name: Request the verified implementation continuation
1326
1349
  run: node src/packages/sdlc/src/issue-actions.mjs continue-refinement
1327
1350
  env:
1328
1351
  GH_TOKEN: ${{ github.token }}
1352
+ - name: Request the verified product prerequisite
1353
+ run: node src/packages/sdlc/src/issue-actions.mjs continue-product-gap
1354
+ env:
1355
+ GH_TOKEN: ${{ github.token }}
@@ -4,7 +4,7 @@ name: refine
4
4
  description: Refine an authorized issue through OpenCode with execution logs and validated evidence.
5
5
  run-name: "refine #${{ inputs.issue }} · request ${{ inputs.dispatch-request }}"
6
6
  concurrency:
7
- group: lighthouse-issue-${{ inputs.issue }}
7
+ group: ${{ inputs.epic-parent && format('lighthouse-epic-child-{0}', inputs.issue) || format('lighthouse-issue-{0}', inputs.issue) }}
8
8
  cancel-in-progress: false
9
9
  queue: max
10
10
  job-discriminator: ${{ github.run_id }}
@@ -21,6 +21,10 @@ on:
21
21
  description: Authenticated router receipt comment ID
22
22
  required: true
23
23
  type: string
24
+ epic-parent:
25
+ description: Authenticated parent issue for shared epic serialization
26
+ required: false
27
+ type: string
24
28
  needs: [prepare]
25
29
  if: needs.prepare.outputs.eligible == 'true'
26
30
  runs-on: [self-hosted, linux, lighthouse-workflow]
@@ -98,6 +102,10 @@ post-steps:
98
102
  retention-days: 14
99
103
  jobs:
100
104
  prepare:
105
+ concurrency:
106
+ group: ${{ inputs.epic-parent && format('lighthouse-issue-{0}', inputs.epic-parent) || format('lighthouse-prepare-{0}', github.run_id) }}
107
+ cancel-in-progress: false
108
+ queue: max
101
109
  outputs:
102
110
  eligible: ${{ steps.prepare.outputs.eligible }}
103
111
  source_revision: ${{ steps.prepare.outputs.source_revision }}
@@ -107,6 +115,7 @@ jobs:
107
115
  actions: read
108
116
  contents: read
109
117
  issues: write
118
+ pull-requests: read
110
119
  env:
111
120
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
112
121
  steps:
@@ -135,16 +144,22 @@ jobs:
135
144
  if: failure()
136
145
  env:
137
146
  GH_TOKEN: ${{ github.token }}
147
+ LIGHTHOUSE_PREPARE_FAILED: "true"
138
148
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
139
149
  publish:
150
+ concurrency:
151
+ group: ${{ inputs.epic-parent && format('lighthouse-issue-{0}', inputs.epic-parent) || format('lighthouse-publish-{0}', github.run_id) }}
152
+ cancel-in-progress: false
153
+ queue: max
140
154
  name: Validate, publish and release
141
- needs: [prepare, agent]
155
+ needs: [prepare, pre_activation, activation, agent]
142
156
  if: always() && needs.prepare.result == 'success' && needs.prepare.outputs.eligible == 'true'
143
157
  runs-on: ubuntu-24.04
144
158
  permissions:
145
159
  actions: write
146
160
  contents: read
147
161
  issues: write
162
+ pull-requests: read
148
163
  env:
149
164
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
150
165
  steps:
@@ -182,11 +197,19 @@ jobs:
182
197
  if: always()
183
198
  env:
184
199
  GH_TOKEN: ${{ github.token }}
200
+ LIGHTHOUSE_PRE_ACTIVATION_RESULT: ${{ needs.pre_activation.result }}
201
+ LIGHTHOUSE_ACTIVATION_RESULT: ${{ needs.activation.result }}
202
+ LIGHTHOUSE_AGENT_RESULT: ${{ needs.agent.result }}
203
+ LIGHTHOUSE_PUBLISH_STATUS: ${{ job.status }}
185
204
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
186
205
  - name: Request the verified implementation continuation
187
206
  env:
188
207
  GH_TOKEN: ${{ github.token }}
189
208
  run: node src/packages/sdlc/src/issue-actions.mjs continue-refinement
209
+ - name: Request the verified product prerequisite
210
+ env:
211
+ GH_TOKEN: ${{ github.token }}
212
+ run: node src/packages/sdlc/src/issue-actions.mjs continue-product-gap
190
213
  ---
191
214
 
192
215
  # Refine the authorized issue
@@ -1,4 +1,4 @@
1
- # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"51e11118c2e24416a675a933e087c252883092fb009eebf147578c58b5a535f7","body_hash":"13d2a6e093a7dc59f842bf0e8e8ea2a1c5a2879c8608b026dac1197b022baebe","compiler_version":"v0.93.2","agent_id":"opencode","engine_versions":{"opencode":"2.1.0"},"agent_image_runner":"[\"self-hosted\",\"linux\",\"lighthouse-workflow\"]"}
1
+ # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"d4a17ac1ac76bdf5b1e27cc7b63dc889d70b7d4521e0cfa9a8d4a126031ab10f","body_hash":"13d2a6e093a7dc59f842bf0e8e8ea2a1c5a2879c8608b026dac1197b022baebe","compiler_version":"v0.93.2","agent_id":"opencode","engine_versions":{"opencode":"2.1.0"},"agent_image_runner":"[\"self-hosted\",\"linux\",\"lighthouse-workflow\"]"}
2
2
  # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/checkout","sha":"fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09","version":"v5"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"949feb2413d6458794dcd2491c4babbbce0c15c1","version":"v7.1.0"},{"repo":"actions/setup-node","sha":"a0853c24544627f65ddf259abe73b1d18a591444","version":"v5"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw-actions/setup","sha":"d9128eb3ea40c18b77c76184eda03c0ff2608d79","version":"v0.93.2"}],"containers":[{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:41835613992df88f51e923bad486f96dfb2e6cda29f13e217df41833284ae382","pinned_image":"ghcr.io/github/gh-aw-node@sha256:41835613992df88f51e923bad486f96dfb2e6cda29f13e217df41833284ae382"}],"mcp_servers":[{"name":"safeoutputs","tools":["noop"]}],"threat_detection":{"mode":"disabled"},"admission":false}
3
3
  # This file was automatically generated by gh-aw (v0.93.2). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
4
4
  #
@@ -1264,6 +1264,7 @@ jobs:
1264
1264
  run: node src/packages/sdlc/src/completion-actions.mjs cleanup
1265
1265
  env:
1266
1266
  GH_TOKEN: ${{ github.token }}
1267
+ LIGHTHOUSE_PREPARE_FAILED: "true"
1267
1268
 
1268
1269
  publish:
1269
1270
  name: Validate, publish and release
@@ -1339,3 +1340,5 @@ jobs:
1339
1340
  run: node src/packages/sdlc/src/completion-actions.mjs cleanup
1340
1341
  env:
1341
1342
  GH_TOKEN: ${{ github.token }}
1343
+ LIGHTHOUSE_AGENT_RESULT: ${{ needs.agent.result }}
1344
+ LIGHTHOUSE_PUBLISH_STATUS: ${{ job.status }}
@@ -137,6 +137,7 @@ jobs:
137
137
  if: failure()
138
138
  env:
139
139
  GH_TOKEN: ${{ github.token }}
140
+ LIGHTHOUSE_PREPARE_FAILED: "true"
140
141
  run: node src/packages/sdlc/src/completion-actions.mjs cleanup
141
142
  publish:
142
143
  concurrency:
@@ -198,6 +199,8 @@ jobs:
198
199
  if: always()
199
200
  env:
200
201
  GH_TOKEN: ${{ github.token }}
202
+ LIGHTHOUSE_AGENT_RESULT: ${{ needs.agent.result }}
203
+ LIGHTHOUSE_PUBLISH_STATUS: ${{ job.status }}
201
204
  run: node src/packages/sdlc/src/completion-actions.mjs cleanup
202
205
  ---
203
206
 
@@ -34,7 +34,7 @@ on:
34
34
  required: true
35
35
  default: stage
36
36
  type: choice
37
- options: [stage, product-change]
37
+ options: [stage, product-change, resume-product]
38
38
  model_selection:
39
39
  description: Optional JSON model selection for this execution
40
40
  required: false
@@ -43,6 +43,14 @@ on:
43
43
  description: Recheck a completed execution through the same continuation rules
44
44
  required: false
45
45
  type: string
46
+ epic_parent:
47
+ description: Authenticated parent issue for epic triage
48
+ required: false
49
+ type: string
50
+ epic_run:
51
+ description: Completed epic execution for child triage
52
+ required: false
53
+ type: string
46
54
  pull_request:
47
55
  description: PR number for integrate or review
48
56
  required: false
@@ -92,14 +100,45 @@ jobs:
92
100
  env:
93
101
  GH_TOKEN: ${{ github.token }}
94
102
  run: node src/packages/sdlc/src/pr-state-actions.mjs
103
+ epic-triage:
104
+ if: >-
105
+ vars.LIGHTHOUSE_AUTOMATION_ENABLED == 'true' && vars.LIGHTHOUSE_EPIC_ENABLED == 'true' &&
106
+ github.event_name == 'workflow_run' && github.event.action == 'completed' &&
107
+ github.event.workflow_run.path == '.github/workflows/lighthouse-sdlc-epic.yml' && github.event.workflow_run.conclusion == 'success'
108
+ concurrency:
109
+ group: lighthouse-epic-triage-${{ github.event.workflow_run.id }}
110
+ cancel-in-progress: false
111
+ queue: max
112
+ runs-on: ubuntu-24.04
113
+ permissions:
114
+ actions: write
115
+ contents: read
116
+ issues: read
117
+ steps:
118
+ - uses: actions/checkout@v5
119
+ with:
120
+ repository: juangcarmona/lighthouse
121
+ ref: __LIGHTHOUSE_REF__
122
+ persist-credentials: false
123
+ - uses: actions/setup-node@v5
124
+ with:
125
+ node-version: 24
126
+ - name: Dispatch authenticated epic child triage
127
+ env:
128
+ GH_TOKEN: ${{ github.token }}
129
+ run: node src/packages/sdlc/src/epic-dispatch.mjs
95
130
  route:
96
131
  if: >-
97
132
  vars.LIGHTHOUSE_AUTOMATION_ENABLED == 'true' &&
98
133
  (github.actor == github.repository_owner || github.event_name == 'workflow_run' ||
99
- (github.event_name == 'workflow_dispatch' && github.actor == 'github-actions[bot]' && inputs.stage == 'implement' && inputs.after_run != '')) &&
134
+ (github.event_name == 'workflow_dispatch' && github.actor == 'github-actions[bot]' && ((inputs.after_run != '' && ((inputs.stage == 'implement' && inputs.workflow != 'product-change') || inputs.workflow == 'product-change' || inputs.workflow == 'resume-product')) || (inputs.stage == 'triage' && inputs.epic_parent != '' && inputs.epic_run != '')))) &&
100
135
  (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_run' ||
101
136
  (github.event_name == 'issues' && (github.event.label.name == 'triage' || github.event.label.name == 'refine' || github.event.label.name == 'propose' || github.event.label.name == 'implement' || (github.event.action == 'unlabeled' && github.event.label.name == 'future'))) ||
102
137
  github.event_name == 'issue_comment' || github.event_name == 'pull_request_review' || github.event_name == 'pull_request_review_comment')
138
+ concurrency:
139
+ group: lighthouse-route-${{ github.event_name }}-${{ github.event.comment.id || github.event.review.id || github.run_id }}
140
+ cancel-in-progress: false
141
+ queue: max
103
142
  runs-on: ubuntu-24.04
104
143
  permissions:
105
144
  actions: read
@@ -109,6 +148,7 @@ jobs:
109
148
  outputs:
110
149
  run: ${{ steps.route.outputs.run }}
111
150
  issue: ${{ steps.route.outputs.issue }}
151
+ epic_parent: ${{ steps.route.outputs.epic_parent }}
112
152
  stage: ${{ steps.route.outputs.stage }}
113
153
  worker: ${{ steps.route.outputs.worker }}
114
154
  steps:
@@ -125,6 +165,7 @@ jobs:
125
165
  env:
126
166
  GH_TOKEN: ${{ github.token }}
127
167
  LIGHTHOUSE_COMPLETION_ENABLED: true
168
+ LIGHTHOUSE_EPIC_ENABLED: ${{ vars.LIGHTHOUSE_EPIC_ENABLED }}
128
169
  LIGHTHOUSE_PRODUCT_CHANGE_ENABLED: ${{ env.LIGHTHOUSE_PRODUCT_CHANGE_ENABLED }}
129
170
  run: node src/packages/sdlc/src/issue-actions.mjs route
130
171
  dispatch:
@@ -132,7 +173,7 @@ jobs:
132
173
  needs: route
133
174
  if: needs.route.outputs.run == 'true'
134
175
  concurrency:
135
- group: lighthouse-dispatch-${{ needs.route.outputs.issue }}
176
+ group: lighthouse-issue-${{ needs.route.outputs.epic_parent || needs.route.outputs.issue }}
136
177
  cancel-in-progress: false
137
178
  queue: max
138
179
  runs-on: ubuntu-24.04
@@ -143,6 +184,9 @@ jobs:
143
184
  pull-requests: read
144
185
  env:
145
186
  LIGHTHOUSE_ISSUE: ${{ needs.route.outputs.issue }}
187
+ LIGHTHOUSE_EPIC_PARENT: ${{ needs.route.outputs.epic_parent }}
188
+ LIGHTHOUSE_EPIC_ENABLED: ${{ vars.LIGHTHOUSE_EPIC_ENABLED }}
189
+ LIGHTHOUSE_EPIC_CAPACITY: ${{ vars.LIGHTHOUSE_EPIC_CAPACITY }}
146
190
  LIGHTHOUSE_STAGE: ${{ needs.route.outputs.stage }}
147
191
  LIGHTHOUSE_WORKER: ${{ needs.route.outputs.worker }}
148
192
  steps:
@@ -1,4 +1,4 @@
1
- # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"2ef374e6036e86ca382e1352ebbbe6367c0836d172b705f4fe450d24ad7921f7","body_hash":"b6819b09222b408b8140fdc320e7270d45149ccb70442e528ef4f0ffa86e985c","compiler_version":"v0.93.2","agent_id":"opencode","engine_versions":{"opencode":"2.1.0"},"agent_image_runner":"[\"self-hosted\",\"linux\",\"lighthouse-workflow\"]"}
1
+ # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"00b2d57d1b7519c4eeb8f10176673c2f626856b7050d2c6f41377d67866ba7b0","body_hash":"b6819b09222b408b8140fdc320e7270d45149ccb70442e528ef4f0ffa86e985c","compiler_version":"v0.93.2","agent_id":"opencode","engine_versions":{"opencode":"2.1.0"},"agent_image_runner":"[\"self-hosted\",\"linux\",\"lighthouse-workflow\"]"}
2
2
  # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/checkout","sha":"fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09","version":"v5"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"949feb2413d6458794dcd2491c4babbbce0c15c1","version":"v7.1.0"},{"repo":"actions/setup-node","sha":"a0853c24544627f65ddf259abe73b1d18a591444","version":"v5"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw-actions/setup","sha":"d9128eb3ea40c18b77c76184eda03c0ff2608d79","version":"v0.93.2"}],"containers":[{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:41835613992df88f51e923bad486f96dfb2e6cda29f13e217df41833284ae382","pinned_image":"ghcr.io/github/gh-aw-node@sha256:41835613992df88f51e923bad486f96dfb2e6cda29f13e217df41833284ae382"}],"mcp_servers":[{"name":"safeoutputs","tools":["noop"]}],"threat_detection":{"mode":"disabled"},"admission":false}
3
3
  # This file was automatically generated by gh-aw (v0.93.2). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md
4
4
  #
@@ -69,6 +69,10 @@ on:
69
69
  description: Authenticated owner admission receipt
70
70
  required: true
71
71
  type: string
72
+ epic-parent:
73
+ description: Authenticated parent issue for shared epic serialization
74
+ required: false
75
+ type: string
72
76
  issue:
73
77
  description: Source issue
74
78
  required: true
@@ -79,7 +83,7 @@ permissions: {}
79
83
 
80
84
  concurrency:
81
85
  cancel-in-progress: false
82
- group: lighthouse-issue-${{ inputs.issue }}
86
+ group: ${{ inputs.epic-parent && format('lighthouse-epic-child-{0}', inputs.issue) || format('lighthouse-issue-{0}', inputs.issue) }}
83
87
  queue: max
84
88
 
85
89
  run-name: "triage #${{ inputs.issue }} · request ${{ inputs.dispatch-request }}"
@@ -1221,6 +1225,12 @@ jobs:
1221
1225
  actions: read
1222
1226
  contents: read
1223
1227
  issues: write
1228
+ pull-requests: read
1229
+ concurrency:
1230
+ cancel-in-progress: false
1231
+ group: ${{ inputs.epic-parent && format('lighthouse-issue-{0}', inputs.epic-parent) || format('lighthouse-prepare-{0}', github.run_id) }}
1232
+ queue: max
1233
+
1224
1234
  env:
1225
1235
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
1226
1236
  outputs:
@@ -1262,19 +1272,28 @@ jobs:
1262
1272
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
1263
1273
  env:
1264
1274
  GH_TOKEN: ${{ github.token }}
1275
+ LIGHTHOUSE_PREPARE_FAILED: "true"
1265
1276
 
1266
1277
  publish:
1267
1278
  name: Validate, publish and release
1268
1279
  needs:
1280
+ - activation
1269
1281
  - agent
1282
+ - pre_activation
1270
1283
  - prepare
1271
1284
  if: always() && needs.prepare.result == 'success' && needs.prepare.outputs.eligible == 'true'
1272
1285
  runs-on: ubuntu-24.04
1273
1286
  # Permissions for the publish job (workflow permissions default to none).
1274
1287
  permissions:
1275
- actions: read
1288
+ actions: write
1276
1289
  contents: read
1277
1290
  issues: write
1291
+ pull-requests: read
1292
+ concurrency:
1293
+ cancel-in-progress: false
1294
+ group: ${{ inputs.epic-parent && format('lighthouse-issue-{0}', inputs.epic-parent) || format('lighthouse-publish-{0}', github.run_id) }}
1295
+ queue: max
1296
+
1278
1297
  env:
1279
1298
  LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
1280
1299
  steps:
@@ -1319,3 +1338,11 @@ jobs:
1319
1338
  run: node src/packages/sdlc/src/issue-actions.mjs cleanup
1320
1339
  env:
1321
1340
  GH_TOKEN: ${{ github.token }}
1341
+ LIGHTHOUSE_ACTIVATION_RESULT: ${{ needs.activation.result }}
1342
+ LIGHTHOUSE_AGENT_RESULT: ${{ needs.agent.result }}
1343
+ LIGHTHOUSE_PRE_ACTIVATION_RESULT: ${{ needs.pre_activation.result }}
1344
+ LIGHTHOUSE_PUBLISH_STATUS: ${{ job.status }}
1345
+ - name: Request the verified product prerequisite
1346
+ run: node src/packages/sdlc/src/issue-actions.mjs continue-product-gap
1347
+ env:
1348
+ GH_TOKEN: ${{ github.token }}