Repository navigation
docs(atlas): truffle states its own design intent, graded by Project Atlas - #215
Merged
Merged
Conversation
…Atlas What the code cannot say about itself now lives in truffle and is graded against the code: the RFC 012 layer stack (truffle-core's modules as tiers, applications at Layer 7, the Go sidecar at Layer 1, Truffle Swift outside), domains, runtime links, contracts, four hot-path flows, dependency rules and the RFC decisions with their real status. Every rule and decision cites CLAUDE.md, docs/, a README or a code comment with a checked see. - atlas/*.atlas holds the structure, placement, rules and decisions. - @atlas comment lines only, no code change: contracts at their trait or enum, flow steps above the function that does each step, and placement plus single-crate rules at the roots of the unpublished crates. The crates.io crates carry no //! atlas text, so docs.rs shows none. - CLAUDE.md "Atlas" and the atlas skill: placement duties, renames, never weakening a rule, the check command, docs:/chore: commit types. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`atlas baseline` records the violations the atlas found when it landed, so `check` exits 0 and a violation an agent introduces shows as new. They stay violated, tagged known, and the guidance lists them with their counts: - layers-point-down, network-knows-no-upper-layer: the NetworkProvider egress verbs and tailscale::provider name egress types (node-api tier); - layers-point-down, transport-knows-no-session: transport::websocket imports session::hello (the RFC 017 hello gate); - apps-use-node-api: truffle-cli, truffle-napi, truffle-tauri-plugin and truffle-bench name Layer 3-6 types, many of them returned by Node itself; - sync-wire: SyncMessage::Clear is consumed but never produced; - the layered-architecture and synced-store decisions, through those. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Protocol 10 (#218) added Node::bridge_stats(), which returns BridgeStats from the private network::tailscale::bridge module, and made the tailscale module doc list BridgeStats among its public types. On 0.7.20 that is a new bridge-is-private violation (node -> tailscale::bridge). The except names the symbol, so it sanctions only edges that name BridgeStats; any other bridge type reaching above Layer 3 still fails. It cites the module doc line that makes BridgeStats public. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… titles claim Eight accepted decisions had no confirmed-by, so drift in them could not go red. Seven now have rules that fail if the code reverses them: - rust-core-go-shim (RFC 003): shim-speaks-no-mesh-protocol - cli-daemon (RFC 010): daemon-ipc-is-local, commands-are-daemon-clients, no-star-or-election - tui-is-the-daemon (RFC 013): tui-hosts-the-daemon, commands-are-daemon-clients - app-namespacing (RFC 017): hostname-from-identity, apps-isolated - peer-handles (RFC 022): peer-handles-interned, device-id-honest, from-is-the-connection - http-serving (RFC 023): serve-engine-in-go, proxy-discovery-inert, no-fixed-sidecar-listener - login-scoped-nodes (RFC 025): login-gate-at-admission-and-hello, store-slices-bound-to-sender one-release-unit stays unconfirmed. release-lockstep and sidecar-fail-closed check the release scripts, but truffle update, the auto-update and the install scripts install the CLI archive's sidecar with no checksum, and truffle-sidecar falls back to PATH at runtime; a comment above the decision says so. bench-keys-from-env now forbids a key on argv in every bench argv parser (a clap field, long name or env binding, the app's argv, the Go baseline's flags). windows-key-press requires the Press filter in both key readers and forbids other key kinds and other readers. The agent -> daemon spawn link also anchors daemon/client.rs, whose auto_up path starts the daemon too. `let $shim` names the Go shim's production code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sample check output, the source-only warning and the egress line references now match 0.7.20 with this atlas. The skill also notes `let $shim`, the one sanctioned except, the one accepted decision left unconfirmed, and that the function-scoped text checks dangle when the function is renamed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jamesyong-42
force-pushed
the
atlas/dsl
branch
from
October 29, 2026 17:16
58f940e to
4ec7cd1
Compare
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.
Summary
Truffle's design intent was stated only in prose: CLAUDE.md, the RFCs and the crate docs. Nothing checked that the code still matched it. This PR adds an architecture atlas that Project Atlas grades against the code, plus guidance so agents keep it current. Please squash-merge with a
docs(atlas):title so these documentation changes do not trigger a release.Design checks
Node::bridge_stats(), which returnsBridgeStatsfrom the private bridge module and brokebridge-is-private. That rule now has one sanctionedexcept. It names onlyBridgeStatsand cites the module doc that makes the type public.bench-keys-from-envnow checks "never argv" in every bench argv parser.windows-key-presschecks that both key readers filterPress.one-release-unitstays unconfirmed on purpose.truffle update, the auto-update and the install scripts install the CLI archive's sidecar with no checksum, and truffle-sidecar falls back tosidecar-slimon PATH at runtime. Both go against the release contract in docs/RELEASING.md. A comment above the decision records this until it is fixed or the contract is narrowed.What lands
atlas/*.atlas:exhaustive.see "file#slug", resolved by the check).becausesays so.@atlascomment lines only; no code changes (+72 lines, 0 deleted, in 20 source files)://!atlas text, so docs.rs shows nothing new..claude/skills/atlas/SKILL.md:exceptor a wideronlylist is the owner's call;docs:/chore:.atlas/atlas.baseline.jsonrecords today's findings as known, socheckexits 0 and a new violation stands out.Findings kept visible for a decision (7 claims, all known in the baseline):
layers-point-downandnetwork-knows-no-upper-layer: theNetworkProvideregress verbs andtailscale::providernameegresstypes, which sit in the Node API tier.layers-point-downandtransport-knows-no-session:transport::websocketimportssession::hello. That is the RFC 017 §8 hello inside the WebSocket handshake, which RFC 012 §3.4 calls transport-level.apps-use-node-api: 66 imports from truffle-cli, truffle-napi, truffle-tauri-plugin and truffle-bench into Layers 3-6. Most are types Node's own API returns. RFC 015 §3 (bindings wrapNode<TailscaleProvider>) and RFC 027 prescribe some of them, so those RFCs and RFC 012 §3.1 disagree.sync-wire:SyncMessage::Clearis consumed but never produced. RFC 025 §3.5 changed its role.layered-architectureandsynced-storedecisions, through the claims above.Type of Change
Checklist
atlas checkonadc42a5(main 0.7.24 plus this atlas) gives 630 claims (590 verified, 33 asserted, 7 violated, 0 new, 7 known), 0 dangling, 0 ambiguous, 0 stale, and 100% layer and domain coverage of 90,142 production lines. The intent parser reports 0 errors and 0 warnings; all seven known findings retain their original counts.adc42a5: Rust tests and doctests on Linux, macOS and Windows; live-network regressions; JavaScript checks; Clippy, rustdoc and cargo-deny; CodeQL. CI, live-network tests, CodeQL.cargo fmt --checkandgit diff --checkpass. The citation-fix commit passed the repository pre-commit hook.Additional Context
TRUFFLE_SIDECAR_SKIP_DOWNLOAD=1; it reports no Rust documentation build errors. The tool stores its build artifacts in its own cache.🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.