Repository navigation
Say what the parts are, where they meet, and which meeting is trusted - #260
Merged
Merged
Conversation
The acceptance contract wants ARCHITECTURE.md to answer three questions -- Parts, Boundaries, Trust -- and this document answered none of them. It described ownership of directories, which is useful and is kept, but a reader could not have told from it which pieces are separately deployable, where one hands work to another, or which of those hand-offs is the one that matters. The Trust section is the point. The MCP surface takes arguments chosen by a model that may be repeating something it read on a scanned host, and two guards exist for that: targets.rs refuses anything outside local scope, and limits.rs caps what a scanned host can put into a model's context. Both were written deliberately and neither was written down anywhere a reader would find. Remote text being data rather than markup, and privilege failures surfacing rather than degrading, are recorded for the same reason. The gate will not evaluate any of this here. It requires the document only for multi-part projects, and its classifier decides that from JavaScript and TypeScript server signals plus a root package.json workspaces array. A JSON-RPC-over-stdio server written in Rust is invisible to it, so a product with five deployables and a real trust boundary classifies as single-part and the check is skipped. The headings were verified against the gate's own matcher instead: all three satisfy hasHeading and sectionHasContent.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
docs/ARCHITECTURE.mdgains the three sections the acceptance contract asks for — Parts, Boundaries, Trust — which it did not have. The existing Ownership Map, Compatibility Rules and Contribution Gates are kept; they answer a different question.Why the Trust section is the point
The MCP surface takes arguments chosen by a model that may be repeating something it read on a scanned host. Two guards exist for exactly that, and neither was written down anywhere a reader would find:
server/targets.rs— refuses anything outside local scope (is_local_scope,ensure_ip_allowed,public_targets_allowed), so a prompt-injected model cannot point the scanner at strangers.server/limits.rs— caps what a scanned host can put into a model's context:MAX_BANNER_CHARS256,MAX_RESULT_BYTES1 MiB, overREMOTE_TEXT_KEYS(banner,hex_preview,info).Also recorded: remote text is data and never markup or control sequences (trace output is asserted free of them in
tests/test_trace.rs), and privilege failures surface rather than silently degrading —arp -d *exiting 0 while printing "requires elevation" is why that rule is written down.Every claim was read out of the source before being written.
The gate still will not check it
Worth stating plainly, because "fixed for the gate" would be misleading. The document is required only when the project classifies as
multi_part, andclassify.cjsdecides that from:distinctServerPresentmatchesserver.ts/api.js-style filenames (JS/TS extensions only) or a standalone HTTP framework dependency (for Rust:actix-web,rocket,axum,warp). A JSON-RPC-over-stdio MCP server incrates/netscli-mcp/src/server.rsmatches neither, and this repo has no rootpackage.json. So a product with five deployables and a genuine trust boundary classifies single-part, and the architecture check is skipped —check-architecture.jsreturns SHIP with "single-part project; architecture doc not required".Since the gate would not validate the headings, I checked them against its own matcher directly:
sectionHasContentis the stricter one, added after a document of three empty headings passed and shipped.Unrelated, same session
cargo cleanreclaimed 26.4 GiB (33,533 files).target/is gone and will rebuild on the next build.