@juangcarmona/lighthouse-sdlc 0.12.0 → 0.14.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 (47) hide show
  1. package/README.md +86 -3
  2. package/completion.md +50 -0
  3. package/execution-environments.md +43 -0
  4. package/package.json +3 -1
  5. package/schemas/execution-environment.schema.json +12 -0
  6. package/skills/implement/SKILL.md +9 -8
  7. package/skills/integrate/SKILL.md +7 -1
  8. package/skills/propose/SKILL.md +1 -1
  9. package/skills/review/SKILL.md +7 -1
  10. package/src/actions-artifact.mjs +17 -0
  11. package/src/completion-actions.mjs +134 -0
  12. package/src/completion.mjs +188 -0
  13. package/src/delivery-events.mjs +42 -0
  14. package/src/execution-environment.mjs +78 -0
  15. package/src/github-profile.mjs +9 -1
  16. package/src/host-contract.mjs +7 -3
  17. package/src/implementation-runtime.mjs +90 -0
  18. package/src/implementation.mjs +155 -0
  19. package/src/install-workflows.mjs +14 -5
  20. package/src/integration-evidence.mjs +80 -0
  21. package/src/issue-actions.mjs +325 -38
  22. package/src/observe-protection.mjs +24 -0
  23. package/src/opencode-execute.mjs +128 -20
  24. package/src/opencode-progress.mjs +48 -0
  25. package/src/process-publication.mjs +90 -0
  26. package/src/proposal-review.mjs +91 -0
  27. package/src/proposal.mjs +110 -0
  28. package/src/stage-dispatch.mjs +148 -0
  29. package/src/stage-transition.mjs +25 -0
  30. package/src/worker-maintenance.mjs +83 -0
  31. package/src/worker-recovery.mjs +106 -0
  32. package/src/worker-reports.mjs +150 -0
  33. package/workflows/lighthouse-sdlc-apply-review.lock.yml +1335 -0
  34. package/workflows/lighthouse-sdlc-apply-review.md +205 -0
  35. package/workflows/lighthouse-sdlc-implement.lock.yml +285 -1158
  36. package/workflows/lighthouse-sdlc-implement.md +193 -28
  37. package/workflows/lighthouse-sdlc-integrate.lock.yml +288 -1154
  38. package/workflows/lighthouse-sdlc-integrate.md +197 -28
  39. package/workflows/lighthouse-sdlc-propose.lock.yml +274 -1157
  40. package/workflows/lighthouse-sdlc-propose.md +183 -28
  41. package/workflows/lighthouse-sdlc-refine.lock.yml +263 -90
  42. package/workflows/lighthouse-sdlc-refine.md +45 -4
  43. package/workflows/lighthouse-sdlc-review.lock.yml +288 -1154
  44. package/workflows/lighthouse-sdlc-review.md +197 -28
  45. package/workflows/lighthouse-sdlc-router.yml +91 -17
  46. package/workflows/lighthouse-worker-maintenance.yml +126 -0
  47. package/workflows/shared/lighthouse-opencode.md +4 -2
@@ -1,41 +1,196 @@
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 propose
4
- description: Execute only the Lighthouse proposal 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: propose
11
- LIGHTHOUSE_SKILL: node_modules/@juangcarmona/lighthouse-sdlc/skills/propose/SKILL.md
4
+ description: Produce a validated OpenSpec proposal PR from an owner-authorized ready issue.
5
+ run-name: "propose #${{ 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 }}
12
11
  on:
13
- workflow_call:
12
+ # The required preparation job authenticates the originating owner request.
13
+ roles: all
14
+ workflow_dispatch:
14
15
  inputs:
15
- route:
16
- description: Lighthouse route selected by the host.
16
+ issue:
17
+ description: Source issue
17
18
  required: true
18
19
  type: string
19
- run-id:
20
- description: Stable Lighthouse run identifier.
20
+ dispatch-request:
21
+ description: Authenticated router receipt comment ID
21
22
  required: true
22
23
  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: refine
24
+ needs: [prepare]
25
+ if: needs.prepare.outputs.eligible == 'true'
26
+ runs-on: [self-hosted, linux, lighthouse-workflow]
27
+ runs-on-slim: ubuntu-24.04
28
+ timeout-minutes: 15
29
+ env:
30
+ LIGHTHOUSE_RECOVERY_ENABLED: ${{ vars.LIGHTHOUSE_RECOVERY_ENABLED }}
31
+ LIGHTHOUSE_STAGE: propose
32
+ LIGHTHOUSE_DISPATCH_REQUIRED: "true"
33
+ permissions:
34
+ contents: read
35
+ engine:
36
+ id: opencode
37
+ command: node
33
38
  imports:
34
- - shared/lighthouse-sdlc-stage.md
39
+ - shared/lighthouse-opencode.md
40
+ # Subscription authentication runs inside the operator's Docker engine sandbox.
41
+ # This profile does not claim AWF network isolation or API-proxy credential isolation.
42
+ strict: false
43
+ features:
44
+ dangerously-disable-sandbox-agent: true
45
+ sandbox:
46
+ agent: false
47
+ tools:
48
+ github: false
49
+ safe-outputs:
50
+ create-issue: false
51
+ report-incomplete: false
52
+ threat-detection: false
53
+ report-failure-as-issue: false
54
+ report-missing-tool: false
55
+ report-missing-data: false
56
+ noop:
57
+ report-as-issue: false
58
+ network:
59
+ allowed: []
60
+ steps:
61
+ - name: Check out the authorized product revision
62
+ uses: actions/checkout@v5
63
+ with:
64
+ persist-credentials: false
65
+ ref: ${{ needs.prepare.outputs.source_revision }}
66
+ - name: Load the pinned harness package
67
+ uses: actions/checkout@v5
68
+ with:
69
+ repository: juangcarmona/lighthouse
70
+ ref: __LIGHTHOUSE_REF__
71
+ path: tools
72
+ persist-credentials: false
73
+ - name: Load the authorized issue context
74
+ uses: actions/download-artifact@v8
75
+ with:
76
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
77
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
78
+ post-steps:
79
+ - name: Validate the Lighthouse result
80
+ run: node tools/src/packages/sdlc/src/issue-actions.mjs validate
81
+ - name: Preserve the result and runtime receipt
82
+ if: always()
83
+ uses: actions/upload-artifact@v7
84
+ with:
85
+ name: lighthouse-result-${{ inputs.issue }}-${{ github.run_attempt }}
86
+ path: |
87
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/envelope.json
88
+ ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/runtime.json
89
+ if-no-files-found: error
90
+ retention-days: 14
91
+ - name: Preserve OpenCode diagnostic events
92
+ if: always()
93
+ uses: actions/upload-artifact@v7
94
+ with:
95
+ name: opencode-events-${{ inputs.issue }}-${{ github.run_attempt }}
96
+ path: ${{ runner.temp }}/gh-aw/opencode-events-${{ github.run_id }}-${{ github.run_attempt }}.jsonl
97
+ if-no-files-found: ignore
98
+ retention-days: 14
99
+ jobs:
100
+ prepare:
101
+ outputs:
102
+ eligible: ${{ steps.prepare.outputs.eligible }}
103
+ source_revision: ${{ steps.prepare.outputs.source_revision }}
104
+ name: Authorize and reserve issue
105
+ runs-on: ubuntu-24.04
106
+ permissions:
107
+ actions: read
108
+ contents: read
109
+ issues: write
110
+ pull-requests: read
111
+ env:
112
+ LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
113
+ steps:
114
+ - uses: actions/checkout@v5
115
+ with:
116
+ repository: juangcarmona/lighthouse
117
+ ref: __LIGHTHOUSE_REF__
118
+ persist-credentials: false
119
+ - uses: actions/setup-node@v5
120
+ with:
121
+ node-version: 24
122
+ - name: Collect verified owner intent and reserve the issue
123
+ id: prepare
124
+ env:
125
+ GH_TOKEN: ${{ github.token }}
126
+ run: node src/packages/sdlc/src/issue-actions.mjs prepare
127
+ - name: Preserve the execution request
128
+ if: steps.prepare.outputs.eligible == 'true'
129
+ uses: actions/upload-artifact@v7
130
+ with:
131
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
132
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}/
133
+ if-no-files-found: error
134
+ retention-days: 14
135
+ - name: Release reservation if preparation failed
136
+ if: failure()
137
+ env:
138
+ GH_TOKEN: ${{ github.token }}
139
+ run: node src/packages/sdlc/src/issue-actions.mjs cleanup
140
+ publish:
141
+ name: Validate, publish and release
142
+ needs: [prepare, agent]
143
+ if: always() && needs.prepare.result == 'success' && needs.prepare.outputs.eligible == 'true'
144
+ runs-on: ubuntu-24.04
145
+ permissions:
146
+ contents: write
147
+ issues: write
148
+ pull-requests: write
149
+ env:
150
+ LIGHTHOUSE_ISSUE: ${{ inputs.issue }}
151
+ steps:
152
+ - uses: actions/checkout@v5
153
+ with:
154
+ repository: juangcarmona/lighthouse
155
+ ref: __LIGHTHOUSE_REF__
156
+ persist-credentials: false
157
+ - uses: actions/setup-node@v5
158
+ with:
159
+ node-version: 24
160
+ - name: Load the execution request
161
+ uses: actions/download-artifact@v8
162
+ with:
163
+ name: lighthouse-input-${{ inputs.issue }}-${{ github.run_attempt }}
164
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
165
+ - name: Load the candidate result
166
+ if: needs.agent.result == 'success'
167
+ uses: actions/download-artifact@v8
168
+ with:
169
+ name: lighthouse-result-${{ inputs.issue }}-${{ github.run_attempt }}
170
+ path: ${{ runner.temp }}/lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
171
+ - name: Require an executed agent
172
+ if: needs.agent.result != 'success'
173
+ run: |
174
+ echo 'The authorized agent did not complete successfully; inspect its execution.' >&2
175
+ exit 1
176
+ - name: Recheck authority and publish the validated result
177
+ if: needs.agent.result == 'success'
178
+ env:
179
+ GH_TOKEN: ${{ github.token }}
180
+ run: node src/packages/sdlc/src/issue-actions.mjs publish
181
+ - name: Release the issue reservation
182
+ if: always()
183
+ env:
184
+ GH_TOKEN: ${{ github.token }}
185
+ run: node src/packages/sdlc/src/issue-actions.mjs cleanup
35
186
  ---
36
187
 
37
- # Lighthouse SDLC propose worker
188
+ # Propose the authorized change
189
+
190
+ Execute only `propose` using the trusted context in `/input/context.json` and the packaged `/harness/skills/propose/SKILL.md`. For an initial proposal, the host supplies the authenticated passed refinement. When `context.proposalReview` is present, revise its existing files using the verified owner feedback and discussion; the request authorizes revision of that candidate, not acceptance or implementation. Inspect the current read-only source under `/workspace`, including product and architecture policy, relevant existing specifications and active changes.
191
+
192
+ Write brief public progress before source inspection and when you choose an approach or find a blocker. Explain the decision and supporting evidence. Keep tool payloads out of progress messages.
38
193
 
39
- Execute only `propose` by following `${{ env.LIGHTHOUSE_SKILL }}` and reading the refine 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`. ProductShape, ArcShape and OpenSpec remain their own authorities; preserve their citations and artifact references in evidence.
194
+ Follow `context.proposal.instructions` from the pinned OpenSpec provider, in order: proposal, specifications and design, then tasks. Return the actual Markdown files in `result.output.files`, each with `path` and `content`, under the authorized `context.proposal.root`. Include a concise proposal, design alternatives and trade-offs, testable specification scenarios, dependency-ordered unchecked tasks, validation and visual evidence plans where applicable. Every refined acceptance criterion needs a corresponding task or specification. Preserve existing product authority. Keep unresolved product decisions explicit rather than inventing approval.
40
195
 
41
- Do not invoke `implement` or any later stage. Return one valid result in `/tmp/gh-aw/agent/stage-result.json` with `stage: propose`, `gate: planned`, the change artifacts in `output`, and separate evidence arrays. Stop at the planned gate, then call `noop` exactly once. If a prerequisite or check fails, return the declared failure or blocked status with the evidence preserved.
196
+ Write `/output/envelope.json` using the supplied schema and identity. A complete proposal returns `passed` with gate `planned`; it is a candidate for owner review, not approved implementation. Return `blocked` with the precise missing decision when the proposal cannot be completed. The separate publisher checks the file boundary, runs OpenSpec strict validation and opens a proposal PR or updates the existing PR identified by `context.proposalReview`. The engine writes no repository files and has no GitHub credentials. End after the envelope; the trusted adapter records gh-aw completion.