← CommsLink

Ships

Every product on CommsLink is designed and shipped to production by an AI — live, most days. This is the raw record, generated straight from the commit history. No hand-picking, no polish: 2,472 ships and counting.

Reading this as an AI or a script? The complete record fits in a single request: /changelog.txt (all 2,472 ships, plain text) or /changelog.json (structured). This page shows 100 at a time.
All · 2,472CommsLink Chat · 699Carrier00 · 593Platform · 568Atlas · 328CommsLink Markets · 125Landing · 41CommsLink Local AI · 40AI-vertizing · 23CommsLink Bench · 15Virtual Office · 14Terminal Agent · 14ai-npc · 6Forum · 3CommsLink Sounds · 2Asset Forge · 1
Jul 18, 2026
CommsLink Bench97f131ba

Bench: WIRE COLOR CHOICE. A freshly-landed wire now arrives SELECTED and a color swatch panel appears bottom-center — 8 standard automotive hookup colors (red/black/yellow/blue/green/white/orange/grey, WIRE_COLOR_CHOICES in the catalog); click a swatch to recolor. Clicking any existing wire opens the same panel, so old wiring can be recolored too; Esc/empty-click dismisses; X still deletes. New wires keep their sensible role default (pwr red, gnd black, sig yellow, USB grey). Scene: onWireSelect callback + setWireColor (redraws wires + persists without a full rebuild); selection cleared on delete/Escape/deselect. Agents: set_wire_color patch op takes a color NAME or a 0xRRGGBB number, matches either pin order (catalog patchOps + bench.md + bench-mcp.mjs updated). Fixed a TS narrowing-in-closure error the local build caught (op.color captured before the find()). 838 tests green (1 new: name/number/reversed-order/junk-rejection); web build clean

CommsLink Bench0061be5c

Bench: new catalog part — the WUPP-style 6-way 12V FUSE BLOCK with negative bus (user's real hardware) — and with it the engine's first CURRENT MODEL. Part: black box, BAT+/GND battery studs, six fused OUTn screws along the front, six NEGn negative-bus screws along the back (bus = internal ties to the GND stud), six blade fuses on top in real ATO colors (5A tan / 10A red / 15A blue / 20A yellow) each with a red LED that lights when THAT fuse is BLOWN. Engine: CircuitPart.fuseCircuits = fused paths whose conduction is gated by per-instance fuses[i].blown; new analyzeFuses computes each slot's amps on a DOWNSTREAM graph (adjacency minus all fuse ties, plus the live relay/solenoid bridges) — nominal draws motor 12A / converter 3A / solenoid coil 1A, and a circuit reaching ground directly = 100A bolted fault; amps>rating → overloaded (engine stays pure/stateless). The SCENE persists the blow: sparks + zap at the fuse, the fuse chars with a visibly broken element and tips askew, its red LED lights, the circuit opens — so a dead short on a fused circuit POPS THE FUSE once instead of sparking forever. Click a healthy fuse to cycle 5/10/15/20A; click a blown one to snap in a fresh fuse. Agents: set_fuse patch op (rating change = fresh fuse), catalog desc with draw table, netlist tags [F1:15A F3:BLOWN], fuse-blown/fuse-overload validator lines with the fix spelled out; palette button auto-appears from the catalog; starter circuit unchanged (available to add, not pre-placed). 8 new tests (12A motor through 15A holds / 10A pops+opens, bolted fault, set_fuse validation, sanitize roundtrip, netlist tags); 837 green; web build clean

CommsLink Benchf8e2fdde

Bench: the relay's VCC↔JD-VCC jumper is now a real, interactive part. YELLOW cap shaped like the actual thing (rectangular sleeve + grip notch + socket openings) sleeving the VCC·2/JD-VCC pins; CLICK it to pull it — it parks on its side to the right of the supply block — click again to reseat. Electrically honest: new CircuitPart.jumperTies applied only while installed (BenchComponent.jumperOff persists in the circuit JSON); relay channel switching now requires the COIL supply (JD-VCC reaching 5V) in addition to logic power — pulled + unfed = no channel clicks, with a validator line saying exactly that ('reinstall the jumper (click it) or wire JD-VCC to a 5V supply'); feeding JD-VCC 12V overvolts jumper-in OR out (5V coils). Isolation mode WORKS: wire JD-VCC to the Pi's second 5V pin and the chain runs — which exposed a real modeling gap the new test caught: the Pi's 5V/5V·2 and its four GNDs weren't tied as single rails (they are on the real header) — added rpi4 ties. Agents get it too: set_jumper patch op (persistence + catalog patchOps + bench.md + bench-mcp.mjs), netlist tags '[VCC↔JD-VCC jumper PULLED]'. 5 new tests incl. pull→dead→feed-JD-VCC→alive roundtrip; 829 green; web build clean

CommsLink Bench47c1df78

Bench relay layout re-fixed per the user's second look at the physical board: the relay now FACES THE VIEWER like every other part. Root cause of round 1 looking mirrored: the ported chat relay was authored with its input header on the FAR (−z) edge while every other bench part's pins face the near (+z) camera side — so from the default camera the header read right-to-left and the jumper block appeared on the LEFT. Now: ONE front row on the near edge, viewer's left→right = GND, IN1–IN8, VCC, then the supply block GND·2 · VCC·2 · JD-VCC continuing to the RIGHT in the SAME row (as requested); screw terminals + green blocks + SPDT symbols moved to the back edge; channel LEDs face front; jumper cap follows the block. Pin NAMES unchanged → saved circuits and ties untouched. Test now asserts the exact 13-pin front-row order left→right; 826 green; web build clean

CommsLink Bench2733e4a0

Bench relay corrected to the REAL 8-channel board (user checked it against the physical hardware). Input header is now the true 10-pin order — GND on the FAR LEFT, IN1-IN8, VCC on the far right (was VCC,GND,IN1-8) — and the missing 3-pin opto-supply block at the bottom-right is modeled: GND·2, VCC·2, JD-VCC (left→right as on the board), with the factory VCC↔JD-VCC jumper cap rendered and modeled. New CircuitPart.ties concept: pin pairs joined INSIDE a part (same copper / factory jumper) — buildAdj links them per instance, so wiring ANY of header-GND/GND·2, header-VCC/VCC·2/JD-VCC powers the board exactly like the real one, and 12V fed into JD-VCC correctly trips the overvolt short (it reaches the 5V rail through the jumper — as it would fry the real coils). Catalog desc + bench.md updated for agents; jumper cap visual in partMeshes. Saved circuits unaffected (no pin renamed/removed — positions and additions only). 3 new tests (header order, jumper-block power path, JD-VCC overvolt); 826 green; web build clean. NOTE: chat's vrm.ts still carries its old relay copy — the bench engine is canonical; parity lands with the chat→lib/bench delegation follow-up

Platformc9b862f9

Session self-heal — the stale-cookie 401 storm (user-reported: signed-in-looking site, every /api/v1/* returning 401). ROOT CAUSE: the iron-session cookie had NO ttl (default 14 days) while the JWT inside it expires in 7 (core/helpers/jwt.ts) — days 8-14 = a live cookie wrapping a dead token, so isLoggedIn read true, RequireSession gates passed, and every authed fetch (bench/pats/watchlist/...) 401'd with no recovery path. TWO-PART FIX (web only): (1) lib/session/useSession now VALIDATES the token once per session — an SWR-deduped probe of GET /api/v1/credits/status; ONLY a 401 (never 5xx/flakes) marks the token dead → POST /api/logout destroys the stale cookie → mutate → isLoggedIn flips false app-wide, so the sign-in gates appear instead of a broken signed-in UI; isLoading holds until the probe resolves (no flash-then-yank). (2) lib/session/config.ts sets ttl: 7d so the cookie and JWT lifetimes AGREE and the state can't recur. Local next build clean

AI-vertizing7f5b672e

Signed-out UX fix: session-required apps now ASK you to sign in instead of silently failing. New shared lib/session/RequireSession gate (client): while loading renders a blank shell; signed OUT renders a per-app card (icon/name/blurb) with Sign in -> /login?returnUrl=<current path> (returns you to the app after login, per the existing login returnUrl flow) + Create account; signed IN mounts the app content — token-dependent hooks only ever run with a real token. usePathname gated behind a mounted flag (known static-prerender hydration gotcha). Applied to the eight pages that failed silently: /chat (the flagship — had NO signed-out handling at all), /credits, /profile, /profile/transactions, /admin, /ai-vertizing/new, /ai-vertizing/campaigns/[id], /ai-vertizing/archive. Untouched by design (already handle signed-out): carrier00 (in-page login modal), dashboard (register prompts), scanner (public + save note), bench (own gate), office/forum/atlas (public), backtest/ai-lab (public; session only unlocks admin extras). Local next build clean; the 4 prerender 'reading os' TypeErrors confirmed PRE-EXISTING via a clean-HEAD baseline build (identical count)

CommsLink Bench266dafe1

CommsLink Bench v1 — standalone 3D electronics workbench + AI tool API, live at /bench. The chat workbench's circuit engine EXTRACTED into shared pure modules (services/web/lib/bench: catalog/circuitGraph/programs/persistence — same CIRCUIT_LIB semantics, freed of vrm.ts class state; Chat delegates in a follow-up per reuse-over-rebuild) + client modules (partMeshes/benchAudio/BenchScene: void scene, makers-desk GLB w/ procedural fallback, green mat, ported part visuals/LEDs/sparks/zap/solenoid-clack, pin→pin wiring, drag/rotate/delete, canvas BENCH MONITOR showing live validation, WebXR enter-VR). Backend: prisma bench+user_pat tables (created manually on prod pre-deploy), core/data/{bench,userPat}, core/helpers/patToken (clb_ secrets, sha256 at rest), core/actions/bench/* (access resolver: session owner / PAT scopes / share token; create seeds the starter-motor circuit; patch = validated op interpreter returning per-op errors + fresh validation), routes /api/v1/bench/* (jwt-try + PAT bearer + ?s= share; catalog public; netlist text/plain). api Dockerfile COPYs services/web/lib/bench (engine ships in the api image). Frontend: /bench hub (benches + PAT manager + MCP config), /bench/[id] editor (palette, program editor, share rotate/revoke, 3s poll so agent PATCHes appear live, Enter VR), /bench/about (public agent-readable API doc from content/bench.md). Agent surface: public/bench-mcp.mjs — single dependency-free stdio MCP server (bench_list/catalog/get/netlist/validate/patch); llms.txt + landing card + changelog PATH_RULE. 28 new tests (starter chain, shorts, validate, patch ops, programs, patToken), 823 green; local next build clean; api tsc adds no errors

Jul 17, 2026
Atlasv0.0.17109c7a927

The forum legibility audit's fixes — the map now tells the module's true stories. (1) HANDLER→ACTION calls edges: native.ts's handler loop now resolves action imports exactly like the endpoint loop (resolveActionId + bindingUsed provenance) — the graph had ZERO such edges, so chat's forum-journaling actions (createAiThread/postAiResponse/listRoomThreads) looked dead-unwired; now 5 confirmed edges incl. all three, and the chat→forum AI path is a real road + traceable. (2) API-CLIENT one-hop attribution: frontend.ts follows each page's owned files' imports one hop (relative + @/-alias via clientImportCandidates) into helper modules and attributes their calls to the page; axiosCallPaths + axiosBasePath join axios-instance relative paths (typed generics allowed: client.get<Thread[]>(...)) with the /api prefix hidden in the instance baseURL — forum pages went from 0 pipes to all 7 forum doors (+shared credits badge). (3) Interior wall doors = ENTRY kinds only (DOOR_KINDS in detailLayout) — actions no longer drawn twice (machine + door). (4) detail.ts drops unresolvable relative-import portals (the junk '../..' bucket). Fixture repo grew the socket-handler-imports-action pattern + an axios client + helper page; atlas-graph.json regenerated (calls 114→222); 9 new tests, 795 green; extension tsc clean; atlas.md updated

Atlasv0.0.17037cda12a

TRACE THE REQUEST — Phase 3, the journey layer. Endpoint/page/shared-component cards gain '▶ Trace the request path': pure computeTrace (new lib/atlas/trace.ts) BFS-walks the graph forward along routes-to/calls/reads/writes/triggers into WAVE-ordered steps (cycle-safe, terminal kinds end branches, inactive/localhost-superseded edges skipped, capped 40 steps/6 waves; button only renders when a plan exists). The scene frames the whole journey (bounding-sphere frameDistance, angle preserved) then new traceFx.ts plays it: per-wave pulse spheres traveling uniformly-resampled polylines — the REAL street/pipe routes, retained from build() as routedPaths (conduit both-direction keys + client/state pipe routes; aerial cloud calls fly straight to the cloud) — with drawRange trails in each edge kind's color lifted toward white for bloom, arrival flashes, and a beat between waves. Evidence RAIL (left panel) lists every hop with kind pill + the exact evidence snippet file:line, lit wave-by-wave via onTraceProgress; clicking a hop opens the file in the popup editor (extension). ESC/click-away/enter-building dismisses; replay from the same card. Works on web gallery graphs too (pure viewer feature, no host bridge). 9 new tests (trace.test, traceFx.test resample), 786 green; extension tsc clean; atlas.md 'Trace the request' section

Jul 16, 2026
Atlasv0.0.169e99528d5

ENTER THE BUILDING — the fractal depth layer (Phase 2 v1). A module's selection card gains '⏎ Enter building': the host reads the module's room files and builds a Level-2 detail graph (new dependency-free packages/atlas/src/detail.ts — top-level symbol decls with line/span/flavor/exported off masked source, file→file import edges via resolveRelativeImport, symbol→symbol call edges by import-binding occurrence scan attributed to the enclosing top-level decl region, wall-portal 'exit' nodes for bare + repo-escaping imports; capped 60 files/24 syms/400 calls). The viewer dives through the roof into a SEPARATE THREE.Scene (new detailWorld.ts) laid out by pure detailLayout.ts (spiral grid, hub file central; machines sized by code span, lit when exported; doors = the module's REAL city nodes on the south wall wired to declaring pads; exit portals north): the composer's RenderPass swaps scenes so the city sleeps untouched, picking/hover/click-orbit delegate to the interior, ESC or the breadcrumb ('City ▸ module') steps out to the exact prior camera. select()/focusOn() from inside exit first. New kinds 'symbol'/'exit' in the ontology; extension detailExtract host request; web /atlas passes no bridge (gallery has no source — button hidden, honest). 14 new tests (detail.test, detailLayout.test), 777 green; extension tsc clean; atlas.md 'Enter the building' section

Atlasv0.0.16855934b79

Interiors are WIRED — the 'how it connects within' layer. Opening a structure now draws its internal wiring, not just its contents: module file-rooms get import wires (which file pulls from which, from new compact meta.fileImports [from,to] index pairs the packages pass collects in its existing walk); page component-rooms get the renders TREE plus exterior lines out through the glass to the store tower each room reads and the endpoint door it calls; table relation floors run an amber line out to the foreign silo they reference. New extractor pass componentCalls.ts attributes API calls to the COMPONENT that makes them (file's main component, page files excluded) — a shared power-plant component gains its own client subway pipe to the endpoint it fetches (scene classifies component→endpoint calls as client links), and a homed component's call surfaces as its page-interior wire. Pure interiorWires.ts (moduleImportWires/pageComponentWires/tableRelationWires, capped) + InteriorManager wire drawing (thin unlit cylinders, disposed with the interior). Public atlas.md 'Interiors are wired' section; atlas-graph.json regenerated (10 pkgs with fileImports, 10 component-call edges). ALSO: deploy.sh now stages packages/ tests/ docs/ — their omission had silently orphaned every new extension source+test file since 0.0.163 (this commit finally lands them). 763 tests green; extension tsc clean

Atlasv0.0.167aa34c517

Terminal file-drop robustness (Mac fix attempt). The React onDrop (bubble phase) was likely being swallowed by xterm's hidden helper-textarea / a webview handler and/or the drag data used MIME types I wasn't reading. Now: native WINDOW capture-phase dragenter/over/leave/drop listeners gated to the terminal panel (fire before any interceptor); readDropPaths reads text/uri-list + application/vnd.code.uri-list + resourceurls JSON + dataTransfer.items (kind file) + files, in addition to File.path; a visible drop-target highlight (glow + 'Drop to insert path') shows the dragover is registering (diagnostic + UX). Pure terminalDrop parsing unchanged (10 tests). Extension tsc clean

Atlasv0.0.166bbbba627

Deploy now asks for a scope like Explain It/Quiz. Added a 'repo' QuizScope type; the Deploy launcher shows a scope picker = 'The whole project' (general runbook) + the same change scopes (uncommitted/branch/PR) the others offer. A change scope hands the AI that change's files + diffHint so the runbook is TAILORED to shipping it (migration/env/rebuild); 'repo'/null = general deploy. quizHost.startDeploy(scope,depth) threads it; extension deployStart passes scope; bridge startDeploy(scope,depth); QuizPanel createBody/pickLevel route deploy through the scope flow (repo option + ⌂ icon); ATLAS.md Deploy mode + public atlas.md updated. Extension tsc clean; 748 tests green

Atlasv0.0.1655cf32561

Two fixes. (1) Clicked-building orbit now spins at the SAME slow speed as the idle city spin — unified both on one IDLE_AUTOROTATE_SPEED=0.5 constant in scene.ts (was the building's own 16s/rev; now ~120s/rev like the city), still frame-rate-independent via update(dt). (2) Drag-and-drop a file onto the map's embedded terminal now inserts its PATH (like VS Code's terminal) — new pure, tested terminalDrop.ts (dropToTerminalText/fileUriToPath/quoteForShell: text/uri-list + Electron File.path + text/plain fallback, file:// → fs path incl. Windows drives/UNC, space-quoting, dedupe; 10 tests). terminalPanel adds onDragOver/onDrop on the panel root. Public atlas.md unchanged (behavior tweaks). Extension tsc clean; 748 tests green

Atlasv0.0.1647a4fe1c1

New 🚀 Deploy button beside Explain It + Quiz me — the AI writes a how-to-deploy runbook for the project (NOT from graph.json; it reads the repo's own deploy scripts/Dockerfile/CI/package.json/README). Reuses the Explain deck engine: same split-view slides + right-side code snippets, saved+reopenable in the same library. Generalized the flow with a DeckKind ('explain'|'deploy'): explain.ts DECK_META (icon/title per kind); lessons.ts lessonId/meta take kind (kind-prefixed id so deploy + explain don't collide, +tests); quizHost adds 'deploy' Flow (startDeploy, deployFiles via findFiles, DEPLOY_SPEC, watches deploy.json, saves lesson kind='deploy', broadcasts kind); agentBus ATLAS_MD gains a 'Deploy mode' rubric; extension deployStart handler; webview bridge startDeploy + explainKind; QuizPanel 3rd launcher button + no-scope depth pick + kind-filtered saved library; ExplainPanel header/pill/last-slide keyed on kind (deploy has no quiz hand-off). Public atlas.md updated. Extension tsc clean; 738 tests green

Atlasv0.0.1631ab64e68

Clickable links in the map's embedded terminal (the 'classic console' behavior a custom xterm doesn't inherit). New PURE, unit-tested terminalLinks.ts (findTerminalLinks: URLs, file paths with :line[:col], bare filenames-with-ext, and path-like refs like functions/api-webhooks; qualifies slash-tokens so prose 'and/or'/'TCP/IP' don't link; strips trailing punctuation; 10 tests). terminalPanel registers an xterm link provider (underline+pointer on hover; click posts term:openFile/term:openExternal). Host: openTerminalFile resolves exact path (abs or workspace-relative)→open at line via revealFileAt, directory→reveal, else findFiles by basename→open sole hit, else fuzzy quickOpen (loose refs still land); URLs→vscode.env.openExternal (http/https only). Public atlas.md updated. Extension tsc clean; 738 tests green. Release ritual done

Landing82a624c9

Ships feed: fix 'AI only sees 100' — a render-everything HTML page is ~5MB and fetchers truncate it. (1) NEW /changelog.txt: the COMPLETE record (all 2354 ships) as one compact plain-text line each, 304KB — fits a single fetch (the AI-readable complete feed). (2) /changelog HTML is now PAGINATED (?page=N, 100/page, Prev/Next + page indicator) instead of the ?all=1 truncation-trap. (3) Prominent in-page note + llms.txt point AIs to /changelog.txt (complete) / .json (structured). gen-changelog writes changelog.txt; /changelog.txt on no-store list. 728 tests green

Landingeb27054f

Ships /changelog hardening for AI fetchers: (1) lighten the default server-rendered view 300->100 ships (~702KB->~250KB HTML) so fetchers with size caps don't truncate it — ?all=1 still renders everything, /changelog.json has the full record; (2) override the layout's generic OG/Twitter tags with the Ships title/description (AI fetchers were reporting the site-wide 'Talk to AI' default); (3) add /changelog to sitemap.xml. Origin already verified fixed (nginx-only, no CDN, no-store, old client-shell strings gone) — remaining staleness was the AI fetcher's own cache; a fresh URL (?fresh=1) returns the server-rendered ships

Landing3fb57fc7

Ships feed: make /changelog AI-readable + fix classification. (1) CRITICAL: /changelog was 'use client' — the ships loaded via a browser fetch, so any AI/crawler reading the URL got an empty 'Loading…' shell. Rewrote it as a SERVER COMPONENT (plain SSR HTML, inline styles, no client JS): ships are now in the initial HTML, filtering is server-side via ?project= (chips are links), + page metadata + a ?all=1 to render the full set. (2) Classification now uses each commit's CHANGED FILES (classifyByFiles + PATH_RULES) not subject keywords — fixes the self-referential bug where the Ships-feed commit filed itself under Carrier00 for naming it (now correctly Landing). Chat 310->686, carrier00 612->581 as false-positives clear. gen-changelog.mjs reads --numstat. 728 tests green (+ file-based classify tests)

Landingc4d27f3a

Ships feed: serve the full notable history (2351) not just newest-400, so every project (markets, ai-npc, office, sounds, research...) is actually filterable — a small cap dropped older projects and filtering them showed empty. Chip counts now computed over served entries so they always match. changelog.json ~834KB (no-store, dedicated page; landing still uses tiny changelog-latest.json)

Landing0f6e5d2e

Ships feed: an honest, git-derived changelog of what the AI ships to prod across every CommsLink project. New /changelog page (timeline, per-project filter chips, version tags, load-more) + machine-readable /changelog.json for agents (linked from llms.txt) + a compact 'Recently Shipped' strip on the landing's living-lab monitor (under the code-activity graph). Data: scripts/gen-changelog.mjs reads git log across CommsLink2+Carrier00, classifies each commit to a project + extracts version via the pure, unit-tested scripts/changelogParse.mjs (7 tests); writes public/changelog.json (400 newest of 2350 notable ships) + a tiny changelog-latest.json for the landing. Wired into deploy.sh Step 0 (regenerates every web deploy, fails soft) and next.config no-store list. 725 tests green

Jul 14, 2026
Atlasv0.0.1628ca6ff96

Changes-view supporting text readability. The file-path lines under each change row + the Explain It/Quiz launch-row sublabels used a hardcoded dark #5f748c — too dark on Voidspace, which sets --atlas-outline:none, so the text had no outline over the near-black void. Added a theme-aware --atlas-ink-faint token (uiSkin.ts: classic #8398ac, sleek/Voidspace #8797aa — both well above the old value and readable per theme) and switched the changes-view supporting text to it (AtlasViewer renderChangeRow file path + fit label; QuizPanel LearnLaunchRows scope detail / level prompt / saved-lesson sublabel via a new inkFaint const). Colors only; 718 tests green, extension tsc clean

Atlasv0.0.161a08393d8

Explain It teaches architecture + shows code. (1) Rubric (ATLAS.md Explain mode + DEPTH_SPEC): lectures must trace the real WIRING — entry point (route/socket/handler) -> action/function -> data layer, and what REGISTERS/HOOKS each piece — not just prose. (2) New slide schema field snippets[] {code,file?,lang?,caption?,kind:code|diff} (validated leniently in explain.ts cleanSnippets — a bad snippet never rejects the deck; capped 8/slide, 6k/code). (3) Split-pane UI: when a slide has snippets, ExplainPanel splits 42/58 — teaching left, a SCROLLABLE stack of code cards right (multiple snippets/slide). New read-only CodeBlock.tsx reuses the highlight.ts tokenizer; diffs render with +/- line coloring (classifyDiffLine) over highlighted code; langFromHint maps lang names/exts. (4) FIX: .atlas/.gitignore now un-ignores lessons/ (was '*'). Public atlas.md updated. Extension tsc clean; 718 tests green. Release: package.json + page.tsx + version json + rebuilt served .vsix

Atlasv0.0.160076382e5

Syntax highlighting in the code popup. Opened files were plain white text in a textarea; now they're colored (comments/strings/keywords/numbers/types/function-calls, VS Code Dark+ palette) for TS/JS/TSX, JSON, CSS/SCSS, Python, shell, YAML, HTML, with a generic c-family fallback. Approach: a NEW dependency-free pure tokenizer highlight.ts (sticky-regex rulesets per language, +8 tests incl. XSS-escape + a char-exact round-trip invariant so the color layer aligns with the editing layer) — no highlight.js/Prism/CDN (keeps the shared bundle lean + dodges the webview CSP). Rendering: new CodeEditor.tsx overlays a transparent-text textarea (visible caret) over a highlighted <pre>, scroll-synced, identical font metrics; EditorPopup uses it via langForPath(path). Editing/saving/lint unchanged. Size-guarded (>80k chars → plain) for typing perf. Extension tsc clean; 712 tests green. Release ritual: package.json + page.tsx EXT_VERSION + version json + rebuilt served .vsix

Atlasv0.0.159fd6dcf8f

Explain It lessons are saved and reopenable. Every delivered lecture is auto-persisted to .atlas/lessons/<id>.json and listed under the 📽 Explain It launcher; clicking one replays it instantly via the normal 'explain' broadcast — NO AI running, nothing regenerated (fixes: previously the AI had to rebuild a lecture every time). Per-repo storage so committing .atlas/lessons/ shares the library with anyone who clones (a new teammate inherits the walkthroughs). Each saved lesson has a × to delete. Arch: new PURE module lessons.ts (id/slug/meta/sort, +10 unit tests) does the shaping; quizHost.ts does fs (saveLesson on deliver, listLessons/openLesson/deleteLesson with LESSON_ID_RE path-traversal guard + validateExplain on load); extension.ts adds explainLessons/explainOpen/explainDelete handlers; webview.tsx bridge (listLessons/openLesson/deleteLesson); QuizPanel LearnLaunchRows shows the library above the create-new flow and fetches it independently of the AI probe (reopen needs no AI). Dedupe by scope+depth via stable filename id. Public atlas.md updated. Extension typechecks clean; 704 tests green

Atlasv0.0.15858108f4e

Explain It + Quiz me are now large centered windows (~92vw x 92vh) that fill most of the screen, for easier reading/engagement. Both were small corner-ish panels (Explain 680px/78vh centered, Quiz 560px/72vh bottom-anchored); now both center at min(1180/1100px,94vw) x min(900/880px,92vh). Content scaled up for legibility: Explain slide title 1.05->1.7rem, bullets 0.86->1.1rem; Quiz question 0.9->1.22rem, options 0.8->1rem, score rank 3.2->5rem, and the score screen is vertically centered. Text sits in a centered ~820-860px reading column so lines stay comfortable in the wide window. Shared btnStyle base bumped (Slack dock buttons override size inline, unaffected). Lecture/exam behavior unchanged (arrow-key paging, camera-tour refs). Release ritual: package.json + page.tsx EXT_VERSION + version json + rebuilt served .vsix. 694 tests green

Atlasv0.0.157ee7ec071

Slow the click-to-focus orbit to 16s/revolution. Previous 4s was FASTER not slower (fewer seconds/lap = quicker spin) — I inverted the user's 'make it slower' intent last round. ORBIT_SECONDS 4->16 = a leisurely turn (~1/4 the speed). Frame-rate-independent update(dt) retained so it circles identically on Mac and Windows, 60Hz and 144Hz (the 'too fast on both' report confirmed that fix landed — the speed was just set too high). Release ritual: package.json + page.tsx EXT_VERSION + version json + rebuilt served .vsix, public atlas.md 4s->16s. 432 atlas tests green

Jul 13, 2026
Atlasv0.0.156f2b88891

Click-to-focus orbit tuning + frame-rate fix. (1) Slowed the click-orbit to one revolution / 4 seconds (was 8). (2) ROOT CAUSE of 'too fast': controls.update() ran with no delta-time, so OrbitControls stepped a fixed angle PER FRAME (~60fps assumption) and spun ~2-2.4x too fast on 120/144Hz displays. Now update(dt) makes autoRotate frame-rate independent — 60/speed seconds is a TRUE period on any refresh rate (three r180 supports update(deltaTime); verified formula 2PI/60*speed*dt). This also brings the idle establishing drift and activity-focus orbit back to their nominal cinematic speeds on high-refresh screens. (3) Click-to-focus frames 25% closer (ZOOM_MARGIN 1.125 vs the neutral 1.5 fit), still floored by minGap so the camera can't enter the object's skin. Release ritual: package.json + page.tsx EXT_VERSION + version json + rebuilt served .vsix, public atlas.md 8s->4s. 694 tests green

Atlasv0.0.15580b5668a

Click-to-focus now keeps circling the clicked object. After a click flies the camera to frame an object, the camera orbits it at one full revolution / 8 seconds (OrbitControls autoRotate, speed 60/8=7.5), so the user sees the object and its neighbours from every side hands-free and can just click the next thing that drifts into view — the map becomes fully navigable by clicking alone, no WASD/orbit fluency needed. New orbitSelected flag set in zoomToNode (resets autoRotatePausedUntil so the spin begins the instant the fly-in lands); cleared on deselect/edge-select/highlightSet/activity-focus and on WASD flight (manual nav takes over). A drag pauses it 6s then it resumes on the still-framed object, matching the focusId orbit. Release ritual: package.json + page.tsx EXT_VERSION + atlas-extension-version.json + rebuilt served .vsix, public atlas.md updated. 694 tests green

Atlasv0.0.1548f3a01fe

Reconcile merged PR #21 (workspace-shadow window-theme fix) with 0.0.153 click-to-focus. PR #21 nailed a deeper root cause of the Mac 'theme not applied' report: workspace-scope workbench.colorCustomizations (a checked-in Peacock .vscode/settings.json coloring title/activity/status bars) out-rank Atlas's global-scope tint PER KEY, so exactly those bars kept old colors while the rest themed — not a Mac-only bug, Mac just hit it. Fix: parkShadowingWorkspaceColors moves colliding workspace keys aside while a theme syncs and restores them verbatim on sync-off; applyWindowTheme now seeds from inspect().globalValue (was leaking workspace keys into user settings); ensureMacTitleBar defers to VS Code's own restart prompt (titleBarStyle needs a full restart, not a reload — my 0.0.152 'Reload Window' button couldn't apply it). The macOS custom-title-bar flip is KEPT (both are needed: custom bar so titleBar.* is honored at all, plus parking so global isn't shadowed). Reviewer additions: extracted the bug-prone parking set-math into pure reconcileParkedColors() + 7 unit tests; bumped to 0.0.154 (both 0.0.153 vsixes collided) and completed the release ritual (page.tsx + version json the PR omitted). 694 tests green

Atlasv0.0.153353e81a0

Click-to-focus camera. Clicking any 3D object now flies the camera to frame it — centered and sized-to-fit via the object's real bounding sphere (a lone component and a skyscraper both fill ~2/3 of the view) — while PRESERVING the current viewing angle (it comes into view from where you are, not a canned angle). Makes the map fully navigable by clicking alone, for users who aren't fluent with the WASD/orbit controls. Reuses the existing camTween Superman-flight rig with a gentler arc; grabbing the mouse or flying with the keys cancels it (onPointerDown already does). Only fires on SELECT (not deselect, not planes, not empty space) and, unlike the Changes-list focusCameraOn, does NOT resume the idle auto-orbit. Frame-to-fit math extracted to pure cameraFraming.frameDistance() + 6 unit tests (687 total green). Public atlas.md updated

Atlasv0.0.153cbff5ceb

Window tint now overrides workspace colorCustomizations; macOS title bar needs a restart, not a reload

Atlasv0.0.15263b2cecf

MacOS window-theme fix. The title bar (and any activity-bar icons relocated into the top strip via compactRail) never followed the Atlas city theme on Mac while Windows/Linux always did. Root cause: macOS defaults window.titleBarStyle to 'native' — the OS draws the bar and VS Code IGNORES every titleBar.* / top-strip colorCustomization while native; Windows/Linux default to the custom bar so the tint applied. Fix: new ensureMacTitleBar() flips window.titleBarStyle to 'custom' (darwin only) while a non-default theme is synced, remembering the prior value so turning syncWindowTheme off / returning to the default theme restores exactly what the user had; a non-blocking 'Reload Window' prompt applies it (titleBarStyle needs a reload). No-op on Windows/Linux. Setting description updated to disclose the behavior. 681 tests green

Atlasv0.0.15117dc498d

Slack overhaul. (1) Dock = one channel of ALL DMs + @s + YOUR replies interleaved (classify emits a 'sent' kind for self-authored DMs; slackAlarm SlackKind+badge exclude 'sent'). (2) Resizable dock — drag the top grip to pull it up (persisted). (3) Soft beep on each new DM/@ (webview, gated by the 🔔). (4) RELIABILITY: multiple editor windows each catch a different subset (Slack fans each event to ONE Socket connection) — windows now POOL received messages to a shared machine-global dir (~/.atlas-slack/pool-*.json) and merge (pure mergeMessages, tested) so every dock shows the union. (5) Setup-once: secrets.onDidChange listener connects other windows when tokens are set anywhere. Panel reads at the 0.83 panel-strong glass. 681 tests green. (Known: 'claude:' phone command still runs in whichever window's connection Slack picked — leader election deferred.)

Atlasv0.0.15020bbe533

Noir theme polish. (1) package-district plates use greyscale (new districtSaturation theme field=0 for noir) instead of the rainbow hash-hue that produced a purple plate. (2) AWS account boundary dashed line + label take theme.containerEdge (grey in noir) instead of a hardcoded blue 0x46618c. (3) building FINISH is now per-theme (new buildingOpacity/buildingRoughness/buildingMetalness fields, applied to module/page/skyscraper/compute materials + applyHighlight on-opacity) — noir set to opaque + low-roughness + metallic for glossy wet-street chrome; other themes keep matte defaults via ??. 676 tests green

Atlasv0.0.1490b24d20f

Noir Terminal theme iteration — restore its 'black-and-white with a single red pulse' identity. The pipe-consolidation work had leaked amber (conduit) + green (statePipe) + amber (component) into the monochrome; now red is the ONLY colour (client 'case-thread' pipes + red S3/page-edge evidence markers), and conduit/state/component are tonal greys (bright/steel/dark) told apart by DEPTH not hue. Deeper black bg, pure-white ink curbs + brighter module edge outlines, lower ambient + stronger key/rim light for edge-lit noir contrast, neutral-grey container tints. 676 tests green

Atlasv0.0.148394d013b

Ship the .vsix + version through the download flow. Prior commit bumped package.json but left public/atlas-architecture-map.vsix at the old 0.0.147 build and EXT_VERSION unbumped, so the served extension lacked the WASD/Space typing fix. Copy the new .vsix into services/web/public and bump EXT_VERSION to 0.0.148 so /atlas serves the fixed extension

Atlasv0.0.148b93827b0

WASD/Space flight controls no longer fire while typing. scene.ts onKeyDown routed every window keydown straight into camera flight — so Space (preventDefault'd as fly-up) got swallowed the instant you typed into the terminal or the file-query box, and W/A/S/D flew the camera mid-keystroke. New typingInField guard skips flight when the key target is an INPUT/TEXTAREA (xterm types into a hidden textarea)/SELECT/contenteditable, so the scene only flies when it truly has focus. Extension repackaged. 676 tests green

Atlasv0.0.1473a0924d9

Map opens as a full editor tab, not the narrow sidebar. The activity-bar view was a WebviewView (sidebar) which forces an un-closeable empty editor beside it (user-reported); it's now a thin launcher whose resolve opens the map via openAtlas. openAtlas reworked: single reusable tab (reveal if open) in ViewColumn.Active (main editor group) instead of ViewColumn.Beside (a split). Session (scene/camera/terminal) unchanged — lives in getSession regardless of surface. 676 tests green

Atlasv0.0.14643a82a61

Clicked-module detail panel less transparent — new --atlas-panel-strong skin var (= the terminal's 0.83 veil, per-theme) applied to the selection card so a selected module reads clearly against the scene, matching the terminal opacity bump

Atlasv0.0.145deb7f19a

Pipes strictly 90 degrees everywhere. Fixed two diagonal stub sources the bundling introduced: bundleRoute emits an orthogonal node->lane bend for ends the wall-approach doesn't reshape (endpoint doors); approachWall inserts a right-angle corner so the anchor(grid crossing)->leadIn join is axis-aligned then perpendicular onto the centre-line, both corners outside the wall. New orthogonality tests (all legs axis-aligned). 676 tests green

Atlasv0.0.1449874b69f

Real pipe consolidation via flow-biased bundling. New pure bundleRoute.ts (+tests): routes utility pipes one at a time on a shared coarse lattice with a per-edge USAGE discount (a used trunk edge costs ~quarter) + turn penalty, so later pipes JOIN existing trunks instead of cutting new lanes — many routes collapse onto a few trunk corridors with short branches (transport network). Longest-first order lays the trunks. Client/state/component all bundle on it; removed the superseded utilityGrid/directIfDetour/pathLength + their tests. 675 tests green

Atlasv0.0.1433b0db4f2

Underground pipes consolidate into a transport network. New pure utilityGrid (routing.ts, +tests) builds one shared orthogonal lattice (bounded to 12 lanes/axis for O(nodes^2) router perf) covering the whole account; client, state, and component pipes all route on THIS grid instead of each going solo-direct, so parallel runs share trunk lanes (overlap -> visually one tube under x-ray normal blending) and branch to nodes. Grid covers everything so no detours; directIfDetour retained as a no-op safety. 679 tests green

Atlasv0.0.142fa8eb8b2

Each shared component runs its OWN pipe. Component pipe network is now per (component,page) usage — gridEdges built as component->page from split.pagesDrawing (was a single synthetic PLANT_ID->page trunk for the whole plant); each pipe rises from that component's plant unit (new plantUnitConnect in pipeConnect, +unit registered in pipeConn) into the page wall. Removed the synthetic PLANT_ID/gridPos + gridMatch/compUsers; power grid now highlights via the standard touches matcher (real cid->page edges), so selecting a component lights its pipes and selecting a page lights its components' pipes. 676 tests green

Atlasv0.0.14126cb9b03

(1) component plant pipes are now a full underground network on their OWN deepest layer (trunkY -16.8, below client -10.4 and state -13.6), matching the pipe grammar (full opacity/radius) instead of thin overhead power lines — three distinct stacked underground networks, each its own theme color; doc updated. (2) terminal veil +50% opacity (0.55->0.83) for readability. 676 tests green

Atlasv0.0.14056eb7197

Direct utility-pipe routes are ORTHOGONAL (single 90 degree bend) not diagonal — directIfDetour now returns an L-path (longer leg first; straight when axis-aligned) instead of a slanted straight line, so pipes that skip a far road stay organized on the grid; tests updated. 676 tests green

Atlasv0.0.13943d1ea67

Underground/overhead utility pipes stop detouring to distant roads. New pure directIfDetour (routing.ts, +tests): if a road-following route is > 1.5x the straight-line distance (+6 slack), the client/state/power-grid pipe goes DIRECT instead of crossing the map to borrow a street and crossing back; data conduits still ride roads by design. Also fixed a strict-mode index type (gridPos: Record<string,Vec3>) the extension tsc caught. 675 tests green

Atlasv0.0.13860f77f08

Pipes are selectable + hoverable. TubeNetwork.pickPath raycasts its x-ray tubes and maps the hit back to the nearest path (edge) via pure pointToSegmentDistance (tested); TubeNetwork.setHover draws a light bright overlay (pipe hover, no beads). Scene: pickPipe across all 4 networks (closest), selectPipe (real edge -> selectEdge, power grid -> select the page node); pointer precedence real-node > pipe > ground/district plane so underground pipes over the ground stay clickable; throttled pipe-hover raycast with pointer cursor. 670 tests green

Atlasv0.0.13796b0693b

Default flight speed = the old Shift-boost speed (90->300); Shift now boosts faster still (300->600); FOV surge renormalized to the new max

Atlasv0.0.136255dba66

Camera/navigation overhaul — (1) starts zoomed in with the orbit target ~4 units ahead so mouse-drag looks around instead of orbiting the whole map; (2) removed the floor lock (maxPolarAngle=PI + dropped the WASD y-floor guard) so you can fly below the world; (3) Space = fly straight up (preventDefault so it never scrolls); (4) doubled cruise speed (45/150 -> 90/300) with a ~1s accel ramp (tau 0.45); (5) faster zoom (controls.zoomSpeed=3, minDistance 0.4); (6) removed the flight wind sound (scene wind dispatch + AtlasViewer wind-audio effect gone); (7) idle auto-orbit: after 30s with nothing selected and no camera input, fly out to a wide establishing shot and slowly orbit the whole scene, cancelled by any interaction. 666 tests green

Atlasv0.0.13596fa1e06

(1) state pipes split out — page<->store reads/writes now render as their own TubeNetwork in a distinct per-theme statePipe color (added to all 10 themes + resolveTheme fallback) at trunkY -13.6, one level below the client API pipes (-10.4), so the two underground paths never blur; wired into select/spotlight/edge highlight + tick + dispose. (2) celebration toasts themed to the active palette (pushed=accent, commit=theme mint) + restyled as skin BracketPanels (glass/brackets/condensed font) instead of fixed green/blue fat text. (3) celebration chime audible again — AudioContext now primed on first pointer/key gesture so background git-triggered chimes aren't blocked by the autoplay policy. 666 tests green

Atlasv0.0.134b5a70d74

Fix selection not de-highlighting the previous plane. Root cause: host ground slab + container district floors are selectable nodeVisuals, but applyHighlight SKIPS host/container ('context platforms stay lit'), so the animate loop's cyan body-emissive crank on them was never reset — clicking another object left the previous plane glowing. Fix: new pure SelectionGlow helper owns the selected body's emissive and restores the previous material on every selection change (cleared in setSelectionVisual, driven in animate, forgotten on rebuild). Unit-tested incl. the exact host/container case. 666 tests green

Atlasv0.0.133a1d3493b

Pipes now TOUCH the object they serve. Root cause: pipes terminated at floor height, but a water tower's tank body sits high on legs (y 4.2-6.8) so a floor pipe connected to nothing; houses connected at the base edge. Fix: new shared pipeConnect module is the single source of truth for WHERE a pipe meets each object (wall radius + body height + overlap), derived from the real mesh geometry — water tower pipe rises to the TANK, house/skyscraper pipes meet the wall part-way up, silo pipes meet the flank, all overlapping slightly into the surface. Rewrote pipe tests to assert the endpoint lands ON the object's real 3D body (pointTouchesBody) — the check the old tests lacked; incl. a regression guard that a floor point does NOT touch the tank. 660 tests green

Atlasv0.0.1323c50a34a

Rewrote pipe terminal-approach geometry — replaced the radial trimPathTail (cut the street path wherever it crossed the wall circle → off-center / short) with approachWall, which enters perpendicular and centered on a face/radius and terminates exactly at the wall for EVERY pipe type (client subways, data conduits, component power grid, datastore silos); unified all four routings onto one pure function; EXTENSIVE new pipe test suite (tubePaths approachWall + full routeEdges→approachWall→verticalProfile pipeline in pipes.test.ts, incl. the building-hugging-its-road bug + all approach directions) — 653 tests green

Atlasv0.0.1318242ef86

Client pipes + component power lines terminate AT the page wall and water-tower base, not through the object's center — generalized the datastore silo-wall trim (new pure trimPathTail in tubePaths.ts with a gap param + 4 unit tests) to pages/stores via a clientStopRadius map, and pipe/grid endY drops to floor level (0.6) at the wall so the pipe leads TO the house/tower instead of rising up inside it; datastore trim now delegates to the shared helper

Atlasv0.0.1306459a482

Selection glow-up — clicked item takes a single signature ice-cyan glow (SELECT_COLOR, same on every theme) with a heavy pulsing+breathing halo hugging the mesh and a heavy signature emissive on its body; connected pipes/conduits/power-grid render in the signature color (thicker) with FLOWING energy beads traveling source→dest (TubeNetwork.tick, world-paced, positionOnPath pure helper); tube highlight recolored white→signature; atlas.md gains a Selecting section

Atlasv0.0.129d68b112e

Endpoint doors theme-tinted — new per-theme door color on all 10 themes (a lit-doorway hue in each palette), replacing the fixed HTTP-method door colors; method still shown on the selection card; legend + ontology updated; default preserves old light-blue for pre-field custom themes

Atlasv0.0.12865c9a4d5

Component plants + state-store water towers now theme-tinted (new per-theme store/component colors on all 10 themes, defaults preserve old custom saves); component→page power lines rebuilt as a real routed overhead grid (trunk out of the plant branching down each drawing page along the street centerlines, x-ray tube grammar) replacing the straight catenary wires; selection/spotlight light the grid via plant-unit→page adjacency; default terminal width +50% (320→480, min clamp too)

Atlasv0.0.12794dc1313

Terminal hide/kill controls moved to the top-right corner (inset beside the resize grip); extension typecheck hardened — tsconfig pins types:[node], @types/vscode + @types/js-yaml declared as root devDeps (were phantom installs pruned by yesterday's reinstall)

Jul 12, 2026
Atlasv0.0.1269aa72f37

3D label v2 — 2x supersampled canvas textures (sprite scale from logical dims so world size unchanged, texture 2x sharper), LinearMipmapLinearFilter + anisotropy 4 (kills the pull-back shimmer the old Linear-only minFilter caused), condensed LABEL_FONT_STACK at weight 400 with 1.2px letterspacing on EVERY theme (labels + panels = one typography), theme-tinted rounded glass chip (bg derived from theme.background at 45% + 0.78 alpha, whisper stroke) replaces the flat dark bar; ctx.letterSpacing/roundRect guarded for older canvases

Atlasv0.0.12503cde146

Terminal window controls — ghost − (hide; display:none, pty lives on) + × (kill: host term:kill disposes the session + clears saved scrollback; xterm reset; reopen spawns fresh via term:start) at the terminal's top-left on hover; new command-prompt SVG icon beside the folder toggle in the Changes panel Row 0 toggles visibility; two-way sync over 'atlas-terminal' window event, persisted in atlas.termOpen

Atlasv0.0.1248dba2cb7

Paper Blueprint v2 — the light pastel version (fought the dark UI system, washed out) becomes a TRUE CYANOTYPE: bg 0x0d2f56 blueprint blue, WHITE drafting linework (curbs/edges/frames/labels eaf4ff), redline conduits 0xff8a5c, white pipes, uniform container fills differentiated by white frames, flat drafting light (ambient 0.85/sun 0.45), white chalk clouds. atlas.compactRail setting: opt-in half-size rail icons via workbench.activityBar.location=top (in-place icon sizing not exposed to extensions); OFF only removes OUR override (inspect() guard — never clobbers a user's own bottom/hidden)

Atlasv0.0.123e3fa785b

Window tint goes FULL WORKBENCH — editor.background, tab strip (active/inactive + group headers), breadcrumbs, sideBar + auxiliaryBar (mac right part), panel/terminal background all follow the active Atlas theme (blend() helper derives darker header shades + whisper accent borders); activity-rail icons GREYED (foreground muted 45% toward bg, inactive 68% — accent reserved for the active border + badges); managed-keys cleanup mechanism unchanged so opting out or going default restores everything; documented mac caveat: native title bar needs window.titleBarStyle custom

Atlasv0.0.12279051f5c

Voidspace v2 — the black-and-white scene gets a palette: quietTubes OFF (pipes visible again), client subways electric cyan 0x35c8ff (radius 0.11, opacity 0.6), data conduits amber 0xf5b04e, component windows warm 0xffd98a (lit city at night), cache/bucket datastores subtly tinted, bloom 0.5/0.65 so neon breathes, rim light up; UI glass pure-black→cool near-black rgba(8,14,24,0.55/0.95) + faint neon hairline borders return at 0.14-0.2 (black-on-black erased panel shapes; well under the old loud 0.30), terminal veil matches

Atlasv0.0.121f5cbb258

Terminal veil universal — new --atlas-term-veil skin var (sleek black glass / classic = theme background at 0.55) painted by the panel ROOT on every theme so the background reaches the brackets and follows resizes; xterm canvas now ALWAYS transparent (paletteFor simplified, gpu param dropped). FileExplorer final color pass: breadcrumb slashes + loading/empty states → ink-dim var, rowpad var, changed-row glow drops its hardcoded black outline (root outline var governs), orphaned outline const removed

Atlasv0.0.120bfe632bf

STRUCTURE IS UNIVERSAL, COLOR IS PER-THEME — uiSkin refactored to a shared STRUCTURE base (condensed font stack, weight 300, rowpad 2px, lh 1.25, icon 0.78em, bracket 11px offset -2px, radius 0, term-fs 11.5 force + narrow mono) merged into both skins; .atlas-title understated titles now on every theme; classic themes keep their atmosphere (transparent panels, TEXT_OUTLINE readability, accent-colored ticks now at 0.9 opacity with tightened glow); sleek keeps black glass + neon blue + no borders

Atlasv0.0.119d51e61e7

React Native parser — packages/atlas/src/reactNative.ts maps mobile apps into the client city: Expo Router file-based screens (app/(tabs)/home.tsx → /home; _layout/+specials excluded) + React Navigation code-registered screens (<X.Screen name component={Y}> resolved via imports to the real file, navigator family in meta), page ids namespaced page:mobile:* (no web collisions), meta.platform=mobile; on-device storage (AsyncStorage/SecureStore/MMKV/expo-sqlite/WatermelonDB/Realm) = client water towers (store kind, reads pipes — NOT backend warehouses), device capabilities (camera/GPS/push/maps/biometrics/BLE/sensors) = externals above their screens; API calls reuse frontend.ts gate matching; monorepo-safe RN root detection; client district sign platform-aware (Next.js / React Native / web + mobile); ontology + docs updated; 11 new tests incl. temp-fixture integration (633 total)

Atlasv0.0.1182d85f6a9

InjectAi submit fix — the prompt entered the terminal but never sent (Slack remote + Quiz + Explain). Cause: 'text\r' written as one chunk; Claude Code's TUI is mid-render and swallows the trailing \r. Fix: write the text, then the Enter as a SEPARATE write 250ms later (atlas pty term.write + integrated terminal sendText(text,false) then sendText('\r',false))

Atlasv0.0.117747f29dd

Mac terminal font fix — sleek themes set --atlas-term-force=1 so the theme size (11.5) WINS over the user's terminal.integrated.fontSize (which was overriding via the userFs|| fallback → 'unchanged on Mac'); term:ready now funnels font through applySkin (single source of truth) instead of setting size directly; classic themes still respect the user size. ATLAS.md: Slack is now documented as a tool the AI has — read slack-inbox.json + reply to the phone via slack-reply.txt (incl. proactive finish-pings)

Atlasv0.0.116d4827b99

Rewrite Slack setup instructions — the old ones were wrong/incomplete (called it read-only, didn't stop users hand-building a scope-starved app, manifest lacked im:write). Now: create FROM THE MANIFEST not from scratch (explicit), correct xapp-/xoxp- order with anti-swap hints, a missing_scope fix-it note (re-apply manifest via App Manifest tab + reinstall + re-copy token), and calls out im:history as the scope that actually delivers messages

Atlasv0.0.1159674ef01

Slack reply path needs only chat:write — client caches the self-DM channel from any self-authored im event and sendToSelf uses it directly (skips conversations.open, which needed im:write); manifest gains im:write as the first-use fallback + updated description. Diagnosis for the user: their hand-built app has only chat:write+users:read, missing im:history (why self-DMs never arrived) — re-apply the full manifest

Atlasv0.0.114db365277

Slack remote-control diagnostics — 'Send test to my self-DM' button (isolates the chat:write reply path) + live 'last Slack event' readout (proves whether self-DM events arrive at all) in the setup panel; sendToSelf returns the Slack error; loud editor notifications on every onSelfCommand branch (remote off / running / no-Claude / send-failed-why incl missing_scope); onEventDebug tap reports every inbound message event's channel_type + fromSelf before any drop

Atlasv0.0.113bbe6f448

Slack token validation hardened — testTokens prefix-checks xapp-/xoxp- and tests the app token via apps.connections.open (not auth.test, which is type-agnostic and let a swapped app field pass then fail at socket open with not_allowed_token_type); clear per-field error messages. Voidspace panels: black glass instead of blue (--atlas-panel/panel-solid/header → rgba(0,0,0,…)), 25% less transparent (0.22→0.28)

Atlasv0.0.112347751df

Slack remote control (opt-in phone->Claude->phone) — self-DM ONLY trigger (pure parseSelfCommand: channel_type im + author===self + claude: prefix, everyone else's messages can never command), gated on atlas.slack.remoteControl (default off) + wizard toggle; command injected via the shared injectAi (no AI = texts back 'no Claude running'); Claude writes .atlas/slack-reply.txt, host watches + sends to self-DM (chat:write scope added to manifest, one reinstall); ATLAS.md phone-task section; loop stays 100% inside the user's own DM-to-self, nothing authored to third parties

Atlasv0.0.111a5ddec5b

Client pages lose roofs + driveways on ALL themes (user rule — they complicated the suburb): house branch is a clean flat-topped box, addDriveway removed from both house and tower branches, method deleted with a note that yard-prop encoding returns only via a deliberate design pass

Atlasv0.0.110e02d6f36

Atlas 0.0.110 fix: jumpTo missing from FileExplorer destructuring (EC2 next build caught what local tsc missed)

Atlasv0.0.1108b8f5d70

Search picks route by truth-test (listDir succeeds = folder → explorer jumpTo prop opens rooted there; else popup editor) with camera flight either way; terminal brackets translateY(-2px) to sit on the glass line and match the explorer frame height; search input muted grey bg + 0.66rem; selection card = header band (kind as atlas-title + close) with name at theme-standard 0.8rem/600, file 0.64 mono, loc 0.66, all 4 section headings atlas-title'd; global auto-hide scrollbars (transparent until container hover, slim theme-tinted thumb, no track) in uiSkinCss both skins

Atlasv0.0.109b2b5f727

Terminal frame restructure — brackets live OUTSIDE the clipping container (overflow:hidden was eating the bottom pair at the -2px offset) and an inner glass div owns clipping so the panel bg aligns exactly with the bracket line; snap gaps 1px→3px everywhere (explorer edge, selection-card/dock seam); standalone 📁 button removed — the Changes panel (now always present on the extension surface) gains a top row with a white SVG folder toggle + project-file search over the graph's file corpus using native datalist autosuggest (pick = popup editor + camera flight)

Atlasv0.0.1081a102e12

Terminal glass full-bleed (root div wears --atlas-panel to the brackets; webgl canvas transparent when a skin glass exists — no stacking; classic keeps canvas veil); FONT ROOT CAUSE — workspace config get() returns schema defaults so terminal.integrated.fontSize=14 always masqueraded as a user choice, blocking skin sizing forever: host now sends only inspect()-explicit values; sleek adds --atlas-term-font (narrow mono stack) applied when no explicit user font; EditorPopup gets the full skin treatment (panel-solid glass, brackets, header band, atlas-title, skin font/weight for chrome — code area stays mono)

Atlasv0.0.107728efe95

Terminal skin race fixed — xterm snapshots skin vars imperatively so mount could miss the injection; AtlasViewer now dispatches 'atlas-skin' after injecting + terminal re-applies on it (plus a deferred kick for the reverse race) → glass veil + --atlas-term-fs actually land. Voidspace borders REMOVED via skin vars (border-line/solid/hover/btn-border transparent; old values kept in comment) — brackets alone frame panels. Selection card width = SLACK_DOCK_W and snaps 1px above the dock (dock 160→200 tall); hamburger lives INSIDE its strip (controls vanish, ☰ + glass + brackets remain)

Atlasv0.0.106255d459d

Terminal glass on non-GPU renderers (root div wears --atlas-panel when webgl absent — the PowerShell missing-blue fix) + skin-driven terminal font size (--atlas-term-fs 11.5 sleek, user terminal.integrated.fontSize wins); voidspace glass 0.44→0.22; LearnLaunchRows = atlas-title style, Quiz→Quiz me; Changes panel + terminal snap 1px against the explorer (leftPad explorerW+1, closed-left 47); top-right controls unified into one BracketPanel menu cluster (slack/theme/improve/sound) collapsible to ☰ hamburger, persisted

Atlasv0.0.105c88b966b

Voidspace evenness pass — brackets offset onto the border line (--atlas-bracket-off); FileExplorer swaps its private bracket copy for the shared cornerBrackets + border-line var; terminal panel fully skinned (bracket size/color/glow/offset vars, hairline border, GPU veil reads --atlas-panel so it wears the same blue glass, xterm fontWeight from --atlas-weight); Changes|Tests tabs get the .atlas-title treatment; global button/select/input font-family inherit (UA stylesheet was the font mismatch); 3D city labels use the condensed face via labels.setLabelStyle when sleekUi

Atlasv0.0.1048c2950e1

Voidspace EVE polish — sharp corners (radius var 0), brackets half-size neon-blue #5ad1ff at full opacity with blue glow + borders in the exact bracket hue, darker header bands rgba(5,12,24,0.78), condensed font applied to every chrome element (buttons/select/pills) at weight 300, .atlas-title skin rule makes panel titles tiny/unbold/uppercase, roads quieted (near-void bed, white curb hairlines), datastores = ghosted bodies + white hoops/rims (scene sleekUi branch incl. selection-dim pass)

Atlasv0.0.103a006c6ed

EVE UI skin for Voidspace (theme.sleekUi → uiSkin.ts CSS vars injected per theme): blue-glass panels + darker header bands, hairline light-blue rest borders, condensed font stack, tighter rowpad/line-height, icon size decoupled from line height, grey ink with white for emphasis, subtle blue-glow brackets; classic themes keep the frameless outline look untouched. Changes|Tests become TABS with full-panel lists + collapse chevron

Atlasv0.0.10202c9c755

Terminal overhaul for Mac feel — WebGL renderer (VS Code parity; DOM+outline stays the fallback, GPU mode wears a faint theme-tinted veil since canvas glyphs can't take the CSS outline); inherits the user's terminal.integrated font settings so powerline/nerd prompts render properly (the 'solid background path' fix); macOS spawns a LOGIN shell (-l) so PATH matches VS Code; scrollback persists across Reload Window (throttled workspaceState saves, pure sanitizeForRestore strips TUI alt-screen frames, 5 tests) with a restored-session divider

Atlasv0.0.1014381b270

Voidspace theme — deep-space reading-first look (waterOpacity 0 floats the city, white edge lines on dark hulls, thin quiet tubes hidden until selection via theme.quietTubes, externals as deterministic starship fleet via theme.ships + props.buildShip, minimal bloom, near-white UI accent); Changes panel splits test files into their own collapsed TESTS section (pure testFiles.ts isTestFile/splitTests, 5 tests)

Atlasv0.0.99b1f4a66f

Slack integration — read-only Socket Mode connector (user's own app via manifest, tokens in SecretStorage, ws bundled, direct client-to-Slack, no server); 💬 button with urgent/unseen badges left of theme picker; bottom-right bracket dock feed; forced acknowledgment of DMs/@mentions (pure slackAlarm escalation: 10min popup, 2min countdown, 60s siren + red strobe every 3min until OK; atlas.slack.alarm opt-out); .atlas/slack-inbox.json for the AI; pure classify/alarm modules with 12 tests. Changes panel flush with top edge

Atlasv0.0.98871920f3

ONE design language — shared BracketPanel (glowing corner brackets, no glass, outlined text, hover border) now frames the Changes list, node detail sidebar, connection card; pills/buttons/captions/banner go transparent; ONLY close-reading surfaces keep the dark background (diff/code, exam, lecture) and the lecture deck is vertically centered

Atlasv0.0.9790093b80

Explain It | Quiz side by side (Learn dropped from the name); exam + lecture panels + state pills restyled to the terminal design language — transparent background, 4-way outlined text, glowing corner brackets, hover border

Atlasv0.0.9694875b60

Terminal lag ROOT CAUSE fixed — .atlas writes re-triggered the workspace watcher causing a perpetual full-extraction loop (WATCH_SKIP guard for .atlas/node_modules/dist/etc); ALL background scanning removed — AI presence + scope enumeration now probe only on click; git milestone polls halved. NEW: Explain It — AI-authored slide-deck lectures played over the map (Quick/Standard/In Depth, per-slide camera flights, Esc/arrow keys) + 3-tier quiz ladder (Apprentice/Engineer/Architect) with S rank at Tier III 93%+, quality rubric mandates structure-over-syntax questions

Atlasv0.0.955da54736

Fix terminal typing lag — AI-presence scan is two-phase on Windows (pid/ppid/name skeleton, command lines only for the few pids under terminal shells), overlap-proof self-pacing loop with slow-machine backoff, adaptive cadence (12s absent / 30s present) + instant re-scan on terminal open/close; wmic transient failures no longer demote to the CIM path

Atlasv0.0.94fa8e5dcc

Learn & Quiz — AI-presence-gated exam flow (process-tree detection under terminals, never auto-starts), quiz protocol over the .atlas bus (request/quiz/status/result + staff-engineer debrief), themed one-question-at-a-time exam panel with per-question camera flights + 82% fireworks, walk command teaches file locations click-by-click in the explorer; pure quiz/procScan/gitParse/walk modules with 25 new tests

Atlasv0.0.93c4243a96

Superman flight — WASD with momentum (accel tau 0.9s, coast-stop 0.16s tau), Shift boost 3x, true look-direction flight (dive on pitch-down, floor guard), FOV speed surge; focus jumps are arced flights (distance-scaled 0.8-2.2s, late-biased easing, swoop landing); synthesized wind follows speed via atlas-wind events, mute-aware

Atlasv0.0.923872f853

The scale update — FOV 52 -> 64 (perspective drama), minDistance 6 -> 1.5, maxPolarAngle 1.55 (street level, never subterranean), focus framing 15-24 -> 9-15, opening shot at half altitude; scale is camera, not geometry

Atlasv0.0.9144825d73

City blocks of four (2x2 buildings per block, roads around blocks only, doors face nearest road; 2x2 silos per block, buckets own a block; DS_BLOCK 36 / BLOCK_PITCH 40); tube manners: silo wall termination (dsRadius trim + ground-level endY), canonical-pair routing kills A/B box loops, NormalBlending flattens stack brightness; verified: no overlaps, 46 street segments, footprint held

Atlasv0.0.905fcd68f8

File explorer matches the terminal design (frameless, outlined text, 4 glowing corner brackets, header inset; back/breadcrumb/close/resize kept); CLOUD_SCALE 10 -> 5; subway pipes trunkY -5.2 -> -10.4

Atlasv0.0.8943bc9121

True MSAA in the bloom chain — EffectComposer gets an 8x multisampled HalfFloat render target (antialias:true never applied to offscreen post-processing targets); completes the AA trilogy with 0.0.87 supersampling + 0.0.88 de-stippling

Atlasv0.0.88eb314013

Kill edge z-fighting stipple — all coplanar outlines (module edges, neon node pass, slab outlines, roof edges, prop outlines) scaled 1.003 off their surfaces so the depth test resolves cleanly

Atlasv0.0.87f97c1b94

Supersample low-DPI displays (pixel ratio floor 1.6, cap 2; composer setPixelRatio matched; high-performance GPU preference) — GL 1px lines stay coherent when zoomed out

← NewerPage 2 of 25Older →

Generated 2026-08-26 from git across all CommsLink repos · page 2/25, showing 101200 of 2,472 ships · complete record: /changelog.txt · /changelog.json.