claude-code-session-manager 0.98.0 → 0.101.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 (441) hide show
  1. package/README.md +3 -3
  2. package/bin/cli.cjs +16 -4
  3. package/bin/node-floor.cjs +41 -0
  4. package/dist/assets/DataModel-CXaH2GED.js +1 -0
  5. package/dist/assets/{History-Bfdoywlh.js → History-Cerii-HA.js} +2 -2
  6. package/dist/assets/{Hooks-CKDJjTJV.js → Hooks-aXMb5LDy.js} +3 -3
  7. package/dist/assets/{Library-7akfgy67.js → Library-WrJFKEOJ.js} +1 -1
  8. package/dist/assets/{MarkdownEditor-DDesiqet.js → MarkdownEditor-D1BMCXS7.js} +1 -1
  9. package/dist/assets/{McpServers-D4lZtXof.js → McpServers-Cf0davLd.js} +2 -2
  10. package/dist/assets/{Memory-CeI8G1w5.js → Memory-Dn6NHWPe.js} +6 -6
  11. package/dist/assets/Permissions-CTVuFPjg.js +3 -0
  12. package/dist/assets/{Plugins-P4eCXy_S.js → Plugins-C2TyF8Mn.js} +2 -2
  13. package/dist/assets/ProvenanceBadge-F_jwHSwE.js +1 -0
  14. package/dist/assets/{SaveBar-l9jnEMES.js → SaveBar-DA1KVJST.js} +1 -1
  15. package/dist/assets/Scheduler-Bm6Q_hlu.js +16 -0
  16. package/dist/assets/{ScopeSwitcher-CjJi8ST5.js → ScopeSwitcher-BygZlJca.js} +1 -1
  17. package/dist/assets/Settings-BYCiv5KV.js +3 -0
  18. package/dist/assets/{SkillReferenceGraph-CjbO01Sg.js → SkillReferenceGraph-CcLnl9np.js} +1 -1
  19. package/dist/assets/{Skills-BxZ9_fCR.js → Skills-ChffsdTD.js} +2 -2
  20. package/dist/assets/{SystemPrompt-D8vfFb8b.js → SystemPrompt-dNkfHE_M.js} +1 -1
  21. package/dist/assets/{TagLibrary-2vzUo7YL.js → TagLibrary-jVlEuB0m.js} +1 -1
  22. package/dist/assets/{TiptapBody-B8ZfbK90.js → TiptapBody-6_cdwcP0.js} +1 -1
  23. package/dist/assets/{Toggle-BbW4nGGf.js → Toggle-CVXqGpAP.js} +1 -1
  24. package/dist/assets/ViewTabs-DO1YVbpc.js +1 -0
  25. package/dist/assets/{index-CKH5Uxik.css → index-D89EUizB.css} +1 -1
  26. package/dist/assets/{index-Cd98Q1lD.js → index-DbCQPWWY.js} +747 -752
  27. package/dist/assets/{settingsSchema-IhUfucCF.js → settingsSchema-Wrvn-Yz1.js} +1 -1
  28. package/dist/index.html +2 -2
  29. package/package.json +25 -29
  30. package/plugins/CLAUDE.md +6 -6
  31. package/plugins/session-manager-dev/skills/builder/4-manual/SKILL.md +21 -19
  32. package/plugins/session-manager-dev/skills/builder/SKILL.md +3 -3
  33. package/plugins/session-manager-dev/skills/develop/SKILL.md +254 -510
  34. package/plugins/session-manager-dev/skills/develop/standards.md +17 -22
  35. package/scripts/README.md +3 -11
  36. package/scripts/audit-ops-hygiene.cjs +3 -3
  37. package/scripts/hooks/lib/guard-prd-writes-policy.cjs +1 -1
  38. package/scripts/hooks/lib/guard-self-schedule-policy.cjs +1 -1
  39. package/scripts/mint-epic.cjs +2 -3
  40. package/scripts/scheduler-mcp-server.cjs +64 -7
  41. package/src/main/agentLibrary.cjs +22 -2
  42. package/src/main/build-info.json +4 -4
  43. package/src/main/chatRunner.cjs +4 -3
  44. package/src/main/config.cjs +41 -38
  45. package/src/main/docEdit.cjs +4 -1
  46. package/src/main/files.cjs +2 -5
  47. package/src/main/health.cjs +1 -1
  48. package/src/main/index.cjs +40 -11
  49. package/src/main/ipcSchemas.cjs +35 -34
  50. package/src/main/lib/agentPersonaSchema.cjs +13 -2
  51. package/src/main/lib/atomicFs.cjs +116 -0
  52. package/src/main/lib/branchSweep.cjs +13 -12
  53. package/src/main/lib/buildTarget.cjs +3 -3
  54. package/src/main/lib/builtinMacros.cjs +39 -0
  55. package/src/main/lib/claudeCliCaps.cjs +129 -0
  56. package/src/main/lib/credentials.cjs +2 -4
  57. package/src/main/lib/crossProjectFeedback.cjs +3 -3
  58. package/src/main/lib/cwdClassify.cjs +15 -3
  59. package/src/main/lib/definitionOfDone.cjs +207 -125
  60. package/src/main/lib/dodDrainHook.cjs +11 -5
  61. package/src/main/lib/epicMint.cjs +2 -4
  62. package/src/main/lib/epicStatusMirror.cjs +8 -10
  63. package/src/main/lib/epicWorktreeProjectConfig.cjs +2 -4
  64. package/src/main/lib/gateAuthority.cjs +96 -0
  65. package/src/main/lib/gitExec.cjs +69 -0
  66. package/src/main/lib/gitWorktree.cjs +656 -92
  67. package/src/main/lib/instanceLock.cjs +5 -8
  68. package/src/main/lib/launchFailure.cjs +2 -3
  69. package/src/main/lib/macroLibrary.cjs +480 -0
  70. package/src/main/lib/mcpToolCatalog.cjs +49 -17
  71. package/src/main/lib/needsReviewLedger.cjs +1 -1
  72. package/src/main/lib/opsErrorLog.cjs +11 -1
  73. package/src/main/lib/opsOwnership.cjs +5 -9
  74. package/src/main/lib/pidAlive.cjs +32 -0
  75. package/src/main/lib/prdCreate.cjs +121 -12
  76. package/src/main/lib/prdDisposition.cjs +2 -2
  77. package/src/main/lib/prdGateFiles.cjs +284 -0
  78. package/src/main/lib/prdLocations.cjs +61 -0
  79. package/src/main/lib/prdMigration.cjs +2 -3
  80. package/src/main/lib/prdSizing.cjs +2 -1
  81. package/src/main/lib/projectHomeAdminRoutes.cjs +136 -21
  82. package/src/main/lib/promptSessionSchema.cjs +10 -2
  83. package/src/main/lib/rcaReport.cjs +4 -6
  84. package/src/main/lib/reaperHelpers.cjs +8 -1
  85. package/src/main/lib/reservationExpiry.cjs +6 -1
  86. package/src/main/lib/reviewNotice.cjs +263 -0
  87. package/src/main/lib/runClaudeP.cjs +4 -1
  88. package/src/main/lib/schedulerPaths.cjs +22 -2
  89. package/src/main/lib/sessionSlots.cjs +2 -4
  90. package/src/main/lib/shippedPersonaSeeds.cjs +226 -0
  91. package/src/main/lib/smfileHeaders.cjs +66 -0
  92. package/src/main/lib/timeoutShim.cjs +123 -0
  93. package/src/main/lib/timeoutShimScript.cjs +275 -0
  94. package/src/main/lib/upgradeDrain.cjs +4 -10
  95. package/src/main/lib/watchdogHelpers.cjs +12 -25
  96. package/src/main/lib/workTypeLibrary.cjs +7 -1
  97. package/src/main/projectPages.cjs +43 -13
  98. package/src/main/promptSessionEvents.cjs +37 -13
  99. package/src/main/scheduler.cjs +910 -198
  100. package/src/main/seedAgentPersonas.cjs +279 -24
  101. package/src/main/supervisor.cjs +4 -1
  102. package/src/main/templates/PRD_AUTHORING.md +126 -406
  103. package/src/preload/__tests__/preload-surface.test.cjs +68 -0
  104. package/src/preload/api.d.ts +53 -94
  105. package/src/preload/index.cjs +14 -9
  106. package/src/seed/agents/architect.md +2 -0
  107. package/src/seed/agents/demo-video-builder.md +84 -0
  108. package/src/seed/agents/dev-lead.md +18 -18
  109. package/src/seed/agents/project-home-builder.md +66 -35
  110. package/src/seed/agents/validator.md +10 -4
  111. package/dist/assets/DataModel-DCEgMTjH.js +0 -1
  112. package/dist/assets/HostBilko-CDVHE0hT.js +0 -1
  113. package/dist/assets/Permissions-BGleLja4.js +0 -3
  114. package/dist/assets/ProvenanceBadge-BFczzI1B.js +0 -1
  115. package/dist/assets/Scheduler-C_phpeUS.js +0 -16
  116. package/dist/assets/Settings-BIwZ3FGQ.js +0 -3
  117. package/src/main/__tests__/activeIndexMerge.test.cjs +0 -235
  118. package/src/main/__tests__/agentEffortResolve.test.cjs +0 -117
  119. package/src/main/__tests__/agentLibrary.test.cjs +0 -276
  120. package/src/main/__tests__/agentModelResolve.test.cjs +0 -311
  121. package/src/main/__tests__/agentOverlayWrite.test.cjs +0 -95
  122. package/src/main/__tests__/bilkoHost-deriveSlug.test.cjs +0 -26
  123. package/src/main/__tests__/bilkoHost-integration.test.cjs +0 -118
  124. package/src/main/__tests__/bilkoHostCore.test.cjs +0 -72
  125. package/src/main/__tests__/broadcastCoalescer.test.cjs +0 -122
  126. package/src/main/__tests__/chat-cancel-terminal.test.cjs +0 -120
  127. package/src/main/__tests__/chat-dead-channels.test.cjs +0 -63
  128. package/src/main/__tests__/chat-exit-close-race.test.cjs +0 -146
  129. package/src/main/__tests__/chat-mcp-consent-notice.test.cjs +0 -139
  130. package/src/main/__tests__/chat-preamble-anchors.test.cjs +0 -100
  131. package/src/main/__tests__/chat-queue.test.cjs +0 -97
  132. package/src/main/__tests__/chat-stop-signal.test.cjs +0 -89
  133. package/src/main/__tests__/chatRunner-epic-worktree-execcwd.test.cjs +0 -125
  134. package/src/main/__tests__/chatRunner-session-flag-retry.test.cjs +0 -252
  135. package/src/main/__tests__/classifyPromptTicket.test.cjs +0 -101
  136. package/src/main/__tests__/classifyTranscriptLine.test.cjs +0 -201
  137. package/src/main/__tests__/computeDepHistorySatisfaction.test.cjs +0 -66
  138. package/src/main/__tests__/config-readText-bounded.test.cjs +0 -84
  139. package/src/main/__tests__/configWriteBoundaryOwners.test.cjs +0 -59
  140. package/src/main/__tests__/crossProjectFeedback.test.cjs +0 -334
  141. package/src/main/__tests__/crossProjectFeedbackRoutes.test.cjs +0 -161
  142. package/src/main/__tests__/dep-orphan-archive-health.test.cjs +0 -77
  143. package/src/main/__tests__/develop-skill-failure-modes.test.cjs +0 -70
  144. package/src/main/__tests__/docEdit.test.cjs +0 -244
  145. package/src/main/__tests__/dod-batchkey.test.cjs +0 -183
  146. package/src/main/__tests__/dod-drain-hook.test.cjs +0 -302
  147. package/src/main/__tests__/dod-report.test.cjs +0 -304
  148. package/src/main/__tests__/dod-reverify.test.cjs +0 -285
  149. package/src/main/__tests__/epicContextDigest.test.cjs +0 -174
  150. package/src/main/__tests__/epicMint.test.cjs +0 -332
  151. package/src/main/__tests__/epicMintTelemetryTap.test.cjs +0 -64
  152. package/src/main/__tests__/epicStatusMirror.test.cjs +0 -110
  153. package/src/main/__tests__/epicValidationHook.test.cjs +0 -291
  154. package/src/main/__tests__/exchanges.test.cjs +0 -122
  155. package/src/main/__tests__/exchangesPromptId.test.cjs +0 -61
  156. package/src/main/__tests__/extractJson.test.cjs +0 -51
  157. package/src/main/__tests__/files-reject-credentials.test.cjs +0 -40
  158. package/src/main/__tests__/fixtures/1218-fo-01-move-scripts-lib-into-src-main-lib.log +0 -556
  159. package/src/main/__tests__/flatPrdTickSweep.test.cjs +0 -110
  160. package/src/main/__tests__/health-build-freshness.test.cjs +0 -39
  161. package/src/main/__tests__/health-claude-md-budget.test.cjs +0 -57
  162. package/src/main/__tests__/health-credentials.test.cjs +0 -81
  163. package/src/main/__tests__/health-delegation-chain.test.cjs +0 -124
  164. package/src/main/__tests__/health-per-project-stall.test.cjs +0 -84
  165. package/src/main/__tests__/health-prd-migration.test.cjs +0 -37
  166. package/src/main/__tests__/health-queue-dispatch.test.cjs +0 -135
  167. package/src/main/__tests__/health-starve-escalation.test.cjs +0 -94
  168. package/src/main/__tests__/health-tick-liveness.test.cjs +0 -179
  169. package/src/main/__tests__/health-usage-poller.test.cjs +0 -144
  170. package/src/main/__tests__/health-worktree-cap-blocked.test.cjs +0 -65
  171. package/src/main/__tests__/heapSnapshot.test.cjs +0 -121
  172. package/src/main/__tests__/historyAggregatorIntraday.test.cjs +0 -313
  173. package/src/main/__tests__/historyDashboard.test.cjs +0 -163
  174. package/src/main/__tests__/historyRollup.test.cjs +0 -333
  175. package/src/main/__tests__/intradayRefresh.test.cjs +0 -39
  176. package/src/main/__tests__/ipcSchemas-dependsOn.test.cjs +0 -39
  177. package/src/main/__tests__/kg-augment.test.cjs +0 -195
  178. package/src/main/__tests__/loadGateDetailTick.test.cjs +0 -31
  179. package/src/main/__tests__/machineProfile.test.cjs +0 -152
  180. package/src/main/__tests__/mcpStatus.test.cjs +0 -61
  181. package/src/main/__tests__/memoryAggregate.test.cjs +0 -109
  182. package/src/main/__tests__/memoryStale.test.cjs +0 -88
  183. package/src/main/__tests__/needsReviewLedger.test.cjs +0 -162
  184. package/src/main/__tests__/openExternalApp-spawn-error.test.cjs +0 -25
  185. package/src/main/__tests__/opsErrorLog.test.cjs +0 -109
  186. package/src/main/__tests__/opsErrorLogTelemetryTap.test.cjs +0 -173
  187. package/src/main/__tests__/personaMerge.test.cjs +0 -169
  188. package/src/main/__tests__/planValidator.test.cjs +0 -125
  189. package/src/main/__tests__/pollLoop-dispatch-on-failure.test.cjs +0 -176
  190. package/src/main/__tests__/prd-group-allocator.test.cjs +0 -119
  191. package/src/main/__tests__/prdAdminRouteParity.test.cjs +0 -70
  192. package/src/main/__tests__/prdAdminRoutes.test.cjs +0 -718
  193. package/src/main/__tests__/prdAgentType.test.cjs +0 -103
  194. package/src/main/__tests__/prdAuthoringSeed.test.cjs +0 -39
  195. package/src/main/__tests__/prdCreate.test.cjs +0 -979
  196. package/src/main/__tests__/prdCreateAdoption.test.cjs +0 -205
  197. package/src/main/__tests__/prdCreateDisposition.test.cjs +0 -201
  198. package/src/main/__tests__/prdCreatePlanId.test.cjs +0 -132
  199. package/src/main/__tests__/prdFrontmatterAgentType.test.cjs +0 -117
  200. package/src/main/__tests__/prdFrontmatterDependsOn.test.cjs +0 -136
  201. package/src/main/__tests__/prdFrontmatterDisposition.test.cjs +0 -125
  202. package/src/main/__tests__/prdFrontmatterQuietMachine.test.cjs +0 -108
  203. package/src/main/__tests__/prdLocations.test.cjs +0 -195
  204. package/src/main/__tests__/prdLocationsArchived.test.cjs +0 -201
  205. package/src/main/__tests__/prdMigration.test.cjs +0 -349
  206. package/src/main/__tests__/prdMigrationLegacyAdopt.test.cjs +0 -91
  207. package/src/main/__tests__/prdParserHighWater.test.cjs +0 -74
  208. package/src/main/__tests__/prdParserSourcePromptId.test.cjs +0 -65
  209. package/src/main/__tests__/prdSetDisposition.test.cjs +0 -222
  210. package/src/main/__tests__/prdSizing.test.cjs +0 -106
  211. package/src/main/__tests__/prdSourcePromptIdBackfill.test.cjs +0 -118
  212. package/src/main/__tests__/prdUpdateDependsOn.test.cjs +0 -160
  213. package/src/main/__tests__/proc-role-env.test.cjs +0 -125
  214. package/src/main/__tests__/procname-claude-spawn-sites.test.cjs +0 -304
  215. package/src/main/__tests__/procname-sm-processes.test.cjs +0 -127
  216. package/src/main/__tests__/projectHomeAdminRoutes.test.cjs +0 -177
  217. package/src/main/__tests__/projectPages.test.cjs +0 -137
  218. package/src/main/__tests__/promptSessionEvents.test.cjs +0 -234
  219. package/src/main/__tests__/promptSessionSchema.test.cjs +0 -101
  220. package/src/main/__tests__/promptSessionTranscript.test.cjs +0 -0
  221. package/src/main/__tests__/promptSessionsCreateEpicHandler.test.cjs +0 -159
  222. package/src/main/__tests__/pty-epic-worktree-spawn-cwd.test.cjs +0 -282
  223. package/src/main/__tests__/pty-session-open-telemetry.test.cjs +0 -96
  224. package/src/main/__tests__/pty-write-result.test.cjs +0 -46
  225. package/src/main/__tests__/queue-health-verdict.test.cjs +0 -170
  226. package/src/main/__tests__/queue-starvation-dispatch-driver.test.cjs +0 -286
  227. package/src/main/__tests__/queue-starvation-per-project.test.cjs +0 -147
  228. package/src/main/__tests__/queueHistory.test.cjs +0 -355
  229. package/src/main/__tests__/queueOps-interactive-ac-lint.test.cjs +0 -65
  230. package/src/main/__tests__/queueOpsArchiveDestination.test.cjs +0 -65
  231. package/src/main/__tests__/queueOpsAutoArchive.test.cjs +0 -211
  232. package/src/main/__tests__/rateLimitPollerStreak.test.cjs +0 -128
  233. package/src/main/__tests__/rcaReport.test.cjs +0 -266
  234. package/src/main/__tests__/reconcileFlatPrdSweep.test.cjs +0 -119
  235. package/src/main/__tests__/reconcileTiming.test.cjs +0 -135
  236. package/src/main/__tests__/runLogRetention.test.cjs +0 -489
  237. package/src/main/__tests__/runVerify-atomic-verdicts.test.cjs +0 -26
  238. package/src/main/__tests__/runVerify-blocked-by-foreign-wip.test.cjs +0 -58
  239. package/src/main/__tests__/runVerify-landed-commit-outranks.test.cjs +0 -191
  240. package/src/main/__tests__/runVerify-policy-denial.test.cjs +0 -89
  241. package/src/main/__tests__/runVerify-transcript-commit-evidence.test.cjs +0 -225
  242. package/src/main/__tests__/runVerify.test.cjs +0 -1784
  243. package/src/main/__tests__/scheduleJobSchema.test.cjs +0 -127
  244. package/src/main/__tests__/scheduleJobStatusDrift.test.cjs +0 -65
  245. package/src/main/__tests__/scheduleJobTransitions.test.cjs +0 -277
  246. package/src/main/__tests__/scheduleJobTransitionsGrep.test.cjs +0 -59
  247. package/src/main/__tests__/scheduleJobTransitionsTelemetryTap.test.cjs +0 -72
  248. package/src/main/__tests__/scheduler-admin-routes.test.cjs +0 -199
  249. package/src/main/__tests__/scheduler-adopted-run-supervision.test.cjs +0 -143
  250. package/src/main/__tests__/scheduler-already-satisfied-on-main.test.cjs +0 -105
  251. package/src/main/__tests__/scheduler-archive-completed-prd.test.cjs +0 -102
  252. package/src/main/__tests__/scheduler-archived-twin-guard.test.cjs +0 -155
  253. package/src/main/__tests__/scheduler-autofix-outcome.test.cjs +0 -188
  254. package/src/main/__tests__/scheduler-autofix-select.test.cjs +0 -439
  255. package/src/main/__tests__/scheduler-autopromote.test.cjs +0 -51
  256. package/src/main/__tests__/scheduler-bash-timeout-env.test.cjs +0 -101
  257. package/src/main/__tests__/scheduler-blocked-by-foreign-wip.test.cjs +0 -107
  258. package/src/main/__tests__/scheduler-boot-orphans.test.cjs +0 -153
  259. package/src/main/__tests__/scheduler-broadcast-reconcile.test.cjs +0 -121
  260. package/src/main/__tests__/scheduler-clear-queue-history.test.cjs +0 -134
  261. package/src/main/__tests__/scheduler-commit-guard-noop.test.cjs +0 -244
  262. package/src/main/__tests__/scheduler-committed-in-window.test.cjs +0 -182
  263. package/src/main/__tests__/scheduler-cross-project-batch.test.cjs +0 -43
  264. package/src/main/__tests__/scheduler-default-eligible-heal.test.cjs +0 -168
  265. package/src/main/__tests__/scheduler-dispatch-loop.test.cjs +0 -58
  266. package/src/main/__tests__/scheduler-effective-concurrency.test.cjs +0 -81
  267. package/src/main/__tests__/scheduler-epic-digest.test.cjs +0 -227
  268. package/src/main/__tests__/scheduler-failed-autoreset.test.cjs +0 -121
  269. package/src/main/__tests__/scheduler-finalize-dispatch-guards.test.cjs +0 -229
  270. package/src/main/__tests__/scheduler-find-prd-dir.test.cjs +0 -75
  271. package/src/main/__tests__/scheduler-fix-plan-path.test.cjs +0 -119
  272. package/src/main/__tests__/scheduler-force-tick-outcome.test.cjs +0 -46
  273. package/src/main/__tests__/scheduler-foreign-wip-manifest.test.cjs +0 -78
  274. package/src/main/__tests__/scheduler-gate-shadow.test.cjs +0 -119
  275. package/src/main/__tests__/scheduler-guard-verdict-autoresolve.test.cjs +0 -390
  276. package/src/main/__tests__/scheduler-heal-refusal.test.cjs +0 -61
  277. package/src/main/__tests__/scheduler-heartbeat-payload.test.cjs +0 -80
  278. package/src/main/__tests__/scheduler-inplace-salvage.test.cjs +0 -323
  279. package/src/main/__tests__/scheduler-integration-failure-stamp.test.cjs +0 -41
  280. package/src/main/__tests__/scheduler-investigation-clean-skip.test.cjs +0 -63
  281. package/src/main/__tests__/scheduler-investigation-prompt.test.cjs +0 -123
  282. package/src/main/__tests__/scheduler-job-budget.test.cjs +0 -172
  283. package/src/main/__tests__/scheduler-job-overrun.test.cjs +0 -175
  284. package/src/main/__tests__/scheduler-launch-failure.test.cjs +0 -199
  285. package/src/main/__tests__/scheduler-leftover-fields.test.cjs +0 -52
  286. package/src/main/__tests__/scheduler-leftover-quarantine.test.cjs +0 -199
  287. package/src/main/__tests__/scheduler-looks-done.test.cjs +0 -537
  288. package/src/main/__tests__/scheduler-manual-pause.test.cjs +0 -118
  289. package/src/main/__tests__/scheduler-mechanical-recovery.test.cjs +0 -245
  290. package/src/main/__tests__/scheduler-meta-code-sha.test.cjs +0 -46
  291. package/src/main/__tests__/scheduler-mutate-reentrancy.test.cjs +0 -117
  292. package/src/main/__tests__/scheduler-needs-review-autoresolve.test.cjs +0 -197
  293. package/src/main/__tests__/scheduler-never-stop.test.cjs +0 -157
  294. package/src/main/__tests__/scheduler-no-dead-end-status.test.cjs +0 -152
  295. package/src/main/__tests__/scheduler-no-orphan-run-dir.test.cjs +0 -81
  296. package/src/main/__tests__/scheduler-notify-originating-tab-transcript.test.cjs +0 -87
  297. package/src/main/__tests__/scheduler-notify-originating-tab.test.cjs +0 -343
  298. package/src/main/__tests__/scheduler-periodic-reverify-guard.test.cjs +0 -217
  299. package/src/main/__tests__/scheduler-porcelain-rename.test.cjs +0 -164
  300. package/src/main/__tests__/scheduler-prd-missing-skip.test.cjs +0 -161
  301. package/src/main/__tests__/scheduler-prd-persona-spawn.test.cjs +0 -178
  302. package/src/main/__tests__/scheduler-quarantine-autoresolve.test.cjs +0 -165
  303. package/src/main/__tests__/scheduler-quiet-machine-lease.test.cjs +0 -257
  304. package/src/main/__tests__/scheduler-rate-limit-cooldown-freshness.test.cjs +0 -123
  305. package/src/main/__tests__/scheduler-rate-limit-pause.test.cjs +0 -152
  306. package/src/main/__tests__/scheduler-rate-limit-spin-guard.test.cjs +0 -156
  307. package/src/main/__tests__/scheduler-reap-dead-running-jobs.test.cjs +0 -754
  308. package/src/main/__tests__/scheduler-reaper-helpers-basics.test.cjs +0 -87
  309. package/src/main/__tests__/scheduler-reconcile-cwd-preserve.test.cjs +0 -100
  310. package/src/main/__tests__/scheduler-reconcile-history-backfill.test.cjs +0 -105
  311. package/src/main/__tests__/scheduler-reconcile-invalid-repair.test.cjs +0 -203
  312. package/src/main/__tests__/scheduler-reconcile-quarantine.test.cjs +0 -247
  313. package/src/main/__tests__/scheduler-reset-job-fields-guard.test.cjs +0 -77
  314. package/src/main/__tests__/scheduler-resume-recovery.test.cjs +0 -254
  315. package/src/main/__tests__/scheduler-shard-quarantine.test.cjs +0 -115
  316. package/src/main/__tests__/scheduler-shared-tree-guard.test.cjs +0 -380
  317. package/src/main/__tests__/scheduler-sigterm-commit.test.cjs +0 -43
  318. package/src/main/__tests__/scheduler-stall-per-project.test.cjs +0 -126
  319. package/src/main/__tests__/scheduler-starve-escalation.test.cjs +0 -154
  320. package/src/main/__tests__/scheduler-stranded-autofix-park.test.cjs +0 -252
  321. package/src/main/__tests__/scheduler-stranded-investigation.test.cjs +0 -185
  322. package/src/main/__tests__/scheduler-stuck-failed-escalation.test.cjs +0 -136
  323. package/src/main/__tests__/scheduler-supervisor-record.test.cjs +0 -81
  324. package/src/main/__tests__/scheduler-tick-cancel-token.test.cjs +0 -54
  325. package/src/main/__tests__/scheduler-tick-wedge.test.cjs +0 -172
  326. package/src/main/__tests__/scheduler-transient-failure.test.cjs +0 -141
  327. package/src/main/__tests__/scheduler-unreadable-queue-guard.test.cjs +0 -62
  328. package/src/main/__tests__/scheduler-utilization-hold.test.cjs +0 -89
  329. package/src/main/__tests__/scheduler-verify-prd-path.test.cjs +0 -109
  330. package/src/main/__tests__/scheduler-worktree-cap-defer.test.cjs +0 -234
  331. package/src/main/__tests__/scheduler-worktree-exec-cwd.test.cjs +0 -120
  332. package/src/main/__tests__/scheduler-writeprd-epic-rollback.test.cjs +0 -105
  333. package/src/main/__tests__/schedulerBatchRootBlocker.test.cjs +0 -117
  334. package/src/main/__tests__/schedulerStateSidecarRestore.test.cjs +0 -110
  335. package/src/main/__tests__/seedAgentPersonas.test.cjs +0 -184
  336. package/src/main/__tests__/seedSchedulerMcp.test.cjs +0 -211
  337. package/src/main/__tests__/seedStatus.test.cjs +0 -100
  338. package/src/main/__tests__/seedValidatorPersona.test.cjs +0 -116
  339. package/src/main/__tests__/stop-signal-anchor.test.cjs +0 -75
  340. package/src/main/__tests__/telemetryClient.test.cjs +0 -1055
  341. package/src/main/__tests__/telemetryContract.test.cjs +0 -930
  342. package/src/main/__tests__/telemetrySettings.test.cjs +0 -210
  343. package/src/main/__tests__/transcripts-batch-flush.test.cjs +0 -249
  344. package/src/main/__tests__/transcripts-doFlush-array.test.cjs +0 -124
  345. package/src/main/__tests__/transcripts-paged-reads.test.cjs +0 -241
  346. package/src/main/__tests__/transcripts-worktree-epic-path.test.cjs +0 -154
  347. package/src/main/__tests__/transcriptsUsageFor.test.cjs +0 -206
  348. package/src/main/__tests__/uniquePrdNumbers.test.cjs +0 -153
  349. package/src/main/__tests__/usageSingleFlight.test.cjs +0 -169
  350. package/src/main/__tests__/validationSentinels.test.cjs +0 -84
  351. package/src/main/__tests__/workTypeLibrary.test.cjs +0 -89
  352. package/src/main/bilkoHost.cjs +0 -314
  353. package/src/main/bilkoHostCore.cjs +0 -89
  354. package/src/main/lib/__tests__/active-sessions.test.cjs +0 -251
  355. package/src/main/lib/__tests__/activeIndexRebuild.test.cjs +0 -179
  356. package/src/main/lib/__tests__/agentPersonaSchema.test.cjs +0 -67
  357. package/src/main/lib/__tests__/auditLog.test.cjs +0 -38
  358. package/src/main/lib/__tests__/bootSelfHeal.test.cjs +0 -107
  359. package/src/main/lib/__tests__/branchSweep.test.cjs +0 -164
  360. package/src/main/lib/__tests__/buildIdentity.test.cjs +0 -121
  361. package/src/main/lib/__tests__/buildTarget.test.cjs +0 -52
  362. package/src/main/lib/__tests__/childWithLog.test.cjs +0 -321
  363. package/src/main/lib/__tests__/coldBootPromptSessionsWrite.test.cjs +0 -87
  364. package/src/main/lib/__tests__/crashTelemetry.test.cjs +0 -103
  365. package/src/main/lib/__tests__/credentials-futile-refresh.test.cjs +0 -115
  366. package/src/main/lib/__tests__/cwdClassify.test.cjs +0 -111
  367. package/src/main/lib/__tests__/definitionOfDoneSequence.test.cjs +0 -95
  368. package/src/main/lib/__tests__/delegationReadiness.test.cjs +0 -1175
  369. package/src/main/lib/__tests__/dispatchLoop.test.cjs +0 -63
  370. package/src/main/lib/__tests__/effectiveModelInfo.test.cjs +0 -244
  371. package/src/main/lib/__tests__/ephemeralCwd.test.cjs +0 -91
  372. package/src/main/lib/__tests__/epicDelegationStats.test.cjs +0 -137
  373. package/src/main/lib/__tests__/epicSpawnCwd.test.cjs +0 -283
  374. package/src/main/lib/__tests__/epicSpawnPlan.test.cjs +0 -196
  375. package/src/main/lib/__tests__/epicTranscriptPath.test.cjs +0 -163
  376. package/src/main/lib/__tests__/epicWorktreeBoot.test.cjs +0 -136
  377. package/src/main/lib/__tests__/epicWorktreeMerge.test.cjs +0 -130
  378. package/src/main/lib/__tests__/epicWorktreeMint.test.cjs +0 -117
  379. package/src/main/lib/__tests__/epicWorktreeProjectConfig.test.cjs +0 -137
  380. package/src/main/lib/__tests__/fixChainDepth.test.cjs +0 -40
  381. package/src/main/lib/__tests__/fixtures/204-mercury-steam-horse.log.txt +0 -13
  382. package/src/main/lib/__tests__/fixtures/scheduler-machine.json.corrupt-1789147548 +0 -34
  383. package/src/main/lib/__tests__/gateFixtures.json +0 -20
  384. package/src/main/lib/__tests__/gitCacheBound.test.cjs +0 -69
  385. package/src/main/lib/__tests__/gitWorktree.test.cjs +0 -1478
  386. package/src/main/lib/__tests__/gitWorktreeSalvage.test.cjs +0 -107
  387. package/src/main/lib/__tests__/gitWorktreeSalvageDelta.test.cjs +0 -153
  388. package/src/main/lib/__tests__/guardShims.test.cjs +0 -158
  389. package/src/main/lib/__tests__/importReferences.spec.cjs +0 -56
  390. package/src/main/lib/__tests__/instanceLock.test.cjs +0 -173
  391. package/src/main/lib/__tests__/jobSupervisorRecord.test.cjs +0 -78
  392. package/src/main/lib/__tests__/jobWorktree.test.cjs +0 -199
  393. package/src/main/lib/__tests__/jobWorktreeBootLive.test.cjs +0 -82
  394. package/src/main/lib/__tests__/landedSinceRun.test.cjs +0 -133
  395. package/src/main/lib/__tests__/launchFailure.test.cjs +0 -220
  396. package/src/main/lib/__tests__/loadGate.test.cjs +0 -303
  397. package/src/main/lib/__tests__/localAdminHttp.test.cjs +0 -214
  398. package/src/main/lib/__tests__/loopDelay.test.cjs +0 -68
  399. package/src/main/lib/__tests__/mcpToolCatalog.test.cjs +0 -107
  400. package/src/main/lib/__tests__/modelCatalog.test.cjs +0 -202
  401. package/src/main/lib/__tests__/opsOwnership.test.cjs +0 -113
  402. package/src/main/lib/__tests__/opsRootAbsoluteCwd.test.cjs +0 -328
  403. package/src/main/lib/__tests__/opsRootNestedWrite.test.cjs +0 -51
  404. package/src/main/lib/__tests__/opsRootResolve.test.cjs +0 -149
  405. package/src/main/lib/__tests__/prdDeclaredPaths.test.cjs +0 -82
  406. package/src/main/lib/__tests__/prdDisposition.test.cjs +0 -224
  407. package/src/main/lib/__tests__/procIdentity.test.cjs +0 -119
  408. package/src/main/lib/__tests__/procName.test.cjs +0 -92
  409. package/src/main/lib/__tests__/projectBriefCore.test.cjs +0 -216
  410. package/src/main/lib/__tests__/projectRootResolve.test.cjs +0 -148
  411. package/src/main/lib/__tests__/queueHealth.test.cjs +0 -58
  412. package/src/main/lib/__tests__/queueStoreAtomicWrite.test.cjs +0 -88
  413. package/src/main/lib/__tests__/queueStoreMachineStateRecovery.test.cjs +0 -190
  414. package/src/main/lib/__tests__/quietMachineLease.test.cjs +0 -39
  415. package/src/main/lib/__tests__/rateLimitWindow.test.cjs +0 -88
  416. package/src/main/lib/__tests__/reaperHelpers.test.cjs +0 -577
  417. package/src/main/lib/__tests__/schedulerBatchDepends.test.cjs +0 -312
  418. package/src/main/lib/__tests__/schedulerBatchFairness.test.cjs +0 -213
  419. package/src/main/lib/__tests__/schedulerBatchLaunchHold.test.cjs +0 -125
  420. package/src/main/lib/__tests__/schedulerBatchProjectCap.test.cjs +0 -127
  421. package/src/main/lib/__tests__/schedulerBatchQuietMachine.test.cjs +0 -109
  422. package/src/main/lib/__tests__/schedulerMcpServerHeadlessRefusal.test.cjs +0 -71
  423. package/src/main/lib/__tests__/schedulerMcpServerHelp.test.cjs +0 -216
  424. package/src/main/lib/__tests__/schedulerMcpServerProjectHome.test.cjs +0 -183
  425. package/src/main/lib/__tests__/schedulerPaths.test.cjs +0 -226
  426. package/src/main/lib/__tests__/schedulerPathsWorktree.test.cjs +0 -133
  427. package/src/main/lib/__tests__/schedulerRuntimeState.test.cjs +0 -56
  428. package/src/main/lib/__tests__/sessionSlots.test.cjs +0 -144
  429. package/src/main/lib/__tests__/telemetryBacklog.test.cjs +0 -626
  430. package/src/main/lib/__tests__/telemetryBoot.test.cjs +0 -134
  431. package/src/main/lib/__tests__/telemetryConsent.test.cjs +0 -136
  432. package/src/main/lib/__tests__/telemetryCounters.test.cjs +0 -57
  433. package/src/main/lib/__tests__/telemetryCountersMetadataColumn.test.cjs +0 -98
  434. package/src/main/lib/__tests__/terminalRunOutcome.test.cjs +0 -200
  435. package/src/main/lib/__tests__/toolUseClassify.test.cjs +0 -53
  436. package/src/main/lib/__tests__/updateCheck.test.cjs +0 -63
  437. package/src/main/lib/__tests__/upgradeDrain.test.cjs +0 -130
  438. package/src/main/lib/__tests__/usageCircuit.test.cjs +0 -354
  439. package/src/main/lib/__tests__/watchdog-helpers.test.cjs +0 -441
  440. package/src/main/lib/__tests__/watchdog-relaunch.test.cjs +0 -266
  441. package/src/main/lib/kgExchangePairing.cjs +0 -75
@@ -0,0 +1,68 @@
1
+ /**
2
+ * preload-surface.test.cjs — guards against a declared api.d.ts method with
3
+ * no matching contextBridge expose in preload/index.cjs (the gap this PRD
4
+ * closes: installSelfScheduleGuard was declared in api.d.ts and handled in
5
+ * index.cjs, but never exposed on the preload bridge, so the renderer could
6
+ * never actually call it).
7
+ *
8
+ * Outside an Electron runtime, `require('electron')` resolves to a path
9
+ * string (see node_modules/electron/index.js), not {contextBridge,
10
+ * ipcRenderer} — and vi.mock('electron') does not reliably intercept a
11
+ * plain require() of an npm package from a .cjs test file under this
12
+ * project's vitest setup. So this stubs 'electron' directly in Node's
13
+ * require cache before requiring preload/index.cjs, which is the real
14
+ * module under test here.
15
+ *
16
+ * Run: timeout 120 npx vitest run src/preload/__tests__/preload-surface.test.cjs
17
+ */
18
+
19
+ 'use strict';
20
+
21
+ import { test, beforeAll } from 'vitest';
22
+ const assert = require('node:assert/strict');
23
+
24
+ let exposedApi;
25
+ const invokeCalls = [];
26
+
27
+ const electronPath = require.resolve('electron');
28
+ require.cache[electronPath] = {
29
+ id: electronPath,
30
+ filename: electronPath,
31
+ loaded: true,
32
+ exports: {
33
+ contextBridge: {
34
+ exposeInMainWorld: (_name, api) => { exposedApi = api; },
35
+ },
36
+ ipcRenderer: {
37
+ invoke: (channel, payload) => {
38
+ invokeCalls.push({ channel, payload });
39
+ return Promise.resolve({ ok: true });
40
+ },
41
+ send: () => {},
42
+ on: () => {},
43
+ removeListener: () => {},
44
+ },
45
+ },
46
+ };
47
+
48
+ beforeAll(() => {
49
+ require('../index.cjs');
50
+ });
51
+
52
+ test('exposes installSelfScheduleGuard, wired to app:install-self-schedule-guard', async () => {
53
+ assert.strictEqual(typeof exposedApi.app.installSelfScheduleGuard, 'function');
54
+ await exposedApi.app.installSelfScheduleGuard('/tmp/proj');
55
+ const call = invokeCalls.find((c) => c.channel === 'app:install-self-schedule-guard');
56
+ assert.ok(call, 'expected an invoke call on app:install-self-schedule-guard');
57
+ assert.deepStrictEqual(call.payload, { cwd: '/tmp/proj' });
58
+ });
59
+
60
+ test('schedule.resetJob sends cwd only when given', async () => {
61
+ invokeCalls.length = 0;
62
+ await exposedApi.schedule.resetJob('my-slug');
63
+ await exposedApi.schedule.resetJob('my-slug', '/tmp/proj');
64
+ const calls = invokeCalls.filter((c) => c.channel === 'schedule:reset-job');
65
+ assert.strictEqual(calls.length, 2);
66
+ assert.deepStrictEqual(calls[0].payload, { slug: 'my-slug' });
67
+ assert.deepStrictEqual(calls[1].payload, { slug: 'my-slug', cwd: '/tmp/proj' });
68
+ });
@@ -1,13 +1,5 @@
1
1
  import type { PromptSession } from '../renderer/state/promptSessions';
2
2
 
3
- export interface BuildTarget {
4
- registry: string;
5
- packageName: string;
6
- versionBumpPolicy: string;
7
- gates: string[];
8
- discovered?: boolean;
9
- }
10
-
11
3
  export interface ActionOutcome {
12
4
  ok: boolean;
13
5
  kind?: 'info' | 'warn' | 'error';
@@ -240,7 +232,36 @@ export interface McpCatalogResult {
240
232
  /** Mirrors WorkType (src/main/lib/workTypeLibrary.cjs) / EpicTag (tagLibrary.ts) — the
241
233
  * same Epic-mission taxonomy, reused here since an Agent persona's `tags` field is that
242
234
  * same concept, not a free-form string list. */
243
- export type AgentPersonaTag = 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder' | 'bilko-host-publisher';
235
+ export type AgentPersonaTag = 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder';
236
+
237
+ /** One user-defined sidebar HOT KEYS macro (macroLibrary.cjs). `projects` = absolute cwds or `'*'` (every project). */
238
+ export interface Macro {
239
+ id: string;
240
+ label: string;
241
+ agentName: string;
242
+ tag: AgentPersonaTag;
243
+ prompt: string;
244
+ projects: string[];
245
+ /** Which strip shows this macro. Defaults to `'sessions'` when absent. */
246
+ surface: 'sessions' | 'project-home';
247
+ /** True for a seeded, machine-authored macro (e.g. the built-in Project Home actions). */
248
+ builtin?: boolean;
249
+ /** Bumped by the seed when a builtin macro's definition changes, to reseed it. */
250
+ builtinVersion?: number;
251
+ createdAt: string;
252
+ updatedAt: string;
253
+ }
254
+
255
+ /** Omit `id` to create; set it to update an existing macro. */
256
+ export interface MacroSaveInput {
257
+ id?: string;
258
+ label: string;
259
+ agentName: string;
260
+ tag: AgentPersonaTag;
261
+ prompt: string;
262
+ projects?: string[];
263
+ surface?: 'sessions' | 'project-home';
264
+ }
244
265
 
245
266
  /** One global `~/.claude/agents/<name>.md` persona, per the Agent Library nav page. */
246
267
  export interface AgentPersona {
@@ -264,6 +285,8 @@ export interface AgentPersona {
264
285
  /** "<Department> — <Human title>" (e.g. "Engineering — Architect"), free text — drives
265
286
  * department grouping in the New Epic Agent picker. Optional/null when not set. */
266
287
  title?: string | null;
288
+ /** Bundled-persona version stamp (seedAgentPersonas.cjs). Null for a persona that was never seeded, or has no stamp. */
289
+ seedVersion?: number | null;
267
290
  path: string;
268
291
  body: string;
269
292
  /** Project names (basename of cwd) whose currently-open tab overlays this agent. */
@@ -293,6 +316,8 @@ export interface AgentPersonaSaveInput {
293
316
  title?: string;
294
317
  /** Open project name: write that project's frontmatter-only override (only `model`/`effort` are used) instead of the global file. */
295
318
  projectName?: string;
319
+ /** Bundled-persona version stamp (seedAgentPersonas.cjs). Omit to carry over the existing file's stamp unchanged. */
320
+ seedVersion?: number;
296
321
  body: string;
297
322
  }
298
323
 
@@ -1307,76 +1332,8 @@ export interface ProjectPagesGetResult {
1307
1332
  html: string | null;
1308
1333
  /** home.html's mtime, or null when `html` is null. */
1309
1334
  mtimeMs: number | null;
1310
- }
1311
-
1312
- // ────────────────────────────────────────────── Host on Bilko.run
1313
- export interface BilkoHostBundleManifest {
1314
- schemaVersion: 1;
1315
- slug: string;
1316
- version: string;
1317
- builtAt: string;
1318
- gitSha: string;
1319
- gitBranch: string;
1320
- hostKit: { version: string };
1321
- golden: { path: string; expect: string };
1322
- health: Record<string, unknown>;
1323
- bundle: { sizeBytesGz: number; fileCount: number };
1324
- /** Not part of the host-contract schema itself — this app's own staleness bookkeeping (see BilkoHostGetResult.bundleStale). */
1325
- documentCount: number;
1326
- documents: Array<{ subpath: string; title: string }>;
1327
- }
1328
-
1329
- export type BilkoHostPublishStatus =
1330
- | 'not-published'
1331
- | 'bundle-ready'
1332
- | 'publishing'
1333
- | 'published'
1334
- | 'publish-failed';
1335
-
1336
- export interface BilkoHostPublishState {
1337
- status: BilkoHostPublishStatus;
1338
- slug: string;
1339
- url?: string;
1340
- lastAttemptAt?: string;
1341
- lastError?: string;
1342
- }
1343
-
1344
- export type BilkoHostDocumentSource =
1345
- | { kind: 'project-page-lens'; lens: 'home' | 'marketing' | 'feature' | 'architecture' }
1346
- | { kind: 'file'; path: string };
1347
-
1348
- export interface BilkoHostDocument {
1349
- id: string;
1350
- /** '' for the root document (dist/index.html); otherwise a '/'-joined lowercase-kebab path, e.g. 'special-doc/01'. */
1351
- subpath: string;
1352
- title: string;
1353
- source: BilkoHostDocumentSource;
1354
- addedAt: string;
1355
- /** Where this document resolves once published, given the project's current/derived slug. */
1356
- url: string;
1357
- }
1358
-
1359
- export interface BilkoHostGetResult {
1360
- hasMarketingPage: boolean;
1361
- projectName: string;
1362
- packagePrivate: boolean;
1363
- packageHomepage: string | null;
1364
- packageVersion: string;
1365
- defaultSlug: string;
1366
- documents: BilkoHostDocument[];
1367
- /** True when the on-disk dist/ bundle doesn't reflect the current document list — Prepare Bundle (then Publish) is owed. */
1368
- bundleStale: boolean;
1369
- bundleManifest: BilkoHostBundleManifest | null;
1370
- publishState: BilkoHostPublishState | null;
1371
- }
1372
-
1373
- export interface BilkoHostPrepareBundleResult {
1374
- distPath: string;
1375
- manifest: BilkoHostBundleManifest;
1376
- }
1377
-
1378
- export interface BilkoHostDocumentListResult {
1379
- documents: Array<Omit<BilkoHostDocument, 'url'>>;
1335
+ /** project-pages/demo-video/index.html's absolute path + mtime, or null when it does not exist. Load it via smfile:// — never pass its HTML across IPC. */
1336
+ demoVideo: { path: string; mtimeMs: number } | null;
1380
1337
  }
1381
1338
 
1382
1339
  // ────────────────────────────────────────────── Per-subagent memory
@@ -1489,7 +1446,7 @@ export interface ChatCreatePrdPayload {
1489
1446
  /** Originating tab id — used at job completion to route a status prompt back into the tab. */
1490
1447
  sourceTabId?: string;
1491
1448
  /** User-selected Feature/Bug tag (PRD 774) carried from the originating PromptTicket. */
1492
- tag?: 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder' | 'bilko-host-publisher';
1449
+ tag?: 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder';
1493
1450
  }
1494
1451
 
1495
1452
  export type ChatCreatePrdResult =
@@ -1531,6 +1488,9 @@ export interface ChatRunToolUseEvent {
1531
1488
  label: string;
1532
1489
  /** Populated only for Edit/Write tool_use blocks; undefined for every other kind. */
1533
1490
  diff?: { filePath: string; oldText?: string; newText?: string };
1491
+ /** The tool_use input's command/description/pattern/file_path, whichever applies —
1492
+ * empty string when the tool took none of those. */
1493
+ detail?: string;
1534
1494
  }
1535
1495
 
1536
1496
  export interface ChatRunNeedsInputEvent {
@@ -1580,8 +1540,6 @@ export interface SessionManagerAPI {
1580
1540
  engageRulesPath: () => Promise<string | null>;
1581
1541
  pickDirectory: () => Promise<string | null>;
1582
1542
  gitBranch: (cwd: string) => Promise<string | null>;
1583
- /** Publish target for 'build'-tagged Epics — null disables the Build toolbar button. */
1584
- resolveBuildTarget: (cwd: string) => Promise<BuildTarget | null>;
1585
1543
  /** Default: request a drain-first restart. `force: true` restarts immediately, killing running jobs. */
1586
1544
  rebootApp: (opts?: { force?: boolean }) => void;
1587
1545
  testFireHook: (args: TestFireHookArgs) => Promise<TestFireHookResult>;
@@ -1708,6 +1666,15 @@ export interface SessionManagerAPI {
1708
1666
  /** Fires after any save/delete/removeOverride — subscribers should re-fetch listPersonas(). */
1709
1667
  onChanged: (handler: () => void) => () => void;
1710
1668
  };
1669
+ macros: {
1670
+ list: () => Promise<Macro[]>;
1671
+ save: (payload: MacroSaveInput) => Promise<Macro>;
1672
+ delete: (payload: { id: string }) => Promise<{ ok: boolean }>;
1673
+ /** Add/remove one project cwd. A macro shown in every project (`'*'`) cannot be narrowed: `{ ok: false, error: 'macro is shown in every project' }`. */
1674
+ setProject: (payload: { id: string; cwd: string; enabled: boolean }) => Promise<{ ok: true; macro: Macro } | { ok: false; error: string }>;
1675
+ /** Fires after any save/delete/setProject — re-fetch list(). */
1676
+ onChanged: (handler: () => void) => () => void;
1677
+ };
1711
1678
  models: {
1712
1679
  /** Live model/effort catalog (`modelCatalog.cjs`'s `resolveModelCatalog`). Never rejects from
1713
1680
  * the resolver itself — a failed probe degrades down cache → floor and sets `degraded`.
@@ -1855,7 +1822,9 @@ export interface SessionManagerAPI {
1855
1822
  min: number; max: number; default: number; envOverride: boolean;
1856
1823
  }>;
1857
1824
  setConfig: (partial: Partial<ScheduleConfig & { supervisor?: Partial<SupervisorConfig> }>) => Promise<{ ok: boolean; config: ScheduleConfig }>;
1858
- resetJob: (slug: string) => Promise<{ ok: boolean; error?: string }>;
1825
+ /** `cwd`, when given, narrows the match to that project's job row — two
1826
+ * different projects can independently produce the identical slug. */
1827
+ resetJob: (slug: string, cwd?: string) => Promise<{ ok: boolean; error?: string }>;
1859
1828
  runNow: () => Promise<{ ok: boolean }>;
1860
1829
  forceTick: () => Promise<ActionOutcome>;
1861
1830
  pause: () => Promise<{ ok: boolean }>;
@@ -1968,16 +1937,6 @@ export interface SessionManagerAPI {
1968
1937
  /** Fires whenever a watched cwd's home.html is added/changed/removed, carrying the freshly read result. */
1969
1938
  onChanged: (handler: (payload: { cwd: string } & ProjectPagesGetResult) => void) => () => void;
1970
1939
  };
1971
- bilkoHost: {
1972
- /** Read compatibility-gate inputs + any existing bundle/publish state. Never fires an LLM call. */
1973
- get: (cwd: string) => Promise<BilkoHostGetResult>;
1974
- /** Stage A: rebuild the whole dist/ tree + dist/manifest.json from the current document list. Pure, no cost, idempotent. */
1975
- prepareBundle: (cwd: string, slug: string) => Promise<BilkoHostPrepareBundleResult>;
1976
- /** Add a hosted sub-path document (never the root, which always exists). Does not touch dist/ — Prepare Bundle picks it up. */
1977
- addDocument: (cwd: string, subpath: string, title: string, source: BilkoHostDocumentSource) => Promise<BilkoHostDocumentListResult>;
1978
- /** Remove a hosted document (never the root). Only updates documents.json — the file stays live until the next Prepare Bundle + Publish. */
1979
- removeDocument: (cwd: string, id: string) => Promise<BilkoHostDocumentListResult>;
1980
- };
1981
1940
  promptSessionTranscript: {
1982
1941
  /** Append one full-text turn to an Epic's durable JSONL transcript. Best-effort — resolves `{ok:false}` rather than throwing on failure. */
1983
1942
  append: (
@@ -2116,7 +2075,7 @@ export interface PromptSessionsMergeActiveIndexResult {
2116
2075
  export interface PromptSessionsCreateEpicPayload {
2117
2076
  cwd: string;
2118
2077
  goalText: string;
2119
- tag?: 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder' | 'bilko-host-publisher';
2078
+ tag?: 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder';
2120
2079
  agentType?: string;
2121
2080
  /** Per-Epic model/effort overrides (New Session card); omitted = the persona's own. */
2122
2081
  model?: string;
@@ -9,7 +9,6 @@ contextBridge.exposeInMainWorld('api', {
9
9
  engageRulesPath: () => ipcRenderer.invoke('app:engage-rules-path'),
10
10
  pickDirectory: () => ipcRenderer.invoke('app:pick-directory'),
11
11
  gitBranch: (cwd) => ipcRenderer.invoke('app:git-branch', { cwd }),
12
- resolveBuildTarget: (cwd) => ipcRenderer.invoke('build:resolve-target', { cwd }),
13
12
  rebootApp: (opts) => ipcRenderer.send('app:reboot-app', opts),
14
13
  archiveProject: (encoded) => ipcRenderer.invoke('app:archive-project', { encoded }),
15
14
  testFireHook: (args) => ipcRenderer.invoke('app:test-fire-hook', args),
@@ -27,6 +26,7 @@ contextBridge.exposeInMainWorld('api', {
27
26
  installPrdWriteGuard: (cwd) => ipcRenderer.invoke('app:install-prd-write-guard', { cwd }),
28
27
  installDestructiveGitGuard: (cwd) => ipcRenderer.invoke('app:install-destructive-git-guard', { cwd }),
29
28
  installInlineImplementationGuard: (cwd) => ipcRenderer.invoke('app:install-inline-implementation-guard', { cwd }),
29
+ installSelfScheduleGuard: (cwd) => ipcRenderer.invoke('app:install-self-schedule-guard', { cwd }),
30
30
  onNewSession: (handler) => {
31
31
  const listener = () => handler();
32
32
  ipcRenderer.on('app:new-session', listener);
@@ -117,6 +117,18 @@ contextBridge.exposeInMainWorld('api', {
117
117
  return () => ipcRenderer.removeListener('agents:changed', listener);
118
118
  },
119
119
  },
120
+ macros: {
121
+ list: () => ipcRenderer.invoke('macros:list'),
122
+ save: (payload) => ipcRenderer.invoke('macros:save', payload),
123
+ delete: (payload) => ipcRenderer.invoke('macros:delete', payload),
124
+ setProject: (payload) => ipcRenderer.invoke('macros:set-project', payload),
125
+ // Fired after any save/delete/set-project so every subscriber re-fetches list().
126
+ onChanged: (handler) => {
127
+ const listener = () => handler();
128
+ ipcRenderer.on('macros:changed', listener);
129
+ return () => ipcRenderer.removeListener('macros:changed', listener);
130
+ },
131
+ },
120
132
  models: {
121
133
  catalog: (payload) => ipcRenderer.invoke('models:catalog', payload),
122
134
  },
@@ -239,7 +251,7 @@ contextBridge.exposeInMainWorld('api', {
239
251
  worktreeBase: () => ipcRenderer.invoke('schedule:worktree-base'),
240
252
  setSessionSlots: (cap) => ipcRenderer.invoke('schedule:set-session-slots', { cap }),
241
253
  setConfig: (partial) => ipcRenderer.invoke('schedule:set-config', partial),
242
- resetJob: (slug) => ipcRenderer.invoke('schedule:reset-job', { slug }),
254
+ resetJob: (slug, cwd) => ipcRenderer.invoke('schedule:reset-job', cwd ? { slug, cwd } : { slug }),
243
255
  runNow: () => ipcRenderer.invoke('schedule:run-now'),
244
256
  forceTick: () => ipcRenderer.invoke('schedule:force-tick'),
245
257
  pause: () => ipcRenderer.invoke('schedule:pause'),
@@ -336,13 +348,6 @@ contextBridge.exposeInMainWorld('api', {
336
348
  return () => ipcRenderer.removeListener('project-pages:changed', listener);
337
349
  },
338
350
  },
339
- bilkoHost: {
340
- get: (cwd) => ipcRenderer.invoke('bilko-host:get', { cwd }),
341
- prepareBundle: (cwd, slug) => ipcRenderer.invoke('bilko-host:prepare-bundle', { cwd, slug }),
342
- addDocument: (cwd, subpath, title, source) =>
343
- ipcRenderer.invoke('bilko-host:add-document', { cwd, subpath, title, source }),
344
- removeDocument: (cwd, id) => ipcRenderer.invoke('bilko-host:remove-document', { cwd, id }),
345
- },
346
351
  promptSessionTranscript: {
347
352
  append: (cwd, epicId, turn) =>
348
353
  ipcRenderer.invoke('promptSessionTranscript:append', { cwd, epicId, ...turn }),
@@ -3,8 +3,10 @@ name: architect
3
3
  description: The primary Actor for an Epic's whole interactive conversation — owns overall plan and decomposition, clarifies scope, searches before building, decomposes work into scheduled PRDs via /develop, tracks them to completion, and verifies before calling anything done. Never implements a PRD itself — that's dev-lead's job, one PRD at a time, headless. Task-type framing is the Epic's Mission tag's job, not this persona's.
4
4
  tools: Read, Grep, Glob, Bash, Edit, Write
5
5
  model: opus
6
+ effort: medium
6
7
  tags: feature, bug, discussion
7
8
  title: Engineering — Architect
9
+ seedVersion: 2
8
10
  ---
9
11
 
10
12
  You are the architect. You are the one Actor a human talks to for the whole life of an Epic's
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: demo-video-builder
3
+ description: 30-second self-contained HTML/JS demo video for Project Home, saved via project_demo_video_write.
4
+ tools: Read, Grep, Glob, Bash, Write, Edit
5
+ title: 'Project Home — Demo Video'
6
+ model: sonnet
7
+ effort: medium
8
+ seedVersion: 1
9
+ ---
10
+
11
+ You are the demo-video-builder. You make a 30-second animated demo that shows someone what this
12
+ project is for and what it does best. It plays inside Project Home and may later be
13
+ screen-recorded, so it must be deterministic — the same frame at the same time, every run.
14
+
15
+ <context>
16
+ You run inside a Session Manager Epic for the target project. The HTML you produce is rendered
17
+ inside a sandboxed frame in that project's Project Home tab, triggered by a human pressing the
18
+ Demo Video button — never automatically and never in a loop — so this run is the one chance to
19
+ get it right before a person watches it.
20
+ </context>
21
+
22
+ <grounding_rules>
23
+ Ground every goal and feature you show in something you read: the project's manifest
24
+ (`package.json`, `pyproject.toml`, or equivalent), its README or docs, its source tree, or its
25
+ git log. If you can't point to where a claim came from, leave it out rather than guess — a
26
+ shorter video is far better than one with an invented feature. Never invent metrics, logos,
27
+ testimonials, or UI screenshots. Where the project already describes itself well (a tagline, a
28
+ feature list, a mission statement), reuse its own wording instead of paraphrasing.
29
+ </grounding_rules>
30
+
31
+ <storyboard>
32
+ Before writing any code, write a 5-7 scene storyboard with timings that sum to exactly 30
33
+ seconds:
34
+
35
+ 1. Title card — the project's name and a one-line purpose.
36
+ 2. The problem it solves.
37
+ 3-6. One scene per key feature (3 to 4 features), each a short caption plus a simple animated
38
+ diagram or kinetic type built from shapes, SVG, or canvas — never a fake screenshot.
39
+ 7. Closing card — the project's name and how to get started (the real command).
40
+
41
+ Keep every caption at 12 words or fewer, and hold each scene on screen long enough to read twice.
42
+ </storyboard>
43
+
44
+ <output_contract>
45
+ Produce exactly one complete HTML document:
46
+ - All CSS and JS live inline, in a single `<style>` block and a single `<script>` block — no
47
+ `<script src="...">`, no `<link href="http...">`, no `@import`, and no `url(http...)`.
48
+ - `<head>` includes `<meta name="sm-demo-duration" content="30">`.
49
+ - A 16:9 stage, 1280x720 logical pixels, scaled to fit the viewport with letterboxing.
50
+ - A single clock drives every scene via `requestAnimationFrame` — no per-scene timers of their
51
+ own, so seeking is exact.
52
+ - Expose `window.smDemo = { duration: 30, seek(t), play(), pause() }`, where `seek(t)` renders
53
+ the exact frame for time `t` in seconds, independent of whatever played before it.
54
+ - Autoplays once on load; shows play/pause, restart, and a progress bar.
55
+ - No audio.
56
+ - No network: no `fetch`, `XMLHttpRequest`, `WebSocket`, `import()`, or `<iframe>`. No external
57
+ fonts or images — system font stack only, and any images as `data:` URIs.
58
+ - Respects `prefers-reduced-motion` by rendering the scenes as a static, steppable storyboard
59
+ instead of animating them.
60
+ - Under 2 MB total.
61
+ - A light/dark neutral palette with sufficient contrast in both.
62
+ </output_contract>
63
+
64
+ <process>
65
+ 1. Read, with a bounded pass: the manifest, the README or top-level docs index, the top-level
66
+ directory tree, and `git log --oneline -30` for a sense of recent direction. Stop once you
67
+ have enough to describe the project honestly.
68
+ 2. Write the claims list: for every goal or feature you plan to show, note the source you read
69
+ it from. Drop anything without a source.
70
+ 3. Write the storyboard per `<storyboard>`, with scene timings summing to exactly 30 seconds.
71
+ 4. Build the HTML per `<output_contract>`.
72
+ 5. Self-check before saving: scene durations sum to 30, every caption traces to a claim in your
73
+ list, and the document contains none of the forbidden network APIs.
74
+ 6. Call `project_demo_video_write` exactly once with `{ html }`. It validates the document and
75
+ writes it as the project's Demo Video.
76
+ 7. Report back the storyboard as one short list — scene, timing, and the claim behind it.
77
+ </process>
78
+
79
+ <when_things_fail>
80
+ If `project_demo_video_write` rejects the HTML, fix the specific problem it reported and call it
81
+ again — up to 3 attempts total. If `project_demo_video_write` isn't available in this session at
82
+ all, say so plainly and stop; don't try to build a workaround or any tooling of your own in the
83
+ target project.
84
+ </when_things_fail>
@@ -3,7 +3,9 @@ name: dev-lead
3
3
  description: Executes exactly one already-scoped PRD at a time, headless, start to finish — reads the PRD's Goal/Acceptance Criteria/Implementation notes and standards.md, implements it, verifies against its own AC, and reports. Has no visibility into the overall plan — that's architect's job. This is the default persona a scheduled PRD runs as: the scheduler resolves a PRD's `agentType` frontmatter field (default `dev-lead`) to this file and launches the headless executor AS this persona via `--append-system-prompt`.
4
4
  tools: Read, Grep, Glob, Bash, Edit, Write
5
5
  model: sonnet
6
+ effort: medium
6
7
  title: Engineering — Software Engineer
8
+ seedVersion: 3
7
9
  ---
8
10
 
9
11
  You are dev-lead. You execute one PRD — nothing above it, nothing beyond it. You don't decide
@@ -25,24 +27,22 @@ points you at), and the project's own files.
25
27
 
26
28
  ## Run contract (execute in this order — the scheduler grades you on it)
27
29
 
28
- 0. ORIENT (≤ 8 tool calls): read the PRD's `Read first:` files and ONLY those. Do not survey the repo.
29
- 1. RED: write or extend the named test so it fails for the right reason. Run it once, captured: `<test cmd> 2>&1 | tail -20 || true`.
30
- 2. BUILD: make exactly the changes the AC names. Touch no file the PRD does not name unless the build breaks without it — then say so in the report.
31
- 3. GATE: run the PRD's single gate line, `timeout`-wrapped, in the foreground, as the LAST command of the run. Red → fix it or `exit 1`; never continue on red.
32
- 4. COMMIT: `git add <exact paths>` then `git commit -m "<type>(<scope>): <summary>"`. Never `git add -A` / `git add .`; never stash, reset, checkout or clean anything you did not create.
33
- 5. VERDICT: last line `SCHEDULER_VERDICT: PASS` only if step 3 was green AND step 4 landed; otherwise `SCHEDULER_VERDICT: FAIL <reason>` and `exit 1`.
34
-
35
- Verifier traps — each has parked a green run before:
36
- - Absence checks: `if grep …; then echo HALT; exit 1; fi; echo clean` — a bare no-match grep exits 1 and reads as an error.
37
- - Expected failures (a red test, a probe) run EARLY and captured; nothing may error after the gate.
38
- - A probe that errors: re-run it corrected at once, or print `# expected/handled: <why>` on the next line.
39
- - A `timeout` exit 124 you expected: branch on 124 and print OK; never leave a bare 124.
40
- - Never background a verification, never call ScheduleWakeup/Monitor/agents, never invoke /develop or queue work — this process has no next turn.
41
- - `gh pr checks` exits 8 while pending: wrap it and annotate; poll with the identical command each time.
42
- - Retry a transient failure with the SAME command text so the verifier pairs the recovery with the failure.
43
-
44
- Out of contract: anything past the AC list. If the PRD looks wrong, do the AC as written and say why in the report.
45
- Reasoning for every line above: `standards.md` (the PRD names its path) — consult one section when a line here is unclear; do not re-read it every run.
30
+ 0. ORIENT. Make at most 8 tool calls. Read the PRD's `# Files` section and the `Read first:` list in its implementation notes, then read those files, before anything else. Why: the PRD already decided what you need; re-surveying the repo burns the call budget for nothing.
31
+ 1. RED. Write or extend the test the PRD names so it fails for the right reason. Run it once, early, and capture the output: `timeout 120 <test cmd> 2>&1 | tail -20 || true`. Why: a captured red run proves the test checks the change before your fix makes it green. If the PRD changes only docs or config and names no test, skip this step.
32
+ 2. BUILD. Change only the files listed in `# Files`. If you need another file, change it and say why in your report. Why: an edit outside the list collides with another PRD's own edit to that file.
33
+ 3. FINISH. Follow the SCHEDULER FINISH PROTOCOL at the end of your prompt — do not run the gate, commit, or print a verdict yourself outside it. That protocol runs the `# Gate` commands in order, commits with exact paths, and prints the scheduler's own last line, `SCHEDULER_VERDICT: PASS`, only when the gate came back green and the commit landed.
34
+
35
+ Verifier traps — each one has parked a green run before:
36
+ - A bare absence check reads as an error. Write it `if grep …; then echo HALT; exit 1; fi; echo clean` so a clean result exits 0.
37
+ - Run an expected failure (a red test, a probe) early and capture its output. Nothing may error after the gate runs.
38
+ - When a probe errors, re-run it corrected at once, or print `# expected/handled: <why>` on the next line. Never leave an unexplained error in the transcript.
39
+ - A `timeout` that exits 124 as expected still needs a branch: print OK on 124, never leave a bare 124 in the output.
40
+ - Never call ScheduleWakeup or Monitor, never start background work, never invoke /develop or queue work. The finish protocol's review steps are the only exception: run them in the foreground.
41
+ - `gh pr checks` exits 8 while a run is still pending. Wrap it, annotate the exit code, and poll with the identical command each time.
42
+ - Retry a transient failure with the exact same command text, so the verifier can pair the recovery with the failure it recovered from.
43
+
44
+ Out of contract: anything past the Acceptance Criteria list. If the PRD looks wrong, do the AC as written anyway and say why in your report — don't expand or redesign it yourself.
45
+ `standards.md` (the PRD names its path) carries the reasoning behind every line above. Open the one section you need; don't re-read the whole file every run.
46
46
 
47
47
  ## What you don't do
48
48
 
@@ -3,40 +3,71 @@ name: project-home-builder
3
3
  description: Reads a project and writes ONE self-contained overview page (home.html) for its Project Home tab, then saves it with a single project_home_write call.
4
4
  tools: Read, Grep, Glob, Bash, Write, Edit
5
5
  title: Project Home — Builder
6
+ model: sonnet
7
+ effort: medium
8
+ seedVersion: 2
6
9
  ---
7
10
 
8
- You are the project-home-builder. Your whole job is to read the real project and produce a single
9
- self-contained HTML overview page, then hand it to the app with one `project_home_write` call.
10
-
11
- ## What the page is
12
-
13
- One overview page for a person opening this project for the first time. It covers:
14
-
15
- - **What it is** — a one- or two-sentence description of the project.
16
- - **Who it's for** — the audience or user the project serves.
17
- - **Structure** — the main directories/modules and what each one does.
18
- - **How to run it** — the real install / build / start steps.
19
- - **Key commands** — the commands a contributor actually uses (test, lint, build, etc.).
20
-
21
- ## Hard rules
22
-
23
- - **Never fabricate.** Every claim must trace to something you read in the project: its README,
24
- manifest (`package.json`, `pyproject.toml`, ...), source tree, docs, or git history. An omitted
25
- section beats an invented one — no invented stats, quotes, screenshots, or features.
26
- - **Read before you write.** Explore the repo itself (tree, manifest, docs, recent git log) first.
27
- - **Self-contained HTML only.** One complete HTML document with all CSS inline in a `<style>` block.
28
- No `<script src>`, no `<link href="http...">`, no `@import`, no `url(http...)`, no external fonts
29
- or images. Keep it under 1 MB. Support both light and dark color schemes.
30
- - **Cost-gated, manual only.** Run once per explicit "Generate" / "Regenerate" request — never
31
- automatically, never in a loop.
32
-
33
- ## Protocol
34
-
35
- 1. Read the project: manifest, README/docs, directory structure, key scripts, recent commits.
36
- 2. Compose the single HTML document described above.
37
- 3. Call `project_home_write` exactly once with `{ html }`. It validates the document and writes it as
38
- the project's Project Home page.
39
- 4. If the tool rejects the HTML, fix the reported problem and call it again; if
40
- `project_home_write` is unavailable in this session, report that plainly and stop — do not build
41
- any tooling in the target project as a workaround.
42
- 5. Report in one or two lines what the page covers.
11
+ You are the project-home-builder. The page you produce is often the first thing a person sees
12
+ when they open this project — they will read it as the project's own description of itself, so
13
+ every sentence on it needs to be something you actually verified by reading the project, not
14
+ something that sounds plausible.
15
+
16
+ <context>
17
+ You run inside a Session Manager Epic for the target project. The HTML you produce is rendered
18
+ inside a sandboxed frame in that project's Project Home tab. It is only regenerated when a human
19
+ deliberately presses the Project Home button — never automatically and never in a loop — so this
20
+ run is the one chance to get it right before a person reads it.
21
+ </context>
22
+
23
+ <grounding_rules>
24
+ Ground every claim in something you read: the project's manifest (`package.json`,
25
+ `pyproject.toml`, or equivalent), its README or docs, its source tree, or its git log. If you
26
+ can't point to where a claim came from, leave it out rather than guess — an omitted section is
27
+ far better than an invented one. Never invent statistics, quotes, screenshots, or features that
28
+ don't exist. Where the project already describes itself well (a tagline, a feature list, a
29
+ mission statement), reuse its own wording instead of paraphrasing.
30
+ </grounding_rules>
31
+
32
+ <page_contents>
33
+ Cover, in whatever order reads best for this specific project:
34
+
35
+ - What it is — a one- or two-sentence description, in the project's own terms where possible.
36
+ - Who it's for — the audience or user the project serves.
37
+ - Key features — 3 to 6 of them, each one tied to a real module, file, or doc you found.
38
+ - Structure — the main directories or modules and what each one does.
39
+ - How to run it — the real install / build / start steps, taken from the README or manifest scripts.
40
+ - Key commands — the commands a contributor actually uses (test, lint, build, etc.).
41
+ </page_contents>
42
+
43
+ <output_contract>
44
+ Produce exactly one complete HTML document:
45
+ - All CSS lives inline in a single `<style>` block — no `<script src="...">`, no
46
+ `<link href="http...">`, no `@import`, and no `url(http...)`.
47
+ - No external fonts or images; nothing the browser needs to fetch over the network.
48
+ - Under 1 MB total.
49
+ - Support both light and dark viewing via `prefers-color-scheme` — pick colors that read well in
50
+ both without needing a toggle.
51
+ - Use semantic headings (`h1`, `h2`, ...) so the page has a real outline, and keep text readable
52
+ at a 1000px-wide viewport.
53
+ </output_contract>
54
+
55
+ <process>
56
+ 1. Read, with a bounded pass: the manifest, the README or top-level docs index, the top-level
57
+ directory tree, and `git log --oneline -30` for a sense of recent direction. Stop once you have
58
+ enough to describe the project honestly — you don't need to read every file.
59
+ 2. Draft a claims list: for every fact you plan to put on the page, note the source you read it
60
+ from.
61
+ 3. Drop any claim from that list that doesn't have a source next to it.
62
+ 4. Compose the HTML page from what's left, following `<page_contents>` and `<output_contract>`.
63
+ 5. Call `project_home_write` exactly once with `{ html }`. It validates the document and writes
64
+ it as the project's Project Home page.
65
+ 6. Report back in one or two lines what the page covers.
66
+ </process>
67
+
68
+ <when_things_fail>
69
+ If `project_home_write` rejects the HTML, fix the specific problem it reported and call it again
70
+ — up to 3 attempts total. If `project_home_write` isn't available in this session at all, say so
71
+ plainly and stop; don't try to build a workaround or any tooling of your own in the target
72
+ project.
73
+ </when_things_fail>