@juangcarmona/lighthouse-sdlc 0.15.2 → 0.16.1

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 (49) hide show
  1. package/README.md +6 -1
  2. package/execution-environments.md +2 -0
  3. package/meta-commands/ff.md +2 -2
  4. package/meta-commands/hotfix.md +3 -1
  5. package/package.json +8 -3
  6. package/schemas/product-change.schema.json +118 -0
  7. package/skills/independent-review/SKILL.md +13 -0
  8. package/skills/product-change/SKILL.md +18 -0
  9. package/src/completion.mjs +5 -3
  10. package/src/contracts.mjs +2 -0
  11. package/src/host-contract.mjs +11 -3
  12. package/src/implementation-runtime.mjs +14 -5
  13. package/src/implementation.mjs +2 -2
  14. package/src/install-workflows.mjs +17 -5
  15. package/src/integration-evidence.mjs +4 -1
  16. package/src/issue-actions.mjs +124 -17
  17. package/src/opencode-execute.mjs +7 -7
  18. package/src/product-change-actions.mjs +308 -0
  19. package/src/product-change.mjs +277 -0
  20. package/src/proposal-review.mjs +1 -1
  21. package/src/proposal.mjs +4 -4
  22. package/src/sdlc.mjs +1 -1
  23. package/src/stage-dispatch.mjs +11 -3
  24. package/src/unattended-actions.mjs +287 -0
  25. package/src/unattended-runtime.mjs +115 -0
  26. package/src/unattended.mjs +161 -0
  27. package/templates/unattended.json +37 -0
  28. package/unattended.md +40 -0
  29. package/workflows/lighthouse-sdlc-apply-product-change.lock.yml +1838 -0
  30. package/workflows/lighthouse-sdlc-apply-product-change.md +183 -0
  31. package/workflows/lighthouse-sdlc-apply-review.lock.yml +4 -4
  32. package/workflows/lighthouse-sdlc-apply-review.md +2 -2
  33. package/workflows/lighthouse-sdlc-implement.lock.yml +4 -4
  34. package/workflows/lighthouse-sdlc-implement.md +2 -2
  35. package/workflows/lighthouse-sdlc-integrate.lock.yml +4 -4
  36. package/workflows/lighthouse-sdlc-integrate.md +2 -2
  37. package/workflows/lighthouse-sdlc-product-change.lock.yml +1329 -0
  38. package/workflows/lighthouse-sdlc-product-change.md +195 -0
  39. package/workflows/lighthouse-sdlc-propose.lock.yml +4 -4
  40. package/workflows/lighthouse-sdlc-propose.md +2 -2
  41. package/workflows/lighthouse-sdlc-refine.lock.yml +4 -4
  42. package/workflows/lighthouse-sdlc-refine.md +2 -2
  43. package/workflows/lighthouse-sdlc-review.lock.yml +4 -4
  44. package/workflows/lighthouse-sdlc-review.md +2 -2
  45. package/workflows/lighthouse-sdlc-router.yml +12 -2
  46. package/workflows/lighthouse-sdlc-triage.lock.yml +4 -4
  47. package/workflows/lighthouse-sdlc-triage.md +2 -2
  48. package/workflows/lighthouse-sdlc-unattended.yml +67 -0
  49. package/workflows/shared/lighthouse-opencode.md +1 -1
@@ -0,0 +1,195 @@
1
+ ---
2
+ # Owned by lighthouse-sdlc. Regenerate the lock with gh aw v0.93.2.
3
+ name: product-change
4
+ description: Prepare and publish an authenticated Product Change candidate for an authorized issue idea.
5
+ run-name: "product change #${{ inputs.issue }} · request ${{ inputs.dispatch-request }}"
6
+ concurrency:
7
+ group: lighthouse-issue-${{ inputs.issue }}
8
+ cancel-in-progress: false
9
+ queue: max
10
+ job-discriminator: ${{ github.run_id }}
11
+ on:
12
+ roles: all
13
+ workflow_dispatch:
14
+ inputs:
15
+ issue:
16
+ description: Source issue containing the product idea
17
+ required: true
18
+ type: string
19
+ dispatch-request:
20
+ description: Authenticated router receipt comment ID
21
+ required: true
22
+ type: string
23
+ needs: [prepare]
24
+ if: needs.prepare.outputs.eligible == 'true'
25
+ runs-on: [self-hosted, linux, lighthouse-workflow]
26
+ runs-on-slim: ubuntu-24.04
27
+ timeout-minutes: 30
28
+ env:
29
+ LIGHTHOUSE_STAGE: propose
30
+ LIGHTHOUSE_WORKER: product-change
31
+ LIGHTHOUSE_DISPATCH_REQUIRED: "true"
32
+ LIGHTHOUSE_PRODUCT_CHANGE_ENABLED: "true"
33
+ permissions:
34
+ contents: read
35
+ engine:
36
+ id: opencode
37
+ command: node
38
+ imports:
39
+ - shared/lighthouse-opencode.md
40
+ strict: false
41
+ features:
42
+ dangerously-disable-sandbox-agent: true
43
+ sandbox:
44
+ agent: false
45
+ tools:
46
+ github: false
47
+ safe-outputs:
48
+ create-issue: false
49
+ report-incomplete: false
50
+ threat-detection: false
51
+ report-failure-as-issue: false
52
+ report-missing-tool: false
53
+ report-missing-data: false
54
+ noop:
55
+ report-as-issue: false
56
+ network:
57
+ allowed: []
58
+ steps:
59
+ - name: Check out the authorized product revision
60
+ uses: actions/checkout@v5
61
+ with:
62
+ persist-credentials: false
63
+ ref: ${{ needs.prepare.outputs.source_revision }}
64
+ - name: Load the pinned harness package
65
+ uses: actions/checkout@v5
66
+ with:
67
+ repository: juangcarmona/lighthouse
68
+ ref: __LIGHTHOUSE_REF__
69
+ path: .lighthouse-harness
70
+ persist-credentials: false
71
+ - name: Load the authorized product request
72
+ uses: actions/download-artifact@v8
73
+ with:
74
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
75
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
76
+ post-steps:
77
+ - name: Validate the Lighthouse result
78
+ run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs validate
79
+ - name: Preserve the result and runtime receipt
80
+ if: always()
81
+ uses: actions/upload-artifact@v7
82
+ with:
83
+ name: lighthouse-result-${{ inputs.issue }}-${{ github.run_attempt }}
84
+ path: |
85
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/envelope.json
86
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/runtime.json
87
+ if-no-files-found: error
88
+ retention-days: 14
89
+ jobs:
90
+ prepare:
91
+ outputs:
92
+ eligible: ${{ steps.prepare.outputs.eligible }}
93
+ source_revision: ${{ steps.prepare.outputs.source_revision }}
94
+ name: Authenticate and checkpoint the idea
95
+ runs-on: ubuntu-24.04
96
+ permissions:
97
+ actions: read
98
+ contents: read
99
+ issues: write
100
+ env:
101
+ LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
102
+ LIGHTHOUSE_PRODUCT_CHANGE_ENABLED: "true"
103
+ steps:
104
+ - uses: actions/checkout@v5
105
+ with:
106
+ repository: juangcarmona/lighthouse
107
+ ref: __LIGHTHOUSE_REF__
108
+ persist-credentials: false
109
+ - uses: actions/setup-node@v5
110
+ with:
111
+ node-version: 24
112
+ - name: Install provider integration when the adopter configured it
113
+ run: |
114
+ npm ci --ignore-scripts
115
+ npm install --no-save --package-lock=false --ignore-scripts @prodshape/integration-openspec@0.6.6
116
+ - name: Collect verified intent and reserve the issue
117
+ id: prepare
118
+ env:
119
+ GH_TOKEN: ${{ github.token }}
120
+ run: node src/packages/sdlc/src/issue-actions.mjs prepare
121
+ - name: Preserve the execution request
122
+ if: steps.prepare.outputs.eligible == 'true'
123
+ uses: actions/upload-artifact@v7
124
+ with:
125
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
126
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/
127
+ if-no-files-found: error
128
+ retention-days: 14
129
+ - name: Release reservation if preparation failed
130
+ if: failure()
131
+ env:
132
+ GH_TOKEN: ${{ github.token }}
133
+ run: node src/packages/sdlc/src/issue-actions.mjs cleanup
134
+ publish:
135
+ name: Validate and publish the product candidate
136
+ needs: [prepare, agent]
137
+ if: always() && needs.prepare.result == 'success' && needs.prepare.outputs.eligible == 'true'
138
+ runs-on: ubuntu-24.04
139
+ permissions:
140
+ contents: write
141
+ issues: write
142
+ pull-requests: write
143
+ env:
144
+ LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
145
+ steps:
146
+ - uses: actions/checkout@v5
147
+ with:
148
+ persist-credentials: false
149
+ ref: ${{ needs.prepare.outputs.source_revision }}
150
+ - uses: actions/checkout@v5
151
+ with:
152
+ repository: juangcarmona/lighthouse
153
+ ref: __LIGHTHOUSE_REF__
154
+ path: .lighthouse-harness
155
+ persist-credentials: false
156
+ - uses: actions/setup-node@v5
157
+ with:
158
+ node-version: 24
159
+ - name: Install the repository and optional product provider
160
+ run: |
161
+ npm ci --ignore-scripts
162
+ npm install --no-save --package-lock=false --ignore-scripts @prodshape/integration-openspec@0.6.6
163
+ - name: Load the request and candidate
164
+ uses: actions/download-artifact@v8
165
+ with:
166
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
167
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
168
+ - name: Load the product result
169
+ if: needs.agent.result == 'success'
170
+ uses: actions/download-artifact@v8
171
+ with:
172
+ name: lighthouse-result-${{ inputs.issue }}-${{ github.run_attempt }}
173
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
174
+ - name: Require a completed worker
175
+ if: needs.agent.result != 'success'
176
+ run: exit 1
177
+ - name: Recheck authority and publish the candidate
178
+ if: needs.agent.result == 'success'
179
+ env:
180
+ GH_TOKEN: ${{ github.token }}
181
+ run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs publish
182
+ - name: Release the execution reservation
183
+ if: always()
184
+ env:
185
+ GH_TOKEN: ${{ github.token }}
186
+ run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs cleanup
187
+ ---
188
+
189
+ # Prepare a product change from an idea
190
+
191
+ 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
+
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.
194
+
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.
@@ -1,4 +1,4 @@
1
- # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"9f1eb00a7ca17acea34862222ba6ea4384d9396a356f5d02c3d5af885e01a378","body_hash":"64c05adc2e6fd3f631b84ea421688ae91dfad6c946b0fb6f8dedf577c8c5bf2a","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":"c27655e49e0c2a6bbcc2f99a4a861c3bcc504599303ed34da08fd0fa7020b692","body_hash":"64c05adc2e6fd3f631b84ea421688ae91dfad6c946b0fb6f8dedf577c8c5bf2a","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
  #
@@ -510,7 +510,7 @@ jobs:
510
510
  - name: Load the pinned harness package
511
511
  uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
512
512
  with:
513
- path: tools
513
+ path: .lighthouse-harness
514
514
  persist-credentials: false
515
515
  ref: __LIGHTHOUSE_REF__
516
516
  repository: juangcarmona/lighthouse
@@ -749,7 +749,7 @@ jobs:
749
749
  export GH_AW_AWF_EXECUTION_EVIDENCE_FILE="/tmp/gh-aw/agent_execution.json"
750
750
  export no_proxy="${NO_PROXY:-}"
751
751
  printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt
752
- cd "${GITHUB_WORKSPACE}" && node tools/src/packages/sdlc/src/opencode-execute.mjs "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
752
+ cd "${GITHUB_WORKSPACE}" && node .lighthouse-harness/src/packages/sdlc/src/opencode-execute.mjs "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
753
753
  env:
754
754
  GH_AW_ADMISSION_MAX_AI_CREDITS: ${{ needs.activation.outputs.admission-max-ai-credits }}
755
755
  GH_AW_ADMISSION_RESULT: ${{ needs.activation.outputs.admission-result }}
@@ -862,7 +862,7 @@ jobs:
862
862
  echo '{"items":[]}' > /tmp/gh-aw/agent_output.json
863
863
  fi
864
864
  - name: Validate the Lighthouse result
865
- run: node tools/src/packages/sdlc/src/issue-actions.mjs validate
865
+ run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs validate
866
866
  - if: always()
867
867
  name: Preserve the result and runtime receipt
868
868
  uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
@@ -68,7 +68,7 @@ steps:
68
68
  with:
69
69
  repository: juangcarmona/lighthouse
70
70
  ref: __LIGHTHOUSE_REF__
71
- path: tools
71
+ path: .lighthouse-harness
72
72
  persist-credentials: false
73
73
  - name: Load the authorized issue context
74
74
  uses: actions/download-artifact@v8
@@ -77,7 +77,7 @@ steps:
77
77
  path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
78
78
  post-steps:
79
79
  - name: Validate the Lighthouse result
80
- run: node tools/src/packages/sdlc/src/issue-actions.mjs validate
80
+ run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs validate
81
81
  - name: Preserve the result and runtime receipt
82
82
  if: always()
83
83
  uses: actions/upload-artifact@v7
@@ -1,4 +1,4 @@
1
- # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"b4ec13bf1f2bca420114208bc2ea15998f9cd7f4cd5c1eb667d0a8d3466022a7","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":"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\"]"}
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
  #
@@ -510,7 +510,7 @@ jobs:
510
510
  - name: Load the pinned harness package
511
511
  uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
512
512
  with:
513
- path: tools
513
+ path: .lighthouse-harness
514
514
  persist-credentials: false
515
515
  ref: __LIGHTHOUSE_REF__
516
516
  repository: juangcarmona/lighthouse
@@ -749,7 +749,7 @@ jobs:
749
749
  export GH_AW_AWF_EXECUTION_EVIDENCE_FILE="/tmp/gh-aw/agent_execution.json"
750
750
  export no_proxy="${NO_PROXY:-}"
751
751
  printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt
752
- cd "${GITHUB_WORKSPACE}" && node tools/src/packages/sdlc/src/opencode-execute.mjs "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
752
+ cd "${GITHUB_WORKSPACE}" && node .lighthouse-harness/src/packages/sdlc/src/opencode-execute.mjs "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
753
753
  env:
754
754
  GH_AW_ADMISSION_MAX_AI_CREDITS: ${{ needs.activation.outputs.admission-max-ai-credits }}
755
755
  GH_AW_ADMISSION_RESULT: ${{ needs.activation.outputs.admission-result }}
@@ -862,7 +862,7 @@ jobs:
862
862
  echo '{"items":[]}' > /tmp/gh-aw/agent_output.json
863
863
  fi
864
864
  - name: Validate the Lighthouse result
865
- run: node tools/src/packages/sdlc/src/issue-actions.mjs validate
865
+ run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs validate
866
866
  - if: always()
867
867
  name: Preserve the result and runtime receipt
868
868
  uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
@@ -68,7 +68,7 @@ steps:
68
68
  with:
69
69
  repository: juangcarmona/lighthouse
70
70
  ref: __LIGHTHOUSE_REF__
71
- path: tools
71
+ path: .lighthouse-harness
72
72
  persist-credentials: false
73
73
  - name: Load the authorized issue context
74
74
  uses: actions/download-artifact@v8
@@ -77,7 +77,7 @@ steps:
77
77
  path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
78
78
  post-steps:
79
79
  - name: Validate the Lighthouse result
80
- run: node tools/src/packages/sdlc/src/issue-actions.mjs validate
80
+ run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs validate
81
81
  - name: Preserve the result and runtime receipt
82
82
  if: always()
83
83
  uses: actions/upload-artifact@v7
@@ -1,4 +1,4 @@
1
- # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"71a9cc0055e7e8bad0c8eeb083c3105f576f83c52f1139b7f8bcfdb15b90ff58","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":"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\"]"}
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
  #
@@ -510,7 +510,7 @@ jobs:
510
510
  - name: Load the pinned harness package
511
511
  uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
512
512
  with:
513
- path: tools
513
+ path: .lighthouse-harness
514
514
  persist-credentials: false
515
515
  ref: __LIGHTHOUSE_REF__
516
516
  repository: juangcarmona/lighthouse
@@ -749,7 +749,7 @@ jobs:
749
749
  export GH_AW_AWF_EXECUTION_EVIDENCE_FILE="/tmp/gh-aw/agent_execution.json"
750
750
  export no_proxy="${NO_PROXY:-}"
751
751
  printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt
752
- cd "${GITHUB_WORKSPACE}" && node tools/src/packages/sdlc/src/opencode-execute.mjs "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
752
+ cd "${GITHUB_WORKSPACE}" && node .lighthouse-harness/src/packages/sdlc/src/opencode-execute.mjs "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
753
753
  env:
754
754
  GH_AW_ADMISSION_MAX_AI_CREDITS: ${{ needs.activation.outputs.admission-max-ai-credits }}
755
755
  GH_AW_ADMISSION_RESULT: ${{ needs.activation.outputs.admission-result }}
@@ -862,7 +862,7 @@ jobs:
862
862
  echo '{"items":[]}' > /tmp/gh-aw/agent_output.json
863
863
  fi
864
864
  - name: Validate the Lighthouse result
865
- run: node tools/src/packages/sdlc/src/completion-actions.mjs validate
865
+ run: node .lighthouse-harness/src/packages/sdlc/src/completion-actions.mjs validate
866
866
  - if: always()
867
867
  name: Preserve the result and runtime receipt
868
868
  uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
@@ -68,7 +68,7 @@ steps:
68
68
  with:
69
69
  repository: juangcarmona/lighthouse
70
70
  ref: __LIGHTHOUSE_REF__
71
- path: tools
71
+ path: .lighthouse-harness
72
72
  persist-credentials: false
73
73
  - name: Load the authorized issue context
74
74
  uses: actions/download-artifact@v8
@@ -77,7 +77,7 @@ steps:
77
77
  path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
78
78
  post-steps:
79
79
  - name: Validate the Lighthouse result
80
- run: node tools/src/packages/sdlc/src/completion-actions.mjs validate
80
+ run: node .lighthouse-harness/src/packages/sdlc/src/completion-actions.mjs validate
81
81
  - name: Preserve the result and runtime receipt
82
82
  if: always()
83
83
  uses: actions/upload-artifact@v7
@@ -1,6 +1,6 @@
1
1
  # Optional GitHub-native stage adapter; source owned by lighthouse-sdlc.
2
2
  name: router
3
- run-name: "${{ (github.event_name == 'workflow_run' && 'Delivery after CI') || inputs.stage || github.event.label.name || ((github.event.pull_request || github.event.issue.pull_request) && 'PR review') || (github.event_name == 'issue_comment' && 'reply') || 'refine' }} #${{ github.event.issue.number || github.event.pull_request.number || inputs.issue }} · ${{ github.actor }}"
3
+ run-name: "${{ (github.event_name == 'workflow_run' && 'Delivery after CI') || inputs.workflow || inputs.stage || github.event.label.name || ((github.event.pull_request || github.event.issue.pull_request) && 'PR review') || (github.event_name == 'issue_comment' && 'reply') || 'refine' }} #${{ github.event.issue.number || github.event.pull_request.number || inputs.issue }} · ${{ github.actor }}"
4
4
  on:
5
5
  issues:
6
6
  types: [labeled, unlabeled]
@@ -26,9 +26,15 @@ on:
26
26
  stage:
27
27
  description: Authorized lifecycle stage
28
28
  required: true
29
- default: refine
29
+ default: propose
30
30
  type: choice
31
31
  options: [triage, refine, propose, implement, integrate, review]
32
+ workflow:
33
+ description: Select the authorized workflow
34
+ required: true
35
+ default: stage
36
+ type: choice
37
+ options: [stage, product-change]
32
38
  after_run:
33
39
  description: Recheck a completed execution through the same continuation rules
34
40
  required: false
@@ -52,6 +58,7 @@ env:
52
58
  LIGHTHOUSE_ENABLED_STAGES: triage,refine,propose,implement,integrate,review
53
59
  LIGHTHOUSE_AUTO_IMPLEMENT: true
54
60
  LIGHTHOUSE_COMPLETION_ENABLED: true
61
+ LIGHTHOUSE_PRODUCT_CHANGE_ENABLED: false
55
62
  jobs:
56
63
  pr-state:
57
64
  if: >-
@@ -99,6 +106,7 @@ jobs:
99
106
  run: ${{ steps.route.outputs.run }}
100
107
  issue: ${{ steps.route.outputs.issue }}
101
108
  stage: ${{ steps.route.outputs.stage }}
109
+ worker: ${{ steps.route.outputs.worker }}
102
110
  steps:
103
111
  - uses: actions/checkout@v5
104
112
  with:
@@ -113,6 +121,7 @@ jobs:
113
121
  env:
114
122
  GH_TOKEN: ${{ github.token }}
115
123
  LIGHTHOUSE_COMPLETION_ENABLED: true
124
+ LIGHTHOUSE_PRODUCT_CHANGE_ENABLED: ${{ env.LIGHTHOUSE_PRODUCT_CHANGE_ENABLED }}
116
125
  run: node src/packages/sdlc/src/issue-actions.mjs route
117
126
  dispatch:
118
127
  name: 📥 Dispatch selected stage
@@ -131,6 +140,7 @@ jobs:
131
140
  env:
132
141
  LIGHTHOUSE_ISSUE: ${{ needs.route.outputs.issue }}
133
142
  LIGHTHOUSE_STAGE: ${{ needs.route.outputs.stage }}
143
+ LIGHTHOUSE_WORKER: ${{ needs.route.outputs.worker }}
134
144
  steps:
135
145
  - uses: actions/checkout@v5
136
146
  with:
@@ -1,4 +1,4 @@
1
- # gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"774a39cc660dd7589cbba460421a95c9fec2bcb21b73471ae90bc9b625eeb767","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":"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\"]"}
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
  #
@@ -510,7 +510,7 @@ jobs:
510
510
  - name: Load the pinned harness package
511
511
  uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
512
512
  with:
513
- path: tools
513
+ path: .lighthouse-harness
514
514
  persist-credentials: false
515
515
  ref: __LIGHTHOUSE_REF__
516
516
  repository: juangcarmona/lighthouse
@@ -749,7 +749,7 @@ jobs:
749
749
  export GH_AW_AWF_EXECUTION_EVIDENCE_FILE="/tmp/gh-aw/agent_execution.json"
750
750
  export no_proxy="${NO_PROXY:-}"
751
751
  printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt
752
- cd "${GITHUB_WORKSPACE}" && node tools/src/packages/sdlc/src/opencode-execute.mjs "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
752
+ cd "${GITHUB_WORKSPACE}" && node .lighthouse-harness/src/packages/sdlc/src/opencode-execute.mjs "$(cat /tmp/gh-aw/aw-prompts/prompt.txt)" 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log
753
753
  env:
754
754
  GH_AW_ADMISSION_MAX_AI_CREDITS: ${{ needs.activation.outputs.admission-max-ai-credits }}
755
755
  GH_AW_ADMISSION_RESULT: ${{ needs.activation.outputs.admission-result }}
@@ -862,7 +862,7 @@ jobs:
862
862
  echo '{"items":[]}' > /tmp/gh-aw/agent_output.json
863
863
  fi
864
864
  - name: Validate the Lighthouse result
865
- run: node tools/src/packages/sdlc/src/issue-actions.mjs validate
865
+ run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs validate
866
866
  - if: always()
867
867
  name: Preserve the result and runtime receipt
868
868
  uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
@@ -66,7 +66,7 @@ steps:
66
66
  with:
67
67
  repository: juangcarmona/lighthouse
68
68
  ref: __LIGHTHOUSE_REF__
69
- path: tools
69
+ path: .lighthouse-harness
70
70
  persist-credentials: false
71
71
  - name: Load the authorized issue context
72
72
  uses: actions/download-artifact@v8
@@ -75,7 +75,7 @@ steps:
75
75
  path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
76
76
  post-steps:
77
77
  - name: Validate the Lighthouse result
78
- run: node tools/src/packages/sdlc/src/issue-actions.mjs validate
78
+ run: node .lighthouse-harness/src/packages/sdlc/src/issue-actions.mjs validate
79
79
  - name: Preserve the result and runtime receipt
80
80
  if: always()
81
81
  uses: actions/upload-artifact@v7
@@ -0,0 +1,67 @@
1
+ # Owned by lighthouse-sdlc. Both routes reuse canonical lifecycle stages.
2
+ name: unattended
3
+ run-name: "${{ inputs.route }} #${{ inputs.issue }} · ${{ github.actor }}"
4
+ on:
5
+ workflow_dispatch:
6
+ inputs:
7
+ issue:
8
+ description: Owner-authorized issue
9
+ required: true
10
+ type: string
11
+ route:
12
+ description: Bounded delivery route
13
+ required: true
14
+ type: choice
15
+ options: [ff, hotfix]
16
+ permissions: {}
17
+ concurrency:
18
+ group: lighthouse-issue-${{ inputs.issue }}
19
+ cancel-in-progress: false
20
+ queue: max
21
+ jobs:
22
+ deliver:
23
+ if: vars.LIGHTHOUSE_AUTOMATION_ENABLED == 'true' && github.actor == github.repository_owner
24
+ runs-on: [self-hosted, linux, lighthouse-workflow]
25
+ timeout-minutes: 125
26
+ permissions:
27
+ actions: write
28
+ contents: write
29
+ issues: write
30
+ pull-requests: write
31
+ steps:
32
+ - name: Load the pinned trusted harness
33
+ uses: actions/checkout@v5
34
+ with:
35
+ repository: juangcarmona/lighthouse
36
+ ref: __LIGHTHOUSE_REF__
37
+ path: .lighthouse-harness
38
+ persist-credentials: false
39
+ - name: Load current product source
40
+ uses: actions/checkout@v5
41
+ with:
42
+ path: product
43
+ persist-credentials: false
44
+ - uses: actions/setup-node@v5
45
+ with:
46
+ node-version: 24
47
+ - name: Execute the authorized bounded composition
48
+ env:
49
+ GH_TOKEN: ${{ github.token }}
50
+ run: node .lighthouse-harness/src/packages/sdlc/src/unattended-actions.mjs
51
+ - name: Retain candidate and execution evidence
52
+ if: always()
53
+ uses: actions/upload-artifact@v7
54
+ with:
55
+ name: lighthouse-unattended-${{ github.run_id }}-${{ github.run_attempt }}
56
+ path: |
57
+ ${{ runner.temp }}/lighthouse-unattended-${{ github.run_id }}/report.json
58
+ ${{ runner.temp }}/lighthouse-unattended-${{ github.run_id }}/candidate.json
59
+ ${{ runner.temp }}/lighthouse-unattended-${{ github.run_id }}/**/request.json
60
+ ${{ runner.temp }}/lighthouse-unattended-${{ github.run_id }}/**/envelope.json
61
+ ${{ runner.temp }}/lighthouse-unattended-${{ github.run_id }}/**/checks.json
62
+ ${{ runner.temp }}/lighthouse-unattended-${{ github.run_id }}/**/changes.json
63
+ ${{ runner.temp }}/lighthouse-unattended-${{ github.run_id }}/**/runtime.json
64
+ ${{ runner.temp }}/lighthouse-unattended-${{ github.run_id }}/**/engine-error.json
65
+ ${{ runner.temp }}/lighthouse-unattended-${{ github.run_id }}/**/evidence/**
66
+ if-no-files-found: warn
67
+ retention-days: 14
@@ -10,7 +10,7 @@ engine:
10
10
  tools-allowlist: true
11
11
  execution:
12
12
  command-name: node
13
- args: [tools/src/packages/sdlc/src/opencode-execute.mjs]
13
+ args: [.lighthouse-harness/src/packages/sdlc/src/opencode-execute.mjs]
14
14
  step-name: OpenCode progress and result
15
15
  write-timestamp: true
16
16
  log-parser: |