lastlight 0.15.0 → 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 (382) hide show
  1. package/README.md +71 -692
  2. package/dist/cli-config.js.map +1 -0
  3. package/dist/cli-format.js.map +1 -0
  4. package/dist/{cli/cli-server.d.ts → cli-server.d.ts} +26 -1
  5. package/dist/{cli/cli-server.js → cli-server.js} +40 -5
  6. package/dist/cli-server.js.map +1 -0
  7. package/dist/cli-timeline.js.map +1 -0
  8. package/dist/{cli/cli.js → cli.js} +4 -3
  9. package/dist/cli.js.map +1 -0
  10. package/dist/{cli/fork-cli.d.ts → fork-cli.d.ts} +3 -3
  11. package/dist/{cli/fork-cli.js → fork-cli.js} +28 -27
  12. package/dist/fork-cli.js.map +1 -0
  13. package/dist/{cli/oauth-cli.js → oauth-cli.js} +1 -1
  14. package/dist/oauth-cli.js.map +1 -0
  15. package/dist/{cli/setup.js → setup.js} +10 -4
  16. package/dist/setup.js.map +1 -0
  17. package/dist/{cli/skills-install.d.ts → skills-install.d.ts} +6 -0
  18. package/dist/{cli/skills-install.js → skills-install.js} +6 -2
  19. package/dist/skills-install.js.map +1 -0
  20. package/package.json +20 -65
  21. package/plugins/lastlight/.claude-plugin/plugin.json +1 -1
  22. package/agent-context/rules.md +0 -80
  23. package/agent-context/security.md +0 -69
  24. package/agent-context/soul.md +0 -21
  25. package/config/default.yaml +0 -119
  26. package/deploy/.env.production.example +0 -100
  27. package/deploy/entrypoint.sh +0 -82
  28. package/deploy/native/README.md +0 -160
  29. package/deploy/native/install.sh +0 -110
  30. package/deploy/native/lastlight.env.example +0 -95
  31. package/deploy/native/lastlight.service +0 -50
  32. package/deploy/sandbox-entrypoint.sh +0 -93
  33. package/dist/admin/auth.d.ts +0 -51
  34. package/dist/admin/auth.js +0 -121
  35. package/dist/admin/auth.js.map +0 -1
  36. package/dist/admin/chat-session-reader.d.ts +0 -39
  37. package/dist/admin/chat-session-reader.js +0 -84
  38. package/dist/admin/chat-session-reader.js.map +0 -1
  39. package/dist/admin/docker.d.ts +0 -61
  40. package/dist/admin/docker.js +0 -187
  41. package/dist/admin/docker.js.map +0 -1
  42. package/dist/admin/index.d.ts +0 -9
  43. package/dist/admin/index.js +0 -59
  44. package/dist/admin/index.js.map +0 -1
  45. package/dist/admin/routes.d.ts +0 -81
  46. package/dist/admin/routes.js +0 -1381
  47. package/dist/admin/routes.js.map +0 -1
  48. package/dist/admin/sessions.d.ts +0 -89
  49. package/dist/admin/sessions.js +0 -204
  50. package/dist/admin/sessions.js.map +0 -1
  51. package/dist/admin/tail.d.ts +0 -12
  52. package/dist/admin/tail.js +0 -145
  53. package/dist/admin/tail.js.map +0 -1
  54. package/dist/admin/version.d.ts +0 -22
  55. package/dist/admin/version.js +0 -92
  56. package/dist/admin/version.js.map +0 -1
  57. package/dist/cli/cli-config.js.map +0 -1
  58. package/dist/cli/cli-format.js.map +0 -1
  59. package/dist/cli/cli-server.js.map +0 -1
  60. package/dist/cli/cli-timeline.js.map +0 -1
  61. package/dist/cli/cli.js.map +0 -1
  62. package/dist/cli/fork-cli.js.map +0 -1
  63. package/dist/cli/oauth-cli.js.map +0 -1
  64. package/dist/cli/setup.js.map +0 -1
  65. package/dist/cli/skills-install.js.map +0 -1
  66. package/dist/config/config-resolve.d.ts +0 -28
  67. package/dist/config/config-resolve.js +0 -47
  68. package/dist/config/config-resolve.js.map +0 -1
  69. package/dist/config/config.d.ts +0 -157
  70. package/dist/config/config.js +0 -581
  71. package/dist/config/config.js.map +0 -1
  72. package/dist/config/core-pin.d.ts +0 -16
  73. package/dist/config/core-pin.js +0 -85
  74. package/dist/config/core-pin.js.map +0 -1
  75. package/dist/config/overlay-assets.d.ts +0 -20
  76. package/dist/config/overlay-assets.js +0 -114
  77. package/dist/config/overlay-assets.js.map +0 -1
  78. package/dist/config/overlay-bootstrap.d.ts +0 -44
  79. package/dist/config/overlay-bootstrap.js +0 -304
  80. package/dist/config/overlay-bootstrap.js.map +0 -1
  81. package/dist/connectors/github-webhook.d.ts +0 -45
  82. package/dist/connectors/github-webhook.js +0 -321
  83. package/dist/connectors/github-webhook.js.map +0 -1
  84. package/dist/connectors/index.d.ts +0 -18
  85. package/dist/connectors/index.js +0 -41
  86. package/dist/connectors/index.js.map +0 -1
  87. package/dist/connectors/messaging/base.d.ts +0 -42
  88. package/dist/connectors/messaging/base.js +0 -139
  89. package/dist/connectors/messaging/base.js.map +0 -1
  90. package/dist/connectors/messaging/delivery.d.ts +0 -14
  91. package/dist/connectors/messaging/delivery.js +0 -38
  92. package/dist/connectors/messaging/delivery.js.map +0 -1
  93. package/dist/connectors/messaging/index.d.ts +0 -4
  94. package/dist/connectors/messaging/index.js +0 -4
  95. package/dist/connectors/messaging/index.js.map +0 -1
  96. package/dist/connectors/messaging/session-manager.d.ts +0 -53
  97. package/dist/connectors/messaging/session-manager.js +0 -255
  98. package/dist/connectors/messaging/session-manager.js.map +0 -1
  99. package/dist/connectors/messaging/types.d.ts +0 -58
  100. package/dist/connectors/messaging/types.js +0 -7
  101. package/dist/connectors/messaging/types.js.map +0 -1
  102. package/dist/connectors/slack/connector.d.ts +0 -100
  103. package/dist/connectors/slack/connector.js +0 -341
  104. package/dist/connectors/slack/connector.js.map +0 -1
  105. package/dist/connectors/slack/index.d.ts +0 -2
  106. package/dist/connectors/slack/index.js +0 -3
  107. package/dist/connectors/slack/index.js.map +0 -1
  108. package/dist/connectors/slack/mrkdwn.d.ts +0 -8
  109. package/dist/connectors/slack/mrkdwn.js +0 -123
  110. package/dist/connectors/slack/mrkdwn.js.map +0 -1
  111. package/dist/connectors/types.d.ts +0 -61
  112. package/dist/connectors/types.js +0 -2
  113. package/dist/connectors/types.js.map +0 -1
  114. package/dist/cron/fanout.d.ts +0 -33
  115. package/dist/cron/fanout.js +0 -55
  116. package/dist/cron/fanout.js.map +0 -1
  117. package/dist/cron/jobs.d.ts +0 -18
  118. package/dist/cron/jobs.js +0 -37
  119. package/dist/cron/jobs.js.map +0 -1
  120. package/dist/cron/scheduler.d.ts +0 -45
  121. package/dist/cron/scheduler.js +0 -105
  122. package/dist/cron/scheduler.js.map +0 -1
  123. package/dist/engine/agent-executor.d.ts +0 -34
  124. package/dist/engine/agent-executor.js +0 -246
  125. package/dist/engine/agent-executor.js.map +0 -1
  126. package/dist/engine/chat/chat-runner.d.ts +0 -132
  127. package/dist/engine/chat/chat-runner.js +0 -424
  128. package/dist/engine/chat/chat-runner.js.map +0 -1
  129. package/dist/engine/chat/chat-skills.d.ts +0 -45
  130. package/dist/engine/chat/chat-skills.js +0 -184
  131. package/dist/engine/chat/chat-skills.js.map +0 -1
  132. package/dist/engine/chat/chat.d.ts +0 -54
  133. package/dist/engine/chat/chat.js +0 -316
  134. package/dist/engine/chat/chat.js.map +0 -1
  135. package/dist/engine/chat/message-batcher.d.ts +0 -32
  136. package/dist/engine/chat/message-batcher.js +0 -109
  137. package/dist/engine/chat/message-batcher.js.map +0 -1
  138. package/dist/engine/dispatcher.d.ts +0 -73
  139. package/dist/engine/dispatcher.js +0 -663
  140. package/dist/engine/dispatcher.js.map +0 -1
  141. package/dist/engine/event-shim.d.ts +0 -117
  142. package/dist/engine/event-shim.js +0 -435
  143. package/dist/engine/event-shim.js.map +0 -1
  144. package/dist/engine/executors/orchestrator.d.ts +0 -81
  145. package/dist/engine/executors/orchestrator.js +0 -365
  146. package/dist/engine/executors/orchestrator.js.map +0 -1
  147. package/dist/engine/executors/shared.d.ts +0 -189
  148. package/dist/engine/executors/shared.js +0 -616
  149. package/dist/engine/executors/shared.js.map +0 -1
  150. package/dist/engine/github/git-auth.d.ts +0 -62
  151. package/dist/engine/github/git-auth.js +0 -161
  152. package/dist/engine/github/git-auth.js.map +0 -1
  153. package/dist/engine/github/github-app-client.d.ts +0 -23
  154. package/dist/engine/github/github-app-client.js +0 -33
  155. package/dist/engine/github/github-app-client.js.map +0 -1
  156. package/dist/engine/github/github-tools.d.ts +0 -18
  157. package/dist/engine/github/github-tools.js +0 -263
  158. package/dist/engine/github/github-tools.js.map +0 -1
  159. package/dist/engine/github/github.d.ts +0 -1193
  160. package/dist/engine/github/github.js +0 -357
  161. package/dist/engine/github/github.js.map +0 -1
  162. package/dist/engine/github/profiles.d.ts +0 -279
  163. package/dist/engine/github/profiles.js +0 -42
  164. package/dist/engine/github/profiles.js.map +0 -1
  165. package/dist/engine/github/review-poster.d.ts +0 -98
  166. package/dist/engine/github/review-poster.js +0 -177
  167. package/dist/engine/github/review-poster.js.map +0 -1
  168. package/dist/engine/llm.d.ts +0 -79
  169. package/dist/engine/llm.js +0 -269
  170. package/dist/engine/llm.js.map +0 -1
  171. package/dist/engine/oauth.d.ts +0 -43
  172. package/dist/engine/oauth.js +0 -103
  173. package/dist/engine/oauth.js.map +0 -1
  174. package/dist/engine/router.d.ts +0 -29
  175. package/dist/engine/router.js +0 -680
  176. package/dist/engine/router.js.map +0 -1
  177. package/dist/engine/screen/classifier.d.ts +0 -93
  178. package/dist/engine/screen/classifier.js +0 -215
  179. package/dist/engine/screen/classifier.js.map +0 -1
  180. package/dist/engine/screen/screen.d.ts +0 -41
  181. package/dist/engine/screen/screen.js +0 -93
  182. package/dist/engine/screen/screen.js.map +0 -1
  183. package/dist/evals-api.d.ts +0 -24
  184. package/dist/evals-api.js +0 -22
  185. package/dist/evals-api.js.map +0 -1
  186. package/dist/index.d.ts +0 -1
  187. package/dist/index.js +0 -923
  188. package/dist/index.js.map +0 -1
  189. package/dist/managed-repos.d.ts +0 -30
  190. package/dist/managed-repos.js +0 -72
  191. package/dist/managed-repos.js.map +0 -1
  192. package/dist/notify/index.d.ts +0 -15
  193. package/dist/notify/index.js +0 -6
  194. package/dist/notify/index.js.map +0 -1
  195. package/dist/notify/model.d.ts +0 -57
  196. package/dist/notify/model.js +0 -89
  197. package/dist/notify/model.js.map +0 -1
  198. package/dist/notify/notifier.d.ts +0 -17
  199. package/dist/notify/notifier.js +0 -87
  200. package/dist/notify/notifier.js.map +0 -1
  201. package/dist/notify/render.d.ts +0 -21
  202. package/dist/notify/render.js +0 -59
  203. package/dist/notify/render.js.map +0 -1
  204. package/dist/notify/transports/github.d.ts +0 -26
  205. package/dist/notify/transports/github.js +0 -26
  206. package/dist/notify/transports/github.js.map +0 -1
  207. package/dist/notify/transports/slack.d.ts +0 -26
  208. package/dist/notify/transports/slack.js +0 -28
  209. package/dist/notify/transports/slack.js.map +0 -1
  210. package/dist/notify/types.d.ts +0 -95
  211. package/dist/notify/types.js +0 -16
  212. package/dist/notify/types.js.map +0 -1
  213. package/dist/providers.d.ts +0 -125
  214. package/dist/providers.js +0 -279
  215. package/dist/providers.js.map +0 -1
  216. package/dist/sandbox/docker.d.ts +0 -180
  217. package/dist/sandbox/docker.js +0 -517
  218. package/dist/sandbox/docker.js.map +0 -1
  219. package/dist/sandbox/egress-allowlist.d.ts +0 -74
  220. package/dist/sandbox/egress-allowlist.js +0 -164
  221. package/dist/sandbox/egress-allowlist.js.map +0 -1
  222. package/dist/sandbox/egress-firewall-config.d.ts +0 -127
  223. package/dist/sandbox/egress-firewall-config.js +0 -434
  224. package/dist/sandbox/egress-firewall-config.js.map +0 -1
  225. package/dist/sandbox/images.d.ts +0 -23
  226. package/dist/sandbox/images.js +0 -55
  227. package/dist/sandbox/images.js.map +0 -1
  228. package/dist/sandbox/index.d.ts +0 -112
  229. package/dist/sandbox/index.js +0 -332
  230. package/dist/sandbox/index.js.map +0 -1
  231. package/dist/sandbox/sandbox.d.ts +0 -214
  232. package/dist/sandbox/sandbox.js +0 -453
  233. package/dist/sandbox/sandbox.js.map +0 -1
  234. package/dist/sandbox/smol.d.ts +0 -162
  235. package/dist/sandbox/smol.js +0 -485
  236. package/dist/sandbox/smol.js.map +0 -1
  237. package/dist/session-log.d.ts +0 -63
  238. package/dist/session-log.js +0 -290
  239. package/dist/session-log.js.map +0 -1
  240. package/dist/state/approval-store.d.ts +0 -88
  241. package/dist/state/approval-store.js +0 -149
  242. package/dist/state/approval-store.js.map +0 -1
  243. package/dist/state/build-assets.d.ts +0 -50
  244. package/dist/state/build-assets.js +0 -154
  245. package/dist/state/build-assets.js.map +0 -1
  246. package/dist/state/db.d.ts +0 -81
  247. package/dist/state/db.js +0 -155
  248. package/dist/state/db.js.map +0 -1
  249. package/dist/state/execution-store.d.ts +0 -257
  250. package/dist/state/execution-store.js +0 -527
  251. package/dist/state/execution-store.js.map +0 -1
  252. package/dist/state/migrate.d.ts +0 -15
  253. package/dist/state/migrate.js +0 -175
  254. package/dist/state/migrate.js.map +0 -1
  255. package/dist/state/workflow-run-store.d.ts +0 -216
  256. package/dist/state/workflow-run-store.js +0 -403
  257. package/dist/state/workflow-run-store.js.map +0 -1
  258. package/dist/telemetry/index.d.ts +0 -38
  259. package/dist/telemetry/index.js +0 -253
  260. package/dist/telemetry/index.js.map +0 -1
  261. package/dist/telemetry/pi-events.d.ts +0 -12
  262. package/dist/telemetry/pi-events.js +0 -134
  263. package/dist/telemetry/pi-events.js.map +0 -1
  264. package/dist/workflows/dag.d.ts +0 -37
  265. package/dist/workflows/dag.js +0 -118
  266. package/dist/workflows/dag.js.map +0 -1
  267. package/dist/workflows/loader.d.ts +0 -53
  268. package/dist/workflows/loader.js +0 -421
  269. package/dist/workflows/loader.js.map +0 -1
  270. package/dist/workflows/loop-eval.d.ts +0 -28
  271. package/dist/workflows/loop-eval.js +0 -74
  272. package/dist/workflows/loop-eval.js.map +0 -1
  273. package/dist/workflows/phase-executor.d.ts +0 -215
  274. package/dist/workflows/phase-executor.js +0 -1144
  275. package/dist/workflows/phase-executor.js.map +0 -1
  276. package/dist/workflows/phase-ref.d.ts +0 -50
  277. package/dist/workflows/phase-ref.js +0 -91
  278. package/dist/workflows/phase-ref.js.map +0 -1
  279. package/dist/workflows/resume.d.ts +0 -58
  280. package/dist/workflows/resume.js +0 -313
  281. package/dist/workflows/resume.js.map +0 -1
  282. package/dist/workflows/runner.d.ts +0 -63
  283. package/dist/workflows/runner.js +0 -364
  284. package/dist/workflows/runner.js.map +0 -1
  285. package/dist/workflows/schema.d.ts +0 -344
  286. package/dist/workflows/schema.js +0 -460
  287. package/dist/workflows/schema.js.map +0 -1
  288. package/dist/workflows/simple.d.ts +0 -90
  289. package/dist/workflows/simple.js +0 -393
  290. package/dist/workflows/simple.js.map +0 -1
  291. package/dist/workflows/target-policy.d.ts +0 -74
  292. package/dist/workflows/target-policy.js +0 -80
  293. package/dist/workflows/target-policy.js.map +0 -1
  294. package/dist/workflows/templates.d.ts +0 -88
  295. package/dist/workflows/templates.js +0 -127
  296. package/dist/workflows/templates.js.map +0 -1
  297. package/dist/workflows/triggers.d.ts +0 -21
  298. package/dist/workflows/triggers.js +0 -45
  299. package/dist/workflows/triggers.js.map +0 -1
  300. package/dist/workflows/verdict.d.ts +0 -19
  301. package/dist/workflows/verdict.js +0 -30
  302. package/dist/workflows/verdict.js.map +0 -1
  303. package/dist/worktree/manager.d.ts +0 -43
  304. package/dist/worktree/manager.js +0 -127
  305. package/dist/worktree/manager.js.map +0 -1
  306. package/docker-compose.yml +0 -274
  307. package/sandbox.Dockerfile +0 -68
  308. package/skills/README.md +0 -42
  309. package/skills/browser-qa/SKILL.md +0 -208
  310. package/skills/browser-qa/scripts/agent-browser.mjs +0 -531
  311. package/skills/building/SKILL.md +0 -95
  312. package/skills/chat/SKILL.md +0 -36
  313. package/skills/code-review/SKILL.md +0 -82
  314. package/skills/debug-production/SKILL.md +0 -108
  315. package/skills/demo/SKILL.md +0 -228
  316. package/skills/demo/scripts/compose-demo.sh +0 -243
  317. package/skills/issue-answer/SKILL.md +0 -91
  318. package/skills/issue-comment/SKILL.md +0 -49
  319. package/skills/issue-triage/SKILL.md +0 -149
  320. package/skills/issue-triage/references/AGENT-BRIEF.md +0 -65
  321. package/skills/pr-comment/SKILL.md +0 -64
  322. package/skills/pr-review/SKILL.md +0 -148
  323. package/skills/pr-review/references/findings-schema.md +0 -89
  324. package/skills/qa-test/SKILL.md +0 -97
  325. package/skills/repo-health/SKILL.md +0 -67
  326. package/skills/security-feedback/SKILL.md +0 -173
  327. package/skills/security-feedback/references/templates.md +0 -77
  328. package/skills/security-review/SKILL.md +0 -215
  329. package/skills/security-review/references/issue-format.md +0 -302
  330. package/skills/verify/SKILL.md +0 -118
  331. package/workflows/answer.yaml +0 -44
  332. package/workflows/build.yaml +0 -129
  333. package/workflows/cron-health.yaml +0 -6
  334. package/workflows/cron-review.yaml +0 -8
  335. package/workflows/cron-security.yaml +0 -6
  336. package/workflows/cron-triage.yaml +0 -8
  337. package/workflows/demo.yaml +0 -62
  338. package/workflows/examples/bash-smoke.yaml +0 -41
  339. package/workflows/examples/parallel-review.yaml +0 -36
  340. package/workflows/examples/tdd-loop.yaml +0 -17
  341. package/workflows/explore.yaml +0 -80
  342. package/workflows/issue-comment.yaml +0 -15
  343. package/workflows/issue-triage.yaml +0 -22
  344. package/workflows/pr-comment.yaml +0 -16
  345. package/workflows/pr-fix.yaml +0 -17
  346. package/workflows/pr-review.yaml +0 -50
  347. package/workflows/prompts/answer.md +0 -68
  348. package/workflows/prompts/architect.md +0 -44
  349. package/workflows/prompts/classifier.md +0 -60
  350. package/workflows/prompts/classify-adds-info.md +0 -17
  351. package/workflows/prompts/demo.md +0 -125
  352. package/workflows/prompts/executor.md +0 -42
  353. package/workflows/prompts/explore-ask.md +0 -99
  354. package/workflows/prompts/explore-publish.md +0 -31
  355. package/workflows/prompts/explore-read.md +0 -120
  356. package/workflows/prompts/explore-synthesize.md +0 -88
  357. package/workflows/prompts/fix.md +0 -18
  358. package/workflows/prompts/guardrails.md +0 -96
  359. package/workflows/prompts/pr-fix.md +0 -26
  360. package/workflows/prompts/pr.md +0 -39
  361. package/workflows/prompts/qa-browser.md +0 -95
  362. package/workflows/prompts/qa-synth.md +0 -44
  363. package/workflows/prompts/qa-test.md +0 -60
  364. package/workflows/prompts/re-reviewer.md +0 -33
  365. package/workflows/prompts/reviewer.md +0 -60
  366. package/workflows/prompts/verify-browser.md +0 -93
  367. package/workflows/prompts/verify-synth.md +0 -44
  368. package/workflows/prompts/verify.md +0 -63
  369. package/workflows/qa-test.yaml +0 -94
  370. package/workflows/repo-health.yaml +0 -15
  371. package/workflows/security-feedback.yaml +0 -25
  372. package/workflows/security-review.yaml +0 -37
  373. package/workflows/verify.yaml +0 -93
  374. /package/dist/{cli/cli-config.d.ts → cli-config.d.ts} +0 -0
  375. /package/dist/{cli/cli-config.js → cli-config.js} +0 -0
  376. /package/dist/{cli/cli-format.d.ts → cli-format.d.ts} +0 -0
  377. /package/dist/{cli/cli-format.js → cli-format.js} +0 -0
  378. /package/dist/{cli/cli-timeline.d.ts → cli-timeline.d.ts} +0 -0
  379. /package/dist/{cli/cli-timeline.js → cli-timeline.js} +0 -0
  380. /package/dist/{cli/cli.d.ts → cli.d.ts} +0 -0
  381. /package/dist/{cli/oauth-cli.d.ts → oauth-cli.d.ts} +0 -0
  382. /package/dist/{cli/setup.d.ts → setup.d.ts} +0 -0
@@ -1,302 +0,0 @@
1
- # § Issue format
2
-
3
- This is the **contract** between `security-review` (producer) and
4
- `security-feedback` (consumer). Every rule here is machine-parsed; do not
5
- deviate. `security-feedback` is staged into a separate workspace and cannot read
6
- this file, so it keeps its own copy of the row/severity grammar — **if you change
7
- the grammar here, update `skills/security-feedback/SKILL.md` in lockstep.**
8
-
9
- ## Title
10
-
11
- ```
12
- Security scan — YYYY-MM-DD
13
- ```
14
-
15
- - Exactly one em-dash (` — `, U+2014), surrounded by single spaces.
16
- - Date is the scan's UTC date in ISO form.
17
- - Same-day re-scans produce a second issue with the same title. GitHub disambiguates by issue number; the scanner never edits a prior-run issue.
18
-
19
- ## Body
20
-
21
- The body is assembled from eight blocks, in this exact order, separated by blank lines:
22
-
23
- ```
24
- {header comments}
25
-
26
- {intro paragraph}
27
-
28
- {how-to-respond section}
29
-
30
- {summary table}
31
-
32
- {suppression note}
33
-
34
- {scope note}
35
-
36
- {overflow note — omitted when overflow == 0}
37
-
38
- {findings sections}
39
- ```
40
-
41
- ### Block 1 — header comments
42
-
43
- Three HTML comments, each on its own line, in this exact order:
44
-
45
- ```
46
- <!-- lastlight-security-scan-version: 1 -->
47
- <!-- lastlight-security-scan-date: YYYY-MM-DD -->
48
- <!-- lastlight-security-scan-ts: YYYY-MM-DDTHH:MM:SSZ -->
49
- ```
50
-
51
- - `version` is a format version. Bump if the structure changes incompatibly — `security-feedback` will check this and refuse to parse unknown versions.
52
- - `date` matches the title.
53
- - `ts` is an ISO-8601 UTC timestamp with second precision (no milliseconds).
54
-
55
- ### Block 2 — intro paragraph
56
-
57
- Exactly one paragraph, with the commit count and short-SHA range substituted:
58
-
59
- ```
60
- Reviewing {N} commits since {priorScanDate} ({firstShortSha}..{lastShortSha}). Findings here focus on SDLC and workflow changes — Dependabot, GitHub Code Scanning, and Renovate handle the rest. Tick the box once the underlying issue is resolved or recorded in `SECURITY.md`.
61
- ```
62
-
63
- `{N}` is the size of `commitsReviewed`. `{priorScanDate}` is the YYYY-MM-DD of the prior scan (or the bootstrap floor). When `N == 1`, both short SHAs are the same — render as `({onlyShortSha})` rather than `({sha}..{sha})`.
64
-
65
- ### Block 3 — how-to-respond section
66
-
67
- Verbatim, including the heading:
68
-
69
- ```
70
- ## How to respond
71
-
72
- **Preferred flow** — tick the boxes on the findings you want broken out, then comment:
73
-
74
- - `@last-light create issues` — files one issue per **ticked** finding (default)
75
-
76
- **Other shortcuts:**
77
-
78
- - `@last-light create issues for the criticals` — every Critical finding (ticked or not)
79
- - `@last-light create issues for the highs` — same, for High
80
- - `@last-light create issues for items 1, 3, 5` — specific items by number (1-based, top to bottom)
81
- - `@last-light create issues for all` — every finding in this scan
82
- - `@last-light accept-risk for item N: <reason>` — suppress this finding in future scans
83
- - `@last-light false-positive for item N: <reason>` — suppress this finding in future scans
84
- - Comment freely to ask questions or discuss
85
- ```
86
-
87
- (Item positions in commands map to the `item:N` HTML-comment markers defined below. Ticking a box in GitHub's UI rewrites the row from `[ ]` to `[x]` — the feedback skill treats that as your selection.)
88
-
89
- ### Block 4 — summary table
90
-
91
- Verbatim header, with numbers substituted. Always include all four severity rows, even when the count is 0.
92
-
93
- `{nC}`, `{nH}`, `{nM}`, `{nL}` and `{nTotal}` are **TRUE counts** (post-filtering, pre-cap) — i.e. how many findings of each severity actually survived the SECURITY.md filtering, regardless of whether each individual row is listed below the cap. The same numbers appear in the `### 🔴 Critical ({nC})` etc. section headers. The overflow note (Block 6) communicates how many of those counts were truncated from the listed rows.
94
-
95
- ```
96
- ## Summary
97
-
98
- | Severity | Count |
99
- |----------|------:|
100
- | Critical | {nC} |
101
- | High | {nH} |
102
- | Medium | {nM} |
103
- | Low | {nL} |
104
- | **Total**| **{nTotal}** |
105
- ```
106
-
107
- ### Block 5 — suppression note
108
-
109
- A single line:
110
-
111
- ```
112
- Suppressed by `SECURITY.md`: {nSuppressed} (accepted: {nA}, false-positives: {nFP}). Below severity floor: {nFloor}.
113
- ```
114
-
115
- Set each count to 0 when N/A. Emit the line unconditionally so the structure is stable.
116
-
117
- ### Block 6 — scope note
118
-
119
- Always emit, immediately after the suppression note. Lists the human (non-bot) commits actually reviewed, so a maintainer can see what diff produced these findings:
120
-
121
- ```
122
- > Commits reviewed: {short-sha-1} {subject-1}, {short-sha-2} {subject-2}, …
123
- ```
124
-
125
- Cap at 10 entries; if there are more, append ` +{N} more` after the last item. Subjects are truncated to 60 chars with `…` if longer. Renovate/Dependabot commits are filtered out at § 1.5 and never appear here.
126
-
127
- ### Block 7 — overflow note
128
-
129
- Emit **only** when `overflow > 0`:
130
-
131
- ```
132
- > **Note** — {overflow} lower-severity findings are not listed here. The cap is: ALL critical and high, plus the first 10 medium/low (after sort). Tighten `SECURITY.md` severity floors or break out items from this scan, then re-run to surface the rest.
133
- ```
134
-
135
- ### Block 8 — findings sections
136
-
137
- Four sections, in this **exact order** (Critical → High → Medium → Low). Always emit all four headers, even when a section has zero findings — the feedback skill relies on stable anchors.
138
-
139
- The header counts (`{nC}` etc.) are the **true** post-filter counts, identical to those in Block 4's summary table. The rows listed under each header are subject to the § 7 cap: critical and high are always complete; medium + low are truncated to the first 10 combined. When a section is partially listed, append `(showing first N of {nM})` after the marker — see the per-section header rule below.
140
-
141
- ```
142
- ## Findings
143
-
144
- ### 🔴 Critical ({nC})
145
-
146
- {rows or "_No findings._"}
147
-
148
- ### 🟠 High ({nH})
149
-
150
- {rows or "_No findings._"}
151
-
152
- ### 🟡 Medium ({nM}){if truncated: " (showing first {kM} of {nM})"}
153
-
154
- {rows or "_No findings._"}
155
-
156
- ### 🟢 Low ({nL}){if truncated: " (showing first {kL} of {nL})"}
157
-
158
- {rows or "_No findings._"}
159
- ```
160
-
161
- Where `kM` and `kL` are the actual rows listed in this issue (sum of the two ≤ 10). When `kM == nM` or `kL == nL` (no truncation in that section), omit the parenthetical.
162
-
163
- ### Finding-row grammar
164
-
165
- Every finding is exactly two lines: a task-list row, then a `<details>` block (one blank line between rows within a section).
166
-
167
- The task-list row is **one physical line** with this exact shape:
168
-
169
- ```
170
- - [ ] <!-- item:N fp:FINGERPRINT --> **TITLE** — `FILE:LINE` (TOOL · `RULE`)
171
- ```
172
-
173
- Matched by this canonical regex (multiline, case-sensitive) — covers all three row states:
174
-
175
- ```
176
- /^- \[([ x])\] <!-- item:(\d+) fp:([0-9a-f]{8,}) --> (?:~~)?\*\*(.+?)\*\* — `([^`]+):(\d+)` \(([a-z][a-z0-9-]*) · `([^`]+)`\)(?:~~ → #(\d+))?$/m
177
- ```
178
-
179
- Capture groups, in order:
180
-
181
- 1. `checkbox` — `" "` (unticked) or `"x"` (ticked or broken-out)
182
- 2. `itemNumber` (1-based across all severities)
183
- 3. `fingerprint` (lowercase hex, ≥ 8 chars)
184
- 4. `title` (plain text; no backticks, no asterisks)
185
- 5. `file` (no backticks, forward-slash path)
186
- 6. `line` (integer; use `0` when not line-scoped)
187
- 7. `tool` (lowercase, hyphenated — e.g. `npm-audit`, `semgrep`, `gitleaks`, `claude`)
188
- 8. `rule` (the tool's native rule id; may contain dots, hyphens)
189
- 9. `subIssueNumber` — present **only** when the row has been broken out to a sub-issue; `undefined` otherwise
190
-
191
- Derived state (the feedback skill computes these from the captures):
192
-
193
- | State | Written as | `checkbox` | `subIssueNumber` |
194
- |-------|------------|------------|------------------|
195
- | **pending** | `- [ ] <!-- item:N fp:FP --> **TITLE** — …` | `" "` | `undefined` |
196
- | **user-ticked** (maintainer clicked the box in GitHub's UI) | `- [x] <!-- item:N fp:FP --> **TITLE** — …` | `"x"` | `undefined` |
197
- | **broken-out** (feedback skill created a sub-issue) | `- [x] <!-- item:N fp:FP --> ~~**TITLE** — …~~ → #SUBISSUE` | `"x"` | the sub-issue number |
198
-
199
- Rules:
200
-
201
- - `alreadyBrokenOut` ≡ `subIssueNumber != null`. Broken-out rows are immutable — the feedback skill never re-opens them, never touches their checkbox, never re-creates sub-issues from them.
202
- - `userTicked` ≡ `checkbox === "x" && subIssueNumber == null`. These are the candidates the default `@last-light create issues` command selects.
203
- - When creating sub-issues from ticked rows, the feedback skill transitions each row from **user-ticked** → **broken-out** by wrapping the visible text in `~~…~~` and appending ` → #{subIssueNumber}`. The checkbox stays `[x]`; the strikethrough + link is the canonical broken-out marker.
204
- - Un-ticking (moving a user-ticked row back to `[ ]`) is fine — the row just becomes pending again. The scanner doesn't police this.
205
-
206
- The per-finding detail block follows immediately on the next line:
207
-
208
- ````
209
- <details><summary>Details</summary>
210
-
211
- ```{LANGUAGE}
212
- {SNIPPET}
213
- ```
214
-
215
- {EXPLANATION}
216
-
217
- **Suggested fix:** {SUGGESTED_FIX}
218
-
219
- </details>
220
- ````
221
-
222
- Rules:
223
- - `LANGUAGE` is the fenced-code language tag; empty string when unknown.
224
- - `SNIPPET` is the code excerpt; no surrounding fences, no trailing blank line inside the fence.
225
- - `EXPLANATION` and `SUGGESTED_FIX` are markdown strings; they may contain their own fenced code blocks and line breaks.
226
- - The `<details>` block ends with `</details>` on its own line.
227
-
228
- ## Worked example
229
-
230
- A scan with 1 critical + 1 high finding renders like:
231
-
232
- ````markdown
233
- <!-- lastlight-security-scan-version: 1 -->
234
- <!-- lastlight-security-scan-date: 2026-04-21 -->
235
- <!-- lastlight-security-scan-ts: 2026-04-21T10:00:00Z -->
236
-
237
- Reviewing 3 commits since 2026-04-14 (a1b2c3d..f9e8d7c). Findings here focus on SDLC and workflow changes — Dependabot, GitHub Code Scanning, and Renovate handle the rest. Tick the box once the underlying issue is resolved or recorded in `SECURITY.md`.
238
-
239
- ## How to respond
240
-
241
- - `@last-light create issues for the criticals` — file individual issues for every Critical finding
242
- - `@last-light create issues for the highs` — same, for High
243
- - `@last-light create issues for items 1, 3, 5` — file issues for specific items by number (1-based, top to bottom)
244
- - `@last-light create issues for all` — every finding in this scan
245
- - `@last-light accept-risk for item N: <reason>` — suppress this finding in future scans
246
- - `@last-light false-positive for item N: <reason>` — suppress this finding in future scans
247
- - Comment freely to ask questions or discuss
248
-
249
- ## Summary
250
-
251
- | Severity | Count |
252
- |----------|------:|
253
- | Critical | 1 |
254
- | High | 1 |
255
- | Medium | 0 |
256
- | Low | 0 |
257
- | **Total**| **2** |
258
-
259
- Suppressed by `SECURITY.md`: 0 (accepted: 0, false-positives: 0). Below severity floor: 0.
260
-
261
- > Commits reviewed: a1b2c3d wire user-supplied repo into git clone, e5f6a7b add admin shell endpoint, f9e8d7c rotate webhook secret
262
-
263
- ## Findings
264
-
265
- ### 🔴 Critical (1)
266
-
267
- - [ ] <!-- item:1 fp:abc123def4567890 --> **Command injection in git clone** — `mcp-github-app/src/index.js:42` (semgrep · `javascript.lang.security.exec-shell-command`)
268
- <details><summary>Details</summary>
269
-
270
- ```javascript
271
- execSync(`git clone ${userInput}`)
272
- ```
273
-
274
- `userInput` originates from an HTTP request and is concatenated directly into a shell command, allowing arbitrary command execution.
275
-
276
- **Suggested fix:** use `execFileSync('git', ['clone', userInput])` so arguments aren't re-parsed by a shell.
277
-
278
- </details>
279
-
280
- ### 🟠 High (1)
281
-
282
- - [ ] <!-- item:2 fp:def456abc7890123 --> **Hardcoded API key in config** — `src/config.ts:18` (gitleaks · `generic-api-key`)
283
- <details><summary>Details</summary>
284
-
285
- ```typescript
286
- const API_KEY = "sk_live_abc123..."
287
- ```
288
-
289
- A live API key is committed to the repo. Anyone with read access to the repo (or the git history of a former branch) can use it.
290
-
291
- **Suggested fix:** move the key to an environment variable (`process.env.API_KEY`) and rotate the exposed one immediately.
292
-
293
- </details>
294
-
295
- ### 🟡 Medium (0)
296
-
297
- _No findings._
298
-
299
- ### 🟢 Low (0)
300
-
301
- _No findings._
302
- ````
@@ -1,118 +0,0 @@
1
- ---
2
- name: verify
3
- description: Test a behaviour claim as an investigator and report whether the evidence confirms or refutes it — CONFIRMED / REFUTED / INCONCLUSIVE with bash-captured evidence. Use when asked to verify a claim, prove a fix works, or check that a PR does what it says.
4
- version: 1.0.0
5
- tags: [github, verify, testing, evidence]
6
- ---
7
-
8
- # Verify
9
-
10
- Test a specific claim about behaviour and report whether the evidence supports
11
- or refutes it. The deliverable is a **verdict with evidence**, not an opinion.
12
-
13
- This skill uses the **building** skill for installing dependencies and running
14
- the repo's build/test commands in the sandbox.
15
-
16
- > **Scope (text-evidence path).** In the default text phase the sandbox agent
17
- > has bash, file read, and the github tools — no browser, no screenshots, no
18
- > video. Prove claims with what bash can capture: test output, command
19
- > stdout/stderr, `curl` against a dev-server you start, log excerpts, file
20
- > contents, exit codes. Driving a real browser and attaching screenshots is the
21
- > separate `browser-qa` skill, which is staged only in the gated browser phase
22
- > running on the docker QA image (Playwright + Chromium). If that skill isn't in
23
- > your catalogue and a claim genuinely can only be shown in a rendered UI, say
24
- > so under **INCONCLUSIVE** rather than guessing — the browser phase will pick
25
- > it up when available.
26
-
27
- ## Ground rule — investigator, not advocate
28
-
29
- Your job is to find out whether the claim is **true**, not to make it look true.
30
- A conclusive "this is broken" with clear evidence is exactly as valuable as a
31
- "this works". Specifically:
32
-
33
- - **Never fabricate, hardcode, mock, or stage evidence** to match an expected
34
- outcome. Do not edit the code under test to make a result appear.
35
- - If the behaviour you observe **contradicts** the claim, that is the result —
36
- report it as REFUTED with the evidence inline. Don't bury it.
37
- - **Don't retry a failing test hoping for a different answer.** Retry only after
38
- *changing* the environment or procedure (wrong branch, missing build step),
39
- and only when you have reason to believe the test setup — not the code — was
40
- wrong. One unexpected result that reproduces is a finding.
41
-
42
- ## Parse the target
43
-
44
- The Context block gives you the claim and (usually) a PR or issue. The claim may
45
- arrive as:
46
-
47
- - A **direct claim** — "ESC cancels streaming in bash mode", "the `--fork` flag
48
- creates a new session".
49
- - A **PR reference + claim** — verify the claim against that PR's head.
50
- - A **PR reference only** — read the PR description + diff and identify the most
51
- important, most testable claim it makes; state which claim you chose.
52
-
53
- When a PR/issue is given, read its description and diff for context (from the
54
- local checkout — see the **building** skill's workspace notes; don't pull the
55
- diff through the API).
56
-
57
- ## Decide what would convince a skeptic
58
-
59
- Name the single behaviour to observe and the evidence that settles it:
60
-
61
- - **Functional claim** (a feature works, a flow completes) → run it and capture
62
- the output / exit code / resulting state.
63
- - **Regression / fix claim** ("no longer clears the screen", "stops erroring") →
64
- show the **before and after**: reproduce on the base ref, then show it gone on
65
- the head ref. Both states must appear in the evidence — an off-camera "it's
66
- fixed" doesn't count.
67
- - **Output/encoding claim** → capture the exact bytes/text (`xxd`, `od -c`, raw
68
- stdout) rather than describing them.
69
-
70
- ## Run the test
71
-
72
- Follow the **building** skill to install and build. Then exercise the claim with
73
- the minimal sequence that demonstrates it, capturing evidence at the decisive
74
- step. Start a dev-server in the background and `curl` it when the claim is about
75
- a running service; run the CLI directly when it's a CLI claim; run the targeted
76
- test when the repo already encodes the behaviour as a test.
77
-
78
- If the environment blocks a clean test (missing dependency the sandbox can't
79
- provide, build failure you can't resolve, infra that won't run), capture what
80
- blocked it — that drives an **INCONCLUSIVE** result, not a guess.
81
-
82
- ## Report
83
-
84
- Produce your report as your **final message** in this shape — the workflow posts
85
- it for you (don't `github_add_issue_comment` yourself; that would double-post).
86
- **Keep it concise**: a one-line environment summary, the decisive evidence
87
- (commands + key output, not every line), and a one-paragraph conclusion — not an
88
- exhaustive walkthrough.
89
-
90
- ```
91
- ## Verify: <claim>
92
-
93
- **Environment:** <branch / commit, package manager, how the app was run>
94
-
95
- ### Evidence
96
- <commands run + their captured output — fenced. Include both states for a
97
- before/after claim.>
98
-
99
- ### Conclusion
100
- **CONFIRMED** | **REFUTED** | **INCONCLUSIVE**
101
-
102
- <one paragraph: what the evidence shows and why it settles the claim.>
103
- ```
104
-
105
- - **REFUTED** — state the expected behaviour (from the claim), the observed
106
- behaviour (from the evidence), include the evidence inline, and note any
107
- environmental factors (branch, commit, OS). This is a valuable finding, not a
108
- failed run.
109
- - **INCONCLUSIVE** — report exactly what blocked the test and what would be
110
- needed to resolve it. Do not guess at the outcome.
111
-
112
- ## Do NOT
113
-
114
- - Retry a failing test more than once without changing the environment/procedure.
115
- - Hardcode expected output, mock responses, or edit the code under test to force
116
- a result.
117
- - Assume unexpected behaviour means *you* made a mistake — it may be a real bug.
118
- - Omit evidence that contradicts the claim.
@@ -1,44 +0,0 @@
1
- kind: answer
2
- name: answer
3
- classification:
4
- intent: question
5
- description: |
6
- QUESTION — The user is asking a substantive INFORMATIONAL question that warrants research to answer well: "how does X work?", "what's the difference between X and Y?", "how does <repo> compare to <other tool>?", "is it possible to do Z?", "why does X happen?". The deliverable is an ANSWER, not code and not a spec. QUESTION is for real questions that benefit from reading docs/code or searching the web — NOT casual chat, thanks, or one-word replies (those stay CHAT). EXPLORE shapes a NEW idea into a spec; QUESTION answers an EXISTING question about how something works or compares.
7
- examples:
8
- - '"how does cliftonc/lastlight compare to Vercel''s Eve framework?" → INTENT: QUESTION, REPO: cliftonc/lastlight, ISSUE: NONE, REASON: NONE'
9
- - '"what''s the difference between a sandbox phase and a chat session in cliftonc/lastlight?" → INTENT: QUESTION, REPO: cliftonc/lastlight, ISSUE: NONE, REASON: NONE'
10
- description: |
11
- Answer a question issue directly. Used when a newly-opened issue asks for
12
- information, an explanation, or a comparison rather than a code change — the
13
- bot researches (repo docs + web search) and posts a single sourced answer
14
- comment, labels the issue `question`, and leaves it open. No agent brief, no
15
- ready-for-agent, no PR.
16
-
17
- Delivery is uniform: the agent's final message (the answer) is captured as
18
- `answerResult` and posted by the harness via `postComment` — as a comment on
19
- the originating issue for GitHub-initiated runs, or into the Slack thread for
20
- Slack-initiated runs. The skill therefore does NOT post the answer itself; it
21
- only applies the `question` label when answering a GitHub issue.
22
-
23
- Triggered by:
24
- - issue.opened webhook when the router classifies the issue as a question
25
- - a Slack message classified as a question against a managed repo
26
- - manual override via routes.github.issue_answer / routes.slack.answer
27
-
28
- phases:
29
- - name: phase_0
30
- label: Context
31
- type: context
32
-
33
- - name: answer
34
- label: Answer
35
- prompt: prompts/answer.md
36
- skill: issue-answer
37
- model: "{{models.answer}}"
38
- web_search: true
39
- unrestricted_egress: true
40
- output_var: answerResult
41
- messages:
42
- on_start: "Researching and drafting an answer..."
43
- on_success: "{{answerResult}}"
44
- on_failure: "I couldn't put together an answer — see the logs for details."
@@ -1,129 +0,0 @@
1
- kind: build
2
- name: build
3
- classification:
4
- intent: build
5
- description: |
6
- BUILD — The user is ASKING YOU (the bot) to make code changes NOW in a GitHub repo: implement a feature, fix a bug, create/send a PR, resolve an issue with code. BUILD requires a GitHub target — either an explicit repo reference (owner/name or github.com URL) in the message, OR an ISSUE TITLE context line indicating the comment is a reply on an existing issue/PR. If neither is present, classify as CHAT — local filesystem operations ("delete files in ~/foo", "clean up my downloads"), shell-style commands, or vague "build something" with no target are NOT BUILD.
7
- BUILD is a REQUEST for NEW work directed at you. A comment that merely REPORTS work the human has ALREADY done is NOT BUILD — it is CHAT. Tells: past-tense ("fixed", "done", "implemented", "added a test", "pushed a fix", "handled it"), a reference to a commit the human made ("addressed in <sha>", "see commit abc123"), thanking you, or explaining/justifying a change they made in response to your review. These are status reports, not requests — classify them CHAT even when the comment is on a PR and even when it @-mentions you. Only classify BUILD when the human asks you to do NEW work (imperative request: "fix X", "now also handle Y", "can you update Z").
8
- examples:
9
- - '"build cliftonc/drizzle-cube#42" → INTENT: BUILD, REPO: cliftonc/drizzle-cube, ISSUE: 42, REASON: NONE'
10
- - '"lets build this!" with ISSUE TITLE "Security Review" → INTENT: BUILD, REPO: NONE, ISSUE: NONE, REASON: NONE'
11
- - '"go ahead" with ISSUE TITLE "Add CSV export" → INTENT: BUILD, REPO: NONE, ISSUE: NONE, REASON: NONE'
12
- - '"now also handle the GET /sql case please" with ISSUE TITLE "Port adapters" → INTENT: BUILD, REPO: NONE, ISSUE: NONE, REASON: NONE'
13
- - '"Thanks @last-light — addressed in 49ccadf. Fixed the nested body in the core and added a regression test; point 3 is intentional, confirmed with the maintainer." with ISSUE TITLE "Port fastify/hono/nextjs adapters" → INTENT: CHAT, REPO: NONE, ISSUE: NONE, REASON: NONE'
14
- - '"done, pushed a fix for the type error in 1a2b3c4" with ISSUE TITLE "Fix build" → INTENT: CHAT, REPO: NONE, ISSUE: NONE, REASON: NONE'
15
- - '"delete any files in ~/work/lastlight/docs" → INTENT: CHAT, REPO: NONE, ISSUE: NONE, REASON: NONE'
16
- - '"can you remove the old docs folder for me" (no ISSUE TITLE, no repo) → INTENT: CHAT, REPO: NONE, ISSUE: NONE, REASON: NONE'
17
- - '"build something cool" (no repo, no ISSUE TITLE) → INTENT: CHAT, REPO: NONE, ISSUE: NONE, REASON: NONE'
18
- description: "Architect -> Executor -> Reviewer build cycle"
19
- trigger: build
20
- # Render progress as a single in-place task-list comment/message that updates
21
- # as phases run, instead of a new comment per phase. The per-phase
22
- # `messages.on_*` below become the one-line detail on each checklist step.
23
- status_checklist: true
24
-
25
- phases:
26
- - name: phase_0
27
- label: Context
28
- type: context
29
-
30
- - name: guardrails
31
- label: Guardrails
32
- prompt: prompts/guardrails.md
33
- model: "{{models.guardrails}}"
34
- variant: "{{variants.guardrails}}"
35
- on_output:
36
- contains_BLOCKED:
37
- action: fail
38
- message: "Guardrails check: BLOCKED"
39
- unless_label: "lastlight:bootstrap"
40
- unless_title_matches: "^(guardrails:|\\[guardrails\\])"
41
- bypass_message: |
42
- **Guardrails check: BLOCKED** — but this is a bootstrap task
43
- (label `lastlight:bootstrap` or "guardrails:" title prefix detected).
44
- Proceeding with the build cycle so the architect can plan, and the
45
- executor can install, the missing tooling. The guardrails report at
46
- `{{issueDir}}/guardrails-report.md` lists what's missing.
47
- contains_READY:
48
- action: continue
49
- messages:
50
- on_success: "READY — foundational tooling verified — [guardrails-report.md]({{artifactUrl guardrails-report.md}})"
51
- on_blocked: |
52
- **Guardrails check: BLOCKED** — missing foundational tooling.
53
-
54
- See the guardrails report on branch `{{branch}}` at `{{issueDir}}/guardrails-report.md`.
55
- Once you've added the missing tooling, ask me to build this issue again — the check will re-run against the current repo state.
56
-
57
- - name: architect
58
- label: Architect
59
- prompt: prompts/architect.md
60
- model: "{{models.architect}}"
61
- variant: "{{variants.architect}}"
62
- approval_gate: post_architect
63
- approval_artifact: architect-plan.md
64
- approval_gate_message: |
65
- **Architect analysis complete** — approval required before implementation.
66
-
67
- - Branch: `{{branch}}`
68
- - Plan: `{{issueDir}}/architect-plan.md`
69
-
70
- **Review & decide:** {{approvalUrl}}
71
- **Or comment:** `{{botMention}} approve` / `{{botMention}} reject [reason]`
72
- messages:
73
- # Single-line messages become the one-line detail on the checklist step,
74
- # so keep them concise and link the artifact on the branch.
75
- on_success: "Plan ready — [architect-plan.md]({{artifactUrl architect-plan.md}})"
76
-
77
- - name: executor
78
- label: Executor
79
- prompt: prompts/executor.md
80
- skill: building
81
- model: "{{models.executor}}"
82
- variant: "{{variants.executor}}"
83
- messages:
84
- on_start: "implementing the architect's plan…"
85
- on_skipped_done: "already completed"
86
- on_success: "Implemented — [executor-summary.md]({{artifactUrl executor-summary.md}})"
87
-
88
- - name: reviewer
89
- label: Reviewer
90
- prompt: prompts/reviewer.md
91
- # code-review: rubric for the review + re-review prompts.
92
- # building: the fix cycle (fix.md) runs under this node and needs the gate.
93
- skills: [code-review, building]
94
- model: "{{models.reviewer}}"
95
- variant: "{{variants.reviewer}}"
96
- output_var: review
97
- loop:
98
- max_cycles: 2
99
- on_request_changes:
100
- fix_prompt: prompts/fix.md
101
- fix_model: "{{models.fix}}"
102
- fix_variant: "{{variants.fix}}"
103
- re_review_prompt: prompts/re-reviewer.md
104
- approval_gate: post_reviewer
105
- approval_artifact: reviewer-verdict.md
106
- messages:
107
- on_cycle_start: "independent verification (cycle {{cycle}})…"
108
- on_approved: "Approved — [reviewer-verdict.md]({{artifactUrl reviewer-verdict.md}})"
109
- on_request_changes: "**Review: REQUEST_CHANGES** — [reviewer-verdict.md]({{artifactUrl reviewer-verdict.md}}) — fixing issues (cycle {{cycle}}/{{maxCycles}})..."
110
- on_fix_start: "**Starting fix loop** (cycle {{cycle}}/{{maxCycles}}) — addressing reviewer feedback..."
111
- on_fix_failed: "Fix cycle {{cycle}} failed. Proceeding to PR with known issues."
112
- on_max_cycles: "**Review: REQUEST_CHANGES** after {{maxCycles}} fix cycles — see [reviewer-verdict.md]({{artifactUrl reviewer-verdict.md}}). Proceeding with remaining issues noted."
113
- on_pause_for_approval: |
114
- **Review: REQUEST_CHANGES** — approval required before fix loop.
115
-
116
- - Verdict: `{{issueDir}}/reviewer-verdict.md`
117
-
118
- **Review & decide:** {{approvalUrl}}
119
- **Or comment:** `{{botMention}} approve` / `{{botMention}} reject [reason]`
120
-
121
- - name: pr
122
- label: PR
123
- prompt: prompts/pr.md
124
- model: "{{models.pr}}"
125
- variant: "{{variants.pr}}"
126
- on_success:
127
- set_phase: complete
128
- messages:
129
- on_start: "packaging changes for review…"
@@ -1,6 +0,0 @@
1
- kind: cron
2
- name: weekly-health-report
3
- schedule: "0 9 * * 1"
4
- workflow: repo-health
5
- context:
6
- mode: report
@@ -1,8 +0,0 @@
1
- kind: cron
2
- name: check-prs-awaiting-review
3
- schedule: "*/30 * * * *"
4
- workflow: pr-review
5
- context:
6
- mode: scan
7
- condition:
8
- unless: webhooksEnabled
@@ -1,6 +0,0 @@
1
- kind: cron
2
- name: weekly-security-scan
3
- schedule: "0 10 * * 1"
4
- workflow: security-review
5
- context:
6
- deliverSlackSummary: true
@@ -1,8 +0,0 @@
1
- kind: cron
2
- name: triage-new-issues
3
- schedule: "*/15 * * * *"
4
- workflow: issue-triage
5
- context:
6
- mode: scan
7
- condition:
8
- unless: webhooksEnabled