@juangcarmona/lighthouse-sdlc 0.12.0 → 0.13.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.
@@ -1,41 +1,187 @@
1
1
  ---
2
- # Owned by @juangcarmona/lighthouse-sdlc. Compile with `gh aw compile`; do not edit the lock file.
2
+ # Owned by lighthouse-sdlc. Regenerate the lock with gh aw v0.93.2.
3
3
  name: Lighthouse SDLC review
4
- description: Execute only the Lighthouse review stage and return its declared stage result.
5
- private: true
6
- runs-on: [self-hosted, linux, lighthouse-sdlc]
7
- runs-on-slim: ubuntu-24.04
8
- strict: true
9
- env:
10
- LIGHTHOUSE_STAGE: review
11
- LIGHTHOUSE_SKILL: node_modules/@juangcarmona/lighthouse-sdlc/skills/review/SKILL.md
4
+ description: Assess review with OpenCode and retain a verified delivery record.
12
5
  on:
13
6
  workflow_call:
14
7
  inputs:
15
- route:
16
- description: Lighthouse route selected by the host.
8
+ issue:
17
9
  required: true
18
10
  type: string
19
- run-id:
20
- description: Stable Lighthouse run identifier.
21
- required: true
22
- type: string
23
- input:
24
- description: Compact JSON input for this stage.
25
- required: false
26
- type: string
27
- default: '{}'
28
- previous-stage:
29
- description: Previous stage artifact name.
30
- required: false
31
- type: string
32
- default: integrate
11
+ needs: [prepare]
12
+ runs-on: [self-hosted, linux, lighthouse-workflow]
13
+ runs-on-slim: ubuntu-24.04
14
+ timeout-minutes: 15
15
+ env:
16
+ LIGHTHOUSE_STAGE: review
17
+ permissions:
18
+ contents: read
19
+ engine:
20
+ id: opencode
21
+ command: node
33
22
  imports:
34
- - shared/lighthouse-sdlc-stage.md
23
+ - shared/lighthouse-opencode.md
24
+ # Subscription authentication runs inside the operator's Docker engine sandbox.
25
+ # This profile does not claim AWF network isolation or API-proxy credential isolation.
26
+ strict: false
27
+ features:
28
+ dangerously-disable-sandbox-agent: true
29
+ sandbox:
30
+ agent: false
31
+ tools:
32
+ github: false
33
+ safe-outputs:
34
+ create-issue: false
35
+ report-incomplete: false
36
+ threat-detection: false
37
+ report-failure-as-issue: false
38
+ report-missing-tool: false
39
+ report-missing-data: false
40
+ noop:
41
+ report-as-issue: false
42
+ network:
43
+ allowed: []
44
+ steps:
45
+ - name: Check out the authorized product revision
46
+ uses: actions/checkout@v5
47
+ with:
48
+ ref: ${{ needs.prepare.outputs.revision }}
49
+ persist-credentials: false
50
+ - name: Load the pinned harness package
51
+ uses: actions/checkout@v5
52
+ with:
53
+ repository: juangcarmona/lighthouse
54
+ ref: __LIGHTHOUSE_REF__
55
+ path: tools
56
+ persist-credentials: false
57
+ - name: Load the authorized issue context
58
+ uses: actions/download-artifact@v8
59
+ with:
60
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
61
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
62
+ post-steps:
63
+ - name: Validate the Lighthouse result
64
+ run: node tools/src/packages/sdlc/src/completion-actions.mjs validate
65
+ - name: Preserve the result and runtime receipt
66
+ if: always()
67
+ uses: actions/upload-artifact@v7
68
+ with:
69
+ name: lighthouse-result-${{ inputs.issue }}-${{ github.run_attempt }}
70
+ path: |
71
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/envelope.json
72
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/runtime.json
73
+ if-no-files-found: error
74
+ retention-days: 14
75
+ - name: Preserve OpenCode diagnostic events
76
+ if: always()
77
+ uses: actions/upload-artifact@v7
78
+ with:
79
+ name: opencode-events-${{ inputs.issue }}-${{ github.run_attempt }}
80
+ path: ${{ runner.temp }}/gh-aw/opencode-events-${{ github.run_id }}-${{ github.run_attempt }}.jsonl
81
+ if-no-files-found: ignore
82
+ retention-days: 14
83
+ jobs:
84
+ prepare:
85
+ outputs:
86
+ revision: ${{ steps.prepare.outputs.revision }}
87
+ name: Verify accepted commit, checks and evidence protection
88
+ runs-on: ubuntu-24.04
89
+ permissions:
90
+ actions: read
91
+ checks: read
92
+ contents: read
93
+ pull-requests: read
94
+ issues: write
95
+ env:
96
+ LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
97
+ steps:
98
+ - uses: actions/checkout@v5
99
+ with:
100
+ repository: juangcarmona/lighthouse
101
+ ref: __LIGHTHOUSE_REF__
102
+ persist-credentials: false
103
+ - uses: actions/setup-node@v5
104
+ with:
105
+ node-version: 24
106
+ - name: Collect verified owner intent and reserve the issue
107
+ id: prepare
108
+ env:
109
+ GH_TOKEN: ${{ github.token }}
110
+ run: node src/packages/sdlc/src/completion-actions.mjs prepare
111
+ - name: Preserve the execution request
112
+ uses: actions/upload-artifact@v7
113
+ with:
114
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
115
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/
116
+ if-no-files-found: error
117
+ retention-days: 14
118
+ - name: Release reservation if preparation failed
119
+ if: failure()
120
+ env:
121
+ GH_TOKEN: ${{ github.token }}
122
+ run: node src/packages/sdlc/src/completion-actions.mjs cleanup
123
+ publish:
124
+ concurrency:
125
+ group: lighthouse-process-publication
126
+ cancel-in-progress: false
127
+ name: Validate, publish and release
128
+ needs: [prepare, agent]
129
+ if: always() && needs.prepare.result == 'success'
130
+ runs-on: ubuntu-24.04
131
+ permissions:
132
+ actions: write
133
+ checks: read
134
+ contents: write
135
+ pull-requests: write
136
+ issues: write
137
+ env:
138
+ LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
139
+ steps:
140
+ - uses: actions/checkout@v5
141
+ with:
142
+ repository: juangcarmona/lighthouse
143
+ ref: __LIGHTHOUSE_REF__
144
+ persist-credentials: false
145
+ - uses: actions/setup-node@v5
146
+ with:
147
+ node-version: 24
148
+ - name: Load the execution request
149
+ uses: actions/download-artifact@v8
150
+ with:
151
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
152
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
153
+ - name: Load the candidate result
154
+ if: needs.agent.result == 'success'
155
+ uses: actions/download-artifact@v8
156
+ with:
157
+ name: lighthouse-result-${{ inputs.issue }}-${{ github.run_attempt }}
158
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
159
+ - name: Recheck authority and publish the validated result
160
+ if: needs.agent.result == 'success'
161
+ env:
162
+ GH_TOKEN: ${{ github.token }}
163
+ run: node src/packages/sdlc/src/completion-actions.mjs publish
164
+ - name: Preserve merge and publication receipts
165
+ if: always()
166
+ uses: actions/upload-artifact@v7
167
+ with:
168
+ name: lighthouse-completion-${{ inputs.issue }}-${{ github.run_attempt }}
169
+ path: |
170
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/integration-receipt.json
171
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/publication-receipt.json
172
+ if-no-files-found: warn
173
+ retention-days: 30
174
+ - name: Release the issue reservation
175
+ if: always()
176
+ env:
177
+ GH_TOKEN: ${{ github.token }}
178
+ run: node src/packages/sdlc/src/completion-actions.mjs cleanup
35
179
  ---
36
180
 
37
- # Lighthouse SDLC review worker
181
+ # Review the accepted delivery
182
+
183
+ Follow `/harness/skills/review/SKILL.md` using `/input/context.json`. The host supplies the accepted PR revision, intent and policy fingerprints, changed paths and authenticated GitHub check results. Source under `/workspace` is read-only. Inspect affected guidance and acceptance evidence; a green check alone does not establish intended behavior. Distinguish missing verification from a failed check.
38
184
 
39
- Execute only `review` by following `${{ env.LIGHTHOUSE_SKILL }}` and reading the integration result from `/tmp/gh-aw/agent/previous/stage-result.json` when present; for a supervised run, use the predecessor context in `/tmp/gh-aw/agent/input.json`. Preserve ProductShape and ArcShape citations in the delivery evidence.
185
+ Explain each decision and finding in public progress messages. Write `/output/envelope.json` with the supplied identity. Return `blocked` for unresolved current-stage evidence or decisions. For review, include `output.retrospective` as concise Markdown: what went well, what went wrong, start doing, stop doing and improvement candidates with evidence and an owner. Do not infer recurrence from retries of a single issue. Separate actual source defects from process gaps; proposed guards need their own review and regression proof.
40
186
 
41
- Classify findings, record the outcome and learning, and write one valid result to `/tmp/gh-aw/agent/stage-result.json` with `stage: review`, `gate: null`, the review record in `output`, and separate evidence arrays. Do not open another delivery gate or invoke another stage. Call `noop` exactly once after recording the closing result.
187
+ The publisher rechecks current authority, GitHub checks and reservation. Only an explicit owner dispatch with `merge: true` can authorize integration, and GitHub still enforces merge rules. A passed assessment never proves a merge occurred. Review records learning without changing permissions, opening issues or starting another stage. The host validates the envelope and records the gh-aw completion signal.
@@ -1,6 +1,6 @@
1
- # Optional GitHub-native refinement adapter; source owned by lighthouse-sdlc.
1
+ # Optional GitHub-native stage adapter; source owned by lighthouse-sdlc.
2
2
  name: Lighthouse SDLC router
3
- run-name: "Refine #${{ github.event.issue.number || inputs.issue }} · ${{ github.actor }}"
3
+ run-name: "${{ inputs.stage || github.event.label.name || 'refine' }} #${{ github.event.issue.number || inputs.issue }} · ${{ github.actor }}"
4
4
  on:
5
5
  issues:
6
6
  types: [labeled]
@@ -9,9 +9,28 @@ on:
9
9
  workflow_dispatch:
10
10
  inputs:
11
11
  issue:
12
- description: Open issue to refine
12
+ description: Work item to process
13
13
  required: true
14
14
  type: string
15
+ stage:
16
+ description: Authorized lifecycle stage
17
+ required: true
18
+ default: refine
19
+ type: choice
20
+ options: [refine, propose, implement, integrate, review]
21
+ pull_request:
22
+ description: PR number for integrate or review
23
+ required: false
24
+ type: string
25
+ head:
26
+ description: Full accepted PR head SHA for integrate or review
27
+ required: false
28
+ type: string
29
+ merge:
30
+ description: Explicitly authorize integrating this accepted PR head
31
+ required: false
32
+ default: false
33
+ type: boolean
15
34
  permissions:
16
35
  contents: read
17
36
  concurrency:
@@ -24,12 +43,13 @@ jobs:
24
43
  github.actor == github.repository_owner &&
25
44
  !github.event.issue.pull_request &&
26
45
  (github.event_name == 'workflow_dispatch' ||
27
- (github.event_name == 'issues' && github.event.label.name == 'refine') ||
46
+ (github.event_name == 'issues' && (github.event.label.name == 'refine' || github.event.label.name == 'propose' || github.event.label.name == 'implement')) ||
28
47
  (github.event_name == 'issue_comment' && contains(github.event.issue.labels.*.name, 'needs-info')))
29
48
  runs-on: ubuntu-24.04
30
49
  outputs:
31
50
  run: ${{ steps.route.outputs.run }}
32
51
  issue: ${{ steps.route.outputs.issue }}
52
+ stage: ${{ steps.route.outputs.stage }}
33
53
  steps:
34
54
  - uses: actions/checkout@v5
35
55
  with:
@@ -44,7 +64,7 @@ jobs:
44
64
  run: node src/packages/sdlc/src/issue-actions.mjs route
45
65
  refine:
46
66
  needs: route
47
- if: needs.route.outputs.run == 'true'
67
+ if: needs.route.outputs.run == 'true' && needs.route.outputs.stage == 'refine'
48
68
  permissions:
49
69
  actions: read
50
70
  contents: read
@@ -52,3 +72,49 @@ jobs:
52
72
  uses: ./.github/workflows/lighthouse-sdlc-refine.lock.yml
53
73
  with:
54
74
  issue: ${{ needs.route.outputs.issue }}
75
+ propose:
76
+ needs: route
77
+ if: needs.route.outputs.run == 'true' && needs.route.outputs.stage == 'propose'
78
+ permissions:
79
+ actions: read
80
+ contents: write
81
+ issues: write
82
+ pull-requests: write
83
+ uses: ./.github/workflows/lighthouse-sdlc-propose.lock.yml
84
+ with:
85
+ issue: ${{ needs.route.outputs.issue }}
86
+ implement:
87
+ needs: route
88
+ if: needs.route.outputs.run == 'true' && needs.route.outputs.stage == 'implement'
89
+ permissions:
90
+ actions: read
91
+ contents: write
92
+ issues: write
93
+ pull-requests: write
94
+ uses: ./.github/workflows/lighthouse-sdlc-implement.lock.yml
95
+ with:
96
+ issue: ${{ needs.route.outputs.issue }}
97
+ integrate:
98
+ needs: route
99
+ if: needs.route.outputs.run == 'true' && needs.route.outputs.stage == 'integrate'
100
+ permissions:
101
+ actions: write
102
+ checks: read
103
+ contents: write
104
+ issues: write
105
+ pull-requests: write
106
+ uses: ./.github/workflows/lighthouse-sdlc-integrate.lock.yml
107
+ with:
108
+ issue: ${{ needs.route.outputs.issue }}
109
+ review:
110
+ needs: route
111
+ if: needs.route.outputs.run == 'true' && needs.route.outputs.stage == 'review'
112
+ permissions:
113
+ actions: write
114
+ checks: read
115
+ contents: write
116
+ issues: write
117
+ pull-requests: write
118
+ uses: ./.github/workflows/lighthouse-sdlc-review.lock.yml
119
+ with:
120
+ issue: ${{ needs.route.outputs.issue }}
@@ -11,10 +11,12 @@ engine:
11
11
  execution:
12
12
  command-name: node
13
13
  args: [tools/src/packages/sdlc/src/opencode-execute.mjs]
14
- step-name: Execute OpenCode CLI
14
+ step-name: OpenCode progress and result
15
15
  write-timestamp: true
16
16
  log-parser: |
17
17
  function parseLog(logContent) {
18
- return require("./parse_opencode_log.cjs").parseOpenCodeLog(logContent);
18
+ const fs = require("fs");
19
+ const events = require("path").join(process.env.RUNNER_TEMP, "gh-aw", `opencode-events-${process.env.GITHUB_RUN_ID}-${process.env.GITHUB_RUN_ATTEMPT}.jsonl`);
20
+ return require("./parse_opencode_log.cjs").parseOpenCodeLog(fs.existsSync(events) ? fs.readFileSync(events, "utf8") : logContent);
19
21
  }
20
22
  ---