@doxbrix/doxloop 0.1.4 → 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 +1153 -0
  2. package/README.md +422 -226
  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 +40 -4
  22. package/dist/agents.js +115 -11
  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 +16 -15
  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 +33 -4
  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 +50 -28
  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
@@ -3,14 +3,11 @@
3
3
  Doxloop stores project configuration under `.doxloop/`. Commit the configuration
4
4
  and synchronization state when a team should share the same authoring decisions.
5
5
 
6
- Create a new documentation project beside, never inside, the product source:
7
-
8
- ```bash
9
- doxloop init
10
- ```
11
-
12
- Run `doxloop settings` inside the documentation project to change shared
13
- configuration without editing JSON by hand.
6
+ The setup wizard creates a new documentation project beside, never inside, the
7
+ product source. Use **Settings** in the control center to change shared
8
+ configuration without editing JSON by hand; this page documents the files
9
+ themselves for review, version control, and advanced options that have no
10
+ form field.
14
11
 
15
12
  ## `project.json`
16
13
 
@@ -18,11 +15,21 @@ configuration without editing JSON by hand.
18
15
  {
19
16
  "schemaVersion": 1,
20
17
  "title": "Example documentation",
21
- "contentDir": "docs",
18
+ "contentDir": "",
22
19
  "generator": "doxbrix",
23
- "sources": [{ "name": "product", "path": "../product" }],
20
+ "sources": [{
21
+ "name": "product",
22
+ "path": "../product",
23
+ "remote": {
24
+ "provider": "github",
25
+ "repository": "example/product",
26
+ "branch": "main",
27
+ "tokenEnv": "GITHUB_TOKEN"
28
+ }
29
+ }],
24
30
  "designReferences": [{ "url": "https://docs.example.com/" }],
25
31
  "deployment": {
32
+ "target": "doxbrix",
26
33
  "name": "Example documentation",
27
34
  "slug": "example-docs",
28
35
  "visibility": "private",
@@ -31,18 +38,21 @@ configuration without editing JSON by hand.
31
38
  "application": {
32
39
  "baseUrl": "http://localhost:3000/",
33
40
  "source": "product",
34
- "startCommand": "npm run dev",
35
41
  "readyPath": "/health",
36
42
  "screenshots": {
37
43
  "policy": "requested",
38
44
  "viewport": { "width": 1440, "height": 900 },
39
- "highlight": true
45
+ "highlight": true,
46
+ "startPath": "/settings/team",
47
+ "workflow": "Reuse the signed-in demo workspace and synthetic team members. Capture the invite form and successful invitation state."
40
48
  }
41
49
  },
42
50
  "documentation": {
43
51
  "primaryAudience": "Application developers",
44
52
  "experienceLevel": "intermediate",
45
53
  "priorityOutcomes": ["Install the SDK", "Send the first request"],
54
+ "preferredExamples": ["TypeScript", "curl"],
55
+ "designDirection": "Compact developer reference with task-led guides",
46
56
  "locale": "en-US",
47
57
  "tone": ["clear", "direct", "professional"],
48
58
  "standardsProfile": "doxloop-v1",
@@ -50,42 +60,316 @@ configuration without editing JSON by hand.
50
60
  "terminology": {},
51
61
  "exclusions": [],
52
62
  "accessibilityTarget": "WCAG 2.2 AA"
63
+ },
64
+ "sync": {
65
+ "mode": "check",
66
+ "branch": "main",
67
+ "on": ["every@15m"],
68
+ "watch": ["src/**", "openapi.yaml"],
69
+ "ignore": ["pnpm-lock.yaml"],
70
+ "budget": { "maxRunsPerDay": 8, "maxMinutes": 15, "maxUsd": 10 },
71
+ "maxVerificationAgeDays": 30,
72
+ "maxVerificationAgeSeverity": "warn"
53
73
  }
54
74
  }
55
75
  ```
56
76
 
57
- - `contentDir` must be a non-symlinked relative directory inside the project.
58
- - `sources` is the optional read-only evidence allowlist used by the authoring
59
- workflow. It may be empty when no local product source is available. Configured
77
+ - `title` and `defaultAgent` are edited under **Settings → General**.
78
+ - `contentDir` is empty for new native Doxbrix projects, meaning reader content
79
+ lives at the project root. Existing projects may retain a non-symlinked
80
+ relative directory such as `docs`; external generators use their native
81
+ content directories.
82
+ - `sources` is the read-only evidence allowlist managed on the **Sources**
83
+ page. It may be empty when no local product source is available. Configured
60
84
  source paths must be outside the documentation project; sibling product and
61
- documentation directories are the recommended layout.
85
+ documentation directories are the recommended layout. Git repository sources
86
+ carry a `remote` object and are downloaded as read-only snapshots into a
87
+ `.doxloop-sources` directory beside the project. A source may declare
88
+ `scope.space`, `scope.routePrefix`, and `scope.navigationGroup`, edited
89
+ through **Documentation ownership** on the Sources page. Route prefixes
90
+ cannot overlap. Pages intentionally shared by several sources must be named
91
+ in `scope.sharedPages`.
62
92
  - `generatorPackage` is required for an external generator and must match the
63
93
  official package selected by `generator`.
64
94
  - `designReferences` accept absolute HTTP or HTTPS URLs without credentials.
65
- - `application` is optional and describes a safe local or test application
66
- surface for guide screenshots. `source` names a configured source and is
67
- required when `startCommand` is present. Screenshot policy is `requested`,
68
- `auto`, or `off`; projects without this object keep the existing behavior.
69
- - `deployment` optionally saves the hosted project name, slug, visibility, and
70
- Doxbrix destination used by `doxloop deploy`. Missing values are derived from
71
- the project title and default to private.
72
- - `documentation` persists confirmed reader, scope, terminology, editorial, and
73
- accessibility decisions.
95
+ - `application` is edited under **Settings → Visual evidence** and describes a
96
+ safe local or test application surface for guide screenshots. `source` names
97
+ a configured source. A legacy `startCommand` is preserved when present but
98
+ is never executed by the capture workflow; the user owns application startup
99
+ and test data. Screenshot policy is `requested`, `auto`, or `off`; projects
100
+ without this object keep the existing behaviour. `screenshots.startPath`
101
+ records the default starting route, and `screenshots.workflow` records
102
+ authentication, safe fixture data, ordered actions, and expected outcomes
103
+ that constrain capture planning. `authentication.loginPath` names the
104
+ sign-in route the browser sign-in opens. Sign-in secrets are never stored
105
+ here: the recorded browser session and any test-account credentials live
106
+ under `~/.config/doxloop/capture-auth/<project key>/` (or
107
+ `$DOXLOOP_CONFIG_HOME`) with owner-only permissions, keyed by the project
108
+ root, and are managed under **Settings → Visual evidence → Application
109
+ sign-in**.
110
+ - `deployment.target` is `doxbrix`, `github-pages`, `netlify`, or `vercel`.
111
+ Common fields save the project name and slug. Doxbrix also uses `visibility`
112
+ and `apiUrl`; GitHub Pages uses `branch` and optional `basePath`; Netlify uses
113
+ `siteId`; Vercel uses `projectId` and optional `teamId`. Provider tokens are
114
+ never stored here—they come from the OS credential store, protected user
115
+ configuration, or `DOXLOOP_NETLIFY_TOKEN` / `DOXLOOP_VERCEL_TOKEN`. Missing
116
+ names and slugs are derived from the project title.
117
+ - `documentation` persists confirmed reader, scope, terminology, editorial,
118
+ and accessibility decisions, edited under **Settings → Audience and voice**
119
+ and in each plan's **Documentation brief**.
120
+ - `sync` configures automatic maintenance and is managed by the
121
+ **Monitoring** dialog on the Sources page. `mode` is `check` (report only),
122
+ `propose` (generate an isolated review when run manually), or `auto`
123
+ (generate an isolated review from configured triggers). Authoring modes
124
+ never alter real documentation before approval and do not require
125
+ documentation Git. `branch` names the product branch documentation follows.
126
+ `on` selects one polling frequency: `every@Nm`, `every@Nh`, `daily@HH:MM`,
127
+ `weekdays@HH:MM`, `weekly@<day>@HH:MM`, or `monthly@<day>@HH:MM`. `watch`
128
+ and `ignore` are path patterns applied to changed source files; `ignore`
129
+ always wins. `budget` caps unattended runs: `maxRunsPerDay` limits scheduled
130
+ runs, `maxMinutes` stops an agent (and the planner) after that many minutes,
131
+ and `maxUsd` passes a spending cap to Claude Code, which is the only agent
132
+ with such a flag. Missing values use the defaults below. `maxVerificationAgeDays` warns or fails (according to
133
+ `maxVerificationAgeSeverity`) when evidence has not been reverified
134
+ recently, even when source revisions are unchanged.
135
+
136
+ Default `ignore` patterns cover lock files and snapshots. Test files are
137
+ deliberately not ignored, because the authoring workflow treats tests as
138
+ evidence of supported behaviour, so a changed test can legitimately change
139
+ documentation.
74
140
 
75
141
  Schema version 1 treats a missing legacy `generator` as `doxbrix` and supplies
76
142
  the default documentation brief when it is absent. Unsupported structures fail
77
143
  closed rather than being silently migrated.
78
144
 
145
+ ### Imported projects
146
+
147
+ A folder that already holds a documentation site can be adopted from the
148
+ control center (**Use existing documentation folder** in the setup wizard, or
149
+ **Import existing documentation…** in the project switcher) or with
150
+ `doxloop init --existing [directory]`. The generator is recognized from its
151
+ configuration files: `docs.json` (Doxbrix), `docusaurus.config.*`,
152
+ `mkdocs.yml`, `astro.config.*` mentioning Starlight, `<dir>/.vitepress/config.*`,
153
+ `next.config.*` mentioning Nextra or `theme.config.*`, `markdoc.config.*`,
154
+ `hugo.*` or a Hugo `config.toml`, `<dir>/conf.py` (Sphinx), and `_config.yml`
155
+ (Jekyll). The content directory and title are read from the same files where
156
+ they are declared, and both can be overridden.
157
+
158
+ Import writes `project.json` with no sources and the default brief, an
159
+ `evidence-map.json` in which every existing page has no sources and the
160
+ confidence `needs-human` (so the first update run must attach evidence before
161
+ drift detection trusts the page), the machine-local `.gitignore` entries
162
+ listed above, and the agent skills. It then runs a read-only discovery pass.
163
+ Pages, navigation, and generator configuration are never modified. A
164
+ generator other than Doxbrix must have its Doxloop generator package
165
+ resolvable from the folder; the control center offers to add it as a
166
+ development dependency.
167
+
168
+ ## `projects.json` (user level)
169
+
170
+ The control center keeps a list of the projects it has opened at
171
+ `~/.doxloop/projects.json` (`DOXLOOP_HOME` overrides the directory). Each
172
+ entry records the project path, title, generator, and when it was last opened,
173
+ newest first, capped at twenty entries. The file is a convenience: a damaged
174
+ one is ignored and rewritten on the next open, and a project whose
175
+ `.doxloop/project.json` has disappeared is shown as missing until it is removed
176
+ from the list.
177
+
178
+ ```json
179
+ {
180
+ "schemaVersion": 1,
181
+ "projects": [
182
+ { "path": "/work/product-docs", "title": "Product documentation", "generator": "doxbrix", "lastOpenedAt": "2026-09-04T10:12:00.000Z" }
183
+ ]
184
+ }
185
+ ```
186
+
187
+ ## `quality.json`
188
+
189
+ `.doxloop/quality.json` is an optional version 1 contract for external-link
190
+ policy and cache lifetime, opt-in executable examples, rendered routes and
191
+ viewports, lint limits, and disabled-by-default reader verification metadata.
192
+ See [release quality](./release-quality.md) for the complete schema and safety
193
+ model. Quality reports, link caches, current screenshots, and evaluation
194
+ results are derived artifacts; approved visual and evaluation baselines may be
195
+ committed when a team wants CI regression protection.
196
+
197
+ Proposal runs live under `.doxloop/runs/<id>/`: the isolated `workspace/`
198
+ the agent wrote into, the reviewed `run.json`, `baseline.json`, which holds a
199
+ content hash of every file as the workspace was created so review can tell
200
+ what the agent changed from what changed in the project while it ran, and
201
+ `authoring.json`, which records the instructions, agent, model, screenshot
202
+ mode, and source summary the run was started with so a failed run can be
203
+ resumed in place. UI recovery
204
+ checkpoints and logs live in `.doxloop/ui-jobs.json` and
205
+ `.doxloop/ui-job-logs/`. Learned local review guidance is stored in
206
+ `.doxloop/review-preferences.json`, and prepared Git delivery metadata is stored
207
+ in `.doxloop/deliveries/`. These machine-local artifacts are owner-readable,
208
+ excluded from proposal snapshots, and added to `.gitignore`; they are not part
209
+ of the portable project contract.
210
+
211
+ ## Documentation plans
212
+
213
+ The control center creates `.doxloop/plans/<plan-id>/plan.json` before any
214
+ create or update authoring begins. The current approved snapshot is copied to
215
+ `.doxloop/documentation-plan.json` for the generation agent. Plan version 2 is
216
+ generator-neutral and records:
217
+
218
+ - the confirmed reader brief, scope, exclusions, terminology, locale,
219
+ accessibility target, and style guide;
220
+ - deterministic discovery metadata and an evidence-backed capability map;
221
+ - page actions, purposes, priorities, structured source evidence, and the
222
+ navigation outline;
223
+ - open clarification questions and their confirmed answers;
224
+ - the selected generator's content format, extensions, and native navigation
225
+ boundaries; and
226
+ - the estimated page count, effort, execution settings, approval hash, and
227
+ resulting proposal ID.
228
+
229
+ Every reviewable revision is archived in
230
+ `.doxloop/plans/<plan-id>/versions/v<N>.json`. Version 1 plans are migrated on
231
+ read without changing reader-facing documentation. Planning discovery is cached
232
+ by safe source-content hash under `.doxloop/cache/discovery/`; cache files and
233
+ plan run logs are operational state and should not be committed.
234
+
235
+ A plan in `planning`, `revising`, or `needs-input` cannot authorize authoring.
236
+ **Approve & generate** records an integrity hash, and generation refuses to
237
+ proceed if either the approved plan or its configured source snapshot changed.
238
+ Pages marked for a future backlog are omitted from the current proposed run.
239
+
240
+ ## Quality review reports
241
+
242
+ Read-only agent reviews are stored as owner-readable JSON files under
243
+ `.doxloop/reviews/`. A report records the selected agent, model and reasoning,
244
+ the bounded score, hard-gate result, summary, and structured findings with page
245
+ and evidence references. Raw agent transcripts are not copied into these
246
+ reports. Reviews do not edit documentation, alter an approved plan, or create a
247
+ proposal; deterministic validation remains a separate release signal.
248
+
249
+ Request and deployment history uses `.doxloop/doxloop.db` and therefore requires
250
+ the package runtime contract, Node.js 22.13 or newer. Set
251
+ `DOXLOOP_NO_HISTORY=1` in the environment that starts the control center only
252
+ as an explicit opt-out; the **Update history** and **Deployment history**
253
+ panels surface that state.
254
+
79
255
  ## `sync-state.json`
80
256
 
81
- Each Git source records the commit, timestamp, and a fingerprint of tracked and
82
- untracked non-ignored, non-credential source content used by the last successful
83
- authoring run. The fingerprint prevents an unchanged dirty working tree from
84
- being reported again after its content is committed.
257
+ Each source records the provider commit and timestamp used by the last accepted
258
+ automatic proposal. Local manual workflows can also record a fingerprint of
259
+ tracked and untracked non-ignored, non-credential source content used by the
260
+ last successful authoring run. The fingerprint prevents an unchanged dirty
261
+ working tree from being reported again after its content is committed.
262
+
263
+ A local folder without Git history records the marker commit `local-content`
264
+ together with the fingerprint and a `files` map of source-relative paths to
265
+ content digests. A later check compares the folder against that map, so it
266
+ can name the added, modified, and deleted files even though there is no
267
+ commit range to diff. Credential files are never read or listed.
268
+
269
+ Doxloop updates synchronization state only when a create or update proposal
270
+ has been fully accepted, documentation validation passes, and the brief has a
271
+ primary audience and priority outcomes. Automatic review runs keep their staged
272
+ state separate and copy it into the real project only after every proposed
273
+ change has been accepted.
274
+
275
+ ## `runs/`
276
+
277
+ `.doxloop/runs/` is ignored runtime state for generated documentation reviews.
278
+ Each run contains an isolated workspace, original copies of changed files, a
279
+ `baseline.json` hash manifest of the project as the run started, and a
280
+ `run.json` manifest with the trigger, validation result, exact line hunks, and
281
+ acceptance decisions. A change whose file also moved in the project while the
282
+ agent ran is marked `changedDuringRun`; the **Review** page groups those under
283
+ **Changed while the agent ran** and asks before applying them. The **Review** page lists the manifests and renders them.
284
+ The directory is not required to be committed and can be retained according to
285
+ local review policy; **Clean up archived** on the Review page removes eligible
286
+ workspaces.
287
+
288
+ The current run manifest is schema version 2. Each file change records its
289
+ reason, configured source paths or operations and revisions, affected public
290
+ interfaces, reader-facing claims, file-relevant validation, confidence,
291
+ assumptions, originating plan or request, and agent or human authorship. This
292
+ is what the **Why this change** panel shows. Schema-version-1 manifests are
293
+ migrated when read.
294
+
295
+ **Ask agent to revise** seeds a new isolated workspace from the prior proposal
296
+ and records the selected files or hunks and reviewer instruction. The old
297
+ proposal is retained as superseded. **Edit page** changes remain inside the
298
+ workspace, run validation, and record whether existing evidence still applies
299
+ or needs review.
300
+
301
+ Before the first accepted hunk, Doxloop snapshots the exact affected files and
302
+ operational sync state. A completed application also snapshots the exact
303
+ applied result. Undo compares the live files with that result and stops instead
304
+ of overwriting a later edit; successful undo restores the pre-acceptance
305
+ snapshot atomically. Proposals receive a 30-day retention date. Archived
306
+ workspaces are removed only through explicit cleanup, while expired rejected,
307
+ failed, superseded, and undone workspaces are eligible for cleanup.
308
+
309
+ ## `evidence-map.json`
310
+
311
+ `.doxloop/evidence-map.json` records which configured source, and which
312
+ source-relative paths or API operations, produced each page. Commit it: it is
313
+ what lets Monitoring name the individual pages a later source change made
314
+ stale, rather than reporting only that a source changed.
315
+
316
+ ```json
317
+ {
318
+ "schemaVersion": 1,
319
+ "pages": {
320
+ "docs/guides/authentication.md": {
321
+ "sources": [{ "source": "product", "paths": ["src/auth.ts"] }],
322
+ "verifiedAt": { "product": "9f2c1ab..." },
323
+ "verifiedOn": { "product": "2026-08-26T10:00:00.000Z" },
324
+ "confidence": "verified",
325
+ "claims": ["Access tokens expire after 900 seconds"],
326
+ "claimVerification": {
327
+ "Access tokens expire after 900 seconds": "verified"
328
+ }
329
+ }
330
+ }
331
+ }
332
+ ```
333
+
334
+ Pages are keyed by project-relative path including the extension. A recorded
335
+ directory matches everything below it. An entry without `paths` means the page
336
+ depends on the whole source. `confidence` is `verified`, `inferred`, or
337
+ `needs-human`; the last raises a validation warning so an unverified claim is
338
+ visible rather than silently published.
339
+
340
+ Authoring runs write this file. A malformed file fails closed: delete it and
341
+ run an update from the **Update** page to rebuild it.
342
+
343
+ `verifiedAt` records the source revision or content hash. `verifiedOn` records
344
+ when the claims were actually checked and drives the maximum-age policy. Claim
345
+ checks treat changed or expired evidence as `needs-human` rather than
346
+ preserving an old verified state. `claimVerification` may record an exact claim
347
+ as `verified`, `inferred`, `contradicted`, or `needs-human`; it must never
348
+ claim more certainty than the configured source supports.
349
+
350
+ The **Documentation coverage** section of the Sources page reports connector
351
+ health, coverage by public surface and source scope, and evidence-precision
352
+ suggestions. Coverage describes traceability to discovered evidence; it is not
353
+ a correctness score.
354
+
355
+ ## `coverage-resolutions.json`
356
+
357
+ `.doxloop/coverage-resolutions.json` records explicit decisions made from the
358
+ coverage gap review on the Sources page. A resolution can link a reader journey
359
+ to an existing page (**Link existing page**), exclude a discovered source item
360
+ from the supported public surface (**Mark as internal**), drop a journey that
361
+ is no longer a priority, or retain a needs-human decision (**Decide later**).
362
+ Commit this file so exclusions and journey mappings remain stable for every
363
+ contributor and CI run.
364
+
365
+ Linking a product surface also writes its precise identifier to
366
+ `.doxloop/evidence-map.json`. Removing a reader journey updates
367
+ `documentation.priorityOutcomes` in `project.json`. Future documentation plans
368
+ preserve those configured outcomes verbatim, even when the planning agent adds a
369
+ more specific description, so wording changes do not reset journey coverage.
85
370
 
86
- Doxloop updates synchronization state only when create or update exits
87
- successfully, documentation validation passes, and create has saved a primary
88
- audience and priority outcomes.
371
+ Coverage uses the newest approved, generating, or generated plan. Planning,
372
+ cancelled, failed, and stale drafts do not replace the coverage baseline.
89
373
 
90
374
  ## `last-run.json`
91
375
 
@@ -102,8 +386,19 @@ be committed.
102
386
 
103
387
  Application guide screenshots are different: they are reader-facing assets,
104
388
  are placed in the selected generator's native asset directory, and should be
105
- committed with the guide. `doxloop create --screenshots` and
106
- `doxloop update --screenshots` require them explicitly; a request that clearly asks for
107
- screenshots also enables the authoring workflow. Contextual focus rings and
389
+ committed with the guide. They are enabled per run by **Add product
390
+ screenshots?** on the Create and Update pages, or by the screenshot policy
391
+ under **Settings → Visual evidence**; a request that clearly asks for
392
+ screenshots also enables the capture workflow. Contextual focus rings and
108
393
  numbered markers are baked into the image so they render consistently across
109
- generators.
394
+ generators. Plans record whether screenshots are automatic, required, or
395
+ disabled and identify the specific UI guides, application-relative start path,
396
+ ordered safe workflow, and an explicit capture sequence from entry through
397
+ verification before approval. The sequence contains one meaningful visible
398
+ state per planned image; UI-heavy tutorials and how-to guides therefore plan
399
+ several captures instead of defaulting to one final-state screenshot. Approval
400
+ requires a reachable configured application and complete capture details for
401
+ every visual guide. During generation the agent writes
402
+ `.doxloop/screenshot-manifest.json`; Doxloop verifies the planned page, purpose,
403
+ expected state, PNG dimensions, uniqueness, embedding, and completed privacy and
404
+ legibility checks before it creates a review proposal.
@@ -0,0 +1,158 @@
1
+ # Release quality and evaluations
2
+
3
+ Doxloop applies quality gates at every step of the loop in the control center:
4
+
5
+ - **Planning** cannot be approved while clarification questions are open, and
6
+ generation refuses to start if the approved plan or its source snapshot
7
+ changed.
8
+ - **Proposals** run page validation before they appear on the **Review** page.
9
+ The **Why this change** panel shows each file's error and warning counts,
10
+ supporting evidence, reader-facing claims, and assumptions to verify.
11
+ Direct page edits are validated before they are saved.
12
+ - **Publish** validates the documentation again and builds the site before
13
+ anything is uploaded.
14
+ Validation errors stop a deployment; warnings are reported.
15
+
16
+ The versioned release-quality contract described below extends those checks
17
+ with external links, OpenAPI linting, documentation lint, claim
18
+ reverification, and opt-in executable, accessibility, and visual checks. It is
19
+ the release-grade definition of "ready", stores its complete JSON report below
20
+ `.doxloop/quality-reports/`, and is designed for the headless checks described
21
+ in [automation and CI](./ci-and-automation.md). A failing gate exits with
22
+ status 1; warnings exit 0 unless the contract is run with warnings treated as
23
+ errors.
24
+
25
+ ## Shared quality configuration
26
+
27
+ Optional settings live in `.doxloop/quality.json`:
28
+
29
+ ```json
30
+ {
31
+ "schemaVersion": 1,
32
+ "links": {
33
+ "mode": "online",
34
+ "allowHosts": ["developer.example.com"],
35
+ "ignore": ["https://status.example.com/"],
36
+ "timeoutMs": 8000,
37
+ "retries": 2,
38
+ "cacheHours": 24
39
+ },
40
+ "examples": { "enabled": true },
41
+ "rendered": {
42
+ "enabled": true,
43
+ "routes": ["/", "/quickstart"],
44
+ "themes": ["light", "dark"],
45
+ "maximumDiffRatio": 0.001,
46
+ "viewports": [
47
+ { "name": "desktop", "width": 1440, "height": 900 },
48
+ { "name": "mobile", "width": 390, "height": 844 }
49
+ ]
50
+ },
51
+ "lint": {
52
+ "maximumTitleLength": 72,
53
+ "maximumNavigationLabelLength": 42
54
+ },
55
+ "suppressions": [{
56
+ "code": "quality.claim.needs-human",
57
+ "file": "reference/legacy.md",
58
+ "reason": "Owner-approved migration exception",
59
+ "expires": "2026-09-30"
60
+ }],
61
+ "ratchet": {
62
+ "enabled": true,
63
+ "baselineFile": ".doxloop/quality-baseline.json"
64
+ },
65
+ "readerVerification": { "enabled": false }
66
+ }
67
+ ```
68
+
69
+ External checks cache successful and broken responses, so an offline run can
70
+ use only that cache. Authentication responses and temporary network/server
71
+ failures are warnings, not broken-link failures. Private destinations and
72
+ credential-bearing URLs are blocked.
73
+
74
+ Suppressions require a reason, can be limited to one file, and can expire. They
75
+ remain in the report as `skipped`; they are not silently removed. Ratcheting
76
+ matches the exact issue code, file, and message so an approved legacy issue does
77
+ not permit a different regression with the same broad code. The current
78
+ reviewed findings can be approved as the baseline from the headless quality
79
+ check. Advanced policy stays in this shared configuration so the control
80
+ center remains a simple status, fix, and recheck flow.
81
+
82
+ ## Executable examples
83
+
84
+ Example execution is opt-in through `.doxloop/examples.json`:
85
+
86
+ ```json
87
+ {
88
+ "schemaVersion": 1,
89
+ "examples": [{
90
+ "id": "parse-config",
91
+ "runtime": "node",
92
+ "file": "examples/parse-config.mjs",
93
+ "workingDirectory": ".",
94
+ "fixtures": ["examples/config.json"],
95
+ "network": "denied",
96
+ "expected": { "exitCode": 0, "stdoutIncludes": "valid" }
97
+ }]
98
+ }
99
+ ```
100
+
101
+ Node examples run from a temporary workspace with a minimal environment,
102
+ explicit filesystem permissions, no network permission, a timeout, and no
103
+ shell. Python examples use `runtime: "python"` and require a locally installed,
104
+ digest-pinned Docker image configured with `DOXLOOP_PYTHON_SANDBOX_IMAGE`
105
+ (for example, `python@sha256:<the approved image digest>`). Doxloop never
106
+ executes Python examples directly on the host. Without the configured image,
107
+ the check is skipped and cannot earn executed-example credit. Containers use
108
+ no network, a read-only filesystem and fixture mount, an unprivileged user,
109
+ no Linux capabilities, and CPU, memory, PID and time limits. The image is
110
+ never pulled automatically. A missing image or unavailable daemon fails the
111
+ execution check; it does not fall back to host Python. Apparent credentials are rejected. Use `runtime:
112
+ "shell-source-verified"` or `runtime: "source-verified"` when a command cannot
113
+ be executed with a portable network/filesystem sandbox; the report keeps that
114
+ distinction instead of overstating verification.
115
+
116
+ Use `runtime: "openapi-request"` for `.http` request examples. The first
117
+ `METHOD /path` line and an optional `# expect-status: 202` directive are checked
118
+ against the currently connected OpenAPI contract without contacting an API.
119
+
120
+ ## Rendered accessibility and visual checks
121
+
122
+ Rendered checks use a managed browser only when enabled. Representative pages
123
+ are checked at configured widths for landmarks, accessible names, images,
124
+ heading order, and horizontal overflow. The report always retains a manual
125
+ WCAG review requirement for keyboard order, focus, contrast, zoom, reflow, and
126
+ assistive-technology output.
127
+
128
+ Current screenshots are stored in `.doxloop/quality-artifacts/`. Approved
129
+ baselines are separate by generator, theme, route, and viewport under
130
+ `.doxloop/visual-baselines/`, and are updated from the headless quality check
131
+ after an intentional design change has been reviewed.
132
+
133
+ ## Documentation lint and safe fixes
134
+
135
+ Linting reports terminology drift, substantial duplicate prose, common
136
+ spelling errors, difficult sentences, title length, and navigation-label
137
+ length. Safe fixes only perform deterministic formatting changes: inferred code
138
+ fence languages, unambiguous heading-rank repair, normalized local-link syntax,
139
+ trailing whitespace, and final newlines. They never rewrite factual prose.
140
+
141
+ ## Claim states and reader metadata
142
+
143
+ Evidence-map claims resolve to `verified`, `inferred`, `contradicted`, or
144
+ `needs-human`. Changed evidence never remains verified automatically. When
145
+ `readerVerification.enabled` is true, Doxloop writes
146
+ `.doxloop/verification-metadata.json` and supplies the matching locale,
147
+ verification date, source revision, confidence, and state to native Doxbrix
148
+ preview and deployment output. The feature is disabled by default.
149
+
150
+ ## Evaluations
151
+
152
+ Doxloop maintainers score generation, update, and review quality across agents
153
+ and models with fixture projects. Those evaluations drive the same plan-first
154
+ control-center workflow as a user, need a locally signed-in agent, and are
155
+ documented for contributors in [releasing](./releasing.md). Machine-readable
156
+ v1 schemas and the append-only issue-code policy are published in
157
+ `contracts/`. Codes can be baselined, suppressed, or ratcheted; presentation
158
+ text is not an API.
package/docs/releasing.md CHANGED
@@ -58,3 +58,75 @@ peer range is updated when necessary, and they are built and published after
58
58
  the root package. Unchanged generators keep their existing versions and are
59
59
  skipped. A dry run lists the exact package set without changing versions or
60
60
  publishing.
61
+
62
+ ## Evaluations
63
+
64
+ Model-backed evaluations are maintainer tooling, not part of the reader
65
+ workflow. Keep the deterministic typecheck, tests, skill validation, build, and
66
+ package checks on every pull request, and run evaluations from a scheduled or
67
+ manually approved job on a developer machine or self-hosted worker where a
68
+ coding agent is signed in.
69
+
70
+ ```bash
71
+ doxloop evaluate --mode generation --max-pages 12
72
+ doxloop evaluate --mode update --before ../docs-before \
73
+ --expected-change guides/billing.md --approve-baseline
74
+ pnpm eval:agents -- --agent codex --case cli
75
+ pnpm eval:agents -- --agent codex --model codex=<model> --case localized-update
76
+ pnpm eval:agents -- --mode generation --agent codex --case rest-api
77
+ pnpm eval:agents -- --mode update --agent codex --case localized-update
78
+ ```
79
+
80
+ Review evaluations run the agent read-only. A review case must exit
81
+ successfully, identify the required behaviour signals, cite enough configured
82
+ source evidence, prioritize findings, report a score out of 100, and leave the
83
+ fixture project byte-for-byte unchanged.
84
+
85
+ Generation and update evaluations instead exercise the same plan-first
86
+ control-center contract as a user: wait for the proposed plan, approve it,
87
+ generate into an isolated proposal, accept that proposal, and score the
88
+ resulting documentation. They mutate only the temporary fixture copy.
89
+
90
+ Workspace evaluations score factual grounding, unsupported claims, coverage,
91
+ information architecture, executable examples, evidence precision, page
92
+ economy, update locality and preservation, accessibility, and reviewer
93
+ outcomes. Reports compare with `.doxloop/evaluation-baseline.json` and can
94
+ block on a configured regression threshold. The agent matrix runs identical
95
+ fixtures across agents and models, records duration and scores, and compares
96
+ with the reviewed `evals/baseline.json`. Output is written below the
97
+ Git-ignored `evals/results/` directory. Use `--approve-baseline` only after
98
+ reviewing a deliberate improvement or model change.
99
+
100
+ ### Product hardening acceptance checks
101
+
102
+ Run `DOXLOOP_E2E_REAL=1 pnpm exec playwright test` after building. CI runs this
103
+ suite against the actual local UI server and a deterministic fake agent. The
104
+ Pages test verifies proposed changes stay isolated, accepts an edit, compares
105
+ exact file contents after undo, and exercises direct draft preview/save/undo.
106
+
107
+ Run `node scripts/ci-existing-sites.mjs` for two existing-site fixtures in
108
+ `evals/native-sites`. The script installs the real Docusaurus and MkDocs
109
+ runtimes, builds before import, imports without changing pages/configuration,
110
+ creates a fake-agent update, accepts it, builds the result, undoes it, and
111
+ builds again. It asserts custom slugs, non-root base paths, file-style URLs,
112
+ asset contents and exact restored prose. CI runs this separately from unit
113
+ tests and uploads `evals/results/existing-sites.json`.
114
+
115
+ Real-agent evaluation remains opt-in, outside `pnpm test` and ordinary CI:
116
+
117
+ ```sh
118
+ pnpm run build
119
+ node scripts/run-authoring-evals.mjs --agent codex --model codex=gpt-5.5 --case cli --mode review
120
+ node scripts/run-authoring-evals.mjs --agent claude --case cli --mode generation
121
+ node scripts/run-authoring-evals.mjs --agent codex --model codex=gpt-5.5 --case localized-update --mode update
122
+ ```
123
+
124
+ Choose a model supported by the installed agent CLI and your account. Results
125
+ record the CLI version, model selection, fixture digest, elapsed time, exit
126
+ status, matched evidence and quality measurements. Review scoring uses the
127
+ final response rather than the agent's echoed prompt or tool transcript.
128
+ Generation/update runs preserve generated workspaces and raw quality/evaluation
129
+ reports under the ignored results folder. Tooling failures remain failed runs;
130
+ they do not earn content-quality credit. No new baseline is approved unless
131
+ `--approve-baseline` is explicitly supplied. Review scores measure detection of
132
+ known fixture defects; they are not proof of production documentation quality.