@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.
- package/CHANGELOG.md +1145 -0
- package/README.md +422 -227
- package/assets/doxbrix-preview.css +77 -15
- package/contracts/agent-events-v1.schema.json +1 -0
- package/contracts/coverage-v1.schema.json +59 -0
- package/contracts/drift-v1.schema.json +1 -0
- package/contracts/evaluation-v1.schema.json +62 -0
- package/contracts/quality-codes-v1.json +1 -0
- package/contracts/quality-report-v1.schema.json +1 -0
- package/contracts/validation-v1.schema.json +1 -0
- package/dist/agent-failure.d.ts +36 -0
- package/dist/agent-failure.js +98 -0
- package/dist/agent-isolation.d.ts +17 -0
- package/dist/agent-isolation.js +94 -0
- package/dist/agent-log.d.ts +197 -0
- package/dist/agent-log.js +1094 -0
- package/dist/agent-process.d.ts +63 -0
- package/dist/agent-process.js +128 -0
- package/dist/agent-reply.d.ts +47 -0
- package/dist/agent-reply.js +315 -0
- package/dist/agents.d.ts +24 -5
- package/dist/agents.js +60 -9
- package/dist/api-coverage.d.ts +11 -0
- package/dist/api-coverage.js +72 -0
- package/dist/application-probe.d.ts +28 -0
- package/dist/application-probe.js +93 -0
- package/dist/application-url.d.ts +14 -0
- package/dist/application-url.js +26 -0
- package/dist/args.js +15 -0
- package/dist/artifact-deploy.d.ts +9 -0
- package/dist/artifact-deploy.js +28 -8
- package/dist/assets.d.ts +72 -0
- package/dist/assets.js +382 -0
- package/dist/auth.d.ts +10 -0
- package/dist/auth.js +38 -9
- package/dist/author.d.ts +206 -4
- package/dist/author.js +1650 -52
- package/dist/authoring-batches.d.ts +190 -0
- package/dist/authoring-batches.js +489 -0
- package/dist/authoring-postpass.d.ts +79 -0
- package/dist/authoring-postpass.js +1289 -0
- package/dist/authoring-progress.d.ts +95 -0
- package/dist/authoring-progress.js +269 -0
- package/dist/autosync.d.ts +56 -0
- package/dist/autosync.js +442 -0
- package/dist/batch-artifacts.d.ts +81 -0
- package/dist/batch-artifacts.js +412 -0
- package/dist/batch-limits.d.ts +37 -0
- package/dist/batch-limits.js +80 -0
- package/dist/branding.d.ts +41 -0
- package/dist/branding.js +229 -0
- package/dist/bundle-upload.d.ts +26 -0
- package/dist/bundle-upload.js +99 -0
- package/dist/capture-auth.d.ts +95 -0
- package/dist/capture-auth.js +204 -0
- package/dist/capture.d.ts +48 -0
- package/dist/capture.js +20 -1
- package/dist/cli.js +839 -32
- package/dist/content-links.d.ts +10 -0
- package/dist/content-links.js +49 -0
- package/dist/contract-validation.d.ts +4 -0
- package/dist/contract-validation.js +25 -0
- package/dist/coverage-actions.d.ts +8 -0
- package/dist/coverage-actions.js +71 -0
- package/dist/coverage-resolutions.d.ts +16 -0
- package/dist/coverage-resolutions.js +58 -0
- package/dist/db.d.ts +37 -0
- package/dist/db.js +288 -0
- package/dist/demo.d.ts +12 -0
- package/dist/demo.js +122 -0
- package/dist/deploy-credentials.d.ts +7 -0
- package/dist/deploy-credentials.js +76 -0
- package/dist/deploy-targets/github-pages.d.ts +3 -0
- package/dist/deploy-targets/github-pages.js +100 -0
- package/dist/deploy-targets/index.d.ts +8 -0
- package/dist/deploy-targets/index.js +78 -0
- package/dist/deploy-targets/netlify.d.ts +3 -0
- package/dist/deploy-targets/netlify.js +49 -0
- package/dist/deploy-targets/types.d.ts +32 -0
- package/dist/deploy-targets/types.js +2 -0
- package/dist/deploy-targets/vercel.d.ts +3 -0
- package/dist/deploy-targets/vercel.js +95 -0
- package/dist/deploy.d.ts +9 -0
- package/dist/deploy.js +87 -13
- package/dist/deterministic-capture.d.ts +90 -0
- package/dist/deterministic-capture.js +435 -0
- package/dist/direct-edit.d.ts +40 -0
- package/dist/direct-edit.js +159 -0
- package/dist/docs-crawl.d.ts +86 -0
- package/dist/docs-crawl.js +536 -0
- package/dist/docs-site.d.ts +49 -0
- package/dist/docs-site.js +233 -0
- package/dist/doctor.js +8 -0
- package/dist/documentation-collections.d.ts +23 -0
- package/dist/documentation-collections.js +191 -0
- package/dist/documentation-plan.d.ts +253 -0
- package/dist/documentation-plan.js +2563 -0
- package/dist/doxbrix-build.d.ts +19 -0
- package/dist/doxbrix-build.js +167 -0
- package/dist/doxbrix-markdown.d.ts +9 -0
- package/dist/doxbrix-markdown.js +115 -14
- package/dist/drift.d.ts +10 -0
- package/dist/drift.js +164 -0
- package/dist/evaluation.d.ts +46 -0
- package/dist/evaluation.js +113 -0
- package/dist/evidence-pack.d.ts +47 -0
- package/dist/evidence-pack.js +358 -0
- package/dist/evidence.d.ts +25 -0
- package/dist/evidence.js +175 -0
- package/dist/fs.d.ts +8 -2
- package/dist/fs.js +41 -11
- package/dist/generator-api.d.ts +89 -0
- package/dist/generator-preflight.d.ts +27 -0
- package/dist/generator-preflight.js +105 -0
- package/dist/generator-runtime.d.ts +7 -0
- package/dist/generator-runtime.js +17 -1
- package/dist/generators.d.ts +24 -2
- package/dist/generators.js +54 -1
- package/dist/git-delivery.d.ts +17 -0
- package/dist/git-delivery.js +123 -0
- package/dist/globs.d.ts +16 -0
- package/dist/globs.js +65 -0
- package/dist/glossary.d.ts +26 -0
- package/dist/glossary.js +179 -0
- package/dist/history.d.ts +106 -0
- package/dist/history.js +600 -0
- package/dist/html-markdown.d.ts +46 -0
- package/dist/html-markdown.js +423 -0
- package/dist/interactive.js +3 -0
- package/dist/job-events.d.ts +74 -0
- package/dist/job-events.js +377 -0
- package/dist/keep-awake.d.ts +50 -0
- package/dist/keep-awake.js +123 -0
- package/dist/local-source-snapshot.d.ts +20 -0
- package/dist/local-source-snapshot.js +61 -0
- package/dist/mintlify-detect.d.ts +3 -0
- package/dist/mintlify-detect.js +18 -0
- package/dist/mintlify-import.d.ts +75 -0
- package/dist/mintlify-import.js +190 -0
- package/dist/navigation.d.ts +98 -0
- package/dist/navigation.js +310 -0
- package/dist/openapi.d.ts +60 -0
- package/dist/openapi.js +439 -0
- package/dist/page-editor-bridge.d.ts +3 -0
- package/dist/page-editor-bridge.js +109 -0
- package/dist/page-editor-preview.d.ts +10 -0
- package/dist/page-editor-preview.js +55 -0
- package/dist/page-extension.d.ts +9 -0
- package/dist/page-extension.js +15 -0
- package/dist/page-metadata.d.ts +28 -0
- package/dist/page-metadata.js +166 -0
- package/dist/page-operations.d.ts +34 -0
- package/dist/page-operations.js +215 -0
- package/dist/page-routes.d.ts +4 -0
- package/dist/page-routes.js +61 -0
- package/dist/pages.d.ts +20 -0
- package/dist/pages.js +184 -0
- package/dist/plan-generator.d.ts +3 -0
- package/dist/plan-generator.js +21 -0
- package/dist/plan-navigation.d.ts +11 -0
- package/dist/plan-navigation.js +30 -0
- package/dist/planning-captures.d.ts +20 -0
- package/dist/planning-captures.js +143 -0
- package/dist/planning-research.d.ts +135 -0
- package/dist/planning-research.js +472 -0
- package/dist/planning-triage.d.ts +23 -0
- package/dist/planning-triage.js +131 -0
- package/dist/preview.d.ts +24 -0
- package/dist/preview.js +280 -29
- package/dist/project-detect.d.ts +36 -0
- package/dist/project-detect.js +251 -0
- package/dist/project-import.d.ts +54 -0
- package/dist/project-import.js +157 -0
- package/dist/project-lock.d.ts +6 -0
- package/dist/project-lock.js +96 -0
- package/dist/project-registry.d.ts +25 -0
- package/dist/project-registry.js +79 -0
- package/dist/project.d.ts +35 -3
- package/dist/project.js +388 -38
- package/dist/prompts.d.ts +9 -0
- package/dist/prompts.js +25 -0
- package/dist/proposal-replay.d.ts +32 -0
- package/dist/proposal-replay.js +99 -0
- package/dist/quality-claims.d.ts +8 -0
- package/dist/quality-claims.js +168 -0
- package/dist/quality-config.d.ts +5 -0
- package/dist/quality-config.js +84 -0
- package/dist/quality-contract.d.ts +37 -0
- package/dist/quality-contract.js +46 -0
- package/dist/quality-examples.d.ts +4 -0
- package/dist/quality-examples.js +233 -0
- package/dist/quality-gates.d.ts +16 -0
- package/dist/quality-gates.js +192 -0
- package/dist/quality-links.d.ts +7 -0
- package/dist/quality-links.js +149 -0
- package/dist/quality-lint.d.ts +6 -0
- package/dist/quality-lint.js +124 -0
- package/dist/quality-rendered.d.ts +11 -0
- package/dist/quality-rendered.js +222 -0
- package/dist/quality-schema.d.ts +3 -0
- package/dist/quality-schema.js +71 -0
- package/dist/release-notes.d.ts +44 -0
- package/dist/release-notes.js +183 -0
- package/dist/remote-monitor.d.ts +16 -0
- package/dist/remote-monitor.js +74 -0
- package/dist/remote-source.d.ts +34 -0
- package/dist/remote-source.js +426 -0
- package/dist/review-diff.d.ts +82 -0
- package/dist/review-diff.js +400 -0
- package/dist/review-learning.d.ts +11 -0
- package/dist/review-learning.js +60 -0
- package/dist/review-render.d.ts +38 -0
- package/dist/review-render.js +224 -0
- package/dist/review-report.d.ts +9 -0
- package/dist/review-report.js +89 -0
- package/dist/review-ui.d.ts +14 -0
- package/dist/review-ui.js +1248 -0
- package/dist/schedule.d.ts +78 -0
- package/dist/schedule.js +480 -0
- package/dist/screen-capture-provider.d.ts +52 -0
- package/dist/screen-capture-provider.js +218 -0
- package/dist/screenshot-workflow.d.ts +167 -0
- package/dist/screenshot-workflow.js +1237 -0
- package/dist/settings.d.ts +1 -1
- package/dist/settings.js +95 -7
- package/dist/site-export.d.ts +18 -0
- package/dist/site-export.js +87 -0
- package/dist/source-connectors.d.ts +33 -0
- package/dist/source-connectors.js +268 -0
- package/dist/source-discovery.d.ts +132 -0
- package/dist/source-discovery.js +823 -0
- package/dist/source-intelligence.d.ts +9 -0
- package/dist/source-intelligence.js +306 -0
- package/dist/sync-review.d.ts +28 -0
- package/dist/sync-review.js +264 -0
- package/dist/sync-runs.d.ts +192 -0
- package/dist/sync-runs.js +2244 -0
- package/dist/sync.d.ts +35 -0
- package/dist/sync.js +298 -32
- package/dist/text-diff.d.ts +9 -0
- package/dist/text-diff.js +59 -0
- package/dist/types.d.ts +946 -1
- package/dist/ui/assets/doxloop-logo-light-De7Nx7j7.png +0 -0
- package/dist/ui/assets/index-BHBYU2aG.css +1 -0
- package/dist/ui/assets/index-Cq3RPQiC.js +33 -0
- package/dist/ui/index.html +18 -0
- package/dist/ui-server.d.ts +83 -0
- package/dist/ui-server.js +3532 -0
- package/dist/usage-budget.d.ts +28 -0
- package/dist/usage-budget.js +90 -0
- package/dist/validation.d.ts +25 -1
- package/dist/validation.js +312 -26
- package/dist/workspace-tools.d.ts +54 -0
- package/dist/workspace-tools.js +123 -0
- package/docs/agent-compatibility.md +49 -32
- package/docs/ci-and-automation.md +105 -66
- package/docs/doxbrix-http-api.md +8 -1
- package/docs/existing-documentation.md +80 -0
- package/docs/generation-performance.md +108 -0
- package/docs/generator-authoring.md +68 -5
- package/docs/generator-selection.md +50 -13
- package/docs/mintlify-import.md +71 -0
- package/docs/openapi-security.md +25 -0
- package/docs/project-format.md +331 -36
- package/docs/release-quality.md +158 -0
- package/docs/releasing.md +72 -0
- package/docs/review-workflows.md +51 -0
- package/docs/security-model.md +102 -39
- package/docs/troubleshooting.md +226 -93
- package/package.json +46 -15
- package/scripts/test-auto-screenshot.mjs +172 -0
- package/skills/doxloop-authoring/SKILL.md +242 -361
- package/skills/doxloop-authoring/references/existing-documentation.md +94 -0
- package/skills/doxloop-authoring/references/navigation-architecture.md +18 -7
- package/skills/doxloop-authoring/references/page-depth.md +169 -0
- package/skills/doxloop-authoring/references/project-format.md +106 -7
- package/skills/doxloop-authoring/references/quality.md +10 -0
- package/skills/doxloop-authoring/references/screenshot-manifest.md +113 -0
- package/skills/doxloop-authoring/references/screenshots.md +149 -235
- package/skills/doxloop-authoring/references/workflows.md +76 -0
- package/skills/doxloop-doxbrix/SKILL.md +38 -22
- package/skills/doxloop-doxbrix/references/api-endpoints.md +15 -14
- package/skills/doxloop-doxbrix/references/components.md +30 -3
- package/skills/doxloop-doxbrix/references/manifest.md +3 -2
- package/vendor/doxbrix-import/LICENSE +202 -0
- package/vendor/doxbrix-import/README.md +17 -0
- package/vendor/doxbrix-import/UPSTREAM.json +47 -0
- package/vendor/doxbrix-import/dist/docs/frontmatter.d.ts +13 -0
- package/vendor/doxbrix-import/dist/docs/frontmatter.js +83 -0
- package/vendor/doxbrix-import/dist/docs/import.d.ts +21 -0
- package/vendor/doxbrix-import/dist/docs/import.js +147 -0
- package/vendor/doxbrix-import/dist/docs/manifest.d.ts +163 -0
- package/vendor/doxbrix-import/dist/docs/manifest.js +64 -0
- package/vendor/doxbrix-import/dist/docs/project.d.ts +25 -0
- package/vendor/doxbrix-import/dist/docs/project.js +77 -0
- package/vendor/doxbrix-import/dist/docs/starter.d.ts +4 -0
- package/vendor/doxbrix-import/dist/docs/starter.js +11 -0
- package/vendor/doxbrix-import/dist/importer.d.ts +227 -0
- package/vendor/doxbrix-import/dist/importer.js +1567 -0
- package/vendor/doxbrix-import/dist/mintlify-openapi.d.ts +37 -0
- package/vendor/doxbrix-import/dist/mintlify-openapi.js +305 -0
- package/vendor/doxbrix-import/dist/safe-path.d.ts +9 -0
- package/vendor/doxbrix-import/dist/safe-path.js +47 -0
- package/dist/agents.d.ts.map +0 -1
- package/dist/agents.js.map +0 -1
- package/dist/args.d.ts.map +0 -1
- package/dist/args.js.map +0 -1
- package/dist/artifact-deploy.d.ts.map +0 -1
- package/dist/artifact-deploy.js.map +0 -1
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js.map +0 -1
- package/dist/author.d.ts.map +0 -1
- package/dist/author.js.map +0 -1
- package/dist/capture.d.ts.map +0 -1
- package/dist/capture.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/deploy.d.ts.map +0 -1
- package/dist/deploy.js.map +0 -1
- package/dist/deployment-visibility.d.ts.map +0 -1
- package/dist/deployment-visibility.js.map +0 -1
- package/dist/doctor.d.ts.map +0 -1
- package/dist/doctor.js.map +0 -1
- package/dist/doxbrix-markdown.d.ts.map +0 -1
- package/dist/doxbrix-markdown.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/fs.d.ts.map +0 -1
- package/dist/fs.js.map +0 -1
- package/dist/generator-api.d.ts.map +0 -1
- package/dist/generator-api.js.map +0 -1
- package/dist/generator-manager.d.ts.map +0 -1
- package/dist/generator-manager.js.map +0 -1
- package/dist/generator-runtime.d.ts.map +0 -1
- package/dist/generator-runtime.js.map +0 -1
- package/dist/generators.d.ts.map +0 -1
- package/dist/generators.js.map +0 -1
- package/dist/interactive.d.ts.map +0 -1
- package/dist/interactive.js.map +0 -1
- package/dist/preview.d.ts.map +0 -1
- package/dist/preview.js.map +0 -1
- package/dist/progress.d.ts.map +0 -1
- package/dist/progress.js.map +0 -1
- package/dist/project.d.ts.map +0 -1
- package/dist/project.js.map +0 -1
- package/dist/prompts.d.ts.map +0 -1
- package/dist/prompts.js.map +0 -1
- package/dist/settings.d.ts.map +0 -1
- package/dist/settings.js.map +0 -1
- package/dist/sync.d.ts.map +0 -1
- package/dist/sync.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js.map +0 -1
- package/dist/version.d.ts.map +0 -1
- 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
|