docs(reference): reference IA completeness, README truth, and CLI verb coverage - #1541
Conversation
Adds the four missing `-core` reference pages so the reference IA covers 35/35 effective-publish workspace members instead of 31/35: plugin-sagas-core, plugin-streams-core, plugin-triggers-core, plugin-workers-core. Root-surface symbol tables are exhaustive against `deno doc --json` for each package's declared exports (41 / 51 / 106 / 32 rows), and every subpath entrypoint carries its measured export count. Also corrects two claims in the reference index. It said these pages "are generated from the source code with `deno doc`, so they always describe the published surface" — nothing in the repository writes into docs/site/reference/; every tooling reference to that path reads or checks it. The pages are hand-written, and saying otherwise implied a currency guarantee that does not exist. The index now says so, and records the page path convention the site actually follows today: name-exact for 31 members, with the four deployable plugins dropping the `plugin-` prefix. That is a description, not a rule — reconciling the two forms is a separate decision. Refs #1377 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QGrdeXR3yuCZt78FxtpMy5
|
[PHASE: IMPL] S1 — reference IA completeness + reference index truth Commit ScopeNew pages (hand-written, derived from
Edited: The generator question — resolved before authoringThe brief required settling whether a generator writes these pages. It does not. Every tooling
The only So the index's claim — pages "are generated from the source code with Symbol-table completenessRoot-surface tables are exhaustive against
Each page also carries an Entrypoints table with the measured export count for all 19 / 4 / 12 / 17 Path convention — described, not decidedMeasured across the workspace: 35 effective-publish members; 31 pages at the name-exact The index records exactly that and states it is a description of today's site, not a rule to follow GatesBaselines were captured at
NextS2 |
jsr-package-settings.json sets readmeSource: "readme", so this file is what a consumer sees on JSR — and it led with the dialect #1373 demoted. `createQueryFactories` appeared only in the export table, never in prose, while the "Why teams use it" bullets front-loaded `createQueryFactory` (the single-resource form) and listed `createServiceQueryUtils` as an equal peer of `createNetScriptQueryClient`. Leads with `createQueryFactories` and its `queryOptions(input)` shape. `createServiceQueryUtils` stays documented, because `defineServices` returns `queryUtils.*` built from it, but as the narrower helper it is: `queryOptions({ input })`, no server KV tier. The new section states the distinction the way docs/site/reference/sdk/index.md:111 states it, rather than inventing a second framing. Refs #1377 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QGrdeXR3yuCZt78FxtpMy5
…n count The quickstart asserted "The scaffold reports 183 files, 44 directories" while docs/site/quickstart.vto:51 tells readers the opposite — that the totals vary with the database, service, editor, and agent-tooling options and that the printed result, not a static number in a guide, is the authority. A number frozen in a README is wrong for every reader who picked different options, and silently wrong for everyone once the scaffold changes. Removed; the README now says the scaffold prints its own totals and why they vary. Also resolves the dangling `jsr:@netscript/cli@<version>` in the install line. The site derives its specifier from packages/cli/deno.json (_data.ts:30-33); a static README cannot, so it now says explicitly what the reader substitutes and where to find it, and notes that bare `jsr:@netscript/*` specifiers do not resolve on the pre-release line. Refs #1377 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QGrdeXR3yuCZt78FxtpMy5
|
[PHASE: IMPL] S2 + S3 — README truth ( Commits S2 —
|
| Gate | Command | Exit | Result |
|---|---|---|---|
| Code quality | deno task quality:gate |
0 | pass; doctrine readiness reports FAIL=0 for every package, WARN/INFO only (all pre-existing, none in a file this PR touches) |
| Publish dry-run | deno task publish:dry-run |
0 | Success Dry run complete |
| Markdown format | deno fmt README.md packages/sdk/README.md |
0 | reformatted, then --check clean |
| Internal doc links | deno task docs:links |
0 | broken-links=0 broken-anchors=0 orphans=0 |
| Docs accuracy | deno task docs:accuracy |
0 | PASS |
#1417 watch — the side effect did not occur. git status --short immediately after
publish:dry-run was empty: no catalog-backed manifest was rewritten, nothing to revert, and
deno.lock is untouched by this PR.
Correction to a claim in this PR's own S1 comment
S1 reported that deno fmt does not govern the touched files. That is right for docs/site/**/*.md
(docs/site/deno.json fmt.exclude lists **/*.md, and an exclude beats an explicit path argument)
but wrong for README.md: an explicit path is formatted even though the root fmt.include does
not discover it. Both READMEs in this slice were formatted with deno fmt and re-verified with
--check (exit 0), and the edited text was re-read after the rewrap. drift.md DR-4 is corrected to
match.
Found, not fixed
deno task docs:readme:check fails at exit 1 on main and still does:
packages/bench/README.md is missing its ## Install section (1/36 non-conformant). Pre-existing,
not a file this PR touches, and README-standard conformance is #767's scope — recorded as DR-6 rather
than swept in.
Next
S4 — the CLI reference: six undocumented verbs and the two contradicted deploy claims.
…face `agent drift`, `plugin ai`, `deploy desktop`, `deploy package-cli`, `deploy list`, and `config list` had no prose anywhere under docs/site (`plugin ai` had one incidental line in the plugin-ai page and appeared in neither command reference). All six are now in the exhaustive command reference; five also reach the curated CLI reference. Corrects `cli-reference.md`'s claim that `deploy docker` and `deploy compose` "are not wired — they only print help". They are wired: each exposes plan/up/down/status/logs routed to AspireComposeDeployTarget, whose handlers are all implemented. The bare group prints help because every command group does, `deploy` itself included. Deliberately does NOT change `commands.md`'s "three-verb lifecycle — plan, up, down" for the five cloud targets, which the slice brief flagged as a second wrong claim. It is right. The CLI verb surface is the intersection of an adapter's advertised `operations` with the router's ROUTED_OPERATIONS, and `emit` is absent from the latter (target-deploy-command.ts:15-23) — so the cloud targets really do expose three verbs. The section is rewritten to cover docker/compose and to explain why the verb lists differ, but the true sentence is kept. See drift.md DR-8; the unreachable `emit` is DR-7. Two behaviours are documented from source rather than from a description string: `agent drift record` refuses without a successful diagnostic receipt under 15 minutes old, and `plugin ai` forwards raw arguments to the installed plugin's own CLI, so its verbs are that plugin's to document. Refs #1377 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QGrdeXR3yuCZt78FxtpMy5
|
[PHASE: IMPL] S4 — CLI reference: six verbs, and one of the two "wrong claims" turns out to be right Commit The deploy verb surface, measuredThe brief said to verify the operations array myself and not to copy #1377's wording. Doing so There are two arrays, and only their intersection reaches the CLI. 1 — each adapter advertises
2 — the router walks a fixed candidate list and skips anything the adapter does not advertise const ROUTED_OPERATIONS: readonly DeployOperation[] = [
'plan', 'up', 'down', 'status', 'logs', 'rollback', 'secrets',
];
What that means for the two claims
DR-7 — a real defect found on the way
Six verbs documented
Two behaviours are documented from source rather than paraphrased from a description string, because
Gates
NextSlice checklist complete. Handing to the opposite-family Codex audit. Staying draft; not marking |
|
[LANE: docs_audit] [VERDICT: PASS] Opposite-family, full-changeset audit of Gate 9 follow-up decisionSelected (a): the separately published The VerdictPASS after in-place documentation corrections. This was the opposite-family Gate log
Fix dispositionFixed in place:
Flagged but not fixed: none. The unrouted adapter Audit-fix commits: PR remains draft. This comment is the |
Label correction: that audit is
|
Edit-only prose pass after the opposite-family audit (no technical claims changed): - unify the provenance sentence on the four new plugin-*-core pages with the template used across the 33 corrected pages - remove three remaining internal (US-8) tokens from public reference prose (plugin-ai, sagas, streams) - align two "generated" stragglers the audit's harmonization missed (cli-reference featureGrid body, commands.md intro) with the verified "API reference / written against deno doc" wording - fix a garbled clause in the reference lane intro - smooth the two audit-patched root-README sentences (scaffold totals, plugin-install output) and normalize "Substitute" to "Replace" Refs #1377 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QGrdeXR3yuCZt78FxtpMy5
docs_polish — edit-only prose pass (commit 232daf0)Final polish lane after the opposite-family audit. No technical claim, number, symbol, command, flag, path, or count was changed. 11 files, +16/−17 lines. What changed
Deliberately left alone
Doubts returned to the audit lane (not fixed here)
Gates (final state)
Note: running PR stays draft; ready-for-review flip belongs to the orchestrator. 🤖 Generated with Claude Code |
|
OPENHANDS_VERDICT: FAIL_FIX IMPL-EVAL — PR #1541 (docs(reference): reference IA completeness, README truth, CLI verb coverage)Evaluator session over trusted base FIND-1 (HIGH) — type-fixture exemption removal leaves the repo-wide quality gate red
FIND-2 (LOW) — no blocking documentation defectsReference IA structure, deployable-plugin → SummaryDeliverable and verdict written to |
|
[PHASE: IMPL] Fixed the sole authoritative IMPL-EVAL blocker at head ScopeOnly the five existing The five negative cases still compile as intended: the direct fixture check exits 0, which also Raw gate output
|
|
[PHASE: FAIL_FIX VERIFICATION] [VERDICT: gates green] — orchestrator, head Independently re-run, not read from the repair commit.
The check that mattered more than the blockerA TypeScript reports an unused The five reasons are derived, not templatedEach states what its assertion actually proves:
Five copies of "negative compile fixture" would have satisfied the scanner and told a future reader nothing. These match the specificity of the sibling allowances already accepted in Recorded boundary exceptionThis PR now carries one
Re-trigger lifecycle now runs on the new immutable head |
|
@openhands-agent model=openrouter/deepseek/deepseek-v4-flash-0731 output=pr-comment iterations=800 phase=impl head=8376bd1bdf1d57529351bf40b9b3d4058ab2089e Trusted base SHA: 3c9dc1f use harness SKILL
Act as the formal IMPL-EVAL session for this pull request. Do not edit files, create commits, push, Return concise, severity-ranked findings with exact evidence and required action. End with exactly |
OpenHands Agent — CompletedOPENHANDS_VERDICT: PASS Model: IMPL-EVAL — PR #1541 (docs(reference): reference IA completeness, README truth, CLI verb coverage)Evaluator session, isolated from the generator. Trusted base SummaryThis is the content half of issue #1377. A prior IMPL-EVAL at head ChangesHead Validation (independent, head
|
| Gate | Result |
|---|---|
deno task quality:scan:repo |
ok:true, 0 findings, allowCount 15 (the 5 new allowances present) |
deno check --unstable-kv on the rfc fixture |
exit 0 — all 5 @ts-expect-error are still needed (unused directive would error) |
deno task docs:links |
PASS — docs=102 broken-links=0 broken-anchors=0 orphans=0 |
deno task docs:accuracy |
PASS — 196 published source pages |
| Root-surface exhaustiveness | sagas 41/41, streams 51/51, triggers 106/106, workers 32/32 vs deno doc; no fabricated/omitted root symbols |
| Entrypoint counts | streams root 51 / sse 33 / telemetry 33 / testing 4; workers root 32 each match deno doc |
| Lock hygiene | no deno.lock, no cache, no scratch in changeset |
Deploy-surface claims (three-verb cloud targets, five-verb docker/compose, emit advertised but
unrouted), README truth (no fabricated file counts/4 plugin files/12 Aspire helpers; version-pin),
and CLI verbs/coverage were re-checked against source and match. PLAN-EVAL: N/A recorded per the
orchestrator brief; DESIGN/worklog (D-1..D-8) reconcile the source-vs-doc decisions.
Findings (severity-ranked)
- LOW-1 — PR body "documentation only" claim is now stale. The body states it "changes no
source underpackages/**orplugins/**exceptREADME.mdfiles." The final changeset adds
source edits topackages/sdk/tests/type-fixtures/(3 files), regenerates
packages/cli/src/kernel/assets/agent-tools.generated.ts, and edits
.llm/tools/quality/scan-code-quality.ts. These are deliberate, fully gated-green, and recorded
as a documented boundary exception by the orchestrator — not a correctness defect — but the PR
body should be corrected to reflect the actual changeset before merge. - LOW-2 — partial subpath coverage on the streams-core page.
plugin-streams-core/index.md
documents thessesubpath 12/33,telemetry5/33,testing2/4 while the entrypoints table
reports the true counts; it claims no subpath exhaustiveness and fabricates no symbols, but it is
less complete than the sagas-core page, which documents its subpaths exhaustively. Minor asymmetry
for a PR whose headline is "reference IA completeness"; suggest a one-line note or completion.
Neither finding blocks merge.
Responses to review/issue comments
The prior FAIL_FIX thread (comment 5266764152) is fully addressed at head 8376bd1bd; verified, not
assumed. No new unanswered review threads exist on the PR (0 thread comments).
Remaining risks
- LOW-1/LOW-2 as above (non-blocking).
- Source defects deliberately out of scope and carried in drift: unrouted adapter
emit,
version('1.0.0'),docs:accuracyhardcoded reference path (DR-3/DR-7/DR-5). None introduced by
this PR.
OPENHANDS_VERDICT: PASS
Run: https://github.com/rickylabs/netscript/actions/runs/31599236878
…PR-E/PR-F Lane ownership confirmed as exactly #1377, #1531, #1554, #1565. PR-G is a lane deliverable and must appear in closeout, not just as a filing. Placement reasoning recorded: PR-G does not compete with #1541 on files, but head immutability is the binding constraint -- PR-C is mid-evaluation on an immutable head, and anything inviting a re-merge costs another eval cycle. So PR-G waits for PR-C to merge rather than merely using a different worktree. Placed before PR-E and PR-F because both run docs:snippets locally and the doc-audit profile requires a site build, so each would otherwise poison its own worktree and hit a false red on unmodified content. Landing PR-G first means each pays that tax zero times instead of once. Records the constraint that matters: the census must stay byte-identical. An over-broad exclusion silently shrinks coverage, which is the defect class #1374 exists to end, and the issue already carries the negative test for it. Refs #1565 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QGrdeXR3yuCZt78FxtpMy5
|
OPENHANDS_VERDICT: PASS IMPL-EVAL — PR #1541 (docs(reference): reference IA completeness, README truth, CLI verb coverage)Evaluator session over trusted base Sole prior blocker — resolved and verifiedThe previous IMPL-EVAL at head
Documentation accuracy — verified against source
Findings (severity-ranked, non-blocking)
Neither finding blocks merge. Source defects outside this PR's scope are accurately carried in |
|
[PHASE: PRE-MERGE GATE] [VERDICT: PASS] — 0.0.6 docs-lane orchestrator, head Terminal automatic IMPL-EVAL: run LOW-1 — corrected, and it was wrong in three ways, not oneThe body claimed "documentation only … no source under
Two of those are not comments. A body asserting "documentation only" over a rendered subtitle and a live registry is the same class of false claim this PR exists to remove from the docs themselves. LOW-2 — assessed, not inflated: the asymmetry is in the package, not the page
So the page is correct and the asymmetry lives in the package's own declared surface. Either it is a deliberately narrow public surface — no defect — or it under-exports relative to its siblings, which is a packaging question owned by whoever owns that surface, not by a docs PR. Editing the page to "balance" it would make it disagree with Current-main checks — the interesting one
File overlap with this PR: zero. But #1560 — "stop scanning negative type fixtures as production source" — semantically overlaps this PR's own FAIL_FIX remediation. Rather than assume the combination was fine, I test-merged this branch onto current
The fixture check is the one that still matters: exit 0 proves all five Merging. |
* chore(harness): bootstrap the PR-F phase-eval label-race slice The cleanup step removes status labels read from an event-payload snapshot, so a concurrent dispatch 404s and reds a run whose evaluation succeeded. Reproduced on PR #1541 at head 0503991 across runs 31596291515 and 31596293364, with exactly-once verified intact. Refs #1566 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R1uTFgh4emCPxSs7m72Pqf * chore(harness): activate PR-F slice * test(agentic): prove phase-eval cleanup race red * fix(agentic): make phase-eval status cleanup race-safe * fix(agentic): keep evaluator dispatch independent * chore(harness): close PR-F review fix * fix(agentic): inline phase-eval status transition * chore(harness): record self-contained gate proof --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Third merge: db1d79c, PR #1541, closing nothing by design. #1377 remains OPEN with 8 of 13 acceptance rows ticked -- the four gate rows and the post-merge JSR row are PR-D's and cannot be truthfully ticked yet. Normalized to status:plan rather than status:shipped, because marking it shipped would assert work that does not exist and would contradict the reason the issue was split. The split earned its keep at the gate: close-gate initially failed because the parser read a Closes keyword out of prose describing a different PR, and had the body actually carried one, merging would have auto-closed #1377 with four rows undone and stranded PR-D. Refs #1377 #1374 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QGrdeXR3yuCZt78FxtpMy5
main advanced 2 commits past the failed canary source, adding #1541's 46 docs/site files and the rewritten packages/sdk/README.md -- the public JSR landing page. The re-cut is a different payload, so its note must be re-measured at the re-cut SHA rather than copied from the failed attempt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TKxrWGp5uxEHQ2NyZiZSMF
Measured the scope at dispatch rather than trusting the filing: "Group [A-Z]" spans 6 files across 3 packages (cli, plugin-sagas-core, plugin-triggers-core), not the one the issue was filed from. Names the one way this slice can do real damage: the T[0-9] pattern also matches legitimate TypeScript generic type parameters, so a blanket replace would corrupt type signatures. The brief requires reading each occurrence and reporting the deliberate exclusions. Source first, page second -- the reference page mirrors deno doc, and PR #1541's contribution was making that claim honest, so editing the page independently would undo it. Refs #1554 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QGrdeXR3yuCZt78FxtpMy5
Summary
The content half of #1377: give every publishable package a reference page, stop the docs asserting
things that are not true (a generator that does not exist, a scaffold file count that is not
authoritative, two
deploycommands described as unwired that are implemented), and document six CLIverbs that had no prose anywhere.
This PR is predominantly documentation, but it is not documentation-only, and the earlier
claim that it changed no source outside
README.mdwas stale. The deliberate non-prose edits, allof them intentional and each verified:
packages/sdk/tests/type-fixtures/sdk-client-contributions-rfc_type.tsquality-allow:reason appended to each of five@ts-expect-errordirectivesmainand reached this branch through the merge that brought in the #1374 compile gate.deno checkon the fixture exits 0, which proves every directive is still needed — the negatives still fail to compile, so the markers changed what the scanner reports, not what the compiler does.docs/site/_data/xref.tsplugin-*-corepages had noref:xref keys, soref:plugin-sagas-coreand its siblings would not have resolved. Folder-derived nav had made them visible but not linkable.docs/site/_data.ts"Every symbol, generated"→"Every published symbol"docs/site/_components/nextPrev.vtoEverything else is prose, reference pages, two READMEs, and run artifacts. No
plugins/**change. Nodeno.lockchange. No generated asset regenerated here — the stale MCP agent-docs corpus is #1531and is deliberately untouched.
Scope
docs/site/**), plusREADME.mdfiles only underpackages/**(the
publish-readiness.tsreference-page check that currently runs over zero packages, thecommand-coverage gate, the path-convention decision) is a separate PR, and that PR is the one
carrying the closing keyword for this issue. This PR must not auto-close the issue.
evidence comment.
Slices
-corereference pages + reference index truth/convention —e22a2f952packages/sdk/README.md— golden-path query dialect —68cf6f2e5README.md— scaffold count and install specifier —617b74884f3893df5bValidation
Baselines captured at
cd24e1679before any edit; both docs gates were already green, so thedeltas below are attributable to this PR.
deno task docs:linksdocs=102 broken-links=0 broken-anchors=0 orphans=0deno task docs:accuracyPASS— published source pages 192 → 196, one per new reference pagedocs/site/_plugins/check-source-format.ts .Docs source format: OKdeno task quality:gateFAIL=0for every package; WARN/INFO all pre-existing, none in a file this PR touchesdeno task publish:dry-runSuccess Dry run completedeno fmt README.md packages/sdk/README.md--checkclean, edited passages re-read after the rewrap#1417 watch — the side effect did not occur.
git status --shortimmediately afterpublish:dry-runwas empty: no catalog-backed manifest rewritten, nothing to revert,deno.lockuntouched by this PR.
On the
deno fmtgate. It splits by path.docs/site/**/*.mdexits 1 withNo target files found—docs/site/deno.jsonfmt.excludelists**/*.md, and an exclude beatsan explicit path argument;
check-source-format.tsis the real authority there.README.mdfilesare formatted by an explicit path (exit 0) even though the root
fmt.includenever discoversthem. Recorded as DR-4.
Harness
.llm/runs/docs-1377-content--leaf/[PHASE: IMPL]comments below, one per slice, with pasted exit codes.convention, gate shape) are explicitly withheld from this slice.
prose polish. This PR does not self-certify and stays draft.
Drift / Debt
Full log in
.llm/runs/docs-1377-content--leaf/drift.md.reference/index.mdclaimed the pages "are generated from the source code withdeno doc, so they always describe the published surface". Nothing writes intodocs/site/reference/; every tooling reference to that path reads or checks it. The second halfwas the damaging one — it asserted a currency guarantee nothing provides.
reference/plugin-ai-core/index.md:10andplugin-auth-core/index.md:9. One line each, outside this slice's footprint.check-accuracy-and-discoverability.ts:126hardcodesdocs/site/reference/sagas/index.md, so it is a second gate bound to the short path. docs(reference): publish-readiness paths still disagree with the plugin-core reference IA, and public README drift remains #1377names only
publish-readiness.ts.deno fmtcoverage is split as described above, and no discovery-basedgate formats
README.mdat all.maintainer-command-tree.ts:32reports.version('1.0.0')againstCLI_PACKAGE_VERSION. Source, not docs.deno task docs:readme:checkis red onmain:packages/bench/README.mdmissing
## Install. Pre-existing, quality(docs): docs:readme:check is a dead gate — checker/template/house-style three-way divergence #767's scope.emitis unreachable from the public CLI. Advertised and implemented onthe compose, cloud, and service deploy adapters, and it even has a router description, but it is
absent from
ROUTED_OPERATIONS(target-deploy-command.ts:15-23). Sonetscript deploy listreports an operation nobody can invoke — the inverse of the honesty rule
service-deploy-target.ts:14-20states forrollback/secrets. Source change; worth its ownissue.
One instruction deliberately not followed
The brief named two false
deployclaims to correct. Only one was false.reference/cli/commands.md:209says the cloud targets share "the same three-verb lifecycle —plan,up,down". The CLI verb surface is the intersection of an adapter's advertisedoperationswith the router'sROUTED_OPERATIONS, andemitis absent from the latter — soAspireCloudDeployTarget's advertisedplan · emit · up · downyields exactly three commands. Thesentence is correct and is preserved verbatim; "fixing" it would have shipped a new error in
place of a true statement. The surrounding section is rewritten for coverage (it now names
docker/compose, their two extra verbs, and why the lists differ).cli-reference.md:246-249— "deploy dockeranddeploy compose… are not wired — they only printhelp" — was false and is corrected: five working verbs each, routed to an adapter whose handlers
are all implemented. The bare group prints help because every command group does.
By the same measurement, #1377's own "five-verb surface" wording is correct, and the research pass
that corrected it to six was counting advertised operations rather than commands.
Definition of Done
docs/site/reference/<segment>/index.md(35/35,measured before and after)
from
deno doc --jsonover the package's declared exports and is exhaustive against it(41 / 51 / 106 / 32 rows)
convention the site follows today as a description rather than a rule
packages/sdk/README.mdleads withcreateQueryFactories;createServiceQueryUtilsappearsonly as the narrower non-golden-path helper
README.mdcarries no hardcoded scaffold file/directory count and no unexplained<version>placeholderagent drift,plugin ai,deploy desktop,deploy package-cli,deploy list, andconfig listare documented in the CLI referencedeploy docker/deploy composesurface is documented as what the source actuallyexposes, and the one genuinely false claim (
cli-reference.md:246-249) is correcteddocs:links,docs:accuracy,check-source-format,quality:gate, andpublish:dry-runallgreen on the final tree, with exit codes pasted per slice