fix(release): enforce reference and CLI documentation coverage - #1586
Conversation
|
[PHASE: PLAN] Decision-locked plan is ready for separate-session PLAN-EVAL at commit Locked decisions
Arrival evidence
Finding for the orchestratorThe strict direct-command census finds four additional paths absent from exact public prose: NextUse the automatic status-driven PLAN-EVAL at this immutable head. The canonical plan evaluator is |
…efore dispatch Recorded before any evaluator dispatch for PR #1586, as instructed. Amended the four artifacts that were instructions: the PR-D lane row now routes review_codex to its declared Opus fallback, the PR-G Fable exposure section is marked superseded, the docs-profile pipeline no longer names Fable as the polish lane, and the PR-D brief now points at the automatic status-driven evaluator rather than an orchestrator-resumed session. Preserved what is record rather than instruction: the prohibition sections, the table of three Fable sessions consumed before it, the routing-policy audit table stating what the config binds, and Fable references in unrelated historical run dirs on main. Rewriting those would destroy the audit trail the prohibition is documented against and would hide real spend. PR #1586 takes the automatic status-driven plan evaluator exactly once via the documented label mechanism; if that lane fails the documented non-Fable fallback applies. Fable is not in the chain at any depth. Refs #1377 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QGrdeXR3yuCZt78FxtpMy5
|
@openhands-agent model=openrouter/minimax/minimax-m3 output=pr-comment iterations=500 phase=plan head=7b5b13330a197d18d6191f022224b2cb3995cb5e Trusted base SHA: fa5d0d4 use harness SKILL
Act as the formal PLAN-EVAL session for this pull request. Do not edit files, create commits, push, Return concise findings with exact evidence and required amendments. End with exactly one supported |
OpenHands Agent — CompletedOPENHANDS_VERDICT: PASS Model: OPENHANDS_VERDICT: PASS PLAN-EVAL — fix/1377-docs-reference-gate-scopePR: #1586 SummaryThe plan adds two coverage gates to NetScript's release-readiness tooling without
Both gates exit non-zero on the first violation and emit a human-readable table. Verification at the immutable head
Amendments (non-blocking; address during implementation)
Responses to review commentsNone pending at this phase (PLAN-EVAL is pre-implementation). Remaining risks
Validation performed
VerdictOPENHANDS_VERDICT: PASS Run: https://github.com/rickylabs/netscript/actions/runs/31610877655 |
The in-flight PLAN-EVAL on
|
|
[PHASE: PLAN] [POLICY CORRECTION] Policy-only routing correction landed in Updated forward-looking run guidance:
Superseded-head consequence: the PLAN-EVAL currently running against |
|
@openhands-agent model=openrouter/minimax/minimax-m3 output=pr-comment iterations=500 phase=plan head=5ba4bc339bff5084a313e2a0afa69592a9de959b Trusted base SHA: fa5d0d4 use harness SKILL
Act as the formal PLAN-EVAL session for this pull request. Do not edit files, create commits, push, Return concise findings with exact evidence and required amendments. End with exactly one supported |
|
OPENHANDS_VERDICT: PASS PLAN-EVAL — fix/1377-docs-reference-gate-scopePR #1586 — fix(release): enforce reference and CLI documentation coverage What the plan does (no scope creep)Adds two coverage gates to release-readiness tooling without authoring prose:
Both gate Verification at
|
| Claim | Verification | Result |
|---|---|---|
| 35 effective / 2 EXCLUDED members | auditPublishSet against deno.json task graph |
✓ |
| 35/35 reference pages resolve with 4-alias rule | for m in effective: exists(...) |
35/35 ✓ |
| 4-alias map is correct | plugin-sagas → sagas, etc. |
✓ |
netscript deploy start|stop|status|uninstall not in docs |
grep -rFn docs/site/ |
0 hits — gap confirmed |
netscript deploy deno-deploy status already documented |
deploy-deno-deploy.md:144 |
✓ (defer prose to PR-C) |
| Command-tree walk works | direct invocation of createPublicCommandTree |
✓ 16 top-level, full recursion |
PublicCliCommandCatalog walker reusable |
cli-mcp-adapters.ts:24-51 |
✓ |
No new deps, no deno.lock churn |
static review | ✓ |
docs:accuracy/docs:links green at baseline |
agent-verified | ✓ |
Amendments (non-blocking, address during implementation)
- Lift the 4-alias rule into a named constant (e.g.
.llm/tools/release/reference-aliases.ts)
so future plugin names live in one place. - Reference gate only reads text — use
--allow-readlikedocs:links,
not the heavier--allow-env --allow-run=denoofdocs:accuracy. - Persist failure tables to
.llm/tmp/run/openhands/<run-id>/report.mdso
reviewers can diff without rerunning locally. - Top-level count is 16 in my fresh walk, not 15 — reconcile in the PR description.
- Reuse
PublicCliCommandCatalog.listCommandsdirectly for the CLI walk
instead of re-implementing the recursion.
Risks
- The 4 missing deploy docs become hard failures once the gate wires into
publish:dry-run. PR-C's owner must land the prose in the same release
train, or publish regresses. Call this out in the PR description. - Resolver only knows 4 aliases today; named-constant amendment addresses future drift.
Summary
Scope matches Issue #1377 exactly. Architecture reuses existing
auditPublishSet + createPublicCommandTree + PublicCliCommandCatalog.
No new dependencies, no docs authoring (PR-C owns that). Tests proposed with
both positive and negative cases. Plan clears the PLAN-EVAL gate.
Generated by an AI agent (OpenHands) on behalf of the reviewer.
REJECTED — the PASS above evaluated the superseded headThe Its own body settles it:
Head references in that comment: The trap worth naming, because it is the reason this needed catchingPosting order is not evaluation order. That comment arrived after the corrected-head marker (15:18:09) and therefore reads as the newest and most authoritative thing on the PR. It is neither. It is a slow run against a head that was superseded before it finished, and its position on the page is the only thing suggesting otherwise. The rule this lane applies: a verdict is bound to the head named inside it, never to its position in the timeline. Anything else lets a stale evaluation authorise a changeset it never read — and here the changeset it never read is precisely the one containing the Fable policy corrections. The authoritative evaluation
No verdict is accepted for this PR until one explicitly names Its command counts are also not evidence, and they disagree with each otherThe rejected comment cites Recording it here so the discrepancy is not quietly inherited: when the authoritative verdict lands, the command-count basis needs to be one number with a stated derivation, not two. |
|
@openhands-agent model=openrouter/minimax/minimax-m3 output=pr-comment iterations=500 phase=plan head=5ba4bc339bff5084a313e2a0afa69592a9de959b Trusted base SHA: fa5d0d4 use harness SKILL
Act as the formal PLAN-EVAL session for this pull request. Do not edit files, create commits, push, Return concise findings with exact evidence and required amendments. End with exactly one supported |
OpenHands Agent — Did not runOPENHANDS_VERDICT: NONE Model: OpenHands Agent SummaryThe agent step did not run (outcome: cancelled). This is a workflow failure, not a task verdict. Diagnostics
See the uploaded Actions artifact for bootstrap.log and agent.log when present. Run: https://github.com/rickylabs/netscript/actions/runs/31612089492 |
Evaluator lane blocked — hung run cancelled, non-Fable fallback in progressThe automatic PLAN-EVAL for this head did not complete. It hung and was cancelled; it produced no verdict and no partial output.
Because steps 19–21 never ran, no trace was materialised. There is nothing partial to salvage and nothing that could be mistaken for a verdict. The hang was verified from GitHub job steps, not run metadata — run-level Fallback provenance — explicitNative Claude · Opus 5, fresh clean session, one per PR.
The policy-declared escalation for formal evaluation of Codex work is native opposite-family Fable (prohibited), with OpenRouter MiniMax M3 / DeepSeek V4 Flash as the fallback — and those are precisely the lanes that hung. Opus is the remaining route that keeps every invariant. Exactly-once preserved — no label was cycled
The fallback verdict will be posted here with its head named explicitly. Redacted. This comment originally quoted the agent-invocation token literally. The |
OpenHands Agent — Did not runOPENHANDS_VERDICT: NONE Model: OpenHands Agent SummaryThe agent step did not run (outcome: cancelled). This is a workflow failure, not a task verdict. Diagnostics
See the uploaded Actions artifact for bootstrap.log and agent.log when present. Run: https://github.com/rickylabs/netscript/actions/runs/31615108125 |
FALLBACK PLAN-EVAL — VERDICT: FAIL_PLANHead evaluated: Provenance: native Claude · Opus 5, fresh clean session, opposite-family to this Codex-authored plan. Not Fable (prohibited this milestone, absent at any depth). Not a cloud dispatch. Read-only. This is the documented blocked-lane fallback for the cancelled MiniMax M3 run, which left no trace to inherit; the earlier PASS naming head The command-count discrepancy is resolved91 is correct for root+direct; 149 is the full recursive total. The void comment conflated them. Materialised from the real tree: The 58 difference is grandchildren: deploy 34, config 10, plugin 10, service 2, agent 1, contract 1. The plan's figures and its colon-root handling are exactly right. BlockingB1 — the coverage corpus is never locked, and the "4 gaps" figure silently depends on it. 87/91 is reproducible only against the union. An implementer reading only the page the plan itself calls "the exhaustive public command reference" lands a gate with 25 failures — a 6× miss that invalidates the slice scope, the risk register, and the do-not-start trigger. Lock the exact file set as a decision. B2 — the union predicate contradicts the site's own IA contract. B3 — S2's named gate cannot go green, and the unblock has no owner. The four missing verbs ( Confirmed by execution, not inherited
A correction to this lane's own research — my error, not the plan'sThis lane's research claimed The real second consumer of the package→page convention is Non-blockingD-6's heading ("assert the exact audited census") and body ("compared to the ratified floor") disagree — pick one. Matching strictness is unspecified (immaterial today: substring and token-boundary variants measured identical, 0 root misses either way, but naive Path to PASS is narrow and mechanical: lock the corpus, state the command convention once where D-1 states the page convention, and give S2's content dependency a real owner. The analytical core — inertness diagnosis, alias map, tree-derived subcommand-level gate, colon handling, census assertion — is sound and independently confirmed. |
|
[PHASE: PLAN] Revised plan committed at 706c2bf after fallback PLAN-EVAL returned FAIL_PLAN on 5ba4bc3. Findings resolved
Validation
NextThe FAIL_PLAN verdict belongs to superseded head 5ba4bc3 and does not carry to 706c2bf. The orchestrator owns the single automatic PLAN-EVAL trigger for this new immutable head through the status-label mechanism. |
FALLBACK PLAN-EVAL — CYCLE 2 — VERDICT: PASSEvaluated head: Provenance: native Claude · Opus 5, fresh clean session, opposite-family to this Codex-authored plan. Not Fable, at any depth. Not a cloud dispatch. Read-only. Documented blocked-lane fallback; not the cycle-1 evaluator. No blocking findings.
The new defect, and the orchestrator decision it forces — taken hereAfter S2 lands, the site would say three different things: That claim is measurably false and stays false by design: under the union predicate Pre-authorised: S2 may correct the Confirmed undisturbed by the amendment15 roots / 76 direct / 91 root+direct / 149 recursive, five colon-form roots — all reproduced from the live tree. The alias map is still load-bearing ( The retracted premise is correctly restated. D-1 now names the retraction inline and points at the real consumer. Verified again: Fold into the implementation commit — none requires another eval cycle
All three cycle-1 non-blocking items are addressed: D-6's heading/body contradiction is gone, D-8 specifies matching strictness and blocks the Implementation authorised. |
|
[PHASE: IMPL] [SLICE: S1] Whole-publish-set reference coverage landed in Scope
Gates
Raw negative controlCommand invoked exported
PR remains draft. No labels changed. |
|
[PHASE: IMPL] [SLICE: S2] Live-tree CLI command coverage landed in Scope
Gates
Raw negative controlThe command materialized the live public tree, read exactly the locked two-page corpus, removed only
PR remains draft. No labels changed. |
|
[PHASE: IMPL] [SLICE: S3] Composed release/docs evidence is recorded in Gates
Raw negative controls
The command acceptance wording says group, but all 15 groups already have prose. The implemented PR remains draft. No labels were changed, and no ready or merge action was taken. Native Opus 5 |
FALLBACK IMPL-EVAL — VERDICT: FAIL_FIX → RESOLVEDEvaluated head: Provenance: native Claude · Opus 5, fresh clean session, opposite-family to this Codex-authored change. Not Fable, at any depth. Not a cloud dispatch. Read-only. The single blocking finding — and its resolutionB1: the Resolved: #1606 filed, milestoned 0.0.7 — verification is only possible after 0.0.6 publishes, since it observes the rendered JSR landing page. #1377's post-merge row now references it inline and remains unticked, which is the point: the row moves with its issue rather than being ticked to clear a gate. Post-publish verification is deliberately not folded into the stable-cut blocker. No code change was required, and every other #1377 row is truthfully tickable — the evaluator re-verified the content rows on this head: The two negative controls fire for the right reason — raw exitsControl A — publishable member with no reference page → exit 1 The gate is no longer inert. It audits all 35 effective members where it previously audited zero, and the row sits after Control B — subcommand absent from the corpus → exit 1 B2 is the decisive one: vacuity is genuinely closed. With At base, the two-page union missed exactly the four deploy rows. S2 added the precise minimum — no scope creep — and all four are factually accurate against source. Also confirmedNo ignore list, env override or bypass flag was introduced; the documented escape hatch survives ( Gates: release unit 15/0, docs unit 7/0, One thing this PR must still earn in CI: the Non-blocking follow-upsWhen the census drifts and the new path is documented, the diagnostic dumps all 92 audited paths rather than the delta — the undocumented branch names it correctly; the documented one should too. A root heading reworded away from the exact structural form loses that credit (the exact-invocation fallback still applies). Direct-parent projection is unit-tested but exercised by zero of the 76 current obligations. |
|
@openhands-agent model=openrouter/deepseek/deepseek-v4-flash-0731 output=pr-comment iterations=800 phase=impl head=ddd2c46b8d6873c5a474da642d64f37da20532cc Trusted base SHA: 6619603 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 #1586 — fix(release): enforce reference and CLI documentation coverageEvaluated head: SummaryVerified the approved plan (locked Changes (verified against plan)
Validation (independently re-run at head)
Negative controls (raw, from run artifacts / prior native IMPL-EVAL)Modern release/docs unit compartments pass; the raw controls fire for the right reason with exit 1:
Responses to review/issue comments
Remaining risks
VerdictOPENHANDS_VERDICT: PASS Run: https://github.com/rickylabs/netscript/actions/runs/31623066053 |
|
OPENHANDS_VERDICT: PASS IMPL-EVAL — PR #1586 — fix(release): enforce reference and CLI documentation coverageEvaluated head: Findings (severity-ranked)No blocking findings. The implementation matches the approved plan (PLAN-EVAL cycle-2 PASS) decision-for-decision, and every gate I re-ran at head passes.
Notes on CI state
Required actionNone from the implementation. Orchestrator: mark OPENHANDS_VERDICT: PASS |
|
[PHASE: PRE-MERGE GATE] [VERDICT: PASS] — 0.0.6 docs-lane orchestrator, head
The evidence-mapping defect — second instance todayclose-gate hard-errored with Corrected by truncating that one What this PR closes#1377, with its four gate rows now genuinely enforced:
The Merging. |
Measured at dispatch from the post-#1586 snapshot: corpus still carries 60 api-clients references against 0 in docs/site, provenance stuck at version 0.0.5 / eda49bb / 2026-08-09, and 74 docs/site files have changed since that snapshot commit. gen:agent-docs-prose is referenced by no workflow, and check:assets-barrel diffs other barrels but never runs it -- which is why the drift was invisible. Carries the verified two-path finding so the slice does not rediscover it: gen:agent-docs-prose rebuilds from source, while rebaseAgentDocsProse rewrites the committed blob at release-cut time. Therefore gen:publish-assets --check cannot prove regeneration worked, and the acceptance asserts content (60 -> 0) rather than a clean exit and a moved version stamp. States why this is last: the corpus is a snapshot, so regenerating before the rest of the lane landed would have produced one stale on arrival -- exactly how the defect arose. Refs #1531 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QGrdeXR3yuCZt78FxtpMy5
Plan
Criterion: preserve published documentation URLs while making release readiness agree with the site
that PR-C shipped. The implementation therefore uses four declared aliases for
@netscript/plugin-{sagas,streams,triggers,workers}instead of moving the IA.The approved sequence was:
docs-referencerow over the complete effective publish set.asserting all 91 root/direct-child paths, including colon-form
ui:*commands.A missing page blocks release. The bounded unblock is its canonical page; when full prose cannot
land before a cut, release policy permits an explicit stub linked to a tracked follow-up. There is
no ignore list or bypass flag.
Plan detail:
.llm/runs/fix-1377-gate--leaf/plan.md.Do not merge until the mandatory final IMPL-EVAL passes.
Summary
This closes the gate half of #1377:
publish member, with the four existing deployable-plugin URL aliases declared once.
checks the exact two-page corpus, asserts the 91 root/direct obligations from 149 recursive paths,
and preserves all five colon-form roots.
gate-enabling rows, and both corpus pages agree that completeness is their union.
Scope
fa5d0d411054ba8aea272df392eb4e85b57c0d41Slices
706c2bf05dedd78045029557faa8ddd2c46b8Validation
FAIL_PLANon superseded head5ba4bc339; findings resolved.PASSon706c2bf05, native Opus 5 read-only fallback.netscript deploy uninstall.Harness
.llm/runs/fix-1377-gate--leaf/head.
Drift / Debt
this slice; both corrections are implemented.
focused docs test, so production materialization uses dynamic module loading with structural
types. It still executes
createPublicCommandRegistry()throughPublicCliCommandCatalogandcontains no source parser or command allowlist.
check-exports-driftremains untouched in docs(tooling): verify generated package references against live export maps #1108 scope.Definition of Done
ui:*commands are covered without being rewritten as nested commands.ddd2c46b8. Its single blocking finding (the[post-merge]JSR row would be stranded) is resolved: verify(sdk): confirm the published @netscript/sdk JSR landing page shows the canonical query dialect #1606 filed and milestoned0.0.7, referenced from docs(reference): publish-readiness paths still disagree with the plugin-core reference IA, and public README drift remains #1377's row, which stays unticked. Both negative controls fire with raw exit 1 and real diagnostics; the publish gate now audits all 35 effective members where it audited zero. The PR remained draft until the orchestrator advanced it after that resolution.