@doxbrix/doxloop 0.1.5 → 0.2.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 (357) hide show
  1. package/CHANGELOG.md +1145 -0
  2. package/README.md +422 -227
  3. package/assets/doxbrix-preview.css +77 -15
  4. package/contracts/agent-events-v1.schema.json +1 -0
  5. package/contracts/coverage-v1.schema.json +59 -0
  6. package/contracts/drift-v1.schema.json +1 -0
  7. package/contracts/evaluation-v1.schema.json +62 -0
  8. package/contracts/quality-codes-v1.json +1 -0
  9. package/contracts/quality-report-v1.schema.json +1 -0
  10. package/contracts/validation-v1.schema.json +1 -0
  11. package/dist/agent-failure.d.ts +36 -0
  12. package/dist/agent-failure.js +98 -0
  13. package/dist/agent-isolation.d.ts +17 -0
  14. package/dist/agent-isolation.js +94 -0
  15. package/dist/agent-log.d.ts +197 -0
  16. package/dist/agent-log.js +1094 -0
  17. package/dist/agent-process.d.ts +63 -0
  18. package/dist/agent-process.js +128 -0
  19. package/dist/agent-reply.d.ts +47 -0
  20. package/dist/agent-reply.js +315 -0
  21. package/dist/agents.d.ts +24 -5
  22. package/dist/agents.js +60 -9
  23. package/dist/api-coverage.d.ts +11 -0
  24. package/dist/api-coverage.js +72 -0
  25. package/dist/application-probe.d.ts +28 -0
  26. package/dist/application-probe.js +93 -0
  27. package/dist/application-url.d.ts +14 -0
  28. package/dist/application-url.js +26 -0
  29. package/dist/args.js +15 -0
  30. package/dist/artifact-deploy.d.ts +9 -0
  31. package/dist/artifact-deploy.js +28 -8
  32. package/dist/assets.d.ts +72 -0
  33. package/dist/assets.js +382 -0
  34. package/dist/auth.d.ts +10 -0
  35. package/dist/auth.js +38 -9
  36. package/dist/author.d.ts +206 -4
  37. package/dist/author.js +1650 -52
  38. package/dist/authoring-batches.d.ts +190 -0
  39. package/dist/authoring-batches.js +489 -0
  40. package/dist/authoring-postpass.d.ts +79 -0
  41. package/dist/authoring-postpass.js +1289 -0
  42. package/dist/authoring-progress.d.ts +95 -0
  43. package/dist/authoring-progress.js +269 -0
  44. package/dist/autosync.d.ts +56 -0
  45. package/dist/autosync.js +442 -0
  46. package/dist/batch-artifacts.d.ts +81 -0
  47. package/dist/batch-artifacts.js +412 -0
  48. package/dist/batch-limits.d.ts +37 -0
  49. package/dist/batch-limits.js +80 -0
  50. package/dist/branding.d.ts +41 -0
  51. package/dist/branding.js +229 -0
  52. package/dist/bundle-upload.d.ts +26 -0
  53. package/dist/bundle-upload.js +99 -0
  54. package/dist/capture-auth.d.ts +95 -0
  55. package/dist/capture-auth.js +204 -0
  56. package/dist/capture.d.ts +48 -0
  57. package/dist/capture.js +20 -1
  58. package/dist/cli.js +839 -32
  59. package/dist/content-links.d.ts +10 -0
  60. package/dist/content-links.js +49 -0
  61. package/dist/contract-validation.d.ts +4 -0
  62. package/dist/contract-validation.js +25 -0
  63. package/dist/coverage-actions.d.ts +8 -0
  64. package/dist/coverage-actions.js +71 -0
  65. package/dist/coverage-resolutions.d.ts +16 -0
  66. package/dist/coverage-resolutions.js +58 -0
  67. package/dist/db.d.ts +37 -0
  68. package/dist/db.js +288 -0
  69. package/dist/demo.d.ts +12 -0
  70. package/dist/demo.js +122 -0
  71. package/dist/deploy-credentials.d.ts +7 -0
  72. package/dist/deploy-credentials.js +76 -0
  73. package/dist/deploy-targets/github-pages.d.ts +3 -0
  74. package/dist/deploy-targets/github-pages.js +100 -0
  75. package/dist/deploy-targets/index.d.ts +8 -0
  76. package/dist/deploy-targets/index.js +78 -0
  77. package/dist/deploy-targets/netlify.d.ts +3 -0
  78. package/dist/deploy-targets/netlify.js +49 -0
  79. package/dist/deploy-targets/types.d.ts +32 -0
  80. package/dist/deploy-targets/types.js +2 -0
  81. package/dist/deploy-targets/vercel.d.ts +3 -0
  82. package/dist/deploy-targets/vercel.js +95 -0
  83. package/dist/deploy.d.ts +9 -0
  84. package/dist/deploy.js +87 -13
  85. package/dist/deterministic-capture.d.ts +90 -0
  86. package/dist/deterministic-capture.js +435 -0
  87. package/dist/direct-edit.d.ts +40 -0
  88. package/dist/direct-edit.js +159 -0
  89. package/dist/docs-crawl.d.ts +86 -0
  90. package/dist/docs-crawl.js +536 -0
  91. package/dist/docs-site.d.ts +49 -0
  92. package/dist/docs-site.js +233 -0
  93. package/dist/doctor.js +8 -0
  94. package/dist/documentation-collections.d.ts +23 -0
  95. package/dist/documentation-collections.js +191 -0
  96. package/dist/documentation-plan.d.ts +253 -0
  97. package/dist/documentation-plan.js +2563 -0
  98. package/dist/doxbrix-build.d.ts +19 -0
  99. package/dist/doxbrix-build.js +167 -0
  100. package/dist/doxbrix-markdown.d.ts +9 -0
  101. package/dist/doxbrix-markdown.js +115 -14
  102. package/dist/drift.d.ts +10 -0
  103. package/dist/drift.js +164 -0
  104. package/dist/evaluation.d.ts +46 -0
  105. package/dist/evaluation.js +113 -0
  106. package/dist/evidence-pack.d.ts +47 -0
  107. package/dist/evidence-pack.js +358 -0
  108. package/dist/evidence.d.ts +25 -0
  109. package/dist/evidence.js +175 -0
  110. package/dist/fs.d.ts +8 -2
  111. package/dist/fs.js +41 -11
  112. package/dist/generator-api.d.ts +89 -0
  113. package/dist/generator-preflight.d.ts +27 -0
  114. package/dist/generator-preflight.js +105 -0
  115. package/dist/generator-runtime.d.ts +7 -0
  116. package/dist/generator-runtime.js +17 -1
  117. package/dist/generators.d.ts +24 -2
  118. package/dist/generators.js +54 -1
  119. package/dist/git-delivery.d.ts +17 -0
  120. package/dist/git-delivery.js +123 -0
  121. package/dist/globs.d.ts +16 -0
  122. package/dist/globs.js +65 -0
  123. package/dist/glossary.d.ts +26 -0
  124. package/dist/glossary.js +179 -0
  125. package/dist/history.d.ts +106 -0
  126. package/dist/history.js +600 -0
  127. package/dist/html-markdown.d.ts +46 -0
  128. package/dist/html-markdown.js +423 -0
  129. package/dist/interactive.js +3 -0
  130. package/dist/job-events.d.ts +74 -0
  131. package/dist/job-events.js +377 -0
  132. package/dist/keep-awake.d.ts +50 -0
  133. package/dist/keep-awake.js +123 -0
  134. package/dist/local-source-snapshot.d.ts +20 -0
  135. package/dist/local-source-snapshot.js +61 -0
  136. package/dist/mintlify-detect.d.ts +3 -0
  137. package/dist/mintlify-detect.js +18 -0
  138. package/dist/mintlify-import.d.ts +75 -0
  139. package/dist/mintlify-import.js +190 -0
  140. package/dist/navigation.d.ts +98 -0
  141. package/dist/navigation.js +310 -0
  142. package/dist/openapi.d.ts +60 -0
  143. package/dist/openapi.js +439 -0
  144. package/dist/page-editor-bridge.d.ts +3 -0
  145. package/dist/page-editor-bridge.js +109 -0
  146. package/dist/page-editor-preview.d.ts +10 -0
  147. package/dist/page-editor-preview.js +55 -0
  148. package/dist/page-extension.d.ts +9 -0
  149. package/dist/page-extension.js +15 -0
  150. package/dist/page-metadata.d.ts +28 -0
  151. package/dist/page-metadata.js +166 -0
  152. package/dist/page-operations.d.ts +34 -0
  153. package/dist/page-operations.js +215 -0
  154. package/dist/page-routes.d.ts +4 -0
  155. package/dist/page-routes.js +61 -0
  156. package/dist/pages.d.ts +20 -0
  157. package/dist/pages.js +184 -0
  158. package/dist/plan-generator.d.ts +3 -0
  159. package/dist/plan-generator.js +21 -0
  160. package/dist/plan-navigation.d.ts +11 -0
  161. package/dist/plan-navigation.js +30 -0
  162. package/dist/planning-captures.d.ts +20 -0
  163. package/dist/planning-captures.js +143 -0
  164. package/dist/planning-research.d.ts +135 -0
  165. package/dist/planning-research.js +472 -0
  166. package/dist/planning-triage.d.ts +23 -0
  167. package/dist/planning-triage.js +131 -0
  168. package/dist/preview.d.ts +24 -0
  169. package/dist/preview.js +280 -29
  170. package/dist/project-detect.d.ts +36 -0
  171. package/dist/project-detect.js +251 -0
  172. package/dist/project-import.d.ts +54 -0
  173. package/dist/project-import.js +157 -0
  174. package/dist/project-lock.d.ts +6 -0
  175. package/dist/project-lock.js +96 -0
  176. package/dist/project-registry.d.ts +25 -0
  177. package/dist/project-registry.js +79 -0
  178. package/dist/project.d.ts +35 -3
  179. package/dist/project.js +388 -38
  180. package/dist/prompts.d.ts +9 -0
  181. package/dist/prompts.js +25 -0
  182. package/dist/proposal-replay.d.ts +32 -0
  183. package/dist/proposal-replay.js +99 -0
  184. package/dist/quality-claims.d.ts +8 -0
  185. package/dist/quality-claims.js +168 -0
  186. package/dist/quality-config.d.ts +5 -0
  187. package/dist/quality-config.js +84 -0
  188. package/dist/quality-contract.d.ts +37 -0
  189. package/dist/quality-contract.js +46 -0
  190. package/dist/quality-examples.d.ts +4 -0
  191. package/dist/quality-examples.js +233 -0
  192. package/dist/quality-gates.d.ts +16 -0
  193. package/dist/quality-gates.js +192 -0
  194. package/dist/quality-links.d.ts +7 -0
  195. package/dist/quality-links.js +149 -0
  196. package/dist/quality-lint.d.ts +6 -0
  197. package/dist/quality-lint.js +124 -0
  198. package/dist/quality-rendered.d.ts +11 -0
  199. package/dist/quality-rendered.js +222 -0
  200. package/dist/quality-schema.d.ts +3 -0
  201. package/dist/quality-schema.js +71 -0
  202. package/dist/release-notes.d.ts +44 -0
  203. package/dist/release-notes.js +183 -0
  204. package/dist/remote-monitor.d.ts +16 -0
  205. package/dist/remote-monitor.js +74 -0
  206. package/dist/remote-source.d.ts +34 -0
  207. package/dist/remote-source.js +426 -0
  208. package/dist/review-diff.d.ts +82 -0
  209. package/dist/review-diff.js +400 -0
  210. package/dist/review-learning.d.ts +11 -0
  211. package/dist/review-learning.js +60 -0
  212. package/dist/review-render.d.ts +38 -0
  213. package/dist/review-render.js +224 -0
  214. package/dist/review-report.d.ts +9 -0
  215. package/dist/review-report.js +89 -0
  216. package/dist/review-ui.d.ts +14 -0
  217. package/dist/review-ui.js +1248 -0
  218. package/dist/schedule.d.ts +78 -0
  219. package/dist/schedule.js +480 -0
  220. package/dist/screen-capture-provider.d.ts +52 -0
  221. package/dist/screen-capture-provider.js +218 -0
  222. package/dist/screenshot-workflow.d.ts +167 -0
  223. package/dist/screenshot-workflow.js +1237 -0
  224. package/dist/settings.d.ts +1 -1
  225. package/dist/settings.js +95 -7
  226. package/dist/site-export.d.ts +18 -0
  227. package/dist/site-export.js +87 -0
  228. package/dist/source-connectors.d.ts +33 -0
  229. package/dist/source-connectors.js +268 -0
  230. package/dist/source-discovery.d.ts +132 -0
  231. package/dist/source-discovery.js +823 -0
  232. package/dist/source-intelligence.d.ts +9 -0
  233. package/dist/source-intelligence.js +306 -0
  234. package/dist/sync-review.d.ts +28 -0
  235. package/dist/sync-review.js +264 -0
  236. package/dist/sync-runs.d.ts +192 -0
  237. package/dist/sync-runs.js +2244 -0
  238. package/dist/sync.d.ts +35 -0
  239. package/dist/sync.js +298 -32
  240. package/dist/text-diff.d.ts +9 -0
  241. package/dist/text-diff.js +59 -0
  242. package/dist/types.d.ts +946 -1
  243. package/dist/ui/assets/doxloop-logo-light-De7Nx7j7.png +0 -0
  244. package/dist/ui/assets/index-BHBYU2aG.css +1 -0
  245. package/dist/ui/assets/index-Cq3RPQiC.js +33 -0
  246. package/dist/ui/index.html +18 -0
  247. package/dist/ui-server.d.ts +83 -0
  248. package/dist/ui-server.js +3532 -0
  249. package/dist/usage-budget.d.ts +28 -0
  250. package/dist/usage-budget.js +90 -0
  251. package/dist/validation.d.ts +25 -1
  252. package/dist/validation.js +312 -26
  253. package/dist/workspace-tools.d.ts +54 -0
  254. package/dist/workspace-tools.js +123 -0
  255. package/docs/agent-compatibility.md +49 -32
  256. package/docs/ci-and-automation.md +105 -66
  257. package/docs/doxbrix-http-api.md +8 -1
  258. package/docs/existing-documentation.md +80 -0
  259. package/docs/generation-performance.md +108 -0
  260. package/docs/generator-authoring.md +68 -5
  261. package/docs/generator-selection.md +50 -13
  262. package/docs/mintlify-import.md +71 -0
  263. package/docs/openapi-security.md +25 -0
  264. package/docs/project-format.md +331 -36
  265. package/docs/release-quality.md +158 -0
  266. package/docs/releasing.md +72 -0
  267. package/docs/review-workflows.md +51 -0
  268. package/docs/security-model.md +102 -39
  269. package/docs/troubleshooting.md +226 -93
  270. package/package.json +46 -15
  271. package/scripts/test-auto-screenshot.mjs +172 -0
  272. package/skills/doxloop-authoring/SKILL.md +242 -361
  273. package/skills/doxloop-authoring/references/existing-documentation.md +94 -0
  274. package/skills/doxloop-authoring/references/navigation-architecture.md +18 -7
  275. package/skills/doxloop-authoring/references/page-depth.md +169 -0
  276. package/skills/doxloop-authoring/references/project-format.md +106 -7
  277. package/skills/doxloop-authoring/references/quality.md +10 -0
  278. package/skills/doxloop-authoring/references/screenshot-manifest.md +113 -0
  279. package/skills/doxloop-authoring/references/screenshots.md +149 -235
  280. package/skills/doxloop-authoring/references/workflows.md +76 -0
  281. package/skills/doxloop-doxbrix/SKILL.md +38 -22
  282. package/skills/doxloop-doxbrix/references/api-endpoints.md +15 -14
  283. package/skills/doxloop-doxbrix/references/components.md +30 -3
  284. package/skills/doxloop-doxbrix/references/manifest.md +3 -2
  285. package/vendor/doxbrix-import/LICENSE +202 -0
  286. package/vendor/doxbrix-import/README.md +17 -0
  287. package/vendor/doxbrix-import/UPSTREAM.json +47 -0
  288. package/vendor/doxbrix-import/dist/docs/frontmatter.d.ts +13 -0
  289. package/vendor/doxbrix-import/dist/docs/frontmatter.js +83 -0
  290. package/vendor/doxbrix-import/dist/docs/import.d.ts +21 -0
  291. package/vendor/doxbrix-import/dist/docs/import.js +147 -0
  292. package/vendor/doxbrix-import/dist/docs/manifest.d.ts +163 -0
  293. package/vendor/doxbrix-import/dist/docs/manifest.js +64 -0
  294. package/vendor/doxbrix-import/dist/docs/project.d.ts +25 -0
  295. package/vendor/doxbrix-import/dist/docs/project.js +77 -0
  296. package/vendor/doxbrix-import/dist/docs/starter.d.ts +4 -0
  297. package/vendor/doxbrix-import/dist/docs/starter.js +11 -0
  298. package/vendor/doxbrix-import/dist/importer.d.ts +227 -0
  299. package/vendor/doxbrix-import/dist/importer.js +1567 -0
  300. package/vendor/doxbrix-import/dist/mintlify-openapi.d.ts +37 -0
  301. package/vendor/doxbrix-import/dist/mintlify-openapi.js +305 -0
  302. package/vendor/doxbrix-import/dist/safe-path.d.ts +9 -0
  303. package/vendor/doxbrix-import/dist/safe-path.js +47 -0
  304. package/dist/agents.d.ts.map +0 -1
  305. package/dist/agents.js.map +0 -1
  306. package/dist/args.d.ts.map +0 -1
  307. package/dist/args.js.map +0 -1
  308. package/dist/artifact-deploy.d.ts.map +0 -1
  309. package/dist/artifact-deploy.js.map +0 -1
  310. package/dist/auth.d.ts.map +0 -1
  311. package/dist/auth.js.map +0 -1
  312. package/dist/author.d.ts.map +0 -1
  313. package/dist/author.js.map +0 -1
  314. package/dist/capture.d.ts.map +0 -1
  315. package/dist/capture.js.map +0 -1
  316. package/dist/cli.d.ts.map +0 -1
  317. package/dist/cli.js.map +0 -1
  318. package/dist/deploy.d.ts.map +0 -1
  319. package/dist/deploy.js.map +0 -1
  320. package/dist/deployment-visibility.d.ts.map +0 -1
  321. package/dist/deployment-visibility.js.map +0 -1
  322. package/dist/doctor.d.ts.map +0 -1
  323. package/dist/doctor.js.map +0 -1
  324. package/dist/doxbrix-markdown.d.ts.map +0 -1
  325. package/dist/doxbrix-markdown.js.map +0 -1
  326. package/dist/errors.d.ts.map +0 -1
  327. package/dist/errors.js.map +0 -1
  328. package/dist/fs.d.ts.map +0 -1
  329. package/dist/fs.js.map +0 -1
  330. package/dist/generator-api.d.ts.map +0 -1
  331. package/dist/generator-api.js.map +0 -1
  332. package/dist/generator-manager.d.ts.map +0 -1
  333. package/dist/generator-manager.js.map +0 -1
  334. package/dist/generator-runtime.d.ts.map +0 -1
  335. package/dist/generator-runtime.js.map +0 -1
  336. package/dist/generators.d.ts.map +0 -1
  337. package/dist/generators.js.map +0 -1
  338. package/dist/interactive.d.ts.map +0 -1
  339. package/dist/interactive.js.map +0 -1
  340. package/dist/preview.d.ts.map +0 -1
  341. package/dist/preview.js.map +0 -1
  342. package/dist/progress.d.ts.map +0 -1
  343. package/dist/progress.js.map +0 -1
  344. package/dist/project.d.ts.map +0 -1
  345. package/dist/project.js.map +0 -1
  346. package/dist/prompts.d.ts.map +0 -1
  347. package/dist/prompts.js.map +0 -1
  348. package/dist/settings.d.ts.map +0 -1
  349. package/dist/settings.js.map +0 -1
  350. package/dist/sync.d.ts.map +0 -1
  351. package/dist/sync.js.map +0 -1
  352. package/dist/types.d.ts.map +0 -1
  353. package/dist/types.js.map +0 -1
  354. package/dist/validation.d.ts.map +0 -1
  355. package/dist/validation.js.map +0 -1
  356. package/dist/version.d.ts.map +0 -1
  357. package/dist/version.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,1151 @@ uses semantic versioning after its first stable release.
5
5
 
6
6
  ## Unreleased
7
7
 
8
+ ## 0.2.0 - 2026-09-27
9
+
10
+ ### Changed
11
+
12
+ - **Docs get the spaces the plan asks for again.** Since authoring moved to
13
+ batches, Doxloop builds the navigation, but plan sections never said which
14
+ space they belong to, so most pages landed in the first space and planned
15
+ spaces were dropped as empty (a 23 Sept Memos plan with three spaces came
16
+ out with one and a half). Each plan section now names its space, older
17
+ plans get one by name ("APIs" → "API & integrations"), and missing spaces
18
+ are created in the plan's order. Replaying that run gives all three.
19
+ - **Setup checks what used to fail a first run.** The wizard picks a signed-in
20
+ assistant, says plainly when one is signed out (with the command to fix it
21
+ or a one-click switch), starts at reasoning "high" with screenshots on,
22
+ refuses reasoning values the model does not offer, and keeps unfinished
23
+ answers as a draft (never passwords or tokens).
24
+ - **Sign-in pages are detected.** "Check page" opens the app in a headless
25
+ browser, so a single-page app that sends visitors to `/auth` or
26
+ `/_/#/login` is reported, sign-in is switched on and its route filled in;
27
+ "Continue without signing in" stays available and tells the planner not to
28
+ ask for credentials. Hash-routed app URLs such as `https://host/_/#/` are
29
+ accepted again.
30
+ - **Plans and runs fail with the agent's real reason.** Planning and retries
31
+ check the assistant's sign-in first; a failed plan shows the agent's own
32
+ error and offers "Retry with" another assistant. Codex and Claude sessions
33
+ run with only Doxloop's tools, and the computer stays awake while a job runs
34
+ (`DOXLOOP_KEEP_AWAKE=0` turns it off).
35
+ - **Quieter, more honest screens.** Form help moved into info tooltips; the
36
+ plan page warns when few guides will have screenshots and gives a rough
37
+ time and token estimate; review counts agree, coverage reads "Screenshots
38
+ in 2 of 41 guides", and the apply dialog closes when it is done. The live
39
+ log hides colour codes, raw JSON replies, and stdin noise.
40
+ - **Consistent output.** Pages are always `.mdx` for Doxbrix, sections are not
41
+ split into one-page duplicate groups, regex text is no longer read as a
42
+ link, a leftover starter page is removed instead of rewritten, and missing
43
+ parameter examples no longer start agent fix sessions when the endpoint
44
+ already has a request sample.
45
+
46
+ - **A batch that writes nothing is no longer reported as finished.** On 21
47
+ Sept 2026 a 34-page Uptime Kuma run wrote 16 pages: five of its nine batch
48
+ sessions hung waiting for the model, were stopped at their 16-minute cap,
49
+ and — because Codex exits 0 when stopped — were counted as complete. The
50
+ final check then deleted every link to the 18 unwritten pages and the run
51
+ reported success. A batch is now judged by which planned files it actually
52
+ wrote (compared with their content before the session): missing pages are
53
+ retried once in a fresh session, and pages still missing fail the run with
54
+ their names, so "Retry" continues with only the unfinished pages.
55
+ - **A silent session is stopped after six minutes, not sixteen.** Every
56
+ session has an inactivity watchdog: when the agent prints nothing for
57
+ `DOXLOOP_AGENT_IDLE_MINUTES` (default 6, 0 disables it), the session is
58
+ stopped and the batch retries in a fresh session instead of waiting for
59
+ the wall-clock cap. Writers are also told to save each page as soon as it
60
+ is complete, so a stopped session keeps the pages it finished.
61
+ - **Two batch sessions at a time by default, not three.** All three model
62
+ streams in flight hung at the same second in the run above;
63
+ `DOXLOOP_AUTHORING_PARALLEL` still raises the number.
64
+ - **Accepting one file of a new site's proposal works.** Accepting a single
65
+ page before the proposal's navigation and starter-page replacements failed
66
+ with "starter-content" and "unnavigated-page" errors on files the reviewer
67
+ had not accepted yet. Errors that the not-yet-accepted part of the same
68
+ proposal resolves no longer block; the rest still do.
69
+ - **Answering a plan's questions no longer regenerates the whole plan.** A
70
+ revision used to return the entire plan again (five minutes to apply three
71
+ answers on a 34-page plan). The reviser now returns only the pages it
72
+ changed as a patch that Doxloop merges into the existing plan, answered
73
+ questions are removed deterministically, and an unreachable capture
74
+ application is a warning for a revision rather than a failed job.
75
+ - **Broken links to pages the same proposal still adds do not block a
76
+ partial accept either**, and the authoring progress never reads "36 of
77
+ 32": the count is capped at the planned total. Writers are told to create
78
+ pages as whole-file adds and rewrite existing pages whole, after
79
+ line-level hunks against long prose failed Codex's patch verification in
80
+ every real run.
81
+ - **Smaller evidence packs.** Per-batch packs are capped near 60 KB
82
+ (fewer, shorter excerpts per page) after 85–143 KB packs made up most of
83
+ each session's uncached input.
84
+ - **An update request is triaged before any research runs.** On 17 Sept
85
+ 2026 a one-line request to add icons to the sidebar ran the same research
86
+ as a product-wide create run: a product audit and three audits of the
87
+ crawled Vikunja docs, five minutes and 567k tokens, before planning even
88
+ started, because the research sessions were chosen from the project
89
+ configuration alone. Now the request decides: a navigation, icon, ordering,
90
+ branding, or metadata request researches nothing and is planned from the
91
+ current navigation in one session; a request that names existing pages
92
+ audits only the product surface behind them and skips the existing-site
93
+ audit and the application exploration; a product-wide request runs the
94
+ full research as before. Clear cases are decided from the request text; an
95
+ ambiguous one gets a short triage session that reads nothing, and when that
96
+ fails the full research runs. The decision is kept on the plan and shown
97
+ first among the review advisories. A navigation-only plan carries the exact
98
+ change in a new `workspaceInstructions` field, which generation applies in
99
+ one short session after the pages are written, so a plan whose pages are
100
+ all preserved still does the approved work.
101
+ - **Research briefs are reused across plans on unchanged sources.** A second
102
+ update on the same source snapshot used to redo every research session.
103
+ The brief key no longer includes the plan id, so the newest plan's product
104
+ and existing-documentation briefs are borrowed (and copied under the new
105
+ plan) when the sources, capture intent, agent, and model match; the
106
+ application brief stays plan-local because it names captures saved under
107
+ its own plan. A page-scoped audit is keyed by its pages and also accepts a
108
+ full audit of the same sources.
109
+ - **Generation runs three batches at a time again, and the run does less
110
+ repeated work.** A 40-page run measured on 16 Sept 2026 wrote 12 pages in
111
+ 25 minutes because batches had gone back to running one after another and
112
+ every batch redid the same research. Now: the writer sessions run up to
113
+ three at a time (`DOXLOOP_AUTHORING_PARALLEL`, default 3); the planning
114
+ stage's screenshots are adopted even when the browser tool saved them at the
115
+ project root instead of the plan's capture directory (before, every one of
116
+ them was silently re-captured); missing captures are taken in a few pooled
117
+ browser sessions of several guides each instead of one sign-in per guide,
118
+ and a capture session that stops no longer aborts the run before any page
119
+ is written; Doxloop signs in with the saved credentials itself before
120
+ leaving a login-gated entry screen to the agent; evidence packs now carry
121
+ the research findings for each page (linked through the plan's
122
+ capabilities), anchor a cited file on the quoted label, and pick the label
123
+ catalog entries about the page instead of the file's first 140 lines;
124
+ planning cites two to four line-numbered evidence files per page; and the
125
+ writer is told which directories its evidence lives in and to keep tests,
126
+ fixtures, migrations, generated bundles, other-language catalogs and
127
+ lockfiles out of its searches.
128
+ - **Doxloop owns the metadata; agents own page bodies and images.** The
129
+ evidence map is now Doxloop's record: an agent-written evidence file is
130
+ input — its claims are kept, its source paths only where the file exists,
131
+ and the plan's citations plus the source files the session actually opened
132
+ (from its tool calls) are always present; a `verified` over no real path
133
+ becomes `inferred`. A writer session's copy of the screenshot manifest is
134
+ never merged back — the manifest belongs to the capture stage and is
135
+ decided from the images on disk. A plan's `captureIds` that name no image
136
+ the application research saved are blanked at planning time with a note,
137
+ instead of being treated as done. And the last three hard failures after
138
+ writing — a page outside the plan, a page or screenshot count over the
139
+ approved batch, a page attributed to a source scoped to another route —
140
+ are now review notes on the proposal (the stray attribution is removed
141
+ from the evidence map), not a discarded run.
142
+ - **A run that ends "generated" is one the reviewer can apply.** The
143
+ validation that "Accept all" performs now runs as the last step of
144
+ generation, after Doxloop's own repairs: navigation and frontmatter,
145
+ links, embeds of images that no longer exist, navigation entries for pages
146
+ that do not, starter pages the plan superseded, and unplanned pages the
147
+ writer left outside the navigation. What cannot be repaired is shown on the
148
+ proposal; nothing waits for the click to fail. Images a check sets aside
149
+ are moved to `.doxloop/quarantine/` inside the run instead of deleted, so a
150
+ wrong downgrade costs a note, never the picture. `doxloop replay
151
+ <run-directory>` re-runs exactly this pipeline over a copy of a recorded
152
+ run's workspace in seconds, so a change to any of these steps is verified
153
+ against real manifests and pages before the next half-hour run.
154
+ - **A proposal no longer loses its screenshots over bookkeeping.** A verified
155
+ manifest step whose image exists but that lacks a `target` (every capture
156
+ reused from planning) or `alt` counted as a defect: a run retook thirteen
157
+ good images, then the acceptance check downgraded them all, deleted the
158
+ PNGs, and left the landing page with a broken image link the proposal could
159
+ not be applied over. Doxloop now fills `target` from the step's action and
160
+ `alt` from its expected state; only a missing image is a defect. A generated
161
+ starter page the plan did not replace is removed in the final check instead
162
+ of being handed to a fix session that rewrote it into an unnavigated page.
163
+ - **Capture status is decided from the image on disk, not from the agent's
164
+ word.** Capture sessions had recorded `status: "captured"`, which is not a
165
+ manifest status, so every image they took counted as a defect: a real run
166
+ retook thirteen screenshots it already had (5.5 minutes, 9.4M tokens) and
167
+ still ended with three invalid rows. After every capture and retake session
168
+ Doxloop now verifies each step whose PNG exists at the recorded path, is at
169
+ least 320×180 and is not blank, and resets any other claimed capture to
170
+ planned with the reason in the log; the capture prompt also names the four
171
+ allowed statuses.
172
+ - **Mechanical sessions think less.** Capture, fix-round, and retake sessions
173
+ run at low reasoning effort (`DOXLOOP_SUPPORT_EFFORT`); writers keep the
174
+ plan's effort, or `DOXLOOP_AUTHORING_EFFORT` when set. On a real run 86% of
175
+ the output tokens — and, at ~200 tokens a second, most of the wall time —
176
+ were hidden reasoning, and a session that adds a code-fence language or
177
+ signs in and takes a picture gains nothing from it.
178
+ - **Writers no longer re-read the same files every batch.** The skill
179
+ references every batch needs (editorial style, page depth, the evidence-map
180
+ section, the generator's component and manifest syntax, screenshots when
181
+ captures are on) are inlined once at the start of the writer prompt as a
182
+ stable prefix the prompt cache serves; each batch's evidence file arrives
183
+ pre-seeded with an entry per page from the plan's citations; and the
184
+ contract carries the titles and icons of the pages already written. A real
185
+ run spent about 120 turns on those reads across ten batches. Unlabeled code
186
+ fences get the `text` language from the post-pass instead of a fix session.
187
+ - **A link to a page another batch has not written yet is not a defect.** The
188
+ per-batch check used to send it to a fix session, which removed the link
189
+ — a page linking to the guide written a minute later lost the link for
190
+ good. Those links are checked once at the end of the run, and the
191
+ navigation spaces the first batch creates for later sections are no longer
192
+ pruned between batches.
193
+ - **Standard and comprehensive plans have no page cap.** The 12- and 40-page
194
+ defaults were back; a comprehensive plan for a product with more screens was
195
+ silently trimmed to forty. A reviewer can still set a cap on the plan
196
+ review's batch-limits panel.
197
+
198
+ - Planning now saves reusable screenshots with state and label evidence. Approved
199
+ writers embed saved images; missing states use separate capture sessions.
200
+ Evidence packs resolve source symbols and translation keys and reuse planning
201
+ findings. New plans use bounded scope and meaningful images instead of a fixed
202
+ screenshot count per page type.
203
+ - Planning and generation share a persistent token/cost ledger across retries. No limit applies unless `sync.budget.maxUsd`, `DOXLOOP_MAX_USD` or `DOXLOOP_MAX_TOKENS` is set explicitly.
204
+ Quota exhaustion stops scheduling, child crashes can retry, and completed
205
+ writing is retained separately from validation repairs. See
206
+ [generation performance](docs/generation-performance.md) for defaults and overrides.
207
+
208
+ - **The live log shows when each step happened and what the agent is doing
209
+ while it is quiet.** Every line a run writes now carries the local time it
210
+ arrived, in the control center and in the full log file, so the time each
211
+ step took can be read off the log. A tool call that took longer than a
212
+ second shows its duration when it finishes. A stretch with no output gets a
213
+ progress line every 30 seconds naming the current phase: waiting for the
214
+ agent's first response, thinking, writing a long reply (with how much has
215
+ streamed so far), or waiting for a named tool call to finish. A planning
216
+ session that thought for three minutes and then streamed a 90 KB plan used
217
+ to show nothing after "Using ToolSearch" and read as a hang; the same run
218
+ now reports its progress. Tool lookups also show what was looked up.
219
+
220
+ - **A finished proposal no longer arrives with errors that block applying
221
+ it.** Three causes were fixed. Doxloop's navigation repair added every page
222
+ to the first space in docs.json, so a plan with "Guides", "Self-hosting",
223
+ and "API" spaces left the last two empty; pages now go to the space their
224
+ plan section or path names, and a space nothing landed in is removed. A
225
+ planned page written over a starter file (the landing page as the site's
226
+ index) is now recognised there, so links to its planned path are rewritten
227
+ to the file that exists instead of staying broken. And the end-of-run check
228
+ now sweeps the whole workspace, not only the planned pages: a link that
229
+ resolves to no page becomes plain text, and any remaining error in a starter
230
+ page or docs.json gets one fix session. The "not applied" message now lists
231
+ only the errors that block, not every depth warning.
232
+ - **Batched authoring sessions sign in with saved credentials.** The
233
+ per-batch prompts never carried the sign-in handling the old single-session
234
+ prompt had, so a project with saved credentials still stopped at the login
235
+ page and recorded every authenticated screenshot step as text-only (28 of 41
236
+ planned captures in one run). Every batch, fix, and retake session now gets
237
+ the capture and sign-in instructions, and is told that a redirect to the
238
+ sign-in page is not a blocker while sign-in material is available.
239
+ - **No page cap for standard and comprehensive plans.** New plans were capped
240
+ at 12 or 40 pages with no way to change it before planning. Standard and
241
+ comprehensive scopes now have no page limit: the planner is told the
242
+ evidence sets the size, and the wizard shows "No page limit". A cap can
243
+ still be set on the plan review. Starter plans stay at five pages.
244
+ - **Depth fixes stop padding.** The fix session for thin-page warnings now
245
+ adds only evidence-backed parts, leaves a complete page alone and says so,
246
+ and never fills a page with generic advice, restated steps, or demo data.
247
+ The authoring skill also states that what the capture application shows is
248
+ fixture state, so pages describe the reader's own project instead of a demo
249
+ route id or task name.
250
+ - **A resumed run shows the pages it kept.** The authoring progress counter
251
+ started at "0 of N" on resume and only ever reached the pages the fix
252
+ sessions touched, which read as a run starting from scratch. Pages the run
253
+ found finished now count as done from the start.
254
+ - **The end-of-run screenshot check no longer crashes with `EISDIR`.** A
255
+ planned page path such as `guides/manage-tasks` names both the page file
256
+ and the directory holding its captures; the check read the directory as the
257
+ page and the whole run failed at its last step. Only files are read now.
258
+ - **The screenshot retake session can start again.** The recorded session
259
+ and saved credentials were removed before the retake session ran, so its
260
+ capture browser failed to initialise every time; they are now kept until
261
+ the retake has finished.
262
+ - **Planning runs as parallel research sessions plus one synthesis session.**
263
+ Instead of one session that read the sources, browsed the application,
264
+ audited every crawled page, and then wrote the plan, Doxloop now starts
265
+ short research sessions, up to four at a time (`DOXLOOP_PLANNING_PARALLEL`):
266
+ a product-surface audit, an application exploration when screenshots are
267
+ wanted, and one existing-documentation audit per twenty crawled pages. Each
268
+ returns a compact brief that is saved under the plan, and one further
269
+ session writes the plan from the briefs without browsing or re-reading. The
270
+ application session works within a budget of thirty browser calls. A
271
+ retried plan reruns only the briefs that are missing. `DOXLOOP_PLANNING_STAGED=0`
272
+ restores the single-session planner.
273
+ - **Planning prompts and replies are much smaller.** The deterministic source
274
+ inventory the planner receives on every turn is now grouped text (about 10k
275
+ characters for a mid-sized product instead of 120k characters of JSON), with
276
+ regex hits on code lines summarised per file; the planner is told not to
277
+ read the authoring skill files; the corrective pass after a failed planning
278
+ gate returns only the pages it changed as a patch that Doxloop merges by
279
+ page id, instead of the whole plan again; and existing-page dispositions
280
+ list snapshot paths only, with titles and URLs filled in from the snapshot.
281
+ - **A plan reply that stops short of its closing brackets no longer fails the
282
+ run.** Codex returned a 60k-character plan twice with the final `]}` missing,
283
+ and both attempts were rejected as "not a valid documentation-plan JSON
284
+ object". Doxloop now closes a reply that ends on a completed object or array
285
+ (a stray closing tag after it is ignored), reads the plan, and reports the
286
+ fix as an advisory on the plan review. A reply that is cut off inside a
287
+ value is still rejected, and the retry prompt now quotes the exact defect
288
+ and the reply's tail instead of a generic message, so the agent can correct
289
+ it. The planning prompt also states that the object's own closing brace must
290
+ be the last character before `</doxloop-plan>`.
291
+ - **Reliable, cheaper, faster generation.** Approved plans are now written in
292
+ short batches of fresh agent sessions (four pages each by default, tunable
293
+ with `DOXLOOP_AUTHORING_BATCH_PAGES`), up to three batches at a time
294
+ (`DOXLOOP_AUTHORING_PARALLEL`; the landing page and a new site's setup run
295
+ first, alone), instead of one session that ran for hundreds of turns
296
+ re-reading a 600k-token context. Each batch gets its own plan slice, an
297
+ evidence pack with the excerpts the plan cites, and its own manifest and
298
+ evidence slices that Doxloop merges back, so concurrent sessions never edit
299
+ the same file. Depth warnings are fixed once at the end in a few concurrent
300
+ sessions instead of after every batch. Between batches Doxloop repairs
301
+ frontmatter, navigation entries, broken local links, and the evidence map
302
+ itself, validates the workspace, and sends only the remaining defects to a
303
+ short fix session. A batch that stops is retried once in a fresh session and
304
+ the rest of the run continues; a resumed run writes only the pages that are
305
+ still missing.
306
+ - **Screenshots never fail a finished run.** Doxloop captures each guide's
307
+ entry screen itself with Playwright before the agent starts, checks every
308
+ image after the run, gives the agent one targeted retake session for the
309
+ problems it finds, and then keeps any remaining step as text with the
310
+ problem listed on the proposal instead of discarding the pages.
311
+ - **Token usage is recorded.** Every run and request shows the tokens, cached
312
+ share, cost when the agent reports it, and number of sessions, in the run
313
+ log, the proposal, and the request history.
314
+ - **Smaller prompts.** The authoring skill has a fast path for plan batches
315
+ that reads only the references a batch needs, the screenshot reference is
316
+ split into workflow and schema halves, and JSON injected into planner prompts
317
+ is compact. The agent is no longer asked to run `doxloop test`, node, or
318
+ python inside its sandbox, where they failed on every run.
319
+ - A page the plan did not name but the writer modified is now a reviewable
320
+ change with an advisory rather than a reason to reject the whole proposal.
321
+ Undersized element captures are accepted down to 200×100.
322
+
323
+ ### Added
324
+
325
+ - **Rewrite existing documentation.** **Add source → Existing documentation**
326
+ (in the setup wizard and on **Sources**) takes the address of the docs you
327
+ publish today. Doxloop crawls the site through its sitemap, `llms.txt`, and
328
+ links into a read-only Markdown snapshot, and the planner audits it against
329
+ your other sources: the plan review gains an **Existing documentation
330
+ audit** with coverage gaps, contradicted claims, obsolete and preserved
331
+ content, findings, and a decision for every crawled page (rewrite, merge,
332
+ preserve, or drop). Approving the plan records redirects from every old page
333
+ to the page that absorbs it. With only the site connected the agent
334
+ restructures and rewrites what the pages already say and marks every page
335
+ `inferred` until a product source is connected. The CLI accepts
336
+ `--docs <url>` on `init` and `create`, and the globe action on **Sources**
337
+ re-crawls a site. See [docs/existing-documentation.md](docs/existing-documentation.md).
338
+
339
+ - **Screenshots behind a login.** **Settings → Visual evidence → Application
340
+ sign-in** (and the **Does this page require sign-in?** step of the setup
341
+ wizard) gets the capture browser past a login page two ways. **Sign in with
342
+ browser** opens a Chrome window where you sign in by hand, including MFA,
343
+ SSO, or passkeys; **Save session** records the cookies and local storage,
344
+ and every planning and capture run starts with that session loaded. For a
345
+ plain form you can save a test account's credentials instead: the agent
346
+ types the secret names `DOXLOOP_APP_USERNAME` and `DOXLOOP_APP_PASSWORD`,
347
+ the capture server substitutes the values and redacts them from every tool
348
+ result. **Test application** now reports whether the saved session still
349
+ signs in and which sign-in method a run will use. Sessions and credentials
350
+ live under the user's Doxloop config home, keyed by project root, never in
351
+ the repository; `application.authentication.loginPath` records only the
352
+ sign-in route. The CLI settings menu offers the same under **Application
353
+ sign-in**.
354
+ - **Navigation editor.** **Pages → Navigation** shows the sidebar as a tree
355
+ you can drag to reorder, group into sections, rename, give icons, or hide
356
+ (Doxbrix), with keyboard equivalents on every row and a live preview
357
+ beside it. Doxbrix writes `docs.json`; MkDocs writes the `nav` list in
358
+ `mkdocs.yml` through new `readNavigationTree` and `writeNavigationTree`
359
+ adapter hooks. Generators whose navigation is code are named instead of
360
+ edited. Every write is validated and rolled back if it would break the site,
361
+ and the plan review gets the same editor for a plan's sections.
362
+ - **Branding panel.** **Settings → Branding** edits the Doxbrix logo,
363
+ favicon, primary and light/dark accent colours, page backgrounds, colour
364
+ mode, code theme, and body, heading, and code fonts, with an image picker
365
+ and a live preview that reloads on save. Other generators are pointed at
366
+ their theme configuration file.
367
+ - **Images and files.** **Pages → Images & files** uploads PNG, JPEG, GIF,
368
+ WebP, SVG, AVIF, ICO, PDF, video, and zip files (10 MB each, content
369
+ checked against the extension, SVG refused when it scripts) into the
370
+ generator's asset directory, lists where each one is used, edits alt text
371
+ across every embedding page, replaces or deletes files, and offers
372
+ **Insert an image…** in the page composer. Screenshot gallery rows gain
373
+ **Replace screenshot** for a run that is still under review.
374
+ - **Page metadata.** Each page on **Pages** has a metadata form for the
375
+ title, description, sidebar icon, canonical URL, and social image, written
376
+ straight to frontmatter with validation, rollback, and history. The local
377
+ preview now emits the canonical and social tags the static build already
378
+ produced.
379
+ - **Release notes template.** When a directory source is a Git checkout,
380
+ **Update** offers **Release notes**: pick the repository, version, and two
381
+ refs, and Doxloop collects the commits, changed files, and the matching
382
+ changelog section deterministically, then hands that inventory to the
383
+ planner and writer as the only evidence for a `release` page at
384
+ `release-notes/<version>`.
385
+ - **Glossary page.** **Settings → Audience and voice** edits terminology as
386
+ term and definition rows and can generate a glossary page (Markdown, MDX,
387
+ reStructuredText, or HTML) from them, add it to the navigation, and record
388
+ it in the evidence map; hand-written glossaries are never overwritten
389
+ without asking.
390
+ - **Planned diagrams.** Plan pages carry a `diagram` decision, defaulting
391
+ to required for concept pages and editable in plan review. The writer is
392
+ told which pages need a Mermaid block, validation reports a
393
+ `missing-diagram` warning for planned pages without one, and the preview
394
+ renders the diagram.
395
+ - Update history records navigation, branding, asset, metadata, and glossary
396
+ writes alongside agent runs.
397
+
398
+ - **Generator tiers and a toolchain check in the wizard.** Every generator now
399
+ carries a support tier (**Full**: Doxbrix, Docusaurus, MkDocs Material;
400
+ **Supported**: Sphinx, Hugo, VitePress, Starlight; **Basic**: Nextra,
401
+ Markdoc, Jekyll, Static HTML) and the runtime it needs. The **Tools** step
402
+ shows the tier beside the selected generator, checks that Node.js with a
403
+ package manager, Python with `venv`, Hugo, or Ruby with Bundler is installed,
404
+ and lists every generator's tier and requirements under **What each
405
+ generator supports**. **Settings → Generator** shows the same label.
406
+ - **Navigation validation that understands real sites.** Sphinx follows
407
+ nested and glob toctrees from the root document; Hugo accepts section
408
+ pages, front-matter menus, and menu `pageRef`s from any TOML configuration
409
+ file; Starlight reads `autogenerate` groups, `slug` and `link` entries, and
410
+ lists every page when no sidebar is configured; VitePress reads
411
+ multi-sidebar objects and `base` prefixes; Docusaurus checks explicit doc ids
412
+ and trusts autogenerated sidebars; Jekyll reads nested `_data/navigation.yml`;
413
+ Nextra checks every `_meta` file against its own directory and no longer
414
+ demands that every page be listed; Static HTML follows links through
415
+ section pages. When a theme, plugin, function, or import builds the
416
+ navigation, validation reports one `navigation-unverified` warning instead of
417
+ false `unnavigated-page` errors.
418
+ - **Authoring references for every generator.** Hugo, Jekyll, Markdoc,
419
+ Nextra, Starlight, and Static HTML skills gained `references/authoring.md`
420
+ covering callouts, tabs, code blocks, images, and Mermaid diagrams in the
421
+ generator's own syntax; the Docusaurus and MkDocs references gained image
422
+ and diagram sections. The Docusaurus scaffold enables
423
+ `@docusaurus/theme-mermaid`, the MkDocs scaffold registers the `mermaid`
424
+ fence, the Sphinx scaffold adds `sphinxcontrib-mermaid`, and the Hugo,
425
+ Jekyll, Markdoc, and Static scaffolds ship callout and tab markup plus a
426
+ Mermaid render path.
427
+ - **Generator API hooks.** Adapters may implement `writeNavigation` (MkDocs
428
+ edits `nav` in place, keeping comments and Python tags; Markdoc rewrites
429
+ `navigation.json`) and `renderPage` (Static HTML returns the page's `<main>`
430
+ landmark), so later work can create pages and preview external generators
431
+ without a native build.
432
+ - **Continuous integration.** `.github/workflows/ci.yml` runs typecheck, unit
433
+ tests, skill validation, and the boundary check on every pull request, then
434
+ scaffolds, previews, and builds every official generator through
435
+ `scripts/ci-generator-smoke.mjs`. `pnpm test` now compiles only the core and
436
+ generator packages instead of running the full build.
437
+
438
+ ### Fixed
439
+
440
+ - **A research brief with swapped closing brackets no longer fails the plan.**
441
+ An update run on 17 Sept 2026 failed twice in a row with "malformed research
442
+ brief JSON object (Expected ',' or ']' after array element)": Codex ended the
443
+ product brief's top-level `unknowns` string array with `"}]}` instead of
444
+ `"]}`, and the retry made the same slip. The reply reader that already
445
+ appends missing closers now also rewrites a trailing run of wrong closers
446
+ with the ones the open structures need, records the fix as a repair note,
447
+ and still refuses a wrong closer that has more content after it. Applies to
448
+ plans, plan patches, and research briefs alike.
449
+ - **Sidebar sections with nothing under them.** When the writer laid the
450
+ plan's top-level areas out as groups inside one space ("Self-hosting",
451
+ "API & integrations") and left them empty, the end-of-run navigation repair
452
+ created each plan section ("Install & upgrade", "API reference") as a
453
+ sibling group instead of nesting it, so the preview showed the area
454
+ headers with no pages beneath them while every page sat one group further
455
+ down. The repair now nests a section group under the area group the page
456
+ path or the plan's top-level list names, matches existing groups
457
+ case-insensitively, and removes any group still empty when the run ends.
458
+ The preview also no longer renders a group that has nothing visible in it.
459
+ - **Saved sign-in reached the planner but not the writer.** Generation runs
460
+ in a throwaway workspace under `.doxloop/runs`, and the capture browser's
461
+ session and credentials are keyed by project path, so the authoring run
462
+ started its capture server without them. The agent typed the secret names
463
+ literally, the sign-in failed, and every screenshot guide ended text-only.
464
+ Proposal runs now load the sign-in material from the project, and a
465
+ secrets file orphaned by a killed run is swept before the next run starts.
466
+ - **Comprehensive depth produced a five-page batch.** The setup wizard sent
467
+ every new plan with the small-batch limits (five pages, eight screenshots,
468
+ 15 minutes) whatever depth was chosen, and the plan review showed the cap
469
+ only after planning had already trimmed the structure to fit. New plans now
470
+ take their limits from the depth, the wizard's Review step shows them, and
471
+ changing the depth on the Update page resets the run limits to match.
472
+ - **A comprehensive plan no longer dies in the corrective pass.** Planning
473
+ was cut off at the 20-minute default even when the batch allowed 120, and
474
+ when the pass that repairs failed planning gates stopped, the complete
475
+ first proposal was thrown away. Planning now runs as long as the batch's
476
+ minutes unless a limit is configured, keeps the first proposal with its
477
+ advisories when the corrective pass does not finish.
478
+ - **The Claude planner can open the application.** Planning used Claude
479
+ Code's plan mode, which refuses the capture browser's navigation, so the
480
+ planner spent its turns on blocked calls and never saw the screens it was
481
+ planning screenshots for. Planning now runs read-only by denying the
482
+ writing tools instead, so the capture browser works during planning as it
483
+ already did for Codex.
484
+ - **A plan that failed while planning can be retried from its page.** The
485
+ plan review used to offer only "Retry generating", disabled because the
486
+ failed plan had no pages and no screenshot guide yet. It now offers
487
+ **Retry planning**, which runs the planning stage again with the same
488
+ brief.
489
+ - **A killed planning or generation run no longer strands its plan.** A
490
+ process that was killed, crashed, or lost its UI server used to leave the
491
+ plan at "planning" or "generating" with nothing to retry. The UI now
492
+ records the interruption on the plan when the job ends and when it starts
493
+ up, so the review offers the retry.
494
+ - **Planning continues from the reply it already has.** The planner's reply
495
+ is saved the moment it arrives, so a run stopped by its time limit, a
496
+ crash, or the user resumes from that reply instead of repeating the whole
497
+ planning pass. The saved reply is used only for the same brief, settings,
498
+ and source snapshot, and is discarded once the plan reaches review.
499
+ - **Planning is faster.** A comprehensive plan used to spend most of its
500
+ time clicking through the application and then minutes emitting a very
501
+ long reply. The planner now explores the application within a fixed
502
+ budget of browser calls, using the source's routes and labels as the
503
+ inventory of screens; it is asked for a compact reply; and it runs at
504
+ medium effort, since planning is an inventory task over evidence Doxloop
505
+ has already extracted (authoring keeps the run's effort). The corrective
506
+ pass, which costs as much as the first proposal because the agent returns
507
+ the whole plan again, now runs only for findings that would block
508
+ approval; thin or missing screenshot coverage is reported as an advisory
509
+ on the plan review instead, where **Update plan** can ask for more. A
510
+ "recommended" screenshot label in a required-screenshot run is corrected
511
+ in place rather than sent back for a second pass, and the planner is told
512
+ to fit its captures inside the batch's screenshot maximum instead of
513
+ leaving the reviewer to trim. A batch now allows three screenshots per
514
+ page it may write (15 for a starter, 36 for a standard, 120 for a
515
+ comprehensive run, up to 300): the planner is asked for a capture of every
516
+ screen-changing step, so the old one-per-page cap left every real plan
517
+ over its limit at approval.
518
+ - **The writer can validate its own work again, and finished runs are no
519
+ longer thrown away.** Inside the agent's sandbox, every Node process died
520
+ with "SecItemCopyMatching failed -67674" before printing anything whenever
521
+ the shell exported `NODE_USE_SYSTEM_CA=1` (it makes Node read the macOS
522
+ Keychain trust store at startup, which the sandbox denies), so `doxloop
523
+ test` never ran, the writer never saw its thin-page warnings, and it either
524
+ built substitute checks or left the warnings for the reviewer. Doxloop now
525
+ strips that variable from the agent's environment. A measured comprehensive
526
+ run (33 pages, 34 screenshots) took 35 minutes, one of them tool execution;
527
+ the rest is the model, at about 18 seconds per screenshot and 28 per page,
528
+ with six of ten output tokens hidden reasoning at **Effort: high**. Running
529
+ the same brief at medium was a tenth faster and noticeably shallower — a
530
+ fifth fewer words, two troubleshooting sections instead of ten, translation
531
+ keys quoted in place of displayed labels — so high stays the default; the
532
+ capture guide asks for one screenshot straight after the action that
533
+ produces a state, with accessibility snapshots only where the next click
534
+ needs a reference. Three Doxloop checks then refused that run's complete
535
+ output, each for a reason no reviewer would accept: an evidence map whose
536
+ page confidence said `contradicted` (a claim-level word; it now reads as
537
+ `needs-human`), 27 `api-endpoint-path-param` errors for gRPC-gateway paths
538
+ such as `/api/v1/{name=memos/*}` (the variable is `name`), and a "page
539
+ outside the approved batch" failure for the starter `index.mdx` the brief
540
+ itself requires the agent to replace. A guide that captured one more
541
+ distinct state than the plan approved is kept as extra evidence rather than
542
+ failing the run. **Continue the interrupted run** tells the agent to fix
543
+ the errors first and then the warnings on pages it wrote. And the file
544
+ contract now says outright which planned page replaces which generated
545
+ starter file and where it belongs — a plan that put the starter
546
+ quickstart's replacement at `getting-started/quickstart` used to leave the
547
+ writer keeping `quickstart.mdx` in place while every link pointed at the
548
+ planned path.
549
+ - **The corrective planning pass rarely runs, and is cheap when it does.**
550
+ Three comprehensive runs in a row paid a second planning pass — six to
551
+ twenty minutes, twice ending in a failed plan — for slips no reviewer would
552
+ have sent back: a start path with a hash (`/setting#member`, how a
553
+ single-page application addresses a tab), a guide whose visual purpose was
554
+ written in the page's rationale, or a workflow left out while the same
555
+ steps were spelled out in the capture sequence. A hash is now a valid start
556
+ path, and the other slips are repaired in place and noted on the log. When
557
+ the pass does run, it is scoped to the named findings and told not to sign
558
+ in and explore the application again, which it used to do from scratch;
559
+ the first proposal travels as compact JSON. And a reviewer who chose **Use
560
+ recommended defaults** for planner questions gets those decisions in the
561
+ first pass — the planner is told to decide and record them — instead of a
562
+ third pass that re-sent the whole plan to apply its own recommendations.
563
+ - **The setup wizard explains a rejected source folder.** Starting `doxloop ui`
564
+ inside the product checkout and adding that folder as a source used to fail
565
+ with no message, because the new workspace defaults to a folder inside the
566
+ source. The **Add source** dialog now shows the server's explanation with both
567
+ paths, the error clears as you type, and the **Location** field is offered on
568
+ a fresh start so the workspace can be moved beside the checkout. The
569
+ **Source added successfully** notice also dismisses itself after four seconds
570
+ and sits above the wizard footer, so it no longer covers **Continue** on a
571
+ short window.
572
+ - **A Claude API failure mid-run no longer fails the run.** When Claude's API
573
+ request breaks off mid-response (a server error, an overload, a rate limit,
574
+ or a dropped connection), Claude exits and the run used to fail with the
575
+ unhelpful message `Claude stopped with result "success"`, discarding a
576
+ session that might already have written pages and captured dozens of
577
+ screenshots. Doxloop now recognizes the failure as transient, waits a
578
+ moment, and resumes the same Claude session in the same workspace, up to
579
+ twice per run, so the agent continues with its context and the pages and
580
+ screenshots it already produced. Only when every resume fails does the run
581
+ fail, and the message then names the API error, how many resumes were
582
+ tried, and that **Resume the run** continues from the preserved workspace.
583
+ Set `DOXLOOP_AGENT_API_RESUMES` to change the number of automatic resumes
584
+ (`0` disables them).
585
+ - **Signed-in sessions no longer block plan approval.** The application
586
+ readiness check follows redirects within the configured application, so a
587
+ saved browser session that bounces a sign-up or landing route to the app
588
+ shell (for example `/signup` → `/dashboard`) counts as reachable and the
589
+ message names where the capture browser will land. Only a redirect to a
590
+ sign-in route, to another origin, or a redirect loop still blocks approval.
591
+ - Nextra's and Markdoc's planning `navigationFiles` name files the scaffold
592
+ actually creates (`content/_meta.js` and `app/layout.jsx`; `navigation.json`
593
+ and `markdoc.config.mjs`). Sphinx starter pages carry the
594
+ `.. doxloop:starter-page` marker, which validation now recognises. The
595
+ Docusaurus and MkDocs adapters use the shared generator runtime instead of
596
+ private copies of its helpers. Hugo, Starlight, VitePress, Nextra, and
597
+ Jekyll no longer report a missing generator file when an adopted site uses
598
+ a theme or a differently named configuration file.
599
+
600
+ - **Monitoring works on local folders.** A schedule no longer requires a Git
601
+ remote. A local Git checkout is checked in place by its HEAD commit and
602
+ working tree; a plain folder is compared against the file digests recorded
603
+ at the last sync, so it can still name the files that changed. Nothing is
604
+ fetched, pulled, or written in the source. **Check now** starts a visible job
605
+ and, when it finishes, a notice reports whether anything changed, how many
606
+ pages are stale, and which proposal was drafted.
607
+ - **Gemini parity.** Unattended Gemini runs receive external sources through
608
+ `--include-directories`, read the capture browser from the workspace's
609
+ `.gemini/settings.json`, stream `stream-json` output into the same one-line
610
+ activity log Claude has, and are checked for sign-in from an API key, a
611
+ Vertex AI project, or the Google sign-in token file instead of "unknown".
612
+ Because Gemini cannot be denied writes to an extra directory, an unattended
613
+ run reads a throwaway copy of each local source. Codex runs stream
614
+ `exec --json` events into the same log. A capability matrix in the wizard's
615
+ **Tools** step and under **Settings → General** marks each row where an
616
+ assistant is **Limited**.
617
+
618
+ ### Changed
619
+
620
+ - **Control center redesign.** The workspace gets one design system: Sora for
621
+ page titles and figures, Instrument Sans for the interface, JetBrains Mono
622
+ for paths, a single teal accent on a cool grey canvas, and consistent
623
+ buttons, badges, tables, and cards. The sidebar now draws the documentation
624
+ loop as a connected rail — Sources, Create/Update, Pages, Review, Deploy —
625
+ with each stage marked done, next, or waiting and a one-line status under
626
+ its name. The Overview leads with a status card (what is waiting on you and
627
+ the action to take), three tiles for coverage, pages, and the published
628
+ site, a validation-issues list when there are any, and an activity feed
629
+ whose **Stop** and **Log** controls no longer overlap. Sources shows
630
+ coverage as a white ring gauge instead of a dark gradient block and
631
+ freshness as a status row with per-source chips; planned screenshots list
632
+ their start route as a code chip with a count badge; the top bar shows the
633
+ project and screen as a breadcrumb plus a live "tasks running" chip.
634
+
635
+ - **Review compares against what the agent started from.** A proposal now
636
+ diffs the agent's output against a snapshot of the project taken when the
637
+ run began, not against the live project at the end. A page you edit by hand
638
+ while the agent runs is no longer proposed as a revert, and a file that both
639
+ you and the agent changed is grouped under **Changed while the agent ran**,
640
+ shows the proposal against your edited version, and asks for confirmation
641
+ before **Accept all**, **Accept file**, or a hunk accept replaces your edit.
642
+ Raw browser captures under `.doxloop/capture-output` never appear as changes.
643
+ - **Review opens on the documentation.** The changed-files list starts on the
644
+ first page instead of the evidence map, lists pages, navigation, and assets
645
+ first, and folds evidence, configuration, and skill files under **Supporting
646
+ files** until asked for. Accepting a change refreshes its hunk badges at
647
+ once, and **Review changes** in the ready dialog opens that proposal.
648
+ - **URLs match the navigation.** The screens are now at `/update`, `/review`,
649
+ and `/deploy`; the previous addresses redirect. The selected proposal and
650
+ file, the Pages selection, and the Settings section live in the URL, so a
651
+ refresh or the back button returns to the same view. `doxloop ui --page`
652
+ accepts the new names and still understands the old ones.
653
+ - **The workspace never renders blank.** A rendering error in one screen shows
654
+ what broke and offers a reload instead of a white page. A validation failure
655
+ is shown as "Validation unavailable" with the reason. Background polling
656
+ retries quietly three times before raising a banner.
657
+ - **Forms keep up with the project.** Settings and Deploy forms reseed after a
658
+ save or a reload, keep unsaved edits when the project changed elsewhere and
659
+ say so, and the plan editor asks before a background refresh replaces edits
660
+ you have not saved. **Update history** names the pages each request changed.
661
+ - **Hidden state is now shown.** Overview carries a validation summary with the
662
+ first issues and the sign-in state of the agent updates run with. Sources
663
+ shows documentation freshness: which pages fell behind which sources, and
664
+ how many paths changed per source.
665
+ - **Setup wizard.** With screenshots on, step 3 requires a successful **Check
666
+ page** before Continue. Errors appear on the step they belong to, and the
667
+ sources table shows what was validated instead of a placeholder sync status.
668
+
669
+ - **Stop really stops the run.** Stopping a run from the control center now
670
+ ends the coding agent and the capture browser it started within ten
671
+ seconds, and nothing writes into the run workspace afterwards. Unattended
672
+ agents run in their own process group; the CLI forwards a termination signal
673
+ to that group, escalates to a forced stop after a grace period, and exits
674
+ with the conventional signal status. Time budgets escalate the same way.
675
+ - **Progress is real.** The stage list for a generation, revision, or page
676
+ edit now advances from what the agent actually does: a page write starts
677
+ **Authoring approved pages** and counts towards a "pages written N of M"
678
+ figure, a navigation write starts **Updating navigation and theme**, an
679
+ evidence-map write starts **Recording page evidence**, a capture starts
680
+ **Capturing application screenshots**, and validation starts when the agent
681
+ runs `doxloop test` or when the run hands over to Doxloop. Stages are
682
+ announced up front as pending, and a stage that saw no activity finishes as
683
+ "unchanged" instead of pretending the work happened. Codex and Gemini output
684
+ is now piped through Doxloop so it appears in the run log, and a workspace
685
+ watcher tracks their progress the same way.
686
+ - **Planning has a time budget.** A planner that never returns now fails with
687
+ "Planning stopped after 20 minutes without a plan reply" instead of running
688
+ forever. The budget follows **Maximum agent minutes** when set, and the
689
+ `DOXLOOP_PLAN_TIMEOUT_MINUTES` environment variable overrides both.
690
+ - Every job the control center starts has a labelled entry in **Recent
691
+ activity** with a log link and, while it runs, a **Stop** button: source
692
+ checks, sign-in, agent installs, screenshot captures, deployments, and
693
+ proposal revisions. The **Review** page shows a running revision or
694
+ resumption with its live log and a Stop button, and a failed one raises a
695
+ banner naming the reason. The deployment progress panel stays on screen
696
+ after a failure until it is dismissed, and the **Deploy** page explains that
697
+ sign-in finishes in the browser while the login job runs.
698
+
699
+ ### Added
700
+
701
+ - **Portable static exports.** Doxbrix now builds page directories, reader CSS,
702
+ copied assets, client search data, sitemap and robots files, and page metadata
703
+ into `build/`, including a configurable base path for project sites.
704
+ `doxloop export --out <directory> [--zip]` provides the same self-hostable
705
+ output for every generator. Deployment dry runs leave their zip in
706
+ `.doxloop/exports` instead of discarding it.
707
+ - **More deployment targets.** The Deploy page and `doxloop deploy --target`
708
+ now support GitHub Pages, Netlify, and Vercel alongside Doxbrix. The page has
709
+ per-target settings, local folder/zip export, protected provider credentials,
710
+ and a shared deployment history. GitHub Pages publishes to `gh-pages`;
711
+ Netlify uploads the static zip; Vercel uploads content-addressed files before
712
+ creating its production deployment.
713
+ - **Project switcher and import.** The project name in the sidebar opens a
714
+ switcher that lists recently opened projects, opens any folder, imports an
715
+ existing documentation site, or starts the setup wizard for a new project,
716
+ all without restarting `doxloop ui`. Every opened project is remembered in
717
+ a user-level list. The setup wizard's first step now offers **Use existing
718
+ documentation folder**, which recognizes Doxbrix, Docusaurus, MkDocs,
719
+ Sphinx, Hugo, VitePress, Starlight, Nextra, Markdoc, and Jekyll sites from
720
+ their configuration files, shows the detected generator, content directory,
721
+ and pages for correction, and adopts the folder without modifying a page.
722
+ Existing pages start as unverified in the evidence map so the first update
723
+ attaches evidence. Switching is refused while a run is in progress and stops
724
+ a local preview. `doxloop init --existing [directory]` and
725
+ `doxloop ui --project <directory>` cover the same from a terminal.
726
+ - **Maximum Claude spend (USD)** under **Monitoring → Advanced watch scope and
727
+ budgets** passes a spending cap to Claude Code for unattended runs and
728
+ planning. A run that ends on the cap says so in the log and the proposal
729
+ error. Codex and Gemini expose no equivalent flag, so the setting is ignored
730
+ for them; the field says so.
731
+
732
+ - **Comprehensive is now the default documentation depth** in the setup wizard
733
+ and on the Create page, and the depth cards no longer show fixed page ranges
734
+ such as "8–15 pages". Depth chooses which product surface to cover; the page
735
+ count comes from the discovered evidence. The planner contract for the
736
+ Standard scope no longer targets a 15-page ceiling, the Standard estimate is
737
+ no longer clamped at 20 pages, and migrated version-1 plans no longer cap
738
+ their estimates at 15 or 30 pages.
739
+
740
+ ### Added
741
+
742
+ - A new **Pages** view lists documentation by navigation section with search,
743
+ word counts, evidence state, update dates, current previews, and page
744
+ history. Select one or several pages, describe an edit in plain language,
745
+ watch the agent work in an isolated proposal, then compare rendered and
746
+ source versions before accepting, rejecting, refining, or undoing it.
747
+ Selected-page scope is enforced after every agent run; related navigation
748
+ and page-image changes require the explicit **Also allow related changes**
749
+ toggle.
750
+ - **Failed runs continue where they stopped.** A generation run that fails
751
+ after the agent wrote pages — required screenshots missing for a guide, a
752
+ time budget reached, a validation error — keeps its workspace, and the plan
753
+ review now offers **Resume generation** and **Ignore problems & continue**.
754
+ Resuming restarts the agent in the same workspace with a brief of what is
755
+ already finished, so verified screenshots and completed pages are never
756
+ captured or written again; ignoring accepts the generated files for review
757
+ with every screenshot problem recorded as a text-only step and counted on the
758
+ proposal. The same actions appear on a failed proposal under **Review**, and
759
+ a plan whose planner missed a planning gate can be opened for review anyway.
760
+ Source changes made while a run sat failed no longer block continuing it:
761
+ the proposal records an advisory and refreshes its evidence snapshot instead.
762
+ Under the hood each run records the instructions it was started with in
763
+ `.doxloop/runs/<id>/authoring.json`, `doxloop proposal resume --id <run>` and
764
+ `doxloop proposal recover --id <run> --ignore-screenshot-problems` drive the
765
+ two paths, and `POST /api/plans/:id/continue` and
766
+ `POST /api/proposals/:id/resume` expose them to the control center.
767
+ - Plans can carry a **minimum page count**. The Create and Update forms have a
768
+ "Minimum pages to write" field (and `POST /api/plans` accepts `targetPages`),
769
+ the planner must reach it with distinct evidence-backed pages or record a
770
+ scope exception, and the comprehensive scope no longer stops at thirty pages:
771
+ the estimate now scales with the discovered public surface, so a product with
772
+ many screens, commands, and configuration groups gets the forty or eighty
773
+ pages it needs instead of being compressed into overviews.
774
+ - A **page depth gate**. `doxloop test` now reports `thin-page` for a page with
775
+ too little prose for its type and `thin-procedure` for a guide with fewer
776
+ than three real steps. Both are warnings, and the authoring contract, the
777
+ plan generation request, and the new authoring-skill reference
778
+ `references/page-depth.md` require the agent to resolve every one on a page
779
+ in scope before finishing. The reference defines what a complete landing
780
+ page, quickstart, guide, tutorial, concept, reference, and troubleshooting
781
+ page contains, so a run can no longer finish with a site of one-paragraph
782
+ pages that passes validation.
783
+ - UI guides now plan and capture **one screenshot per screen-changing step**.
784
+ The planner is told to plan a capture for the entry screen, each dialog or
785
+ section a step opens, the filled form, and the result; a required-screenshot
786
+ plan whose procedural guide plans fewer than three captures is sent back for
787
+ revision unless its workflow says the guide is a single screen; and the
788
+ authoring prompt places an image inside every such step. The plan form also
789
+ defaults to screenshots when an application capture surface is configured.
790
+
791
+ ### Fixed
792
+
793
+ - A plan whose generation failed can be approved again from the plan review.
794
+ **Approve & generate** returned "cannot be approved from status failed",
795
+ leaving **Retry stage** in the activity log as the only way forward. The
796
+ approval bar now reads **Retry generating …** for a failed plan and starts a
797
+ fresh run from the reviewed structure.
798
+ - Documentation generation no longer stops at 60 agent turns. Unattended
799
+ Claude runs were launched with a fixed `--max-turns 60`, so a 44-page plan
800
+ with 85 planned screenshots ended while the agent was still exploring the
801
+ application and before it had written a page, reported only as "The
802
+ documentation agent exited with status 1." The cap now scales with the
803
+ approved plan (30 turns per page written plus 12 per planned screenshot,
804
+ never below 400; `DOXLOOP_AGENT_MAX_TURNS` overrides it), planning runs get
805
+ 100 turns instead of 30, and when Claude does stop early the activity log and
806
+ the failure message name the reason, such as the turn limit or a reported
807
+ API error.
808
+ - The control center no longer freezes after a long agent run. Every job kept
809
+ its complete output in memory — a single planning run left about 2 MB of
810
+ streamed JSON — and that whole job list was re-serialized for every
811
+ subscriber on every output chunk of the next run, written to `ui-jobs.json`
812
+ and returned by every state request. Buttons such as **Continue planning**
813
+ then sat on "Working…" with nothing happening. Jobs now keep a recent tail of
814
+ their log in memory (the full log stays on disk behind **Open full log**),
815
+ job-stream updates are coalesced, and a tab that cannot keep up no longer
816
+ has snapshots buffered on its behalf. A control-center request that gets no
817
+ answer for two minutes now reports that instead of waiting forever.
818
+ - A code change no longer invalidates a documentation plan. Approving a plan
819
+ whose configured sources changed after it was proposed used to fail with
820
+ "Configured source evidence changed", mark the plan **stale**, and demand a
821
+ full agent revision, so any edit while a plan waited for review threw the
822
+ review away. Approval now proceeds with the structure as proposed, records
823
+ a note that the sources changed, and generation reads the current sources
824
+ when it writes each page. A change made between approval and generation is
825
+ logged instead of failing the run. Plans already marked stale by an earlier
826
+ version can be approved directly, or cleared with
827
+ `POST /api/plans/<plan-id>/resume`. Clicking **Use recommendation** on a
828
+ planner question now visibly confirms that the recommendation was applied.
829
+ - A code change no longer blocks a generated proposal from being edited or
830
+ applied. Proposals now refresh their configured-source snapshot and show a
831
+ non-blocking review advisory; proposals marked stale by an earlier version
832
+ are restored to review automatically. Concurrent edits to the documentation
833
+ itself remain protected by the file-level conflict check.
834
+ - A stale failed-plan screen no longer reports that a generated plan has no
835
+ failure to ignore. Recovery actions are idempotent once generation has
836
+ completed and return the generated plan so the browser refreshes to the
837
+ ready proposal.
838
+ - Plan workflow manifests under `.doxloop/plans/` no longer leak into generated
839
+ documentation proposals. Existing proposals automatically drop those
840
+ internal changes and clear the resulting false conflict, while real
841
+ documentation-file concurrency checks remain enforced.
842
+ - The local preview now renders `<Mermaid>` diagrams. It emitted the diagram
843
+ block but never loaded a renderer, so every lifecycle or architecture diagram
844
+ appeared as raw `flowchart LR …` text until the site was published.
845
+ - Coverage no longer counts prose as product surface. Discovery ran its
846
+ authentication, authorization, and integration keyword scans over every text
847
+ file — changelogs, roadmaps, skill references, evaluation fixtures, tests —
848
+ and every matching line became its own "public signal", so a sixteen-page
849
+ site reported 23% security coverage with 186 items and a hundred-odd "gaps"
850
+ that were sentences from a roadmap. Keyword signals now come only from
851
+ product code, once per keyword family per file; fixture, test, example, and
852
+ documentation paths contribute file-level evidence only; and exports count
853
+ only from package entry points (`main`, `exports`, `bin`, `index`), not from
854
+ every internal module.
855
+
856
+ - The live activity panel now has a Screenshots tab showing the images a run has
857
+ captured, refreshed while the run is still going. Captures that repeat an
858
+ earlier image are flagged, so a step saved under the name of a state the agent
859
+ never reached is visible before anything is applied.
860
+ - A failed documentation run whose preserved workspace still validates can now
861
+ be recovered into review instead of requiring a full agent re-run. Retrying
862
+ generation for an approved plan recovers the newest matching failed proposal
863
+ automatically, and `doxloop proposal recover --id <run-id>` or
864
+ `POST /api/proposals/<run-id>/recover` recover one directly. Recovery refuses
865
+ archived runs, runs without a workspace, and runs whose configured source
866
+ evidence changed after the failure.
867
+
868
+ ### Fixed
869
+
870
+ - A screenshot run can no longer quietly drop half its approved guides. The
871
+ agent built the capture manifest at the end, out of whatever it had captured,
872
+ so guides it decided to skip never appeared in the file at all — in one run it
873
+ covered four of eight guides, having decided the other four were "not a
874
+ distinct new screen" without ever navigating to them, and still reported
875
+ success. Doxloop now writes the manifest before the agent starts, with every
876
+ approved guide staged as `planned`, so capture is filling in a form rather
877
+ than inventing one. A guide left untouched is reported by name with the route
878
+ to open, instead of surfacing as a vague missing-manifest error, and the
879
+ authoring contract forbids judging a screen without opening it first.
880
+
881
+ - Screenshot runs no longer fail over repeated images they were told to take.
882
+ Capture sequences were planned with steps that are not distinct states —
883
+ "scroll to the history area", "focus the request field", "inspect the coverage
884
+ panel" — and on a screen that already fits the viewport each produced a
885
+ byte-identical file, so a run that followed its approved plan exactly was
886
+ rejected for duplicates. The planner no longer proposes a capture for a step
887
+ that does not change the screen, the authoring guidance treats the approved
888
+ count as a target rather than a quota, and Doxloop keeps the first image of a
889
+ screen and records the repeats as text-only instead of failing. Repeats are
890
+ judged within a guide: two guides showing the same screen is ordinary
891
+ documentation and is now reported for review rather than counted as a defect.
892
+
893
+ - Screenshot runs no longer throw away the screenshots they took. Doxloop asked
894
+ the agent to open each saved PNG and inspect it before marking the step
895
+ verified, which no agent CLI can do: a careful agent concluded it could not
896
+ verify anything, recorded every step as `text-only`, and a run whose captures
897
+ were all valid failed with "requires 1 verified capture, but produced 0".
898
+ Verification now happens before the shutter — confirm the state in a page
899
+ snapshot, then capture — and Doxloop checks the saved file itself, as it
900
+ already did. A capture left unrecorded is adopted into the step its filename
901
+ names, so a real screenshot is never lost to bookkeeping.
902
+
903
+ - Screenshot planning no longer collapses a whole product to one capture. The
904
+ planner treated screens as URL routes, so in a single-page control center it
905
+ saw one route, recorded every other screen as "not visibly reachable", and
906
+ planned a single screenshot for an entire documentation set. It is now told to
907
+ reveal screens through read-only in-app navigation — tabs, steps, disclosure
908
+ controls — to change no data, and to record a state as unavailable only after
909
+ actually trying to reach it. Thin screenshot coverage is now reported on the
910
+ plan for review — naming the likely cause, an application left on its initial
911
+ or empty state — instead of silently shipping or blocking the run.
912
+ - Planning no longer reads the wrong JSON object out of an agent transcript. It
913
+ previously took the first fenced block in the whole reply, which is usually a
914
+ quoted example from the skill references — an `.doxloop/project.json` or an
915
+ evidence map — rather than the plan. Doxloop now asks for the plan inside a
916
+ `<doxloop-plan>` block, ignores JSON it sent the agent itself, ignores objects
917
+ that are not plan-shaped, and takes the last real plan in the reply.
918
+ - An unreadable plan reply is retried once with the defect quoted back, instead
919
+ of failing the whole planning run. A malformed plan now reports the actual
920
+ JSON defect and its position, and is never silently truncated into a plan that
921
+ has lost pages.
922
+
923
+ - Plan approval no longer stalls behind an unexplained disabled button. The
924
+ application readiness check ran once when the plan opened and rendered nothing
925
+ when it failed, so a reviewer whose application started later saw a disabled
926
+ "Approve & generate" with no reason. The plan now always shows the readiness
927
+ state, offers "Check again", re-checks when the tab regains focus, and names
928
+ the one thing blocking approval.
929
+ - The plan screen no longer stays on "Researching sources" after planning has
930
+ finished. A refresh of the persisted plan is now triggered whenever a plan job
931
+ stops running, instead of being suppressed by the guard that exists only to
932
+ prevent duplicate navigation.
933
+ - Screenshot capture no longer fails silently on a missing folder. The capture
934
+ tool resolves its filename against the project root and does not create
935
+ directories, so a nested guide path whose folder did not exist failed with
936
+ `ENOENT` and wrote nothing — which is why runs reported screenshots that were
937
+ never taken. Doxloop now creates the guide asset directories for the approved
938
+ plan, per generator, before the capture browser starts, and the agent is told
939
+ that a failed call means no image exists.
940
+ - Captured screenshots are no longer lost to page placement. Doxloop's own
941
+ guidance told agents to put each image "inside the same ordered-list item",
942
+ while the Doxbrix skill told them to write procedures with `<Steps>`/`<Step>`
943
+ and showed no example of an image inside a step — so agents captured every
944
+ planned state, embedded the first, and orphaned the rest, failing the run.
945
+ The step components now document the pattern, the placement rule covers them,
946
+ and Doxloop places any verified capture the agent left unembedded into the
947
+ step it belongs to before validation runs.
948
+ - A repeated screenshot no longer throws away an otherwise good capture run. One
949
+ or two images reused for a state the agent could not reach are now reported on
950
+ the run for review — and flagged in the Screenshots tab — instead of failing
951
+ generation. A run where repeats outnumber distinct captures still fails, since
952
+ that means the capture pass did not really happen.
953
+ - Screenshot validation now reports every problem in a run at once instead of
954
+ failing on the first one. A run whose manifest marked a dozen steps verified
955
+ while capturing two images used to surface as a single misplaced screenshot,
956
+ hiding the rest until the next retry. The agent is also told to mark a step
957
+ verified only after its image exists, has been opened, and is embedded.
958
+ - Screenshots taken before a client-rendered application finished loading are
959
+ now rejected instead of published. Capturing straight after navigation returns
960
+ the splash or skeleton screen, which the old "at least four colours" emptiness
961
+ check accepted, so whole guides shipped as repeated pictures of a loading
962
+ page. A capture that is 98% or more a single colour is refused, and the agent
963
+ is told to confirm the expected content in a snapshot before capturing.
964
+ - A screenshot embedded in a page written at a generator-native path — a Doxbrix
965
+ overview saved as `index.mdx` rather than the planned `overview` slug — no
966
+ longer fails validation as "not embedded in its matching guide". Only an image
967
+ that no page references at all is now treated as a defect.
968
+ - Duplicate captures are reported together instead of one at a time, naming every
969
+ file in each identical group, and the agent is told to record states it cannot
970
+ reach as text-only rather than resaving the current screen under another name.
971
+ - Screenshot manifest validation no longer fails a completed run when the agent
972
+ writes a terse step field such as `action: "Open /"`: approved
973
+ capture-sequence text now maps by capture ordinal (text-only steps no longer
974
+ shift the mapping), the minimum-specificity rule is stated in the agent
975
+ prompt and authoring skill, and the validation error now explains what a
976
+ specific value requires.
977
+
978
+ - Post-Phase-4 hardening expands deterministic discovery across security,
979
+ errors, events, integrations, configuration, and framework routes; reports
980
+ unmeasurable coverage as Unknown; and revalidates semantic claims against
981
+ current source and OpenAPI facts.
982
+ - Interrupted UI authoring jobs now recover as safe retry checkpoints. Reviewer
983
+ revisions, rejections, and inline edits build a bounded, redacted local
984
+ preference record used by later planning and generation.
985
+ - The `doxloop quality` command now runs the configured isolated Node/Python and
986
+ OpenAPI example checks, axe and keyboard accessibility checks, light/dark
987
+ multi-viewport visual baselines, exact pixel tolerances, reviewed
988
+ suppressions, and quality ratcheting. Advanced policy remains in the shared
989
+ project configuration and CLI instead of crowding the main workflow. Public
990
+ coverage, quality, and evaluation payloads are schema validated before they
991
+ are stored or emitted.
992
+ - Agent generation/update evaluations now complete the real UI plan, approval,
993
+ proposal, and acceptance workflow. Proposal review can prepare an isolated
994
+ Git branch and commit, then push it or open a pull request only on explicit
995
+ request, without switching or editing the current checkout.
996
+
997
+ - Phase 4 release quality: `doxloop quality` now runs
998
+ one versioned contract across deterministic validation, generator strict
999
+ builds, cached external links, opt-in isolated Node examples, OpenAPI lint,
1000
+ documentation lint, claim reverification, and optional rendered
1001
+ accessibility and visual regression checks. Text/JSON output and CI exit
1002
+ behavior share stable machine-readable codes.
1003
+ - `doxloop evaluate` scores generation and update quality, preservation, and
1004
+ reviewer outcomes against an approved baseline. The agent/model matrix now
1005
+ records model, duration, score, and release-blocking regressions across ten
1006
+ realistic evaluation fixtures.
1007
+ - Optional evidence-derived reader verification metadata and Doxbrix badges
1008
+ surface verified, inferred, contradicted, or needs-review states without
1009
+ overstating source certainty. Versioned public contracts are shipped in
1010
+ `contracts/`.
1011
+
1012
+ - Stable workspace routes now match UI navigation and unsupported deep links
1013
+ show an explicit not-found state.
1014
+ - `doxloop demo` (including `npx @doxbrix/doxloop demo`) builds a complete,
1015
+ validated seven-page example in a temporary directory, demonstrates a
1016
+ generated plan, evidence map, source baseline, and structured review, opens
1017
+ the preview, and cleans up safely unless `--keep` is selected.
1018
+ - Connected source cards now use real connector checks and expose provider,
1019
+ branch, subdirectory, revision, check time, OpenAPI metadata, and actionable
1020
+ redacted failures. Monitoring is explicitly project-wide and exposes both
1021
+ daily run and agent-minute budgets.
1022
+
1023
+ - Versioned directory and OpenAPI source connectors now provide validated
1024
+ JSON/YAML inspection, safe remote caching, structural API diffs, and targeted
1025
+ drift.
1026
+ - Source ownership scopes, public-surface coverage in UI/CLI/JSON, evidence
1027
+ precision diagnostics, and configurable maximum verification age make source
1028
+ traceability visible and enforceable.
1029
+
1030
+ - Proposal review is now evidence-aware. Every file has a compact rationale
1031
+ drawer with source paths or API operations, revisions, affected interfaces,
1032
+ reader claims, confidence, assumptions, validation, and plan/request origin.
1033
+ - Reviewers can ask the terminal agent to revise one hunk, one file, selected
1034
+ files, or the whole proposal without changing the real documentation.
1035
+ Revisions remain isolated and scope-checked, while the original proposal is
1036
+ retained as superseded for audit.
1037
+ - Proposed pages can be edited directly in the review UI. Doxloop validates the
1038
+ result, records human authorship, and either preserves the evidence
1039
+ association or marks it for re-checking.
1040
+ - Applied proposals now support conflict-aware atomic undo from exact
1041
+ pre-acceptance snapshots. Proposal lifecycle controls add regeneration,
1042
+ stale-source protection, archive, 30-day retention, cleanup, and a focused
1043
+ responsive rendered comparison without manual device or theme selectors.
1044
+ - Create and update now use a persisted, versioned documentation plan before
1045
+ authoring. A deterministic, safely cached source inventory maps public
1046
+ capabilities to an evidence-backed page tree; users can edit the brief and
1047
+ page structure, answer one consolidated set of planner questions, compare
1048
+ plan versions, inspect structured evidence, and approve the exact scope.
1049
+ - Scope presets show source-derived page estimates, and generator adapters
1050
+ declare their native navigation boundaries while keeping the plan portable.
1051
+ - UI jobs expose structured planning and generation stages while retaining the
1052
+ complete terminal log for diagnostics.
1053
+
1054
+ - The workspace Update page shows an update history table: every request, its
1055
+ result, the pages it changed, and how each page was reviewed. The Publish page
1056
+ shows a publishing history table covering successful and failed deployments.
1057
+ - `doxloop history` shows what the project was asked to document and what
1058
+ happened: the request text, its outcome, the pages it touched, and whether
1059
+ each page was accepted or rejected in review. `--page` traces a single page,
1060
+ `--deployments` lists publishing history. Pages edited outside Doxloop are
1061
+ detected by content hash, so the record matches what is on disk.
1062
+ - Documentation history is stored in `.doxloop/doxloop.db` using the SQLite
1063
+ built into the required Node.js 22.13-or-newer runtime. There is nothing extra
1064
+ to install, the file is gitignored and owner-readable, and runtime readiness
1065
+ is reported before authoring. `DOXLOOP_NO_HISTORY=1` explicitly turns
1066
+ recording off. Agent transcripts are
1067
+ never stored; they remain in `.doxloop/ui-job-logs/`.
1068
+ - `doxloop ui` opens a loopback-only project control center covering setup,
1069
+ product evidence and GitHub connection tests, agent authoring, source
1070
+ monitoring, proposal review, preview, publishing, and
1071
+ complete project settings. Long-running work reports live output and can be
1072
+ cancelled. `doxloop sync review --open` now deep-links to its Proposals page.
1073
+ - The unified proposal workspace compares rendered pages side by side or
1074
+ stacked, folds unchanged content, exposes the source diff, and accepts one
1075
+ hunk, one page, or a complete proposal. It uses a session cookie, validates
1076
+ the Host and Origin headers, and never binds to a non-loopback interface.
1077
+ - `doxloop check` reports which documentation pages no longer match the
1078
+ configured sources. It starts no agent and uses no model: the answer comes
1079
+ from Git history, the recorded sync baseline, and the evidence map. It exits
1080
+ `1` when pages are stale, so it can gate a pull request without credentials.
1081
+ - `.doxloop/evidence-map.json` records which configured source and which
1082
+ source-relative paths produced each page. Authoring runs write it, and
1083
+ `doxloop check` uses it to name the affected pages instead of reporting that
1084
+ "a source changed".
1085
+ - A `sync` block in `.doxloop/project.json` configures automatic maintenance:
1086
+ `mode`, the product `branch` to follow, the triggers to run `on`, `watch` and
1087
+ `ignore` path patterns, and a run `budget`. Lock files and snapshots are
1088
+ ignored by default; test files are not, because the authoring workflow treats
1089
+ tests as evidence of supported behavior.
1090
+ - `doxloop sync <setup|status|now|review|history|off>` sets up automatic maintenance. `setup`
1091
+ asks three questions and installs the triggers; `status` verifies the hook,
1092
+ schedule, agent sign-in, evidence map, and current drift before anyone
1093
+ depends on it; `now` generates one isolated proposal; `history` lists all
1094
+ runs; `review --open` opens the review center; `off` removes triggers and
1095
+ keeps the settings. The wizard prints the equivalent non-interactive command.
1096
+ - `doxloop sync review --open` opens the unified control center on its Proposals
1097
+ page. Each page shows the current version beside the proposed version, both
1098
+ rendered the way the published site renders them, with changed words
1099
+ highlighted in place and untouched sections optionally folded away. View
1100
+ controls switch between side by side and stacked or open the line-by-line
1101
+ source diff with surrounding context and per-change Accept buttons. Acceptance
1102
+ works at three levels: one change, one page, or the whole proposal, and
1103
+ supporting files such as the evidence map are written automatically once every
1104
+ page has been accepted.
1105
+ - Review-first synchronization works with ordinary local documentation folders
1106
+ and does not require Git. Authoring happens in `.doxloop/runs/<id>/workspace`;
1107
+ real files remain unchanged until acceptance. Accepted selections are checked
1108
+ for intervening local edits, applied atomically, and validated. Partial
1109
+ acceptance applies only selected line hunks, while the source baseline moves
1110
+ forward only when the full proposal is accepted.
1111
+ - Git triggers are installed as marked blocks, so existing hooks are preserved,
1112
+ a second documentation project can share the same file, and Doxloop never
1113
+ blocks the Git operation. Pull and push triggers are mode-aware. `push`
1114
+ installs a real `pre-push`
1115
+ trigger; propose and auto hooks run a complete sync cycle while check hooks
1116
+ remain credential-free. Authoring triggers generate a pending review without
1117
+ editing or committing the actual documentation.
1118
+ - macOS schedules launch through the system shell so user-managed Node binaries
1119
+ can run under launchd. Setup smoke-tests the job, and status reports scheduler
1120
+ registration, running state, and the native last-exit result instead of
1121
+ treating plist presence as proof of health.
1122
+ - Evidence-map validation warns when one source path is attached to more than
1123
+ half the documentation pages, and authoring guidance requires an audit of
1124
+ shared routers, entry points, and integration tests to reduce false-positive
1125
+ stale-page reports.
1126
+ - A local scheduled run (`daily@HH:MM`) is registered with the platform's own
1127
+ scheduler — launchd, a systemd timer, cron, or Task Scheduler — so unattended
1128
+ runs use the agent CLI already signed in on that machine. Doxloop still never
1129
+ accepts or stores a model API key.
1130
+ - Unattended authoring: `create` and `update` can run without a terminal, with
1131
+ writes confined by the agent's own sandbox and a wall-clock budget. Validation
1132
+ must still pass before the sync baseline advances, and automation never
1133
+ deploys.
1134
+ - Validation warns when a page is missing from the evidence map, when the map
1135
+ references a deleted page or an unconfigured source, and when a page is
1136
+ recorded as needing human verification. These are warnings and appear only
1137
+ once a project has an evidence map.
1138
+
1139
+ ### Fixed
1140
+
1141
+ - Plan-first creation now becomes Update after its proposal is accepted. While
1142
+ generated files are awaiting review, Authoring shows the proposal handoff
1143
+ instead of reopening a second Create form, and planning buttons describe the
1144
+ action they start rather than claiming a proposal already exists.
1145
+
1146
+ ### Changed
1147
+
1148
+ - New native Doxbrix projects place `docs.json`, pages, and reader assets at the
1149
+ documentation project root instead of creating an additional `docs/`
1150
+ directory. Existing projects with `contentDir: "docs"` continue to work, and
1151
+ external generators keep their generator-native content directories.
1152
+
8
1153
  ## 0.1.5 - 2026-07-26
9
1154
 
10
1155
  ### Changed