Survey of master for surface area whose consumers are tests/docs only, classified per candidate (production vs non-production corpus, rg + call-site reads). New proposed/simplification RFCs: - prune-producerless-vocabulary-variants: CacheHint/cache? fields, MessageSource 'agent', TurnTrigger 'continuation' (the TurnEndReasonMap omitted-until-emitted policy, applied) - drop-inert-request-knobs: GenerateOptions.prefill (both adapters throw UNSUPPORTED), ToolSchema.strict (zero setters; beta-URL-only feature) - drop-web-providers-change-event: the llm/adapter-change precedent replayed - drop-image-content-block: no producer; every consumer silently drops it - prune-write-only-fs-surface: fs-local STREAM_MIN_SIZE/streamMinSize, FsTarget.inputPath, FsEditOutcome.replacements/replaceAll, FileReadOutcome.limit/version - prune-unimplemented-subagent-vocabulary: outputSchema/structured, toolFilter, sendMessage/resume (depthLimit stays) - trim-acp-bridge-unreachable-surface: agentName/agentVersion knobs (resolves TODO(double-default)), toolKindFor name-sniffing - prune-dead-core-spine-surface: SurfaceManager.invalidate(), runLoop/Inbox exports, ToolExecutionResult.callId - share-app-bin-boot-glue: the twin coverage-exempt bin helpers Also supplements three existing proposed RFCs with survey evidence: the bash seam consumption census (generic-long-running-tool-runtime), three more static inventories (discover-package-inventory), and the bridge's already-1:1 id usage (unify-agent-and-session-id).
3.8 KiB
RFC: Prune write-only fields and a dead routing knob from the fs seam
Status: proposed
Problem
The fs seam split moved read routing and policy out of the backend into dsh-tool-fs and dsh-fs-policy. Four pieces of surface kept the pre-split shape — populated on every call, read by nobody:
STREAM_MIN_SIZE+FsIoInternals.streamMinSizeindsh-fs-local(packages/fs/fs-local/src/fsio.ts, re-exported frompackages/fs/fs-local/src/index.ts): zero readers anywhere, including fs-local's own source and tests. The backend has no read routing —readWholeText/streamWholeTextare separate primitives the caller chooses between — and the real routing constant lives in the consumer (packages/fs/tool-fs/src/read.ts, compared againstinfo.size). Two mirrors of the 10 MiB fact; the backend's is dead, and the knob's JSDoc claims a "read routing" override that does not exist.FsTarget.inputPath(packages/fs/fs/src/types.ts): every backend and every test fake must fabricate a "diagnostics only" value with zero production readers — the policy plugin and every error message usetargetKey/displayPath. ThelistDirproducer exposes the semantic wobble: directory children get the bare entry name, which was nobody's "input".FsEditOutcome.replacements+.replaceAll(packages/fs/fs/src/types.ts):replacementshas zero production readers (the single-match policy itself stays — it is enforced by theFS_AMBIGUOUS_EDIT/FS_EDIT_NOT_FOUNDthrows inside the backend, whose error message keeps the internal count);replaceAllis read only byformatEditOutputinpackages/fs/tool-fs/src/edit.ts— as an echo of thereplace_allargument the tool already holds. Shrunk,FsEditOutcomebecomes{ version, before, after }, parallel toFsWriteOutcome's genuinely backend-discovered fields.FileReadOutcome.limit+.version(packages/fs/tool-fs/src/read-render.ts): populated by the read tool, butformatReadOutputrendersoffset/lines/totalLines/truncatedByBytesonly, and thefs/observedemit usesinfo.versiondirectly rather than the outcome copy.
Proposal
Delete the fs-local constant, its re-export, and the streamMinSize knob (the remaining FsIoInternals knobs are genuinely used by the atomic-write tests); drop inputPath from FsTarget; shrink FsEditOutcome to { version, before, after } and pass replaceAll to formatEditOutput from the parsed args; drop limit/version from FileReadOutcome. Update the filesystem.md pastes, the type-equiv manifest, packages/fs/fs/README.md, and the test fakes that currently must fabricate the removed fields.
Why not keep them?
A future permission/containment layer might want the pre-resolution path for error text — but it would want the request, which every call site still holds. "N occurrences replaced" might become model-facing text — a behavior change to design when wanted, and the backend-internal count survives for its error message. A read footer might display limit — everything the footer shows already derives from lines/totalLines. Meanwhile every current and future backend (remote, native) must fabricate wire fields nobody consumes, and every test fake must satisfy them.
Acceptance criteria
- The removed spellings appear only in this RFC; doc pastes and the manifest in sync; the suite is green with the shrunk fakes.
formatEditOutput's emitted text is unchanged for bothreplace_allbranches, so no snapshot golden churns.
Risks
The in-flight fs discovery work (glob/grep tools) touches the same dsh-fs type files — a textual, not design, conflict; land in either order and reconcile mechanically. Backends gain no new obligations; they shed four.