{"generated":"2026-07-16","total":2358,"shown":2358,"counts":{"atlas":270,"landing":77,"sounds":1,"platform":559,"chat":686,"carrier00":581,"markets":125,"office":14,"ai-npc":6,"forum":3,"ai-vertizing":22,"terminal":14},"entries":[{"date":"2026-07-16","ts":1784234905000,"hash":"5cf32561","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.165","title":"Atlas ext 0.0.165: 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"},{"date":"2026-07-16","ts":1784233865000,"hash":"7a4fe1c1","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.164","title":"Atlas ext 0.0.164: 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"},{"date":"2026-07-16","ts":1784230499000,"hash":"1ab64e68","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.163","title":"Atlas ext 0.0.163: 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"},{"date":"2026-07-16","ts":1784229030000,"hash":"82a624c9","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"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"},{"date":"2026-07-16","ts":1784227229000,"hash":"eb27054f","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"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"},{"date":"2026-07-16","ts":1784214312000,"hash":"3fb57fc7","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"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)"},{"date":"2026-07-16","ts":1784213021000,"hash":"c4d27f3a","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"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)"},{"date":"2026-07-16","ts":1784212647000,"hash":"0f6e5d2e","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"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"},{"date":"2026-07-14","ts":1784058936000,"hash":"8ca6ff96","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.162","title":"Atlas ext 0.0.162: 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"},{"date":"2026-07-14","ts":1784058092000,"hash":"a08393d8","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.161","title":"Atlas ext 0.0.161: 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"},{"date":"2026-07-14","ts":1784056082000,"hash":"076382e5","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.160","title":"Atlas ext 0.0.160: 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"},{"date":"2026-07-14","ts":1784052916000,"hash":"fd6dcf8f","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.159","title":"Atlas ext 0.0.159: 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"},{"date":"2026-07-14","ts":1784048788000,"hash":"58108f4e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.158","title":"Atlas ext 0.0.158: 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"},{"date":"2026-07-14","ts":1784047498000,"hash":"ee7ec071","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.157","title":"Atlas ext 0.0.157: 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"},{"date":"2026-07-13","ts":1783982961000,"hash":"f2b88891","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.156","title":"Atlas ext 0.0.156: 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"},{"date":"2026-07-13","ts":1783982271000,"hash":"80b5668a","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.155","title":"Atlas ext 0.0.155: 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"},{"date":"2026-07-13","ts":1783978765000,"hash":"8f3a01fe","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.154","title":"Atlas ext 0.0.154: 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"},{"date":"2026-07-13","ts":1783978261000,"hash":"353e81a0","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.153","title":"Atlas ext 0.0.153: 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"},{"date":"2026-07-13","ts":1783978169000,"hash":"cbff5ceb","repo":"commslink2","author":"Daniel Lessor","project":"atlas","label":"Atlas","version":"0.0.153","title":"Atlas ext 0.0.153: window tint now overrides workspace colorCustomizations; macOS title bar needs a restart, not a reload"},{"date":"2026-07-13","ts":1783976101000,"hash":"63b2cecf","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.152","title":"Atlas ext 0.0.152: 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"},{"date":"2026-07-13","ts":1783974712000,"hash":"17dc498d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.151","title":"Atlas ext 0.0.151: 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.)"},{"date":"2026-07-13","ts":1783954250000,"hash":"20bbe533","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.150","title":"Atlas ext 0.0.150: 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"},{"date":"2026-07-13","ts":1783953317000,"hash":"0b24d20f","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.149","title":"Atlas ext 0.0.149: 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"},{"date":"2026-07-13","ts":1783952040000,"hash":"394d013b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.148","title":"Atlas ext 0.0.148: 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"},{"date":"2026-07-13","ts":1783951295000,"hash":"b93827b0","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.148","title":"Atlas ext 0.0.148: 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"},{"date":"2026-07-13","ts":1783950327000,"hash":"3a0924d9","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.147","title":"Atlas ext 0.0.147: 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"},{"date":"2026-07-13","ts":1783949429000,"hash":"43a82a61","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.146","title":"Atlas ext 0.0.146: 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"},{"date":"2026-07-13","ts":1783948832000,"hash":"deb7f19a","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.145","title":"Atlas ext 0.0.145: 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"},{"date":"2026-07-13","ts":1783947392000,"hash":"9874b69f","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.144","title":"Atlas ext 0.0.144: 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"},{"date":"2026-07-13","ts":1783946530000,"hash":"3b0db4f2","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.143","title":"Atlas ext 0.0.143: 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"},{"date":"2026-07-13","ts":1783945407000,"hash":"fa8eb8b2","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.142","title":"Atlas ext 0.0.142: 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"},{"date":"2026-07-13","ts":1783944764000,"hash":"26cb9b03","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.141","title":"Atlas ext 0.0.141: (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"},{"date":"2026-07-13","ts":1783944156000,"hash":"56eb7197","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.140","title":"Atlas ext 0.0.140: 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"},{"date":"2026-07-13","ts":1783942773000,"hash":"43d1ea67","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.139","title":"Atlas ext 0.0.139: 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"},{"date":"2026-07-13","ts":1783942424000,"hash":"60f77f08","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.138","title":"Atlas ext 0.0.138: 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"},{"date":"2026-07-13","ts":1783941387000,"hash":"96b0693b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.137","title":"Atlas ext 0.0.137: default flight speed = the old Shift-boost speed (90->300); Shift now boosts faster still (300->600); FOV surge renormalized to the new max"},{"date":"2026-07-13","ts":1783940328000,"hash":"255dba66","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.136","title":"Atlas ext 0.0.136: 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"},{"date":"2026-07-13","ts":1783938636000,"hash":"96fa1e06","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.135","title":"Atlas ext 0.0.135: (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"},{"date":"2026-07-13","ts":1783937781000,"hash":"b5a70d74","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.134","title":"Atlas ext 0.0.134: 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"},{"date":"2026-07-13","ts":1783936549000,"hash":"a1d3493b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.133","title":"Atlas ext 0.0.133: 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"},{"date":"2026-07-13","ts":1783935359000,"hash":"3c50a34a","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.132","title":"Atlas ext 0.0.132: 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"},{"date":"2026-07-13","ts":1783934237000,"hash":"8242ef86","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.131","title":"Atlas ext 0.0.131: 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"},{"date":"2026-07-13","ts":1783933314000,"hash":"6459a482","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.130","title":"Atlas ext 0.0.130: 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"},{"date":"2026-07-13","ts":1783931831000,"hash":"d68b112e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.129","title":"Atlas ext 0.0.129: 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"},{"date":"2026-07-13","ts":1783929724000,"hash":"65c9a4d5","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.128","title":"Atlas ext 0.0.128: 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)"},{"date":"2026-07-13","ts":1783926712000,"hash":"94dc1313","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.127","title":"Atlas ext 0.0.127: 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)"},{"date":"2026-07-12","ts":1783900005000,"hash":"9aa72f37","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.126","title":"Atlas ext 0.0.126: 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"},{"date":"2026-07-12","ts":1783898406000,"hash":"03cde146","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.125","title":"Atlas ext 0.0.125: 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"},{"date":"2026-07-12","ts":1783897696000,"hash":"8dba2cb7","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.124","title":"Atlas ext 0.0.124: 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)"},{"date":"2026-07-12","ts":1783897097000,"hash":"e3fa785b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.123","title":"Atlas ext 0.0.123: 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"},{"date":"2026-07-12","ts":1783896515000,"hash":"79051f5c","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.122","title":"Atlas ext 0.0.122: 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"},{"date":"2026-07-12","ts":1783895830000,"hash":"f5cbb258","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.121","title":"Atlas ext 0.0.121: 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"},{"date":"2026-07-12","ts":1783895287000,"hash":"bfe632bf","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.120","title":"Atlas ext 0.0.120: 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"},{"date":"2026-07-12","ts":1783894506000,"hash":"d51e61e7","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.119","title":"Atlas ext 0.0.119: 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)"},{"date":"2026-07-12","ts":1783893353000,"hash":"2d85f6a9","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.118","title":"Atlas ext 0.0.118: 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))"},{"date":"2026-07-12","ts":1783892895000,"hash":"747f29dd","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.117","title":"Atlas ext 0.0.117: 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)"},{"date":"2026-07-12","ts":1783892351000,"hash":"d4827b99","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.116","title":"Atlas ext 0.0.116: 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"},{"date":"2026-07-12","ts":1783891986000,"hash":"9674ef01","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.115","title":"Atlas ext 0.0.115: 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"},{"date":"2026-07-12","ts":1783890924000,"hash":"db365277","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.114","title":"Atlas ext 0.0.114: 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"},{"date":"2026-07-12","ts":1783890153000,"hash":"bbe6f448","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.113","title":"Atlas ext 0.0.113: 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)"},{"date":"2026-07-12","ts":1783888960000,"hash":"347751df","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.112","title":"Atlas ext 0.0.112: 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"},{"date":"2026-07-12","ts":1783887691000,"hash":"a5ddec5b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.111","title":"Atlas ext 0.0.111: 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"},{"date":"2026-07-12","ts":1783887060000,"hash":"e02d6f36","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.110","title":"Atlas 0.0.110 fix: jumpTo missing from FileExplorer destructuring (EC2 next build caught what local tsc missed)"},{"date":"2026-07-12","ts":1783886822000,"hash":"8b8f5d70","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.110","title":"Atlas ext 0.0.110: 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"},{"date":"2026-07-12","ts":1783885810000,"hash":"b2b5f727","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.109","title":"Atlas ext 0.0.109: 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)"},{"date":"2026-07-12","ts":1783884829000,"hash":"1a102e12","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.108","title":"Atlas ext 0.0.108: 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)"},{"date":"2026-07-12","ts":1783883974000,"hash":"728efe95","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.107","title":"Atlas ext 0.0.107: 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)"},{"date":"2026-07-12","ts":1783883161000,"hash":"255d459d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.106","title":"Atlas ext 0.0.106: 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"},{"date":"2026-07-12","ts":1783882159000,"hash":"c88b966b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.105","title":"Atlas ext 0.0.105: 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"},{"date":"2026-07-12","ts":1783881364000,"hash":"8c2950e1","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.104","title":"Atlas ext 0.0.104: 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)"},{"date":"2026-07-12","ts":1783880240000,"hash":"a006c6ed","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.103","title":"Atlas ext 0.0.103: 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"},{"date":"2026-07-12","ts":1783879269000,"hash":"02c9c755","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.102","title":"Atlas ext 0.0.102: 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"},{"date":"2026-07-12","ts":1783878097000,"hash":"4381b270","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.101","title":"Atlas ext 0.0.101: 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)"},{"date":"2026-07-12","ts":1783875777000,"hash":"b1f4a66f","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.99","title":"Atlas ext 0.0.99: 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"},{"date":"2026-07-12","ts":1783874352000,"hash":"871920f3","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.98","title":"Atlas ext 0.0.98: 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"},{"date":"2026-07-12","ts":1783873197000,"hash":"90093b80","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.97","title":"Atlas ext 0.0.97: 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"},{"date":"2026-07-12","ts":1783872381000,"hash":"94875b60","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.96","title":"Atlas ext 0.0.96: 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"},{"date":"2026-07-12","ts":1783870871000,"hash":"5da54736","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.95","title":"Atlas ext 0.0.95: 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"},{"date":"2026-07-12","ts":1783870065000,"hash":"fa8e5dcc","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.94","title":"Atlas ext 0.0.94: 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"},{"date":"2026-07-12","ts":1783867320000,"hash":"c4243a96","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.93","title":"Atlas 0.0.93: 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"},{"date":"2026-07-12","ts":1783866768000,"hash":"3872f853","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.92","title":"Atlas 0.0.92: 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"},{"date":"2026-07-12","ts":1783866060000,"hash":"44825d73","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.91","title":"Atlas 0.0.91: 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"},{"date":"2026-07-12","ts":1783864822000,"hash":"5fcd68f8","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.90","title":"Atlas 0.0.90: 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"},{"date":"2026-07-12","ts":1783864134000,"hash":"43bc9121","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.89","title":"Atlas 0.0.89: 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"},{"date":"2026-07-12","ts":1783863224000,"hash":"eb314013","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.88","title":"Atlas 0.0.88: 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"},{"date":"2026-07-12","ts":1783862752000,"hash":"f97c1b94","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.87","title":"Atlas 0.0.87: 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"},{"date":"2026-07-12","ts":1783861615000,"hash":"24fb02ae","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.86","title":"Atlas 0.0.86: the agent bus — AI-driveable map via .atlas/ (graph.json context + ATLAS.md instructions + commands.jsonl file bus, self-gitignored); commands: focus/highlight/select/say/open/tour/reset; scene.spotlight (gold pulses + dimmed city + lit tubes), AI caption banner, ref resolution (id/file/label/fuzzy/best-fit, pure+tested); universal — any file-writing agent, zero config"},{"date":"2026-07-12","ts":1783860451000,"hash":"9a1e8f69","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.85","title":"Atlas 0.0.85: the jenga system — packing.ts (MaxRects BSSF free-rect packing + shelf overflow + occupancy metric, pure+tested); db zone z-aligned to compute zone; secondary blocks pack into footprint voids; client city wraps to columns (capped span); cloud-district filter kills local-twin shadowing; verified numerically (host 367x611 -> 400x467, occupancy 46.5 -> 56.6 pct, zero overlaps)"},{"date":"2026-07-12","ts":1783859357000,"hash":"0713d851","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.84","title":"Atlas 0.0.84: watch-the-AI-work camera — watcher broadened to all source-ish extensions (graph-shaping edits re-extract, others push activity cheaply at 400ms), git-poll derives focus from newly-dirty files so out-of-watcher changes still fly the camera; zoom+orbit follows every change through the best-fit chain"},{"date":"2026-07-12","ts":1783858688000,"hash":"b7ed7d4c","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.83","title":"Atlas 0.0.83: best-fit change navigation — changed files without exact nodes select their directory's module building, else their package platform; rows annotate the fallback target, cycle-zoom includes them"},{"date":"2026-07-12","ts":1783857362000,"hash":"0c83c07f","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.82","title":"Atlas 0.0.82: localhost realm rotated 90 degrees (north-south column parallel to the city's west edge) and placed LAST in layout when all ground positions exist — root cause of the overlap was placement before the client city/user crowd were positioned; clearance verified numerically (38.6u)"},{"date":"2026-07-12","ts":1783855975000,"hash":"6aba01bb","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.80","title":"Atlas 0.0.80: the LOCALHOST REALM — dev machine as a white-dashed plate beside the cloud (local compose services, archetype-inherited squares, port signs); env-driven wiring roads cross the realm border and superseded cloud paths dim inactive; deploy-readiness checklist on the realm (env provenance, keys only); live docker ps status via compose working_dir labels in the extension"},{"date":"2026-07-12","ts":1783852709000,"hash":"08113d3b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.79","title":"Atlas 0.0.79 UI pass: terminal starts minimal with 4 glowing corner brackets + slides right when explorer opens; theme picker top-right beside volume; Help Improve as quiet one-liner; explorer back button + 50% glassier + source-control glow trail (changed file + every ancestor folder in theme accent)"},{"date":"2026-07-12","ts":1783851281000,"hash":"5a3f1ac7","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.78","title":"Atlas 0.0.78: the honest question mark — thresholded unknown-mediator node (5+ orphan tables, 50%+ of schema dark, real code present) wired to orphan tables + unwired code as dashed inferred edges; card explains the inference with a quiet anonymized-report link; trust-rule doc section"},{"date":"2026-07-12","ts":1783850167000,"hash":"57d43d9a","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas tests: fully generic comments in root-discovery test"},{"date":"2026-07-12","ts":1783849839000,"hash":"39a7d13e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.77","title":"Atlas 0.0.77: package.json exports-map resolution (exact + wildcard subpaths, dist->src fallback) + receiver-agnostic model access matching (known model + prisma verb, any client name) — the two universal patterns from a Help Improve report; VPC/secrets wiring correctly left out (network reachability, not code data flow)"},{"date":"2026-07-12","ts":1783848720000,"hash":"afb4d871","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.76","title":"Atlas 0.0.76: restore extension name/description mangled by encoding bug in version bumps (package.json restored from git, bumps now via Node); Improve Atlas opens the note form IMMEDIATELY on click"},{"date":"2026-07-12","ts":1783847765000,"hash":"85527bbf","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.75","title":"Atlas 0.0.75: Help Improve reports accept an optional user-authored note (paste your AI's diagnosis of what the map missed) — extension prompt after Send + feedback schema note field; the one non-anonymized field, consent by construction"},{"date":"2026-07-12","ts":1783846841000,"hash":"d48b8cbe","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.74","title":"Atlas 0.0.74: serverless.ts configs read (TS-monorepo norm) + custom-named descriptors found by content + Lambda data-trace file-level fallback for wrapper handlers (middy) — diagnosed from a user-submitted anonymized report (193 orphan datastores, 14 unmapped functions blocks, zero data edges)"},{"date":"2026-07-12","ts":1783845867000,"hash":"fa34841c","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas doc: layered backends discovered at any depth + workspace-package data tracing in the public systems reference"},{"date":"2026-07-12","ts":1783845608000,"hash":"852503aa","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.73","title":"Atlas 0.0.73: backend layers DISCOVERED not assumed (actions/adapters/handlers/routes found at any depth with backend-sibling guard — company-nested backends map like root ones); endpoint data wiring traced through workspace packages (db-core-style imports -> inferred reads/writes; 5 CommsLink ads/users endpoints un-orphaned); cities always get street grids even with unreadable data layers"},{"date":"2026-07-12","ts":1783844375000,"hash":"6e0d4d08","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.72","title":"Atlas 0.0.72: cloud deck doubled (320/256 — only true monoliths pierce it), whole puffball clouds clickable (every puff selects the external), cloud tether lines invisible at rest — shown only when the cloud or its consumer is selected; invisible lines excluded from edge picking"},{"date":"2026-07-12","ts":1783843620000,"hash":"055a42ad","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.71","title":"Atlas 0.0.71: height cap removed — purely linear LOC heights, monoliths pierce the cloud deck (chat's 13k-line module = a 523-unit spire visible city-wide); a hideously tall building means something"},{"date":"2026-07-12","ts":1783842606000,"hash":"a314f46e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.70","title":"Atlas 0.0.70: container blocks get real street grids (all block domains on-grid — off-grid pile put buildings on top of connector roads); datastores = flat-top industrial tanks (domes removed, hoop bands, rim-only outlines via 30-degree edge threshold); S3 bucket body scaled 2x to fill its reserved 2x2 block"},{"date":"2026-07-12","ts":1783841591000,"hash":"f0ea366d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.69","title":"Atlas 0.0.69: linear building heights (25 LOC/unit, cap 60 — 4x the code reads 4x taller, monoliths saturate into mega-towers) + per-theme conduit colors (revised user rule: match each theme's palette, never collide with its pipes)"},{"date":"2026-07-12","ts":1783840619000,"hash":"c2800540","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.68","title":"Atlas 0.0.68: width = endpoint count, height = pure LOC (doors need frontage; code bulk reads at a glance); conduits rest ON the road bed instead of hovering; port signs scaled + repositioned to an actually-visible second row under container labels"},{"date":"2026-07-11","ts":1783839581000,"hash":"d7ee7471","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.67","title":"Atlas 0.0.67: street-level readability — apportioned building heights (single-file Flask services no longer render identical towers), package plots dropped below road surface, road contrast floor in all themes (brighter bed, near-opaque curbs/dashes, dash z-fight fix), conduits toned down 0.55x"},{"date":"2026-07-11","ts":1783838674000,"hash":"bdade6a1","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.66","title":"Atlas ext 0.0.66: conduits + archetypes + Flask/FastAPI cities + published-port signs flow to the extension — version feed, vsix, and download button updated"},{"date":"2026-07-11","ts":1783836232000,"hash":"33d676d0","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.0","title":"Atlas: Flask/FastAPI extractor + published-port signs + per-container city blocks — ligo-analysis becomes a real backend city (182 endpoints, 51 route families) inside its own square; compose ports stamped on containers and worn as signs (loopback calm, 0.0.0.0 flagged OPEN); module identities container-qualified (ligo/chat vs api chat) across selection, activity glow, interiors; pure containerBlocks + ports modules with tests; graph 487 nodes"},{"date":"2026-07-11","ts":1783813108000,"hash":"6cf7618a","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas services: archetype detection — every container classified by what it IS (vendor image: cache/database/queue/gateway; shipped code: frontend/backend; code-without-routes: worker, inferred) never by name; redis square becomes a cold-storage warehouse, ligo-analysis a factory with smokestack; label tags (· cache / · ~worker); extractor stamps meta.archetype + provenance, renderer falls back to image for old graphs; served graph regenerated (305 nodes, archetypes + state towers)"},{"date":"2026-07-11","ts":1783809841000,"hash":"cd2cee3d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: unit tests for tubePaths (verticalProfile + segmentTubes)"},{"date":"2026-07-11","ts":1783809630000,"hash":"587bb825","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas roads: data conduits — backend reads/writes/calls now render like the pipe system: stacked one-per-segment azure tubes (cross-theme conduit color) hovering above the road bed, running into the exact door/silo; per-lane surface lines removed; tube math extracted to pure tubePaths.ts + tubes.ts with unit tests"},{"date":"2026-07-11","ts":1783807549000,"hash":"47a4de96","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.65","title":"Atlas ext 0.0.65: front-end city rules + table interiors — component POWER PLANT inside the web container (shared components as units, power lines from drawing pages), state stores as WATER TOWERS (Zustand/Redux/Jotai/Context extractor + reads pipes), page interiors (components as rooms; shared = grid feeds), table silos open into COLUMN floors (Prisma columns extractor, FK floors link to related tables, inspector list), BFF meta on Next API routes, graph-DB driver detection, comment/regex-aware masking (self-detection fix), InteriorManager extraction from scene.ts"},{"date":"2026-07-11","ts":1783804318000,"hash":"6bfbc4c0","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.64","title":"Atlas ext 0.0.64: fix live staleness — city re-heights as you edit. sig() now tracks per-node LOC (0.0.63 only rebuilt on structural change, so growing a file left it at the old height) + extractor re-reads each file per pass (no stale line-count cache in the long-lived extension). New .vsix + regression test"},{"date":"2026-07-11","ts":1783803117000,"hash":"e7b4e287","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: regenerate served /atlas-graph.json with meta.loc so the live demo's module/page buildings vary by lines of code (270/301 nodes stamped)"},{"date":"2026-07-11","ts":1783802555000,"hash":"e3b65b7c","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":"0.0.63","title":"Atlas ext 0.0.63 city polish (#20): LOC building heights + inspector, 4x datastores/S3 footprints, real 10x clouds, glowing gated container walls, thinner packages, half-depth pipes, crisp Mac terminal"},{"date":"2026-07-11","ts":1783802189000,"hash":"507f43bf","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.63","title":"Atlas ext 0.0.63: city polish — LOC heights, 4x datastores/S3, real 10x clouds, glowing container walls, thinner packages, half-depth pipes, Mac terminal crispness (#20)"},{"date":"2026-07-11","ts":1783797836000,"hash":"33735aca","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.62","title":"Atlas ext 0.0.62 (PR #19): rules-based, deployment-derived extraction — container membership from docker-compose/Dockerfile (k8s/serverless/terraform/CFN/workspaces fallbacks), web container fills with its own pages, inferred placements read uncertain; polyglot backends (Django/Rails/Laravel/Spring/Go). Regenerated served /atlas graph so the live demo shows the web fold-in"},{"date":"2026-07-11","ts":1783792611000,"hash":"840419e6","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.61","title":"Atlas ext 0.0.61: revert client bullet-trains (static pipes, no fake motion) — forward-versioned so it reaches 0.0.60 installs"},{"date":"2026-07-11","ts":1783791789000,"hash":"c70fd99a","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":"0.0.60","title":"Atlas ext 0.0.60: client->web bullet-trains (directional traffic on client routes) (PR #17)"},{"date":"2026-07-11","ts":1783791556000,"hash":"c6177773","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.60","title":"Atlas ext 0.0.60: client→web bullet-trains (directional traffic on client routes) (#17)"},{"date":"2026-07-11","ts":1783790532000,"hash":"2ae5f694","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":"0.0.59","title":"Atlas ext 0.0.59: in-map file explorer + popup editor (edit/lint/save, workspace-sandboxed host fs) (PR #16)"},{"date":"2026-07-11","ts":1783790291000,"hash":"a19a6013","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.59","title":"Atlas ext 0.0.59: in-map file explorer + popup editor (edit/lint/save) (#16)"},{"date":"2026-07-11","ts":1783789069000,"hash":"13071616","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":"0.0.58","title":"Atlas ext 0.0.58: Improve button behind a setting + non-default themes tint the window chrome (opt-out) (PR #15)"},{"date":"2026-07-11","ts":1783788832000,"hash":"b83d968a","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.58","title":"Atlas ext 0.0.58: hide Improve button behind a setting + non-default themes tint the window (opt-out) (#15)"},{"date":"2026-07-11","ts":1783787757000,"hash":"0aa5c42f","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":"0.0.57","title":"Atlas: theme-aware Source Control colors + resizable diff inspector (ext 0.0.57) (PR #14)"},{"date":"2026-07-11","ts":1783787526000,"hash":"2f631b8b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.57","title":"Atlas: theme-aware Source Control colors + resizable diff inspector (ext 0.0.57) (#14)"},{"date":"2026-07-11","ts":1783786494000,"hash":"97c783b5","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.56","title":"Atlas city visuals (PR #13): high cloud decks, Moonlit Canal default, decluttered UI; ext 0.0.56"},{"date":"2026-07-11","ts":1783786493000,"hash":"73227bc6","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.56","title":"Atlas ext bump 0.0.56 (city-visuals PR #13 flows to the extension surface)"},{"date":"2026-07-11","ts":1783786167000,"hash":"4dffdcba","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas city visuals: high cloud decks, Moonlit Canal default, remove Guide + orbit hint (#13)"},{"date":"2026-07-11","ts":1783784395000,"hash":"e5e93b29","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"CommsLink Sounds: /sounds sampler + 20 CC0 wavs + landing card (PR #12)"},{"date":"2026-07-11","ts":1783784362000,"hash":"33d81013","repo":"commslink2","author":"puppyprogrammer","project":"sounds","label":"CommsLink Sounds","version":null,"title":"Restore CommsLink Sounds: @commslink/sfx pack + /sounds sampler + landing card (#12)"},{"date":"2026-07-11","ts":1783784133000,"hash":"e412f33e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.55","title":"Atlas ext 0.0.55: persistent sidebar map + shared session (terminal survives everything)"},{"date":"2026-07-11","ts":1783784087000,"hash":"0b1b9c10","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.55","title":"Atlas ext 0.0.55: persistent SIDEBAR map (WebviewViewProvider, retainContextWhenHidden) — one click on the activity-bar icon, survives closing/refresh; shared AtlasSession backend (graph cache + watchers + terminal) outlives every surface"},{"date":"2026-07-11","ts":1783778942000,"hash":"6ac02bc8","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.54","title":"Atlas ext 0.0.54: Shift+Enter newline + macOS pty fix"},{"date":"2026-07-11","ts":1783778929000,"hash":"237635aa","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.54","title":"Atlas ext 0.0.54: Shift+Enter = newline (ESC+CR); macOS pty fix (restore spawn-helper exec bit lost in vsix extraction) + interactive pipe fallback with surfaced load error"},{"date":"2026-07-11","ts":1783778709000,"hash":"7a550006","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.53","title":"Atlas ext 0.0.53: scrollbar restyle + first-letter delete fix"},{"date":"2026-07-11","ts":1783778696000,"hash":"d0852595","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.53","title":"Atlas ext 0.0.53: slim translucent-black scrollbar; dedupe PTY resizes (undeletable-first-letter PSReadLine fix)"},{"date":"2026-07-11","ts":1783778162000,"hash":"690ba9d6","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.52","title":"Atlas 0.0.52: decluttered UI — permanent terminal + resize grip, chat gone, compact theme picker"},{"date":"2026-07-11","ts":1783778136000,"hash":"bf8aaf3c","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.52","title":"Atlas ext 0.0.52: declutter — always-on terminal with corner resize grip (no launcher/close/minimize), chat removed everywhere, compact theme select (no Delete)"},{"date":"2026-07-11","ts":1783777145000,"hash":"df743f4c","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.51","title":"Atlas ext 0.0.51: terminal transparency fix (container inline bg + ANSI-black cell fill)"},{"date":"2026-07-11","ts":1783777132000,"hash":"9121a7d7","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.51","title":"Atlas ext 0.0.51: real transparency — !important over xterm's inline container bg + semi-transparent ANSI-black cell fill (PowerShell paints the screen with it)"},{"date":"2026-07-11","ts":1783776688000,"hash":"5d9d5ef4","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.50","title":"Atlas ext 0.0.50: fully transparent outlined terminal"},{"date":"2026-07-11","ts":1783776674000,"hash":"511f38c9","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.50","title":"Atlas ext 0.0.50: terminal — no background at all, per-character black outline (DOM-renderer text-shadow), width -25%"},{"date":"2026-07-11","ts":1783776281000,"hash":"210f6fae","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.49","title":"Atlas ext 0.0.49: sleek theme-synced terminal glass"},{"date":"2026-07-11","ts":1783776267000,"hash":"caa130db","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.49","title":"Atlas ext 0.0.49: terminal restyle — frameless glass, hover-only ghost controls, palette derived live from the active city theme"},{"date":"2026-07-11","ts":1783775717000,"hash":"dd8817de","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.48","title":"Atlas ext 0.0.48: embedded PTY terminal (claude full-screen in the city); city guide relocated to top-right button"},{"date":"2026-07-11","ts":1783775693000,"hash":"04651201","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.48","title":"Atlas ext 0.0.48: embedded PTY terminal in the map (xterm.js + node-pty N-API prebuilds, pipe fallback) — full-screen vibe coding with claude inside the city"},{"date":"2026-07-11","ts":1783775015000,"hash":"1928c1f7","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.47","title":"Atlas: junction-aware curbs (stop at edges, continuous through T's, closed corners), side-by-side cloud bunching, tighter blocks, domed silos, pipe depth 10.4; ext 0.0.47"},{"date":"2026-07-11","ts":1783775002000,"hash":"fc20b496","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.47","title":"Atlas: junction-aware curb tests + ext bump 0.0.47"},{"date":"2026-07-11","ts":1783773789000,"hash":"800ad252","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.46","title":"Atlas: one domain = one building (dominant-package placement, kills twin chat/forum), cumulus clouds on a 2x-high deck, 2x-deep client pipes; ext 0.0.46"},{"date":"2026-07-11","ts":1783773775000,"hash":"b580d132","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.46","title":"Atlas: one-domain-one-building tests + ext bump 0.0.46"},{"date":"2026-07-11","ts":1783772845000,"hash":"85bbc48f","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.45","title":"Atlas: city ontology (one declarative kind→metaphor dictionary + generated city-guide legend), building INTERIORS (files as rooms on floors, gold rooms for live edits), activity fallback file→module→package so every edit lands somewhere; ext 0.0.45"},{"date":"2026-07-11","ts":1783772821000,"hash":"27165ba8","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.45","title":"Atlas depth: package file index (extractor), interior/ontology tests, extension activity carries focusFile; ext 0.0.45"},{"date":"2026-07-11","ts":1783770833000,"hash":"09acaf22","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.44","title":"Atlas: drivable road network — junction graph + Dijkstra (turn-penalized), auto-repair connectors unify blocks/zones, datastore paths ride real streets end-to-end; ext 0.0.44"},{"date":"2026-07-11","ts":1783770808000,"hash":"8aa25ff7","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.44","title":"Atlas: road-network test suite + extension bump to 0.0.44"},{"date":"2026-07-11","ts":1783769261000,"hash":"8f725441","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: packages as physical districts — optional grouping tier (package/stack/…) → ground platforms + nameplates + depends roads; graceful flat fallback; refresh live graph"},{"date":"2026-07-11","ts":1783767865000,"hash":"0d7ef3f5","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Remove SlackAnimals entirely — app, OAuth endpoints, landing page, home card, download, docs (privacy: no server in the Slack path)"},{"date":"2026-07-11","ts":1783765283000,"hash":"bbe543da","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"SlackAnimals: Add-to-Slack OAuth endpoints (/api/v1/slack-animals/oauth/*)"},{"date":"2026-07-11","ts":1783765275000,"hash":"ef3aea37","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":"0.3.0","title":"SlackAnimals v0.3.0: one-click 'Add to Slack' OAuth (loopback handoff), token-paste demoted to Advanced"},{"date":"2026-07-11","ts":1783761376000,"hash":"8b602873","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":"0.2.0","title":"SlackAnimals v0.2.0: setup hint (connect via ⚙, quit via tray/✕)"},{"date":"2026-07-11","ts":1783761334000,"hash":"f96fa8bc","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":"0.2.0","title":"SlackAnimals v0.2.0: real Slack connect (token paste + validate), tray/✕/Ctrl-Q quit, honest not-connected state, emoji pet, click-through dock"},{"date":"2026-07-11","ts":1783759093000,"hash":"daeeee75","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"SlackAnimals: Download-for-Windows button (68MB portable exe on S3) + unsigned SmartScreen note"},{"date":"2026-07-11","ts":1783757878000,"hash":"33e512c7","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"SlackAnimals: home card + /slack-animals landing (PR #10 — read-only Slack dock pet)"},{"date":"2026-07-11","ts":1783756717000,"hash":"bf356b35","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.43","title":"Atlas: extension v0.0.43 — separate databases (Postgres/MySQL) into stacked labeled zones"},{"date":"2026-07-11","ts":1783756676000,"hash":"5c3c1cff","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.43","title":"Atlas ext v0.0.43: separate databases (Postgres/MySQL) into labeled zones"},{"date":"2026-07-11","ts":1783756676000,"hash":"eb0bb93b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: tag Prisma datastores with their datasource provider (postgresql/mysql/…)"},{"date":"2026-07-11","ts":1783754287000,"hash":"725189a3","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.42","title":"Atlas: extension v0.0.42 — wire Lambdas to Prisma tables (symbol-traced), un-orphaning the tables"},{"date":"2026-07-11","ts":1783754254000,"hash":"9b28d1db","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: wire Lambdas -> Prisma tables via SPECIFIC-SYMBOL import trace (un-orphans the tables)"},{"date":"2026-07-11","ts":1783754254000,"hash":"a4258f62","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.42","title":"Atlas ext v0.0.42: Lambda->Prisma-table wiring"},{"date":"2026-07-11","ts":1783753389000,"hash":"32ddf9fa","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.41","title":"Atlas: extension v0.0.41 — fix off-grid Lambda/orphan-datastore layout (wrap into a grid, not a mile-long row)"},{"date":"2026-07-11","ts":1783753371000,"hash":"df555a91","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.41","title":"Atlas ext v0.0.41: fix off-grid/orphan layout — wrap into a grid instead of a single mile-long column"},{"date":"2026-07-10","ts":1783752980000,"hash":"a5a66368","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.40","title":"Atlas: extension v0.0.40 — whole-name folder anonymization (universal names shown, project-unique hashed)"},{"date":"2026-07-10","ts":1783752949000,"hash":"ae82bd14","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.40","title":"Atlas ext v0.0.40: whole-name folder anonymization"},{"date":"2026-07-10","ts":1783752949000,"hash":"fd8406a1","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: folder map reveals only WHOLE-NAME universal dirs, hashes project-unique names"},{"date":"2026-07-10","ts":1783752218000,"hash":"6f3b2ad8","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.39","title":"Atlas: extension v0.0.39 — AWS SAM/Lambda parser + GENERIC anonymized folder map (no folder-name allow-list)"},{"date":"2026-07-10","ts":1783752183000,"hash":"672fb5fc","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.39","title":"Atlas ext v0.0.39: AWS SAM/Lambda parser + generic anonymized folder map"},{"date":"2026-07-10","ts":1783752150000,"hash":"0db9364a","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: make the report folder map GENERIC — hash path buckets, no folder-name allow-list"},{"date":"2026-07-10","ts":1783751573000,"hash":"fe0182e4","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: anonymized folder map in reports — surface structure the node graph misses"},{"date":"2026-07-10","ts":1783751282000,"hash":"2b5cd709","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: AWS SAM/CloudFormation importer — template.yaml → Lambda functions + API endpoints"},{"date":"2026-07-10","ts":1783749024000,"hash":"7c1f6d11","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.38","title":"Atlas: extension v0.0.38 — in-app auto-updater + version manifest; no-store the manifest/vsix"},{"date":"2026-07-10","ts":1783749011000,"hash":"f8f12e57","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.38","title":"Atlas ext v0.0.38: in-app auto-updater — checks commslink.net manifest, one-click download + install + reload"},{"date":"2026-07-10","ts":1783748776000,"hash":"35f5fb36","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.37","title":"Atlas: extension v0.0.37 download — GraphQL/Apollo parser + tier-1 gap fingerprints"},{"date":"2026-07-10","ts":1783748707000,"hash":"819d528d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.37","title":"Atlas ext v0.0.37: GraphQL/Apollo parser + tier-1 gap fingerprints in reports"},{"date":"2026-07-10","ts":1783748587000,"hash":"12213a11","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: Tier-1 gap fingerprints — name the exact unparsed framework-API patterns in reports"},{"date":"2026-07-10","ts":1783748319000,"hash":"137d1e04","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: GraphQL/Apollo importer — SDL root fields → gateway + operation endpoints"},{"date":"2026-07-10","ts":1783720065000,"hash":"7e497232","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.36","title":"Atlas: Components district — library components (unreachable from pages) now render as their own buildings; from a user's anonymized feedback report (547 components, 7 pages). ext v0.0.36"},{"date":"2026-07-10","ts":1783720021000,"hash":"074d5bf8","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.36","title":"Atlas ext v0.0.36: Components district — library components (unreached by pages) get visible buildings"},{"date":"2026-07-10","ts":1783718951000,"hash":"5872c9b5","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.35","title":"Atlas: 'Help Improve Atlas' button in the map (extension v0.0.35) + hidden on web via onImprove injection"},{"date":"2026-07-10","ts":1783718906000,"hash":"5603563e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.35","title":"Atlas ext v0.0.35: 'Help Improve Atlas' button IN THE MAP (onImprove injected into AtlasViewer → host)"},{"date":"2026-07-10","ts":1783718287000,"hash":"33861b7d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.34","title":"Atlas: extension v0.0.34 — 'Help Improve Atlas' visible button (status bar + Atlas panel)"},{"date":"2026-07-10","ts":1783718232000,"hash":"d8b018ba","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.34","title":"Atlas ext v0.0.34: surface 'Help Improve Atlas' as a visible button (status bar + activity-bar panel), not just the command palette"},{"date":"2026-07-10","ts":1783716689000,"hash":"47c5a54b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.33","title":"Atlas: ship PR#9 theme assets + Cyberpunk (merged) + extension v0.0.33 download (adds Help-Improve-Atlas anonymized submission)"},{"date":"2026-07-10","ts":1783716476000,"hash":"1ba4ba52","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: opt-in anonymized-architecture submission — extension command + API endpoint"},{"date":"2026-07-10","ts":1783716111000,"hash":"04374ae7","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.32","title":"Theme more Atlas city assets and ship Cyberpunk in extension 0.0.32"},{"date":"2026-07-10","ts":1783715418000,"hash":"f7b498e8","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: anonymizeReport — privacy-preserving architecture report (structure only, no code/labels)"},{"date":"2026-07-10","ts":1783714743000,"hash":"1fab31c1","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.31","title":"Atlas: show extension version (v0.0.31) on the /atlas download button"},{"date":"2026-07-10","ts":1783714136000,"hash":"ecf506eb","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.31","title":"Atlas: add 'Get the extension' .vsix download button to /atlas header + serve the v0.0.31 vsix from public/"},{"date":"2026-07-10","ts":1783713956000,"hash":"3e56ad04","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.31","title":"Atlas ext v0.0.31: component skyscrapers (clickable component windows) + front/back/full-stack classification"},{"date":"2026-07-10","ts":1783713673000,"hash":"af2b9f2a","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: pages become component skyscrapers (windows = components a page uses, each clickable) + front-end/back-end/full-stack classification badge"},{"date":"2026-07-10","ts":1783710704000,"hash":"70ba4b79","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.30","title":"Atlas ext v0.0.30: package the .vsix with the city-theme picker + package-district render"},{"date":"2026-07-10","ts":1783708699000,"hash":"f8bb621a","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: package-district render (signs + depends bridges) + ship theme system (themes.ts/picker) that was merged but never deployed; regen graph; /atlas no-store"},{"date":"2026-07-10","ts":1783706540000,"hash":"e4a664f1","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: complete Noir Terminal theme definition"},{"date":"2026-07-10","ts":1783706521000,"hash":"b4c5a73d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: add Noir Terminal city theme"},{"date":"2026-07-10","ts":1783706473000,"hash":"bfed3720","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: TypeORM importer (@Entity -> datastore warehouses + relates edges)"},{"date":"2026-07-10","ts":1783706172000,"hash":"51be2646","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: front-end component layer (component nodes + renders tree)"},{"date":"2026-07-10","ts":1783705964000,"hash":"2d936465","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: monorepo-structure layer — workspace packages/services as districts"},{"date":"2026-07-10","ts":1783705943000,"hash":"0ae62327","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: add Moonlit Canal city theme"},{"date":"2026-07-10","ts":1783705261000,"hash":"8810b31b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.29","title":"Atlas: bump extension to v0.0.29 for city themes"},{"date":"2026-07-10","ts":1783705246000,"hash":"9315fcfc","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: city theme picker + six built-in map skins"},{"date":"2026-07-10","ts":1783705206000,"hash":"c51067ad","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: Fastify importer (instance verb calls + @fastify/autoload dir prefix → endpoints)"},{"date":"2026-07-10","ts":1783704051000,"hash":"070d9aae","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: NestJS importer (@Controller + @Get/@Post/… decorators → endpoints) — a whole framework that previously mapped to nothing now maps; verified 0→21 on a real Nest app"},{"date":"2026-07-10","ts":1783703721000,"hash":"533f4dac","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":"0.0.28","title":"Atlas: x-ray pipes (Cursor approach) v0.0.28"},{"date":"2026-07-10","ts":1783703697000,"hash":"447db5b4","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.28","title":"Atlas: adopt Cursor's x-ray utility pipes (additive tubes, depthTest off) — pads can't cover or angle-flip the network (v0.0.28)"},{"date":"2026-07-10","ts":1783702927000,"hash":"541999ab","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: pipes always-on-top (no cover, no flip) — sync viewer"},{"date":"2026-07-10","ts":1783702910000,"hash":"d6e6376d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.27","title":"Atlas: pipes drawn on top (renderOrder 20, depthTest off) so the ground/building plane never covers them and there's no angle flip; reverted slab/water depthWrite (v0.0.27)"},{"date":"2026-07-10","ts":1783702059000,"hash":"681312b9","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: consistent pipe depth (no angle flip) — sync viewer"},{"date":"2026-07-10","ts":1783702037000,"hash":"0bd91f6d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.26","title":"Atlas: pipes use real depthTest (consistent occlusion, no angle-dependent over/under flip) + ground slabs/water depthWrite off so they dim (not hide) the deep pipes (v0.0.26)"},{"date":"2026-07-10","ts":1783701552000,"hash":"c48fa196","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: pipe riser-before-door + softer container opacity — sync viewer"},{"date":"2026-07-10","ts":1783701538000,"hash":"ea67a46c","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.25","title":"Atlas: pipe riser comes up SHORT of the door then horizontal into its centre + container/water opacity back to partly-transparent (0.7) (v0.0.25)"},{"date":"2026-07-10","ts":1783701173000,"hash":"2438dbde","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: pipe emergence + camera/WASD + clouds — sync viewer"},{"date":"2026-07-10","ts":1783701157000,"hash":"6ca2a750","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.24","title":"Atlas: pipes emerge above-ground before the door + camera orbit resumes on new change (faster) + drag-to-rotate no longer selects + WASD pan + 2x cloud height (v0.0.24)"},{"date":"2026-07-10","ts":1783700208000,"hash":"86cc54ca","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: pipe-to-door + suburb crowding — sync viewer"},{"date":"2026-07-10","ts":1783700190000,"hash":"2372fc2e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.23","title":"Atlas: pipes emerge from the ground + attach to the endpoint door (ramp to node height) + suburb-crowding — houses hug the backend's west border sorted by what they call (v0.0.23)"},{"date":"2026-07-10","ts":1783699512000,"hash":"92162dae","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: pipe polish (no-overlap-glow, page path highlight, buried depth) — sync viewer"},{"date":"2026-07-10","ts":1783699495000,"hash":"29b77b95","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.22","title":"Atlas: pipes normal-blend (no overlap glow) + select-a-page highlights its underground path (white) + opaque ground/water so pipes read as buried (v0.0.22)"},{"date":"2026-07-10","ts":1783698468000,"hash":"41ba4ecc","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: shared electric pipes (deduped, deep) — sync viewer"},{"date":"2026-07-10","ts":1783698454000,"hash":"289809f0","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.21","title":"Atlas: underground = shared electric PIPES not train tracks — dedup segments (one pipe per grid segment, no overlap), 3x deeper, solid glowing lines, centerline routes (v0.0.21)"},{"date":"2026-07-10","ts":1783698058000,"hash":"3533b6c7","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: subway rides the grid — sync viewer"},{"date":"2026-07-10","ts":1783698036000,"hash":"af2c56bd","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.20","title":"Atlas: subway rides the GRID — client links route on the road grid (off-grid page spurs onto it) + render as tracks underground following the routed path, sharing segments (v0.0.20)"},{"date":"2026-07-10","ts":1783696807000,"hash":"ee8aa7a5","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: subway tracks for client links — sync viewer"},{"date":"2026-07-10","ts":1783696793000,"hash":"9840dd17","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.19","title":"Atlas: client links as a SUBWAY — page->endpoint connections become rails-with-ties ramping under the city, glowing up through the ground (replaces the pink lines) (v0.0.19)"},{"date":"2026-07-10","ts":1783696181000,"hash":"cabbfc6d","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: line-click + houses + client roads — sync viewer"},{"date":"2026-07-10","ts":1783696152000,"hash":"c5c2bf11","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.18","title":"Atlas: click a line to see what it connects + clients as houses (pyramid roofs) + client HTTP roads in a distinct pink color (v0.0.18)"},{"date":"2026-07-10","ts":1783695357000,"hash":"fa4b2b5c","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: roof-member fix + cloud scatter — sync viewer"},{"date":"2026-07-10","ts":1783695340000,"hash":"be6f0696","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.17","title":"Atlas: FIX handlers/actions buried inside 2x-taller buildings (lift roof members to new roof) + scatter unconnected clouds along the border instead of a vertical stack (v0.0.17)"},{"date":"2026-07-10","ts":1783694863000,"hash":"549015e4","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: camera orbit fallback + diff panel + guide — sync viewer"},{"date":"2026-07-10","ts":1783694837000,"hash":"9e0e38a4","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.16","title":"Atlas: fix camera orbit (fallback to a changed node when no explicit focus) + diff inspector panel on click (transparent, X to close) + bundled architecture guide for teaching AI (v0.0.16)"},{"date":"2026-07-10","ts":1783694166000,"hash":"a61a9605","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: routing v3 — nearest-road on-ramps, road-width lanes — sync viewer"},{"date":"2026-07-10","ts":1783694142000,"hash":"9ff7e73c","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.15","title":"Atlas: edge routing v3 — exit to NEAREST road (short on-ramp, more corners), lanes within road width (overlap ok), enter buildings from closest road point; verified 0 off-road interior vertices on real data (v0.0.15)"},{"date":"2026-07-10","ts":1783693482000,"hash":"9df83422","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: FIX per-grid edge routing on real roads — sync viewer"},{"date":"2026-07-10","ts":1783693457000,"hash":"14f52ffa","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.14","title":"Atlas: FIX edge routing — route per-grid on each grid's real roads, cross between grids only on a shared avenue (the two grids have different scales; merging their coords put lines on non-existent roads) (v0.0.14)"},{"date":"2026-07-10","ts":1783692896000,"hash":"5d64e045","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: full corner-turning edge routing — sync viewer"},{"date":"2026-07-10","ts":1783692872000,"hash":"db714938","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.13","title":"Atlas: full Manhattan edge routing — turn at street corners (node → vertical street → avenue → target street), per-street lanes (v0.0.13)"},{"date":"2026-07-10","ts":1783692556000,"hash":"a01fdc5d","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: street-routed edges (Manhattan lanes) — sync viewer"},{"date":"2026-07-10","ts":1783692535000,"hash":"67286d9e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.12","title":"Atlas: wire street-routed edges — reads/writes/calls run orthogonally along avenues in parallel lanes, shown at rest (v0.0.12)"},{"date":"2026-07-10","ts":1783692204000,"hash":"1e5a44f8","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: bloom glow + street curbs/dashed center + taller buildings — sync viewer"},{"date":"2026-07-10","ts":1783692171000,"hash":"5abc9754","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.11","title":"Atlas: bloom glow (UnrealBloomPass) + street curbs glow with dashed center + 2x module/datastore height; routeEdges module + tests (not yet wired) (v0.0.11)"},{"date":"2026-07-10","ts":1783691384000,"hash":"52b2e99f","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: neon streets + degree-scaled modules/datastores — sync shared viewer"},{"date":"2026-07-10","ts":1783691356000,"hash":"73a95b1e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.10","title":"Atlas: neon Tron streets (glowing centerlines) + scale modules & datastores by line count (v0.0.10)"},{"date":"2026-07-10","ts":1783690521000,"hash":"b73d91b1","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: sync shared viewer — gold borders, celebrations, Tron neon edges"},{"date":"2026-07-10","ts":1783690495000,"hash":"bcdf9aea","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.9","title":"Atlas: Tron pass — neon additive edge outlines per element (fill stays semantic) + deeper background for contrast (v0.0.9)"},{"date":"2026-07-10","ts":1783690308000,"hash":"5ea9d1c5","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.8","title":"Atlas: milestone celebrations — fireworks + chime + banner on commit (green) / push (blue), with a mute toggle (v0.0.8)"},{"date":"2026-07-10","ts":1783689908000,"hash":"e17ca020","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.7","title":"Atlas: changed nodes signal via GOLD borders + gold titles (fill color untouched); distinctive isometric icon + colored status bar/tab (v0.0.7)"},{"date":"2026-07-10","ts":1783689306000,"hash":"ced09a8e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.6","title":"Atlas extension: always-visible launchers — Activity Bar icon + Status Bar button (no file needed) (v0.0.6)"},{"date":"2026-07-10","ts":1783688265000,"hash":"f385b785","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas activity: district glow + cycle pill + Changes panel — keep shared viewer in sync"},{"date":"2026-07-10","ts":1783688229000,"hash":"e4896465","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.5","title":"Atlas activity: district-level glow + clickable cycle pill + Changes list panel (navigate the diff through the map, v0.0.5)"},{"date":"2026-07-10","ts":1783685621000,"hash":"a9d1dec5","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: activity-layer scene/viewer (glow + camera orbit) — keep shared component in sync"},{"date":"2026-07-10","ts":1783685590000,"hash":"cb4f4c88","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.4","title":"Atlas extension: live git-activity layer — glow uncommitted-change nodes amber + orbit the file being edited (v0.0.4)"},{"date":"2026-07-10","ts":1783684353000,"hash":"32c2e94f","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: ship Medusa (Shopify) + Medplum (FHIR healthtech) gallery examples"},{"date":"2026-07-10","ts":1783684330000,"hash":"a471e3cf","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: Medusa (Shopify) + Medplum (healthcare/FHIR) importers — file-based + Express parsers, pinned meta.domain grouping"},{"date":"2026-07-10","ts":1783683059000,"hash":"a3bd1827","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: ship tRPC gallery examples (Documenso + Cal.com) — rebuild with SCP'd files"},{"date":"2026-07-10","ts":1783682958000,"hash":"2cc04333","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: add Cal.com (Calendly) tRPC gallery example + tRPC router-grouping fix (skip generic procedures/handlers dirs)"},{"date":"2026-07-10","ts":1783682740000,"hash":"143b9b1c","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: tRPC parser + Documenso (DocuSign) tRPC gallery example"},{"date":"2026-07-10","ts":1783682728000,"hash":"3f33c612","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: tRPC importer — procedures→endpoints (query=read, mutation=write) + Prisma access; extract Documenso (267 procedures) as a real tRPC gallery example (7 tests)"},{"date":"2026-07-10","ts":1783682396000,"hash":"35b36567","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas: chat model picker (shared AtlasViewer models dropdown)"},{"date":"2026-07-10","ts":1783682358000,"hash":"0d24db4d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: model picker in chat — <AtlasViewer models> dropdown; extension enumerates vscode.lm models (Copilot exposes Claude/GPT) + user key, routes ask() to the chosen model"},{"date":"2026-07-10","ts":1783681875000,"hash":"fac0b12e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":"0.0.2","title":"Atlas ext v0.0.2: chat fallback — editor model (Copilot) → user's own OpenAI-compatible API key → graceful msg, so 'Ask your architecture' works for anyone (incl. Cursor/no-Copilot); map always works with no LLM"},{"date":"2026-07-10","ts":1783679456000,"hash":"da5f6e44","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas ext: add map-icon button to the editor toolbar; README leads with the user flow (install → click map icon → see your open project)"},{"date":"2026-07-10","ts":1783678331000,"hash":"978903f7","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: VS Code/Cursor extension scaffold (packages/atlas-vscode) — thin host+webview shell reusing the extractor + <AtlasViewer>; builds both bundles, F5-launchable"},{"date":"2026-07-10","ts":1783677599000,"hash":"6b439810","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: extract shared <AtlasViewer> (canvas+sidebar+chat) from page.tsx — page now injects graph+ask; the single-codebase seam for the VS Code/Cursor extension"},{"date":"2026-07-10","ts":1783676667000,"hash":"074f0585","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: detect S3 asset buckets referenced in next.config.js → the commslink-assets bucket now shows on the CommsLink map (web reads from S3)"},{"date":"2026-07-10","ts":1783676003000,"hash":"6357f964","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Exclude ~300MB of models from web image via .dockerignore (served from S3) — lighter/faster web builds"},{"date":"2026-07-10","ts":1783675655000,"hash":"faa7a840","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Serve avatar/room models (~300MB) from S3 (commslink-assets) via redirect — shrinks web build, faster deploys, no re-SCP"},{"date":"2026-07-10","ts":1783672723000,"hash":"2cb40487","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove retired Kara agent docs, branch convention, and post-deploy health check. (#4)"},{"date":"2026-07-10","ts":1783671652000,"hash":"1ed80238","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas vision: guiding light — local MVP, 'watch the agent build' live diff+camera, live telemetry (cars on roads) seam, terminal-context awareness"},{"date":"2026-07-10","ts":1783669257000,"hash":"b8f7b5dd","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas roadmap: extension strategy (big-3 editors, no fork), ladder business model, thin-shells-over-shared-core"},{"date":"2026-07-10","ts":1783668459000,"hash":"b1563dd2","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: webhook endpoints badged distinctly (WEBHOOK) in module contents + detail, so they're identifiable when clicking a domain"},{"date":"2026-07-10","ts":1783667692000,"hash":"6e760b57","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: clickable domain buildings (module → lists its endpoints/handlers/actions) + reconcile Cursor outline-toggle onto EC2"},{"date":"2026-07-09","ts":1783666655000,"hash":"00bc3d2b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: Next.js API-route importer + monorepo Prisma discovery → extract dub (bit.ly) as first REAL company: 194 pages, 175 API routes, 116 tables, full-stack"},{"date":"2026-07-09","ts":1783666410000,"hash":"4952fdfb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00/Chat: furniture scan outlines off by default, with voice and wrist toggle"},{"date":"2026-07-09","ts":1783664732000,"hash":"d763dc15","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: fix invisible page-phantoms bloating api container (exclude client nodes from backend zone); AWS account always shown as foundation border; pages served-by web module (removed nonsensical Users->page); reverted off-grid compaction"},{"date":"2026-07-09","ts":1783663736000,"hash":"5f34087b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: Users node + page-load 'requests' edges (the basic HTTP GET-page requests, distinct from API calls) + compact off-grid block (api container 382→224 deep)"},{"date":"2026-07-09","ts":1783662573000,"hash":"6929fe7e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas docs: full-stack front-end city (Next.js client extraction)"},{"date":"2026-07-09","ts":1783662354000,"hash":"a150d8b0","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: full-stack — front-end extractor (Next.js routes + client API calls) renders the CLIENT as its own city outside the gates, wired to the backend endpoints"},{"date":"2026-07-09","ts":1783659655000,"hash":"a89d5feb","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: AWS account is a dashed BORDER (not a plane) — servers stay their own cities, databases on their own separate plane"},{"date":"2026-07-09","ts":1783656739000,"hash":"7bacb9bd","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: Lambdas off the EC2 — serverless base = AWS account (not EC2), no container box for managed resources, each Lambda/compute gets its own raised plane"},{"date":"2026-07-09","ts":1783635021000,"hash":"08e811ec","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: de-clutter grants (drop bold roads → quiet lines + guarded-vault checkpoint) + MMO/AI-training/AI-RAG gallery examples"},{"date":"2026-07-09","ts":1783633625000,"hash":"30f8c857","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas docs: grant-roads + checkpoints, EC2/ECS/Fargate compute, containment model"},{"date":"2026-07-09","ts":1783633399000,"hash":"70d97c60","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: grant roads + police checkpoints (DUI barricade + flashing cruiser to vaults) + EC2/ECS/Fargate compute"},{"date":"2026-07-09","ts":1783632272000,"hash":"2b55d8d8","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas docs: record CDK importer, AWS city vocabulary, telemetry opt-in-overlay decision"},{"date":"2026-07-09","ts":1783632032000,"hash":"f47b8b7c","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: CDK-as-TypeScript importer — Lambdas as tents, IAM grants as roads (AWS-native extraction + city vocabulary)"},{"date":"2026-07-09","ts":1783624184000,"hash":"f2c648ca","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Verify fixed deploy pipeline (LF scripts + synchronous build)"},{"date":"2026-07-09","ts":1783624172000,"hash":"b439f54f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Force LF on shell scripts via .gitattributes — Windows CRLF broke deploy-ec2.sh on Linux EC2 (silent deploy failures)"},{"date":"2026-07-09","ts":1783624011000,"hash":"de2194f8","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Fix deploy.sh: synchronous EC2 build (detached nohup trigger silently failed to run the build)"},{"date":"2026-07-09","ts":1783622064000,"hash":"d33530e0","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Atlas CITY-1g + README lab-suite update"},{"date":"2026-07-09","ts":1783622011000,"hash":"2e1a3f1d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"docs: bring README lab-suite update from PR #3 onto main (Atlas CITY-1g preserved)"},{"date":"2026-07-09","ts":1783620796000,"hash":"78df4512","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas CITY-1g: externals as clouds (outbound, over consumers); webhooks as helicopters; clouds pickable"},{"date":"2026-07-09","ts":1783618890000,"hash":"277f608d","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas CITY-1f: helipads (air network) — buildings that call out get a fenced pad; helicopters on islands"},{"date":"2026-07-09","ts":1783618425000,"hash":"a8b533b4","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas CITY-1e: remove fake harbor; external islands sized by dependency count, routes on focus"},{"date":"2026-07-09","ts":1783617746000,"hash":"8fa44265","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas CITY-1d: table road grid + orphan-table sorting (unused tables off to the side)"},{"date":"2026-07-09","ts":1783616662000,"hash":"03441585","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas CITY-1c: buildings = modules (endpoints=doors, handlers=machines, actions=people); off-grid inside container; uniform roads"},{"date":"2026-07-09","ts":1783615038000,"hash":"a9ebbc56","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas CITY-1b: street grid between blocks + off-grid module sorting (stateless districts detached)"},{"date":"2026-07-09","ts":1783614118000,"hash":"b1afe1c4","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas CITY-1a: quiet edges + data avenue + coastline (mainland + offshore island externals)"},{"date":"2026-07-09","ts":1783612690000,"hash":"248001f2","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas CITY-0: generic model + example-architecture gallery (serverless/3-tier/event-driven)"},{"date":"2026-07-09","ts":1783612665000,"hash":"b83877dc","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas CITY-0: generic city-role model + doc plan"},{"date":"2026-07-09","ts":1783609151000,"hash":"11031a07","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas UI: scale fog + clip planes to scene so buildings stay visible when zoomed out"},{"date":"2026-07-09","ts":1783608613000,"hash":"a05b94f7","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas UI: infra nesting (EC2 host + containers, tables grouped in mysql)"},{"date":"2026-07-09","ts":1783608589000,"hash":"c3e8ccb1","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: infrastructure layer — EC2 host + containers from docker-compose"},{"date":"2026-07-09","ts":1783607817000,"hash":"2ded612b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"docs: Atlas Phase 4 (talk to your architecture) shipped — end goal met"},{"date":"2026-07-09","ts":1783606463000,"hash":"7f75b34b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas Phase 4: talk to your architecture (GraphRAG /api/v1/atlas/ask + chat panel)"},{"date":"2026-07-09","ts":1783605751000,"hash":"e4757840","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas Phase 3: self-updating architecture doc at /atlas/architecture"},{"date":"2026-07-09","ts":1783605739000,"hash":"0deb7108","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas Phase 3: living architecture doc generator (graph → Markdown)"},{"date":"2026-07-09","ts":1783604291000,"hash":"2d6ce26b","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"docs: Atlas Phase 2b (handler nodes + LLM tier) shipped"},{"date":"2026-07-09","ts":1783604045000,"hash":"3db89b89","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas Phase 2b: handler nodes + LLM-inferred edges on the 3D map"},{"date":"2026-07-09","ts":1783604028000,"hash":"e814effe","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas Phase 2b: handler nodes + Tier-2 LLM edge extraction (grounded, provenance-tagged)"},{"date":"2026-07-09","ts":1783602846000,"hash":"dda72681","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"docs: Atlas Phase 2 external-services slice shipped"},{"date":"2026-07-09","ts":1783602576000,"hash":"e493f150","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas Phase 2: external services on the 3D map (arteries out of the system)"},{"date":"2026-07-09","ts":1783602540000,"hash":"130d7405","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas Phase 2: external-service extraction from adapters (Stripe/Polly/Grok/Anthropic/AWS/…)"},{"date":"2026-07-09","ts":1783601201000,"hash":"c2cc01b7","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"docs: mark Atlas Phase 1 (3D map at /atlas) done"},{"date":"2026-07-09","ts":1783600886000,"hash":"e4659409","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas Phase 1: 3D architecture map at /atlas (nested districts, data-flow highlight)"},{"date":"2026-07-09","ts":1783600851000,"hash":"5dfdb64e","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas: nested-district layout unit test"},{"date":"2026-07-09","ts":1783599893000,"hash":"aafe565f","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Atlas Phase 0: deterministic graph substrate (endpoints/actions/datastores + provenance)"},{"date":"2026-07-09","ts":1783597971000,"hash":"606dc553","repo":"commslink2","author":"puppyprogrammer","project":"atlas","label":"Atlas","version":null,"title":"Add Atlas app card + about page to landing"},{"date":"2026-07-09","ts":1783597940000,"hash":"87f6fa35","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"deploy.sh: auto-refresh /landing code-activity graph on web deploys"},{"date":"2026-07-07","ts":1783412108000,"hash":"eec27e34","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Refresh code-activity graph through 2026-07-07 (r72-r82 session work)"},{"date":"2026-07-07","ts":1783408361000,"hash":"b1b0a5c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r82: EVEN OUT THE SEA FLOOR — runtime-detach the ~2349 deep 5x5x11 heightfield boxes (the uneven ocean floor, confirmed as the deepest meshes via the depth query). Sub reads seabedDepth() field not these visual boxes, so safe. Biggest single object-count cut. Reversible via EVEN_SEA_FLOOR flag"},{"date":"2026-07-07","ts":1783408361000,"hash":"351660d0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r82: even out the sea floor (detach ~2349 floor boxes) — biggest object-count cut"},{"date":"2026-07-06","ts":1783406447000,"hash":"9f7564f","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r81: DEEPEST-mesh diagnostic (user's 'closest to sphere centre = ocean floor' insight) — log the lowest-Y meshes + identity + parent to finally ID the sea-floor system"},{"date":"2026-07-06","ts":1783406447000,"hash":"629b019d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r81: deepest-mesh diagnostic (find the ocean floor by depth)"},{"date":"2026-07-06","ts":1783402901000,"hash":"9366c151","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r80: pinpoint 5x5x11 box source"},{"date":"2026-07-06","ts":1783402900000,"hash":"8096814","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r80: pinpoint the 5x5x11 box (2349x) — log a sample's parent chain + world pos to name its creation site for instancing"},{"date":"2026-07-06","ts":1783402003000,"hash":"05d9536b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r79: geometry-frequency diagnostic (find top instancing target)"},{"date":"2026-07-06","ts":1783402002000,"hash":"fe14929","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r79: GEOFREQ diagnostic — count meshes by geometry signature (type + dims) to find the most-repeated shape = the highest-ROI InstancedMesh target (Win 2, step 1a)"},{"date":"2026-07-06","ts":1783367886000,"hash":"982ece7","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r78: composition diagnostic — add group world-position + first-child box dims to the name hint, to locate/identify the ~10 uniform ~270-object box-pools (enemy hulls are only 2 boxes, so these aren't ships)"},{"date":"2026-07-06","ts":1783367886000,"hash":"fcf4475a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r78: locate the anonymous box-pool groups"},{"date":"2026-07-06","ts":1783364937000,"hash":"c5336be6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r77: parked planes merged to 1 mesh each — cut the carrier object count (measure objs drop)"},{"date":"2026-07-06","ts":1783364936000,"hash":"a4aacbf","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r77: parked planes → ONE merged vertex-coloured mesh each (was ~15 box parts). makeParkedPlane now wraps _buildParkedPlaneParts + _mergeGroupToMesh. Cuts ~14 objs/plane × ~20-26 always-in-scene planes = the bulk of the 897-object carrier. All _park usages are opaque Object3D ops so a Mesh drops in cleanly. Fallback to raw group if merge fails"},{"date":"2026-07-06","ts":1783350200000,"hash":"0ec5f35a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r76: name scene-composition groups"},{"date":"2026-07-06","ts":1783350199000,"hash":"473edc5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r76: name the anonymous scene groups in the composition diagnostic (walk to first named descendant / geometry type) — identify what the ~6400-object diffuse bulk actually is"},{"date":"2026-07-06","ts":1783349581000,"hash":"202f70a7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r75: scene-composition diagnostic"},{"date":"2026-07-06","ts":1783349580000,"hash":"b84c2f8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r75: scene-composition diagnostic — log total scene objects + top-level groups by descendant count, to find the REAL object-count driver (buildings were only 472/11000)"},{"date":"2026-07-06","ts":1783349025000,"hash":"21687718","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r74: city-merge diagnostic logging"},{"date":"2026-07-06","ts":1783349024000,"hash":"346de10","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r74: add MERGE diagnostic — log mergedCities/hiddenBuildings so we can see whether the city merge is actually running (r73 telemetry showed no draw/obj drop)"},{"date":"2026-07-06","ts":1783348255000,"hash":"e99c026b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r73: Carrier00 client-side city merge (buildings → 1 mesh/city) — cut draws + object count + bend CPU. Measure impact"},{"date":"2026-07-06","ts":1783348254000,"hash":"98abb76","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r73: CITY MERGE (client-side) — bake each city's static building bodies + roof caps into ONE vertex-coloured mesh via existing _mergeBaked (per-city, sphere-safe convention). Auto-excludes dynamic objects (roof heli, hangar planes, NPC crew, lights = separate objects). Throttled re-merge on build/raze. Cuts draw calls + object count + per-frame sphere-bend CPU. v1: no night-dim on merged cities. Toggle CITY_MERGE"},{"date":"2026-07-06","ts":1783347773000,"hash":"dc477116","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r72: remove building burning effects (fire/smoke/scorch/ember) game-wide — buildings now static/mergeable. Step 1 before city merge"},{"date":"2026-07-06","ts":1783347772000,"hash":"9e25c83","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r72: remove all building BURNING effects (updateBuildingFx fire/smoke/ember neutered; scorch color removed from damage + heal). Damage is HP-only now; buildings stay their base colour → visually static → mergeable. Step 1 of city-merge"},{"date":"2026-07-06","ts":1783345091000,"hash":"de71f4aa","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r71: live CPU/GPU split in the debug HUD (host loop CPU time vs GPU~) — diagnoses fill-bound vs sim-bound directly"},{"date":"2026-07-06","ts":1783345090000,"hash":"09bbf57","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r71: CPU/GPU readout in the debug HUD. main.js brackets its animation loop → window.__c00cpuMs (EMA JS frame time). Engine HUD shows 'CPU Xms · GPU~ Yms CPU-BOUND/GPU-BOUND' (GPU ≈ frame − CPU, valid below the 72Hz cap) + logs cpu/gpu to telemetry. Settles fill-vs-sim without guessing"},{"date":"2026-07-06","ts":1783344391000,"hash":"95646c2e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r70: revert r69 world culling (net-negative — no perf gain, hid visible buildings; FPS is fill/CPU-bound not draw-bound)"},{"date":"2026-07-06","ts":1783344390000,"hash":"f73c45b","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r70: REVERT world culling (r69) — data proved it did nothing for perf (city stayed 1656 draws, objs/fps unchanged) while hiding faintly-visible fogged buildings. FPS is fill/CPU-bound (8fps at 240 draws), not draw-bound — draw culling was the wrong lever"},{"date":"2026-07-06","ts":1783343596000,"hash":"87fdc02d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r69: Carrier00 world culling (horizon + fog-distance) — collapse draw calls toward dense cities that are below the horizon/beyond fog"},{"date":"2026-07-06","ts":1783343595000,"hash":"47d1bad","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r69: WORLD CULLING phase 1 — cullIslands() hides city buildings that are geometrically invisible: below the planet horizon (deck/air/orbit — central angle vs viewer+object horizon half-angles) or beyond fog.far. three.js only frustum-culls (still draws everything in the view cone behind the horizon/fog). Targets the '1600 draws toward the city, ~150 visible' gap. Per-island, ~10Hz, state-change only"},{"date":"2026-07-06","ts":1783342172000,"hash":"d7318a9e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r68: mirror perf — throttle Reflector to every 3rd frame + 512² (was 768²). It does a full 2nd scene render; in Carrier00 that craters framerate (judder/tears). Shared engine, harmless to Chat"},{"date":"2026-07-06","ts":1783341140000,"hash":"dd2c0c2c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r67: fix Carrier00 geometry leak (missile flame geo cached, was per-shot + never disposed). Affects browser + VR both"},{"date":"2026-07-06","ts":1783341139000,"hash":"5a171b1","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r67: FIX geometry leak — missile flame built a NEW ConeGeometry per shot (weapons.js:92) and cleanup (line ~302) only scene.remove'd it, never disposing → geometries leaked ~200/min under AI missile fire. Now a single cached _mslFlameGeo shared by all missiles (nuke pattern). Confirmed via telemetry: geometries climbed while objs stayed flat = churn without disposal"},{"date":"2026-07-06","ts":1783340530000,"hash":"72444fe7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r66: perf telemetry into shared engine (both apps, host-tagged) + gate ALL debug tracking/logging behind debug HUD visible ('Computer, debug off/on' toggle). Same debugger code in /chat + Carrier00"},{"date":"2026-07-06","ts":1783340529000,"hash":"71943dc","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r66: perf telemetry moved into the shared engine (one impl for /chat + Carrier00, host-tagged); removed Carrier00's duplicate host-side sampler. All debug tracking now gated behind the debug HUD being shown"},{"date":"2026-07-06","ts":1783338465000,"hash":"a63162f","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r65: (1) FIX worn avatar — Carrier00 never called engine.setUserAvatar, so the player had no body; now loads /models/aruishi.vrm (or localStorage cl_user_avatar) first-person. (2) PERF telemetry — every 2s in VR, POST FPS/ms/draws/tris/objects + head yaw to server log to correlate framerate with view direction"},{"date":"2026-07-06","ts":1783338465000,"hash":"1359a7bc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r65: fix worn user avatar in Carrier00 (setUserAvatar was never called) + VR perf telemetry (FPS/draws/tris/objects/yaw → server log) + engine getPerfSample()"},{"date":"2026-07-06","ts":1783337210000,"hash":"c706ed8d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r64: add live perf metrics to the VR debug HUD (FPS · ms/frame · draw calls · triangles) in the engine — flows to BOTH Chat and Carrier00. renderer.info reflects the host's whole scene in Carrier00. This is the 'measure first' tool for VR framerate debugging"},{"date":"2026-07-06","ts":1783336407000,"hash":"a0074238","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r63: revert Carrier00 MSAA-off — broke the in-XR mirror; foveation (r61) keeps the fill win"},{"date":"2026-07-06","ts":1783336050000,"hash":"a306dcb6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r62: Carrier00 MSAA off (antialias:false) for VR fill — pairs with foveation. Chat renderer unchanged (keeps MSAA; has headroom)"},{"date":"2026-07-06","ts":1783336049000,"hash":"ee89b81","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR perf: drop MSAA (antialias:false) on the main renderer — heavy VR fill cost on ocean/sky, can't be toggled per-session (context attr), so dropped globally. Pairs with foveation (r61). Tradeoff: desktop edges jag"},{"date":"2026-07-06","ts":1783335075000,"hash":"d4a16a2d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r61: enable fixed foveated rendering on XR session start (VrmEngine.onXRStart) — big Quest fill-rate win, flows to BOTH Chat VR and Carrier00 (configures the whole XR render via the adopted renderer). XR-only; no effect on flat clients"},{"date":"2026-07-06","ts":1783332854000,"hash":"c67a6b5e","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing: fix code-activity graph windowing at 1m/1w — bucketize now drops buckets before the window start (the code JSON isn't pre-windowed like the traffic API, so it was drawing full history back to March)"},{"date":"2026-07-06","ts":1783332550000,"hash":"e5f4e8fb","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing code-activity: add AI-era band (backfill = one Opus 4.8 era; auto-appends a new segment when CURRENT_MODEL changes in gen-code-activity.mjs). + ai-eras.json"},{"date":"2026-07-06","ts":1783332081000,"hash":"fcd3944f","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing: add 2nd 'Code Activity' graph under Site Activity — git churn (lines added/removed) across CommsLink2 + Carrier00, backfilled from full history, filtered to hand-written source (excludes bundles/locks). Shares the same time-frame buttons. + gen-code-activity.mjs + code-activity.json"},{"date":"2026-07-06","ts":1783330454000,"hash":"8a9b7013","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00 r60: add missing bug_open/progress/statement + voice_cmd_open listeners to the bridge — bug report now records into the (real) debug HUD"},{"date":"2026-07-06","ts":1783329456000,"hash":"6c56b14b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00 r59: mount chat's COMPLETE avatar integration (movement director, poses, animations, lip-sync, chat, voice commands, Q&A) via one shared bridge module"},{"date":"2026-07-06","ts":1783329455000,"hash":"65e062a","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r59 WHOLESALE integration port: extract chat's COMPLETE client wiring (the 40-case movement director + every avatar socket handler + Q&A + lip-sync) into ONE shared module (avatarSocketBridge → avatarbridge.mjs). chat.js mounts wireAvatarSocket(socket, getEngine) — the whole feature set wired at once, not per-host. Removed Carrier00's overlapping hand-wired handlers. This is 'run chat's integration', not fix-one-function-a-day. (AvatarPanel still has its inline copy — delegating it to the shared module is the paired de-dup.)"},{"date":"2026-07-06","ts":1783327908000,"hash":"19d6bab","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r58 UNIFY the env — no more fork: engine.setEnv(env) hands Carrier00's env (chat's environment.ts, fed our planes) to the engine so its execVoiceCommand runs Computer env-commands on THAT one env. Relaxed the AR-only guard (!this.env||!liveAlign → !this.env; equivalent in /chat). onVoiceText routes ALL commands to the engine's handleVoiceLine now — env, exit, Q&A, reports all chat's code, one env"},{"date":"2026-07-06","ts":1783327908000,"hash":"2658c681","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00 r58: unify env — engine commands run on Carrier00's env via setEnv; all voice commands through the engine. No fork"},{"date":"2026-07-06","ts":1783327372000,"hash":"f9db662a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00 r57: add missing voice_cmd listener — the server-side Computer commands finally reach the client"},{"date":"2026-07-06","ts":1783327371000,"hash":"c0ad289","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r57 THE FIX: add the voice_cmd listener chat.js was missing. On Quest, voice is server-side; the server detects 'Computer' + emits voice_cmd with the command — Carrier00 never listened, so every Computer command was dropped. Now routes voice_cmd → onVoiceText → env/exit/Q&A. This is why nothing worked regardless of client changes"},{"date":"2026-07-06","ts":1783326734000,"hash":"44efdc43","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00 r56: fix voice commands — env commands no longer eaten by the engine's gated handler; route them to Carrier00's env, rest to the engine"},{"date":"2026-07-06","ts":1783326733000,"hash":"0af6e08","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"r56 FIX the voice-command break I caused: my routing sent env commands to engine.handleVoiceLine, which EATS them (env gated in host mode → 'works in AR only' → returns true → never falls through). Now env commands ('make X visible') → Carrier00's working env handler; only exit/Q&A/bug/feature/chime → the engine"},{"date":"2026-07-06","ts":1783325896000,"hash":"49a7475","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Use the EXISTING build number: revert my duplicate C00_BUILD slop; bump the engine's GHOST_BUILD r54→r55 and surface it in Carrier00's mount log + VR button. No new constant — the build number that was always in the engine"},{"date":"2026-07-06","ts":1783325896000,"hash":"a364631d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00: surface the engine's existing GHOST_BUILD (r55) in the mount log/VR button; remove my duplicate build constant"},{"date":"2026-07-06","ts":1783325488000,"hash":"8cb719b","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"BUILD B49: add visible build number — big in the re-enabled in-VR debug HUD + on the VR button. Confirms the headset is on the latest build (not a cached one). Bump C00_BUILD every deploy"},{"date":"2026-07-06","ts":1783325488000,"hash":"ff55afe2","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 BUILD B49: visible build number in the in-VR debug HUD + VR button (stale-cache check)"},{"date":"2026-07-06","ts":1783324637000,"hash":"e571c31","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix STT regression: setPhysicalHandler was forwarding EVERY engine physical event (proximity/grab per frame) to the socket, flooding it and starving the voice STT stream → no transcripts. Filter to only the low-frequency command/report events (bug/cmd_arm/report/dismiss/env_state)"},{"date":"2026-07-06","ts":1783324637000,"hash":"b046d1b0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: filter setPhysicalHandler to low-freq events only — fixes voice STT starved by the physical-event flood"},{"date":"2026-07-06","ts":1783324033000,"hash":"be15daff","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: route voice to chat's handleVoiceLine (Computer chime + Q&A + bug/feature reports + exit) via the mounted engine; wire setPhysicalHandler to the socket"},{"date":"2026-07-06","ts":1783324032000,"hash":"85b559e","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Route voice to chat's REAL command handler: transcripts → engine.handleVoiceLine (Computer wake word + chime + Q&A + bug/feature reports), engine.setPhysicalHandler → chat socket (bug_arm/bug_report/cmd_arm reach server). 'Computer exit' now hits the engine's exit command. Env commands fall back to Carrier00 onVoice until the engine's env is un-gated. NOT a rebuild — chat's code"},{"date":"2026-07-06","ts":1783324031000,"hash":"7c2eac63","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add voice→parse→execute integration test (the layer unit tests missed): utterance → strip wake word → parseEnvCommands → env.execute → assert effect. Catches parser/execute mismatches"},{"date":"2026-07-06","ts":1783321418000,"hash":"45178b02","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add tests for the report systems: in-VR bug reporter → vr_bug_report (files, guards room/statement, truncates) + carrier00 feedback (feature/bug submit: type normalize, truncate, insert fields, return id; owner reply). 11 tests. Full suite 259 green"},{"date":"2026-07-05","ts":1783320984000,"hash":"a16e45e7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add headless EnvironmentEngine tests: rectangular room → 4 walls+floor+ceiling (count-the-walls), make-walls-invisible passthrough toggle, make-bed-visible furniture reveal. + debugSnapshot() test accessor. 138 tests pass. Verifies env execution without a headset"},{"date":"2026-07-05","ts":1783319431000,"hash":"a41d5442","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00: skip engine's loadTemplate in host mode — kills the second room (roomShell + bedroom furniture)"},{"date":"2026-07-05","ts":1783318051000,"hash":"28a7990","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix duplicate XR setup: vr.js was adding its OWN controllers/grips/hand models on the same shared XRHand joints the engine also sets up → two XRHandModelFactory models z-fighting (the 'second room' glitch + broken hands). Removed vr.js's set; the mounted engine owns XR input. Also log dolly child names for diagnosis"},{"date":"2026-07-05","ts":1783318051000,"hash":"85bd4d39","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: remove duplicate controller/hand setup in vr.js (was z-fighting the engine's) — fixes room glitch + hands"},{"date":"2026-07-05","ts":1783317267000,"hash":"ea4d07c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix engine-mount invisibility: point the engine's scene at the host DOLLY (bend-exempt) so Eve/hands/wrist aren't swept by Carrier00's floating-origin bend. Add frame-error logging (log first throw, was swallowed) + post-mount diagnostic (presenting/dollyKids/avatar)"},{"date":"2026-07-05","ts":1783317267000,"hash":"be657551","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00 engine mount: scene→dolly (bend-exempt so Eve/hands/wrist show) + frame-error + mount diagnostics"},{"date":"2026-07-05","ts":1783316618000,"hash":"7421f0c4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00 mounts the REAL VrmEngine (vrmengine.mjs) — chat's entire engine runs in the naval world; host-agnostic VrmEngine, /chat host-guarded + unchanged"},{"date":"2026-07-05","ts":1783316617000,"hash":"60d05de","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"MOUNT THE REAL CHAT ENGINE: Carrier00 now runs VrmEngine itself (vrmengine.mjs = the entire 7k-line engine bundled, three+three-vrm external) instead of hand-wired kits. vr.js: new VrmEngine({renderer,scene,camera,dolly}) → init() → loadAvatar() → frame() per tick; chat.js feeds pushChatLine + avatar_speak→speakAudio. VrmEngine made host-agnostic (constructor/init adopt an external world; onXRStart uses host dolly + skips chat room; frame() for host loops) — /chat unchanged (all host-guarded). Eve, grab/touch, wrist all from chat's actual code. Replaces companion.js/roomui.js"},{"date":"2026-07-05","ts":1783312261000,"hash":"46a0a7ac","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Extract wrist intent-gate from VrmEngine into shared WristGate — /chat + Carrier00 now summon the wrist by ONE identical rule (raise fist ~2s). Chat delegates; no fork"},{"date":"2026-07-05","ts":1783312260000,"hash":"7df10fc","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Extract wrist intent-gate from VrmEngine → shared WristGate (uikit). The 'raise fist ~2s to summon, hide when arm drops' rule was welded into VrmEngine; moved it verbatim into wristUI.ts (WristGate), VrmEngine now delegates, Carrier00 imports the SAME gate. No fork. Carrier00 wrist now appears by the exact chat rule (fist detection via curled fingertips; controllers: raised is enough)"},{"date":"2026-07-05","ts":1783308409000,"hash":"00176853","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Native UI port: Chat's REAL wristUI/chatPanel/debugHud shared via uikit.mjs; wristUI generalized (injected button spec) so /chat + Carrier00 run ONE wrist engine. Carrier00 drives it with its own buttons"},{"date":"2026-07-05","ts":1783308408000,"hash":"780c4af","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Native UI port: wrist/chat/debug are now the REAL chat widgets (uikit.mjs = bundled wristUI+chatPanel+debugHud). roomui imports uikit, drives the generic native wrist with Carrier00's button spec (Chat·Avatar·Debug·Report·Exit); native ChatPanel (push from chat_message) + native head-locked DebugHud. Deleted rebuilt wrist/chatpanel/debughud.js; kept React-adapted picker+feedback. Wrist is poke-driven (native) like chat; laser only for the far floating panels. import-map: uikit"},{"date":"2026-07-05","ts":1783303874000,"hash":"4de2f084","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: aim-ray laser + fingertip dots so you can see where you point + click the wrist/avatar buttons"},{"date":"2026-07-05","ts":1783303873000,"hash":"425c9b2","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR interaction: add a visible aim ray (laser) from each hand/controller + a bright fingertip dot, so the user can SEE where they're pointing and pinch/trigger to click wrist/panel buttons (they couldn't see their own hands to aim)"},{"date":"2026-07-05","ts":1783302733000,"hash":"1f70df3","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Native furniture feed + fix peripheral passthrough. (1) vr.js reads frame.detectedMeshes → builds furniture groups → env.styleFurniture (chat's exact impl), so 'Computer, make the <object> visible' reveals real scanned furniture. (2) main.js sky dome radius 5900→1000: it was at/beyond the XR far plane (far=6000) and getting clipped at the FOV periphery → raw passthrough; 1000 is well inside far like chat's 540/650"},{"date":"2026-07-05","ts":1783302733000,"hash":"34b477d8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: native furniture feed (Computer show objects) + fix peripheral passthrough (sky dome was far-clipped)"},{"date":"2026-07-05","ts":1783301264000,"hash":"c5bc3b8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix avatar-picker access + Computer commands: 'Computer, avatar' opens the picker (companion + YOUR avatar tabs) via voice — reliable when the wrist unit isn't reachable; also 'Computer, exit' (ends VR), chat/report/debug/hide. Wrist-anchor diagnostic logs whether a hand-joint/grip is in reach"},{"date":"2026-07-05","ts":1783301264000,"hash":"815b5679","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: 'Computer, avatar' opens the avatar picker by voice + Computer exit/chat/report/debug/hide; wrist-anchor diagnostic"},{"date":"2026-07-05","ts":1783255731000,"hash":"65795373","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00 Phase 2 BATCH: real Eve via extracted CompanionRig (companion.mjs = Chat's VrmEngine companion logic — movement/gaze/lip-sync); full in-VR room UI (chat panel, avatar pickers, wrist unit, debug HUD, voice bug/feature reporter); Computer commands re-routed to room engine. VrmEngine refactored to delegate to CompanionRig (chat unchanged)"},{"date":"2026-07-05","ts":1783255712000,"hash":"4bc68f6","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"PHASE 2 batch: real Eve behavior + full room UI. companion.js drives the extracted CompanionRig (companion.mjs = Chat's VrmEngine companion logic, bundled) — movement/gaze/lip-sync/gestures; avatar_speak → rig.speak (plays+lipsyncs). Room UI (roomui.js + src/ui/*): chat panel, avatar pickers (cl_ai_avatar/cl_user_avatar), wrist unit, debug HUD, voice-dictated bug/feature reporter. Computer commands re-routed to the room engine. import-map: companionkit"},{"date":"2026-07-05","ts":1783250831000,"hash":"94d3e718","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: place Eve in front of the player's gaze + log her position/size (she loaded but wasn't visible)"},{"date":"2026-07-05","ts":1783250830000,"hash":"4d55cb8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Eve placement: stand her 1.5m in front of where the player is LOOKING at load (not a fixed guardian-forward spot that could be behind them/in a wall), face the player, disable frustum culling, and log her world position + height (to catch scale issues)"},{"date":"2026-07-05","ts":1783250400000,"hash":"8c13f504","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 2a: render Eve's VRM body in the room (three-vrm from CDN, r0.180)"},{"date":"2026-07-05","ts":1783250399000,"hash":"8beecca","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"PHASE 2a: render Eve's VRM in the room. companion.js loads the companion's chosen .vrm (localStorage cl_ai_avatar, same origin as /chat) via @pixiv/three-vrm (CDN, three external, now r0.180) + three/addons GLTFLoader; stands her ~1.3m in front on the floor, under the VR rig (fixed in room, not sphere-bent), vrm.update each frame. Lip-sync next"},{"date":"2026-07-05","ts":1783249835000,"hash":"e6d79847","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: remove thumbstick, auto bow-alignment only"},{"date":"2026-07-05","ts":1783249834000,"hash":"12dcd4f","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Remove the thumbstick nudge — auto-snap only (no manual control, no bloat). worldYaw = _fwdYaw (auto bow-to-wall alignment)"},{"date":"2026-07-05","ts":1783249638000,"hash":"96214811","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: re-enable AUTO bow-to-wall alignment (main.js now reads the auto _fwdYaw; duplicate-room confound is fixed)"},{"date":"2026-07-05","ts":1783249637000,"hash":"7df12a8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Re-enable AUTO carrier-bow alignment (was only broken because main.js read the manual thumbstick value instead of the auto _fwdYaw). worldYaw = _fwdYaw (auto-snap the front wall to the bow at rendered -Z) + optional thumbstick nudge. The duplicate-room bug that made this look broken before is now fixed, so the snap holds"},{"date":"2026-07-05","ts":1783249270000,"hash":"0d0a056d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: right thumbstick rotates the naval world so you align a wall to the carrier bow yourself (persisted). No more auto-snap sign guessing"},{"date":"2026-07-05","ts":1783249269000,"hash":"7983e66","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier-bow alignment = USER-CONTROLLED (right thumbstick), persisted. Rotate the naval world to line a wall up with the carrier's bow yourself; saved to localStorage + restored per session. Replaces the auto-snap I kept getting the sign wrong on. Applied as a yaw premultiply on the eye-frame rotation (turns the world, not the room)"},{"date":"2026-07-05","ts":1783248594000,"hash":"5aba21d","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":"3.5.3","title":"Upgrade Carrier00 three.js r0.160 -> r0.180 (import-map). Aligns with CommsLink (three ^0.180) so roomkit runs native + unblocks the VRM avatar port (@pixiv/three-vrm 3.5.3 needs r0.180). r0.160 already had the color-management + physical-lights defaults, so this is incremental — no breaking APIs in Carrier00's code"},{"date":"2026-07-05","ts":1783248594000,"hash":"10c2a24b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: upgrade three.js r0.160 -> r0.180 (aligns with CommsLink, unblocks VRM avatar)"},{"date":"2026-07-05","ts":1783247655000,"hash":"8512f894","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: voice is just-talk (mic opens on room-join, no button) like /chat"},{"date":"2026-07-05","ts":1783247654000,"hash":"d89bef2","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Voice = just talk (like /chat): open the mic on room-join instead of push-to-talk (removed the controller-trigger gating); stop the mic on VR exit"},{"date":"2026-07-05","ts":1783247425000,"hash":"ea55b8f5","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 1: chat/voice/AI via a 2nd socket to Chat's namespace + presencekit (Chat's real voiceCapture+tts). Hold trigger to talk"},{"date":"2026-07-05","ts":1783247424000,"hash":"1751756","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"PHASE 1 presence port: Carrier00 becomes a CommsLink Chat client. Opens a 2nd socket to the chat DEFAULT namespace (same JWT as the /carrier00 game socket), auto-joins the player's room; push-to-talk (hold controller trigger/pinch) streams 16kHz PCM via Chat's real voiceCapture → server Amazon Transcribe → transcript returns as chat_message → the room's AI agent auto-replies (1-agent-1-human) with Polly audio → playAudioBlob speaks it. presencekit.mjs = bundled voiceCapture + tts (Chat's actual pipeline, not rebuilt). Lazy-imported; import-map adds presencekit"},{"date":"2026-07-05","ts":1783247144000,"hash":"2024044","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR sky dome: opaque sky above the ocean horizon (fixes passthrough-above-horizon — scene.background is null for passthrough so nothing was drawn there). Backdrop on the player rig, renderOrder -50 + depthWrite off, masked by the room occluder (passthrough inside), shows through windows above the sea; color tracks _skyC. Also guard scene.background.copy in updateDayNight (was throwing on null bg in VR)"},{"date":"2026-07-05","ts":1783247144000,"hash":"6deb8ac0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: opaque sky dome above the horizon (fixes passthrough sky); guard updateDayNight null background"},{"date":"2026-07-05","ts":1783246404000,"hash":"9972892","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR hands: render tracked hand joints via XRHandModelFactory (getHand was an empty joint space = invisible hands with hand-tracking). Lazy-imported so it can't break the desktop game"},{"date":"2026-07-05","ts":1783246404000,"hash":"42fc7cbc","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: render hand-tracking joints (hands were invisible — getHand had no joint models)"},{"date":"2026-07-05","ts":1783245990000,"hash":"8a91e6d","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"ROOT CAUSE of the recurring VR '2nd room': loadCommandRoom is async (awaits the scan fetch) and is called on startup + every 400ms — if the fetch takes >400ms, two calls both pass the '_commandRoom null?' check and both build a c00CommandRoom, but only the last is tracked+hidden; the orphaned duplicate stays visible = the 2nd room (intermittent, timing-dependent). Fix: synchronous _roomLoading guard before the await (no more duplicates) + hide ALL c00CommandRoom copies by name in VR (clears any existing orphan without a reload). Confirmed via ancestor-aware NEAR probe: 2nd room = c00CommandRoom at 0.1m"},{"date":"2026-07-05","ts":1783245990000,"hash":"ad39d356","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: fix the recurring 2nd room — loadCommandRoom async race made a duplicate scanned room; add a load guard + hide all room copies by name in VR"},{"date":"2026-07-05","ts":1783245350000,"hash":"27b395e0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: REVERT the wall-snap alignment (it broke the view again) — back to the stable 2nd-room-gone state"},{"date":"2026-07-05","ts":1783245027000,"hash":"40b30e9","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Align room to carrier: snap the naval world's yaw to the front wall's outward normal (computed from live walls) so a window squares to the bow — instead of aligning to the guardian's arbitrary forward axis (the ~27deg skew). Frozen once per session, applied as a yaw premultiply on the eye-frame rotation"},{"date":"2026-07-05","ts":1783245027000,"hash":"6336a717","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: snap the naval world to the room's front wall (fixes the ~27deg room-vs-deck skew so a window faces the bow squarely)"},{"date":"2026-07-05","ts":1783244103000,"hash":"9f6e9b28","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: hide all bridge superstructure (incl. the default bridge that wasn't hidden) so it stops rendering on top of the player as a 2nd room; ancestor-aware diagnostic probe"},{"date":"2026-07-05","ts":1783244102000,"hash":"f5e4467","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix VR '2nd room': hide ALL bridge superstructure in passthrough (the default bridge _bridgeInteriorMeshes was only hidden when a command room loads, so in VR it rendered at the bridge = on the player after the floating-origin). Also hide captainFig/engineers there. Deck/hull stay (ship seen through windows). Made the diagnostic probe ancestor-aware (was counting hidden _commandRoom children as visible = false positive)"},{"date":"2026-07-05","ts":1783243339000,"hash":"dde5bd8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Add one-time VR root-cause probe: after the eye-frame transform, log every visible mesh within 18m of the player + its parent chain (c00vrlog 'NEAR...'), to identify the '2nd room' by system instead of guessing"},{"date":"2026-07-05","ts":1783243339000,"hash":"8a60b947","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: one-time diagnostic probe — log visible meshes near the player in VR to identify the overlapping 2nd room"},{"date":"2026-07-05","ts":1783242421000,"hash":"ccaf0f5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix VR room rotated relative to the carrier: fold the carrier heading (_fcq) back into the eye-frame rotation (_sqInv = (_sq·_fcq)^-1, matching the old rig orientation). Without it the naval world's yaw tracked the carrier's sphere-longitude instead of its bow, so the room read as rotated relative to the carrier while position mapped straight"},{"date":"2026-07-05","ts":1783242421000,"hash":"612a850f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: fix room-rotated-relative-to-carrier — fold the carrier heading back into the eye-frame rotation so the bow is a fixed room direction"},{"date":"2026-07-05","ts":1783241328000,"hash":"4f5e2c93","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR floating-origin: render the naval world in the eye frame so the carrier bridge sits at the player and the sea curves away under them (was parked 25km out). Ocean+cloud shells transformed; far widened to 6000. Look through a cut window → the ocean/carrier"},{"date":"2026-07-05","ts":1783241322000,"hash":"eb9c356","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR floating-origin: render the bent naval world in the eye's local frame (pos=_sqInv·(bent−_scp), quat=_sqInv·bent) so the carrier bridge sits at the player origin and the ocean curves away under them — instead of parking the dolly 25km out. Ocean+cloud shells transformed too; camera.far widened to 6000 (env.activate set 650 for chat's close world). XR-gated; naval world masked by walls except through the cut windows/doors = the 'see the sea' payoff"},{"date":"2026-07-05","ts":1783240489000,"hash":"13ab0f88","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: hide the engine's chat outdoor world (trees/sky — built as a side effect of floorCentroid) so the naval world shows through openings; restrict voice commands to windows/doors/passthrough (time/weather/day-night are server-driven, mirror/light are chat-only)"},{"date":"2026-07-05","ts":1783240475000,"hash":"2b82643","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 env fixes per user: (1) hide the engine's chat outdoor world (env.world = trees/sky/ocean, built as a side effect of passing floorCentroid) each frame — the naval world is what shows through the openings, not the chat beach; keep the occluder shell. (2) restrict voice commands to opening/visibility/list — time/weather/day-night are SERVER-driven for all players (never per-client), mirror/light are chat-only"},{"date":"2026-07-05","ts":1783239689000,"hash":"c0009537","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Carrier00 voice commands: mic → 'Computer, cut a window here' / 'make the walls invisible' → the SAME environment.ts grammar (parseEnvCommands + execute) as /chat, gaze-targeted. roomkit re-bundled to export parseEnvCommands; carrier00 iframe gains microphone permission"},{"date":"2026-07-05","ts":1783239683000,"hash":"465c17a","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Wire voice commands: mic (Web Speech API) → 'Computer, …' → the SAME parseEnvCommands grammar + env.execute (gaze raycaster from the headset). Player can now cut windows/doors + toggle passthrough by voice, looking at the wall. roomkit re-bundled from roomkit-entry.ts to export parseEnvCommands; iframe gains microphone permission"},{"date":"2026-07-05","ts":1783239269000,"hash":"99e4a615","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fix saved window/door placement — compute the real floor centroid+polygon from the live floor plane and pass to env.syncPlanes (was null, misplacing saved openings). Openings come from shared /chat localStorage"},{"date":"2026-07-05","ts":1783239259000,"hash":"6df9909","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix saved window/door placement: compute the real floor centroid + polygon from the live floor plane and pass to env.syncPlanes (was null → the engine keyed every wall opening at distance 0, misplacing saved openings onto the wrong surface). Openings come from the shared cl_env_state_v1 localStorage (same origin as /chat)"},{"date":"2026-07-05","ts":1783238720000,"hash":"d97cea32","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fix roomkit load — add three/examples/jsm/ to the import-map so the bundled engine's Reflector import resolves (dead-code mirror on r0.160). EnvironmentEngine now loads"},{"date":"2026-07-05","ts":1783238719000,"hash":"5c8ee06","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"fix roomkit load: map three/examples/jsm/ in the import-map so the bundled engine's Reflector import resolves (r0.160, dead-code mirror). EnvironmentEngine failed to load without it"},{"date":"2026-07-05","ts":1783238211000,"hash":"35de263f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: wire in CommsLink's REAL room engine (roomkit.mjs = bundled environment.ts). VR now uses EnvironmentEngine fed live detected planes for the occluder shell (+ window/door cuts + voice passthrough toggles), replacing the stopgap. Lazy-imported so the desktop game is unaffected; renderWrapped skips envShell/envWorld from the bend"},{"date":"2026-07-05","ts":1783238199000,"hash":"f3d9f33","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Wire in CommsLink's real room engine: vr.js lazily imports EnvironmentEngine from roomkit (bundled environment.ts), instantiates + activates it, and feeds it LIVE detected planes each frame (updateLiveScene) — the actual Chat occluder shell + window/door cuts + voice passthrough toggles, replacing my stopgap buildOccluder. import-map maps 'roomkit'→./roomkit.mjs; renderWrapped skips envShell/envWorld from the sphere-bend so the shell stays glued to the real room at the local-floor origin. Lazy import so it can't break the desktop game"},{"date":"2026-07-05","ts":1783236566000,"hash":"b7828bea","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR room cleanup: remove the in-VR debug panel + hide the FPS rifle viewmodel in the passthrough command room — now it's just your real room"},{"date":"2026-07-05","ts":1783236557000,"hash":"68cbf48","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR room cleanup: remove the in-VR debug panel (server log is enough) and hide the FPS rifle viewmodel in the passthrough command room. Now it's just your real room"},{"date":"2026-07-05","ts":1783236085000,"hash":"8288b189","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR passthrough room: rig pinned at the local-floor origin (zero offset) so headset==real-room pose; depth-only occluder from the scan masks the naval world so the Quest cameras show your REAL room; opaque virtual room hidden in VR (kept for desktop). Naval world culled for now — returns through windows + floating-origin next. Fixes 'saw the digital room, wrong location'"},{"date":"2026-07-05","ts":1783236070000,"hash":"277c347","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"fix: remove duplicate fetchScan in room.js (revert had kept the earlier copy)"},{"date":"2026-07-05","ts":1783235993000,"hash":"12826e6","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR passthrough room (increment 1): pin the rig at the local-floor origin (zero offset) so headset pose == real-room pose; add a depth-only occluder (buildOccluder) from the scan so the naval world is masked and the Quest cameras show your REAL room; hide the opaque virtual command room in VR (kept for desktop). Naval world sits far at the bent bridge (culled) for now — comes back through windows + floating-origin next. Fixes 'saw the digital room, wrong location'"},{"date":"2026-07-04","ts":1783234740000,"hash":"f999b60e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR step 0a: passthrough AR — flip the XR session to immersive-ar with transparent clear so the player stands in their real room with the naval world around it (desktop untouched, VR-gated). Foundation for the occluder room shell + windows/doors, reusing CommsLink's engine on r0.160"},{"date":"2026-07-04","ts":1783234728000,"hash":"ddd2391","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR step 0a: passthrough. Flip the XR session from immersive-vr (opaque) to immersive-ar with a transparent clear + null background, so the player stands in their REAL room (Quest cameras) with the naval world rendered around it. Desktop untouched (all VR-gated). Occluder shell + windows/doors (0b) come next — reusing CommsLink's environment.ts on r0.160"},{"date":"2026-07-04","ts":1783231402000,"hash":"77fbddff","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: plop the ACTUAL scanned room onto the pylon — render the real SpaceScan geometry (walls/floor/ceiling from plane polygons, furniture from object meshes) exactly as captured, recentred onto the command pylon at its true dimensions. No reconstruction/box+blocks. No-scan players get the standard box room. Deck/pylon sized to the scan"},{"date":"2026-07-04","ts":1783231392000,"hash":"ca24920","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Plop the ACTUAL scanned room onto the pylon (not a reconstructed box+blocks): buildScannedRoom renders the real SpaceScan geometry — walls/floor/ceiling from the plane polygons (ShapeGeometry + plane matrix) and furniture from the object meshes (vertices/indices + matrix) — recentred to the floor bbox centre so it sits on the command pylon at its true dimensions. Deck/pylon sized to the scan bbox. No-scan players get the standard box room. fetchScan returns raw scan; dimsFromScan exported for sizing"},{"date":"2026-07-04","ts":1783230576000,"hash":"36479aa6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: command room mirrors the player's scan — render their scanned furniture (bed/desk/etc.) as recentred bounding-box blocks from the SpaceScan objects, so the room reads as their actual room. Browser-game feature; VR renders it"},{"date":"2026-07-04","ts":1783230567000,"hash":"fffb44b","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Room mirrors the scan: render the player's scanned FURNITURE as recentred bounding-box blocks (from SpaceScan objects — center transformed by the object matrix, sized by extents), so the command room reads as their actual room. Browser-game feature; VR just renders it"},{"date":"2026-07-04","ts":1783230056000,"hash":"b8aa490f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: keep browser + VR identical — island tower removed from ALL carriers at build; every player gets a command room (their scan if saved, else the standard room) instead of conditionally only scan players; engineers on deck for everyone. Command room is a browser-game feature; VR is just the render adapter"},{"date":"2026-07-04","ts":1783230049000,"hash":"ad6122b","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Keep browser + VR identical (no fork): remove the island tower from ALL carriers at build (carrier.js), and mount a command room for EVERY player — their scan if saved, else the STANDARD room — instead of conditionally replacing only for scan players. Command room is a browser-game feature on the carrier; VR is just the render adapter on top. Engineers home to the deck for everyone"},{"date":"2026-07-04","ts":1783229732000,"hash":"8aa234f","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Room cleanup: hide the carrier's island tower voxels (the tall block through the room's starboard side) via Carrier.hideIsland() when the scan replaces the bridge; move engineer home spots from the mid-deck cluster (z50, in the room) to the port deck line aft of the command island (where deck crew stand)"},{"date":"2026-07-04","ts":1783229093000,"hash":"c63d7fbf","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: command island cleanup (hide tower mast + rotating radar dish + beacon + helm/nav panel when scan replaces the bridge; captain moved to the deck; skinnier support column) + STEP 2: VR player now stands INSIDE the command room (VR eye moved to the room floor at the bridge, rig aligned to carrier heading so you face the front window)"},{"date":"2026-07-04","ts":1783229087000,"hash":"a44e8cb","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Command island cleanup + VR player stands IN the room. Cleanup (when scan replaces the bridge): hide the tower mast, rotating radar dish (the white ball) + beacon, and the helm/nav panel; move the captain down onto the deck; skinnier support column (0.6x room, reads as a pillar). STEP 2: VR eye moved from carrier centre to the command room floor (bridge world pos) and the rig aligned to the carrier heading, so the headset stands inside the room facing the front window (bow)"},{"date":"2026-07-04","ts":1783228272000,"hash":"ef553d5f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: command island sized to the scan — room-sized platform + viewing-deck ring + railings + stairs to the carrier deck, replacing the entire oversized default bridge (fixes the room looking tiny). Plus fixes the old-bridge flash (scan fetch retries every 400ms instead of 3s, so the swap is instant)"},{"date":"2026-07-04","ts":1783228259000,"hash":"20b3238","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Command island sized to the scan: room-sized platform + viewing-deck ring + railings + stairs down to the carrier deck (buildViewingDeck), replacing the ENTIRE default bridge (column+interior+stairs now all hidden). Fixes the room looking tiny on the old oversized platform. Also fixes the old-bridge flash: retry the scan fetch every 400ms (was 3s) so the swap is instant once the auth token arrives"},{"date":"2026-07-04","ts":1783227418000,"hash":"a84fdc5c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 1b: scanned room mounts on the carrier as the command island (renders in DESKTOP and VR). Built in main.js at the bridge location, sized to the player's scan; default bridge interior hidden, island column + stairs kept. User can verify placement in a normal browser"},{"date":"2026-07-04","ts":1783227409000,"hash":"b9d9053","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Phase 1b: mount the scanned room ON THE CARRIER as the command island (desktop + VR). room now built in main.js at the bridge location (BRIDGE_CX, BRIDGE.y, BRIDGE_CZ) on playerCarrier.group, sized to the scan; default bridge interior (floor/walls/ceiling/furniture) hidden, island column + stairs kept. Removed the old VR-dolly room. Retries the scan fetch until the auth token arrives"},{"date":"2026-07-04","ts":1783225775000,"hash":"8e153df1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix VR command room not rendering: the player-rig dolly sits at the bent eye (~47k units from the cull center), so renderWrapped was distance-culling it (visible=false) and skipping the room subtree while the camera still drew the world. Now the dolly is excluded from the bend/cull loop like the camera/planet, so the command room renders"},{"date":"2026-07-04","ts":1783225766000,"hash":"a470e40","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix: exclude the VR dolly (player rig) from renderWrapped's bend/cull loop — the dolly sits at the bent eye ~47k units from the cull center, so it was being distance-culled (visible=false), hiding the command room subtree while the camera still rendered the world. Now skipped like the camera/planet; step 3 places it at the bent eye"},{"date":"2026-07-04","ts":1783224632000,"hash":"8c332d02","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 1b.1: the command room. A solid opaque room (floor/walls/ceiling + front window) stands on the carrier in VR, sized to the player's scanned room (GET /api/v1/space → largest floor plane bbox + ceiling height) or the standard-room default if no scan. Player stands inside it, looks out the front window at the naval world. Foundation for the console/doors/viewing-deck phases"},{"date":"2026-07-04","ts":1783224626000,"hash":"e48905f","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Phase 1b.1: command room. New src/room.js builds a solid opaque command room (floor/walls/ceiling + front window) attached to the VR dolly so it rides the carrier and the player stands inside. Sizes to the player's SCANNED room via GET /api/v1/space (largest floor plane bbox + ceiling height), or the STANDARD_ROOM default (also the non-scan fallback). getToken wired from Net.me.token"},{"date":"2026-07-04","ts":1783222673000,"hash":"d58b2279","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR sky decor fix: sun, moon, stars, water-climate tint, and storm clouds now anchor to the carrier's flat eye (_eyeFlat) instead of camera.position — which is dolly-local (~0) in VR, so they were placed 25k units away and disappeared. renderWrapped's bend offset now lands them correctly around the player"},{"date":"2026-07-04","ts":1783222666000,"hash":"cabf4d5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR sky decor: anchor sun/moon/stars + climate + storm clouds to _eyeFlat (the carrier's flat position) instead of camera.position — in VR camera.position is dolly-local (~0), so they were placed 25k units off and vanished. renderWrapped's _cd offset then lands them correctly around the player"},{"date":"2026-07-04","ts":1783220749000,"hash":"c6dec872","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: render the ACTUAL sphere world. renderWrapped now handles XR — bends the world around the carrier's flat position, parks the dolly at the bent eye so the headset looks around the globe from the deck, shows sphereOcean (the real sea). Switched to immersive-VR (opaque) so the game's true sky + ocean render fully, no passthrough camper. No more flat-ocean hack"},{"date":"2026-07-04","ts":1783220734000,"hash":"55d8105","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR renders the ACTUAL sphere world (not a flat hack): renderWrapped now handles XR — bends the world around the CARRIER's flat position, parks the dolly at the bent eye (_scp/_sq) so the headset looks around the globe from the deck, shows sphereOcean. Switched to immersive-VR (opaque) so the game's real sky+ocean render fully with no passthrough camper. Removed the flat-ocean XR path (dead 3500 plane, never used)"},{"date":"2026-07-04","ts":1783218792000,"hash":"4bcd7d35","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: opaque sky dome — a BackSide sphere (depthTest off, drawn first, colour synced to the game's day/night sky) surrounds the player so every pixel not covered by the world is solid sky, never passthrough. immersive-ar leaves empty pixels transparent even with a background Color set, so real geometry is the only reliable fill. Fixes the real room showing through the sky/horizon instead of sea and sky"},{"date":"2026-07-04","ts":1783218786000,"hash":"354771e","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR: opaque sky dome (BackSide sphere, depthTest off, drawn first, colour synced to game sky) — immersive-ar leaves empty pixels transparent even with a background Color, so real geometry is the only reliable fill; kills the passthrough camper showing behind the sea/sky"},{"date":"2026-07-04","ts":1783196262000,"hash":"8078463f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: opaque world — remove scene.background=null (root cause of BOTH the passthrough camper bleed-through AND the every-frame 'scene.background.copy of null' throw in updateDayNight); remove diagnostic box/posts. Re-deploy (prior attempt was SIGPIPE-killed before shipping)"},{"date":"2026-07-04","ts":1783196096000,"hash":"de1a3d7","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR: opaque world for now (user: don't show the camper) — keep the game's sky background instead of transparent passthrough; remove the diagnostic box/posts now that rendering is confirmed"},{"date":"2026-07-04","ts":1783195511000,"hash":"ead30cb5","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR FIX: the pre-try loop section (updateFps/serverWorldClock/updateDayNight/updateWeather/Aircraft.NIGHT) ran OUTSIDE the game-update try/catch — a throw there in XR killed the frame before the render, the exact root cause of 'presenting=true but 0 frames'. Now wrapped: render always runs, and the actual thrower is reported (PRE-TRY THREW). Frames should flow; box/posts/world visible"},{"date":"2026-07-04","ts":1783195505000,"hash":"ad3e9bc","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR FIX: wrap the pre-try loop section (updateFps/serverWorldClock/updateDayNight/updateWeather) in try/catch — it ran OUTSIDE the game-update try, so a throw there killed the frame before render (root cause of presenting=true but 0 frames). Render now always runs; the thrower is reported as PRE-TRY THREW"},{"date":"2026-07-04","ts":1783194834000,"hash":"9ba768aa","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR diag: instrument the render loop — logOnce at loop-top ('XR loop tick reached'), at the render branch ('reached XR render branch'), and a try/catch around renderer.render in XR that reports the actual error. Pinpoints why frames=0 despite presenting=true (loop not driven vs loop dies before render vs render throws)"},{"date":"2026-07-04","ts":1783194823000,"hash":"5623480","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR diag: logOnce at loop-top + render-branch + try/catch around the XR render (report the error), to pinpoint why the loop submits 0 frames despite presenting=true"},{"date":"2026-07-04","ts":1783194210000,"hash":"f7de47e3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR self-diagnosis: add POST /api/v1/carrier00/vrlog (no-auth console sink) + the game reports every WebXR session step there, so the device's actual progress/error is readable in the api logs when the user just clicks VR (no console/typing). Reports immersive-ar/vr support on page load too"},{"date":"2026-07-04","ts":1783194197000,"hash":"29efab8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR: report every session step to /api/v1/carrier00/vrlog so the device's WebXR progress is readable server-side (no console/typing needed); report immersive-ar/vr support on load"},{"date":"2026-07-04","ts":1783193970000,"hash":"c0d9b4ea","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Add WebXR isolation test page at /carrier00-game/vrtest.html — a minimal standalone immersive-ar scene (rotating box + ring, canonical three.js pattern, on-screen status line). Isolates whether WebXR works at all in the Quest browser at commslink.net vs whether it's the game integration. Static file only; touches nothing else"},{"date":"2026-07-04","ts":1783191924000,"hash":"e6ba6f14","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: xr.enabled=true at STARTUP (the canonical requirement — three binds the loop's XR frame routing only when setAnimationLoop is called with xr.enabled already true; I'd set it on the button click, so frames never reached the headset → endless Quest loader). Plus: local-floor→local reference-space fallback, and an IN-VR head-locked debug panel (session steps + live frame count + carrier pos) so the next test pinpoints any remaining failure from inside the headset"},{"date":"2026-07-04","ts":1783191910000,"hash":"7b0f658","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR: xr.enabled=true at startup (canonical — bind XR frame routing before setAnimationLoop); local-floor→local reference-space fallback; IN-VR debug panel (head-locked text: session steps + live frame count + carrier pos) so failures are diagnosable in-headset"},{"date":"2026-07-04","ts":1783191152000,"hash":"f5e44f11","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR: single-driver render loop. renderer.setAnimationLoop(loop) is now the ONLY loop for both desktop and VR (replaces the initial requestAnimationFrame + the loop's self-reschedule). setSession routes that same loop onto the XR frame callback — the previous rAF↔setAnimationLoop hand-off on button click never submitted frames, so the Quest sat on its pulsing 'waiting for first frame' loader. enterVR/onEnd no longer touch setAnimationLoop. Desktop is unchanged (setAnimationLoop behaves like rAF with xr.enabled=false)"},{"date":"2026-07-04","ts":1783191141000,"hash":"6b8899d","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR: use renderer.setAnimationLoop as the single loop driver (desktop + XR) so setSession routes frames to the headset — the rAF↔setAnimationLoop hand-off left the Quest stuck on its 'waiting for first frame' loader"},{"date":"2026-07-04","ts":1783190500000,"hash":"8e68b2c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VR fix: don't bail the render loop on document.hidden while presenting (immersive XR reports the 2D doc hidden → nothing rendered); force flat ocean in XR; on-deck diagnostic geometry"},{"date":"2026-07-04","ts":1783190491000,"hash":"28679c47","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 VR fix: the render loop bailed every frame in VR because an immersive XR session reports document.hidden=true (the headset IS the display) — the 'tab hidden → idle' early-return is now gated on !isPresenting, so VR actually renders. Also force the flat ocean on / globe ocean off in the XR render, and add on-deck diagnostic geometry (red box + green post ring) so 'is anything rendering' is visible in-headset"},{"date":"2026-07-04","ts":1783189913000,"hash":"0f8ebd5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Meta Quest VR Phase 1a: additive WebXR (immersive-ar passthrough), camera dolly on the carrier deck following the server-authoritative carrier, hand tracking. All main.js hooks guarded on renderer.xr.isPresenting so desktop is unchanged; renders flat in XR (globe bend fights the headset camera); alpha renderer for passthrough. VR button appears only on a WebXR headset"},{"date":"2026-07-04","ts":1783189893000,"hash":"f1ebb9eb","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Meta Quest VR — Phase 1a (additive, desktop untouched). New src/vr.js: taps 'VR' → immersive-ar passthrough session, parents the camera to a dolly parked on the player's carrier deck (deckTopY, follows the server-authoritative carrier each frame), hand-tracking + controller grips. main.js hooks all guarded on renderer.xr.isPresenting: loop self-schedule + FPS cap gated (VR uses setAnimationLoop at headset rate), updateCamera early-returns in XR, renders FLAT in XR (the globe bend fights the headset camera), renderer gets alpha:true for passthrough. VR button hidden unless immersive-ar is supported. page.tsx: xr-spatial-tracking added to the carrier00 iframe allow. Room shell (occluder + windows) is Phase 1b. Doc: docs/CARRIER00_ROOM_FUSION.md updated with the real architecture"},{"date":"2026-07-04","ts":1783189329000,"hash":"c360cd11","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r54 bug batch (138/139/140): (138) worn avatar read 20-30% too large — scale now by standing-height RATIO (player eye height / avatar foot-to-eye), pelvis-independent, instead of pinning the head bone to the camera; (139) hand colliders added to the worn avatar's spring bones so touching hair/breasts moves them (adapts the companion's setupHairPhysics); (140) the tracked hand meshes + grip blobs now hide when the debug skeleton is off or an avatar is worn (the avatar's own hands render). Deferred: 141 (lip-sync needs mic-stream plumbing) + 142 (companion-under-table needs a companion-side snapshot)"},{"date":"2026-07-04","ts":1783187808000,"hash":"6ad4af9b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r53: scale the worn avatar to the player's height so heads are co-located (else looking down shows your own shorter avatar's head). Measured the avatar's bind head-above-hips; each frame scale = (player pelvis→head) / headAboveHips, clamped [0.5,2.5] and EMA-smoothed slowly (dt*1.0) so head bobs/crouches don't make the avatar breathe. Applied as uniform scene scale before the hips-at-pelvis correction (uniform scale doesn't affect the aim quaternions). chat-systems.md worn-avatar section updated (fingers + first-person + mapping)"},{"date":"2026-07-04","ts":1783186989000,"hash":"ca2bc3d2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r52: finger articulation on the worn avatar. The engine already reads WebXR hand-tracking joints (25/hand) but only passed the wrist to the rig, so the avatar's hands stayed flat. Now collectFingers() forwards all finger joints; the rig maps each VRM finger bone (thumb metacarpal/proximal, index/middle/ring/little proximal/intermediate) to the matching WebXR segment and aims it (world-quat), matched to the hand assigned to each arm by wrist proximity. Fingers curl with the user's real fingers"},{"date":"2026-07-04","ts":1783185872000,"hash":"c8a7cb93","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r51: THE crossed-arms fix. Root cause was the left/right MAPPING (not the aim): the old logic assumed the VRM's right limbs sit on the spatial-right side, but a VRM facing the camera has them on the OPPOSITE side by convention — so engine-R drove the VRM's LEFT arm. In r46 the twisted torso masked it; once the torso was correct it showed. FIX: decide the mapping by comparing the VRM's OWN right-arm bone side vs the engine's right-cluster side (both via the same 'right' vector, so its sign cancels — immune to the convention). swap = (vrmRightOnRight !== engineRRight)"},{"date":"2026-07-04","ts":1783185209000,"hash":"3ad937d1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r50: fix consistently crossed arms on worn avatar (report 137: torso now perfect, arms opposite). Evidence-based split of the aim: parent-LOCAL for torso+legs (so they follow the body facing — the r47 fix that made the torso perfect), but WORLD-quat for the ARMS (user-confirmed correct in r46 report 134; parent-local systematically crossed them). Each bone stores both rest forms; aimLocal for spine/chest/legs, aimWorld for the arm chains"},{"date":"2026-07-04","ts":1783184361000,"hash":"ccb1adae","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r49: 4 new admin-only avatars (both companion + player pickers) — Melon in 3 outfits (cuddle/day/sleep) + Alexis restored (alexis2.vrm; the .vroid files are VRoid projects, not loadable). Gender assumed female. 4 VRMs SCP'd to prod"},{"date":"2026-07-04","ts":1783183928000,"hash":"26c963f8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r48: fix jumpy avatar turning + intermittent crossed arms (reports 135/136). Report 136: 'ghost accurate but avatar teleport-turns.' The facing came from the engine's INFERRED hip lateral axis (steppy); now derived from the TRACKED shoulders (smooth — the user's own read: 'shoulders tell the torso which way to stand') and the root yaw is EMA-smoothed (dt*12 critically-damped follow — no teleport, no lag). The unstable facing also flickered the left/right assignment (crossed arms, report 135) — added a dead-band hysteresis to the engine↔VRM side mapping. Torso (r47) confirmed correct by the user"},{"date":"2026-07-04","ts":1783182732000,"hash":"7311100d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r47: fix worn-avatar waist twist + first-person body (report 134). (1) Torso was 'stuck to the side' because aim() posed bones to FIXED WORLD orientations from the bind pose — the spine/chest ignored the body facing. Rewrote aim to be PARENT-LOCAL (child dir + local rot in the parent frame, aimed parent-before-child), so the whole torso follows the root facing. Arms already correct (r46 spatial assignment confirmed by user). (2) Removed firstPerson.setup() which routed body meshes to the third-person layer — the wearer saw their body only in the mirror; now the whole avatar renders on the default layer, visible looking down / at your hands"},{"date":"2026-07-04","ts":1783181401000,"hash":"ca554496","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r46: rewrite user-avatar rig to match the companion's proven orientation + robust left/right. Two compounding bugs: (1) torso facing built from fragile per-bone world quats — now faces via scene.rotation.y + per-version vrm0Yaw, the SAME mechanism the companion uses for every VRM; (2) crossed arms/legs from trusting the body engine's L/R LABELS, which don't match the VRM — now every limb is assigned to the VRM side it's ACTUALLY on (spatial dot-with-right, one aggregated swap flag), and forward is sign-locked to the head gaze (ground truth). No more label reliance"},{"date":"2026-07-04","ts":1783180324000,"hash":"1376c1cb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r45: fix worn-avatar torso facing backward (bug report). The hips forward was built from side×up where side=hipR-hipL, but the body engine's hip left/right labeling is opposite the VRM bind convention, flipping the torso 180° (face was correct — it uses the real headset quat). Now sign-correct the lateral axis against the head forward (ground truth) before building the hips basis. Ghost tubes are symmetric so it never showed until a real mesh had a front/back; limbs were always fine (position-aimed)"},{"date":"2026-07-04","ts":1783180066000,"hash":"0261eb5d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r44: avatar picker refinements — ONE unified roster for both the companion and 'You' pickers (shibu + enmiel 2 now selectable as YOUR avatar too, kept admin-only in BOTH); (M)/(F) gender tags on every name; the single-agent selector is hidden (only shows with 2+ agents); the companion model choice is now PERSISTED (cl_ai_avatar) alongside the user avatar, and a never-chosen user defaults to Ghost"},{"date":"2026-07-04","ts":1783179592000,"hash":"257db739","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r43: 'Computer, make my bones visible/invisible' — voice toggle for the debug skeleton overlay (user request). Persisted in localStorage, survives reloads; handled in the voice command layer before the env parser (bones is a render preference, not a scene object). Added to the command list + docs"},{"date":"2026-07-04","ts":1783179252000,"hash":"f951339a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r42: restore the debug skeleton while wearing an avatar (report 131). Wearing a VRM hid the ghost tubes; now the skeleton renders as a depth-independent OVERLAY (depthTest off + high renderOrder) so the bones draw OVER the solid avatar instead of being buried inside it — the user keeps verifying joint positions and the red anomaly coloring while dressed. The avatar is still the skin; the ghost is the diagnostic overlay on the same solved joints"},{"date":"2026-07-04","ts":1783178483000,"hash":"e71f3b32","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r41: mirror inward-facing fix — on 2 of 3 walls the mirror faced OUTWARD and landed behind the occluder (invisible). Was using the floor centroid to decide 'inward' (unreliable per-wall); now uses the CAMERA position at placement (the user is provably inside the room) and stores the flip against the wall's own +Y so it's stable per-frame. Added a silvery backing panel + double-sided frame so the mirror is always locatable even with an empty reflection, and it no longer hides on transient wall-refresh misses"},{"date":"2026-07-04","ts":1783177550000,"hash":"731718a3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r40: USER AVATARS — the user wears their own VRM (driven by the same body engine that solves the ghost: measured-rest aim retarget, real head quat, tracked-hand arm chains, spring bones; first-person layer split). New user picker (4 male: Everyman/Rai/Aneki/Aneki-Sport + all public females) + Aruishi/Amane added to BOTH user and AI rosters. WALL MIRROR (report 126 revived): voice-placed Reflector, reflects digital content only (passthrough can't be reflected), virtual camera renders the third-person head layer so you see your own face — dress up and admire yourself. Avatar GENDER injected into the companion's context (correct he/she pronouns). 6 VRMs SCP'd to prod"},{"date":"2026-07-04","ts":1783175156000,"hash":"22deff71","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r39: reports 112-130 — Polly computer voice (Quest has no speechSynthesis; answers + env confirmations voiced server-side); vignette was rendering OUTSIDE the FOV (4m plane → 2m); calibration freezes at lock (standH ratcheted 1.51→1.90 while locked, flapping every band); bone law re-applies after the surface constraint; hands-pressed-below-top overrides the quadruped neck-drop veto (straddle = hands-and-knees); largest floor plane wins (hallway floor was stealing the walkable polygon); solid-volume-only burial checks + straddle foot deadband; gaze-targeted per-instance furniture visibility; placeable wall/ceiling lights (max 4, persisted); Eve environment awareness + gooutside/comeinside through cut doors (Director-gated, revocable, self-check exempt); mirror deferred (passthrough cannot be reflected)"},{"date":"2026-07-04","ts":1783171612000,"hash":"d2767cdc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Environment r38 parser polish: 'command list' phrasing hits the list branch; free-form visibility target excludes pronouns ('show me the room')"},{"date":"2026-07-04","ts":1783171594000,"hash":"ca5ba50c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Environment editing r38: unit tests for the pure parser/geometry modules + pivot-doc pillar note"},{"date":"2026-07-04","ts":1783171378000,"hash":"08eb45fe","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Environmental editing r38: voice-commanded room environment — passthrough occluder shell over live wall/floor/ceiling planes; cut/remove windows and doors (gaze-placed, persisted under intrinsic wall keys); always-there outdoor world (grass, beach + animated ocean, mountains, swaying trees, seagulls, sky dome with sun/moon/stars); time-of-day + weather presets (rain never falls indoors, fog, cloud); make walls/floor/ceiling/furniture/sky/ground visible or invisible; 'Computer, <command>' one-breath wake; 'list commands'. Companion never navigates outside. Pure parser + geometry modules unit-tested (239 tests)"},{"date":"2026-07-04","ts":1783168609000,"hash":"1354863c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add the body-pose case library (112 adjudicated VR reports + derived engine rules), the engine/spatial unit-test suite (bodyEngine 79 tests: calibration, posture ladder, claims, touch-surveyed geometry; spatial routing), and the animation-alignment + my-space pivot design docs - these were untracked and existed only locally"},{"date":"2026-07-04","ts":1783167711000,"hash":"1692f6ce","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r37 - THE ANIMATION COMPOSER (the next tier from report 111, user-commissioned): companions now AUTHOR their own animations on the fly - a new compose_animation command takes a name, an optional loop flag, and a one-line JSON array of raw keyframes (bone rotations in degrees, ms ease-in per frame), validates hard (joint-limit clamping via clampJoint, 2-24 frames, 16 bones/frame, 15s cap, finite numbers), auto-appends a wrap frame for smooth loops, saves to the shared animation library (source 'composed', loop + duration recorded), and plays it immediately - create, name, remember, reuse. Registered across all five command sites (KNOWN_COMMANDS, strip regex, tool definitions, brace format, match collection + hasAnyCommand + block gate + execution); respects the director-owns-the-body guard (saves but defers playback); brace-mode docs teach the bone vocabulary, degree units, loop-closure rule, and a worked seated-bounce example. The living systems doc gains the authorship paragraph. 212 tests. Composer tier of the pose library marked SHIPPED"},{"date":"2026-07-04","ts":1783166940000,"hash":"61e75a22","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r36 - reports 102-111: (1) [auto:eve] outside-room FALSE POSITIVES (104/108): furniture legitimately sits outside the WALKABLE polygon - hips over a surface footprint are ON furniture, not escaping the room; (2) the persistent lying-feet d0.20 reports were the plantar-flexed ANKLE POSE, not a sunken body - the self-heal was chasing a pose artifact and floating her; feet get a 25cm lying deadband while buried HIPS still self-level; (3) report 109: hip-grabs while SEATED (incl. straddling) adjust her in place - her root follows the hand midpoint with the pose intact, and only a firm sustained UPWARD pull becomes a real pickup; (4) report 111 (self-authored looping animations): the concrete named example ships as a primitive - a Director 'bounce' move (only while sitting/straddling) drives a rhythmic vertical oscillation for a few seconds; the full on-the-fly animation composer (create, remember, reuse) is logged as the next tier. 212 tests. Build r36"},{"date":"2026-07-04","ts":1783165551000,"hash":"3ba7812c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r35 - TOUCH REDRAWS THE MAP (user question: 'do we rely on scanned object positions forever, or can running my hand along the bed rediscover its dimensions?' - answer: the scan is a PRIOR, touch is the corrector, extended from height to GEOMETRY): (1) per-face footprint offsets learned from two channels - an on-plane palm beyond a face GROWS it; a SIDE-FACE press (hand on the vertical face below the top) marks the edge line exactly, both directions - tracing the ledge rewrites it; (2) the touch-corrected footprint feeds claims, edge detection, and hand tests; (3) HER sit/lie anchors consume the corrections - ledge shifts to the learned edge, sit/lie height uses the sunk real top: the inaccurate bed height and ledge get fixed by the user's own hands; (4) HUD shows live geo offsets, snapshots record them. 212 tests. Build r35"},{"date":"2026-07-04","ts":1783164756000,"hash":"0ec25991","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r34 - reports 94-101 + model gating: (1) Enmiel is PUBLIC, Enmiel 2 stays ADMIN-ONLY (user directive); (2) Eve's auto-report bursts consolidated (95-100 filed in triplicate - per-joint throttles all fired for one incident): at most one [auto:eve] report per 90s with every violation inside it; (3) her lie self-heal extends to buried HIPS, not just feet (her whole body was found 28cm inside the second bed); (4) report 101 - she now SEES hand MOTION, not just position: per-hand traces count direction reversals, so a fist pumping up and down reads as 'their right FIST is MOVING UP AND DOWN repeatedly' and side-to-side reads as WAVING, with fist/open state from the finger-curl detector. 209 tests. Build r34"},{"date":"2026-07-04","ts":1783164202000,"hash":"f61e1967","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r33 - reports 86-93 one-shot (incl. EVE'S FIRST SELF-FILED TICKETS, 89/91): (1) #86 COOPERATIVE STEPPING - steering her by grabbed shoulders/hips now animates her legs: grab-driven root motion advances the same procedural walk cycle as free walking, forward, backward, or turning; (2) #87 she lies a touch farther when joining (0.5->0.62m) and the mirror instinct is disabled entirely while the USER lies (cuddling hands drift close constantly - that was the 'her hand attached to mine'); (3) #88 the vignette that never showed: robustified (frustum culling off, double-sided, 4m plane) PLUS a guaranteed fallback - the debug HUD panel itself now draws an orange border while listening and flashes green on success; (4) #89/#91 SELF-HEALING from her own tickets: a lying foot buried in the mattress now LEVELS her body up instead of only reporting it; (5) #90 straddle pose v2 to the user's specified angles - hips ~55deg, knees ~112deg (seated on her legs), shins astride, torso lowered toward theirs, arms braced; mount height lowered; (6) #92 THE HEADSET IS THE USER'S FACE - head contact reads as their lips against her (a distinct mouth_touch perception event: 'pressed their lips to your X') and a face never shoves; (7) #93 adjustable while seated/straddling - gentle pulls DRAG her toward the hand for repositioning; only firm sustained pulls stand her up. 209 tests. Build r33"},{"date":"2026-07-04","ts":1783163604000,"hash":"ffd796fb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add Enmiel + Enmiel 2 as avatar MODELS picker options (user-supplied VRoid .vrm files; admin-only while being evaluated, same pattern as Shibu). The binaries are SCP'd into the EC2 build context directly - models/*.vrm is gitignored"},{"date":"2026-07-04","ts":1783163066000,"hash":"2d7944a6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r32 - reports 83-85: (1) STRADDLE capability (83/84): new Director move 'straddleuser' - she approaches beside the LYING user's tracked hips, then mounts astride them facing their head (thighs splayed, one knee either side, hovering just above their pelvis); available to the LLM only when the user's real body is lying; (2) report 84: lying 'on the bed' while the USER lies there now means lying BESIDE them - the anchor's centered marker knows the bed but not the body, so occupied-surface lies delegate to the user-relative placement; AND the user's tracked body is now a routing OBSTACLE when seated/lying (an oriented box along their body line) - she walks around you, not through you; (3) auto-report 85: a table claimed a kneeling user as lying-on - the lying-claim now applies to lie-able heights only (topY <= 0.7). 209 tests. Build r32"},{"date":"2026-07-04","ts":1783162620000,"hash":"f1339ebd","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r31 - COMPANION SELF-DIAGNOSIS (user idea): Eve audits her own body against the room's physical rules at 5Hz - standing outside the floor polygon, joints buried 12cm+ inside furniture volumes (legitimate placements at surface tops never trip it), feet below the floor - and files her own tickets through the same reporter pipeline tagged [auto:eve], with her joint positions, pose flags, and yaw attached to the snapshot. Persistent violations only (pathing wiggles don't report), per-type throttled, announced in the chat panel. The wall-sitting and feet-through-bed bug classes now report themselves the moment they recur. Systems doc updated. Build r31"},{"date":"2026-07-04","ts":1783162266000,"hash":"7f49b3ae","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r30 - reports 66-82 batch (incl. FOUR correct autonomous reports): BODY ENGINE: (1) reports 68/71 (propped lying with mild gaze flapped lying-sitting, conf 0.15 correctly flagged it): a neck AT the support plane (h<0.18) is itself lying evidence - you cannot sit with your neck at mattress level; (2) autonomous reports 75/79 caught the folded-pose solvers violating the founding bone law (femur 0.19 vs 0.48) - kneel-family geometry rebuilt (true fold reach from femur and fold height) AND the law is now enforced universally: every knee exactly a femur from its hip, every foot exactly a tibia from its knee, in every branch; (3) report 81: quadruped's axis now comes from the load-bearing HANDS (a straight-down gaze degenerates and drew the body behind the head) - also noted the user's straddle-relative-to-companion idea in the library; (4) autonomous flap reports 76/80/82: kneel-family and sit-family variant churn no longer counts as flapping; (5) seated shin arithmetic (report 70's tibia anomaly). COMPANION: (6) report 74: a chest touch now yields LOCALLY first (contact give at the touched part), the waist lean is gentler and depth-gated - no more whole-torso lurch from a light touch; (7) report 78: a SLAP (1-2 frames of contact) can startle but never launch - hard outcomes (tips, knockdowns) require HELD contact, and falls are now STAGGERED: the push lands, then the fall follows 340ms later - no teleporting; (8) report 73: a sustained chest push walks her back and tips her onto whatever catches her; (9) report 66 (she sat beyond the wall): sit spots outside the floor polygon flip to the opposite edge before anyone walks there. Report 67 confirmed the edge-sit fix working at 92% confidence. 209 tests. Build r30"},{"date":"2026-07-04","ts":1783160446000,"hash":"e901965b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r29 - THE FEATURE-REQUEST BATCH, one-shot (reports 58-65, incl. the first AUTONOMOUS report #64): (1) #59+#61 PERIPHERAL STATE GLOW - a radial vignette parented to the camera: ORANGE edges while a report/command is listening, GREEN 800ms pulse on every success (report saved, command executed, answer received); (2) #60 FEATURE REQUESTS as a first-class verbal flow - 'feature request ... end feature request' works exactly like bug reports on both voice paths, tagged [feature] in the table; (3) #62 COMPANION DISMISSAL - 'Computer, dismiss the companion' hides the avatar AND mutes the room's LLM at the single runAgentResponse choke point (zero token spend) until 'Computer, return the companion'; (4) #65 THE PROJECT-AWARE COMPUTER - 'Computer, <question>' or 'Computer, I have a question' routes to a separate grok-3-mini assistant injected with condensed project context (new handlers/chat/computerAssistant.ts), answering in the chat panel AND speaking in its own robotic client-side voice (free synthesis, distinct from the companion); (5) #63 the HUD now shows live L/R hand coordinates; (6) #58 HANDS AS AXIS WITNESSES - a poisoned lying anchor pointing the body away from where the hands rest re-derives its axis from them (evidence beats the anchor); (7) #64 the self-diagnoser's first autonomous report was itself adjudicated: lying-variant churn is not posture flapping (family-aware commit counting). 209 tests. Build r29"},{"date":"2026-07-04","ts":1783159956000,"hash":"d58ba29c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r28 - THE AMBITION TIER (all three approved extensions) + reports 55-57: (1) PROBABILISTIC CONFIDENCE - every classification carries a confidence from its distance to the decisive band edges; low-confidence candidates must sustain evidence longer (up to 90 frames), the inferred ghost DIMS with uncertainty (brightness IS certainty - real parts stay full), confidence shows on the HUD and in snapshots; (2) TRANSITION ANTICIPATION - the neck's vertical velocity is tracked (EMA), and a candidate backed by real motion in its direction commits in 12 frames instead of 30: the ghost leads the sit-down instead of lagging it; (3) THE ROOM LEARNS ITS FURNITURE - a stable seated-height pose held 4s with no surface underneath (report 51's unscanned computer chair) creates a virtual seat the classifier can claim from then on (capped, merged, announced in the chat panel); (4) report 56: ZERO lying-axis drift while anchored - slow head-turns dragged the body through the agreement gate; self-heal now only on sustained gross flip; (5) report 55: cross-legged knees snap to WRAPPED hands (same body-side pairing as seated); (6) report 57 (her hand stuck to the user's, swinging wildly): GRAB SAFETY - grabs auto-release when the grabbing hand loses tracking 600ms, and a spin-guard emergency-releases everything if her yaw goes chaotic while held. ALSO reconstructed the lying evidence gate that had silently regressed (caught by ReferenceError, restored with the r19 gate + slack). 209 tests. Build r28"},{"date":"2026-07-04","ts":1783159167000,"hash":"e02601e2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r27 - THE EXTENSION MANDATE (user: 'use your intelligence to go above and beyond my intuition - you are an extension of my brain'): (1) SELF-DIAGNOSIS - the engine now checks its own physical invariants every frame (bone-length violations, below-floor joints, posture flapping, implausible learned sink, claim/footprint disagreement); persistent violations file AUTONOMOUS bug reports through the exact pipeline built for spoken ones ('[auto] ...' with full snapshot+trace, per-type throttled) and the offending joints render RED on the ghost - the system is its own first tester and no longer waits for the user to notice; (2) POSTURE CALIBRATES THE SKELETON - extending 'touch calibrates the world' upward: committed kneeling measures the tibia directly (standing height minus kneeling height IS the shin), total leg preserved - proportions converge from living; (3) 'Computer, status report' recites the engine's beliefs (posture, build, calibration, support+sink, active anomalies) into the VR chat panel. Systems doc updated. 205 tests. Build r27"},{"date":"2026-07-04","ts":1783158646000,"hash":"27ecee4a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r26 - lying is world-anchored + the r25 extents regression fixed (reports 52-54): (1) report 52's snapshot exposed my r25 AABB-corner projection INFLATING rotated boxes 10x (hz 2.85 on a 0.29 bed) - true extents now come from the mesh VERTICES projected onto the orthonormal frame (cached per mesh, ~1s TTL) - this was also warping the seat-edge direction behind 'edge sitting still needs work'; (2) the user's rule from report 53 ('moving my head should not move my torso and legs'): the lying body is WORLD-ANCHORED - origin, axis, and plane pinned at lie-down; head turns move nothing (axis drift only as a fine correction when estimates agree); re-anchor only on real neck travel (>0.35m); (3) the user's rule from report 54 ('raising my hands should not levitate my body'): the lying plane latch is ONE-WAY - resting hands may lower it toward the real mattress, raised hands can never lift it. 200 tests. Build r26"},{"date":"2026-07-04","ts":1783157679000,"hash":"8dd3616e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r25 - THE MOTHER BUG + four report-driven rules (reports 43-51): (1) ORTHONORMAL SURFACE FRAMES - the scanned boxes' axes were independently flattened to the ground plane, so tilted volumes' Z-axis landed near-parallel to X and the footprint math degenerated: support was claimed METERS away (47/49 - kneeling on the floor claimed the bed), sink learning got poisoned by floor-hands, and edge/claim tests contradicted themselves (44/45/46); axZ is now the perpendicular of axX by construction, and the live path's half-extents project the AABB corners onto the true frame instead of mixing world extents with local axes; (2) the user's principle from report 45 engraved: a head within half a body-length of a lie-able surface IS on it (lying claim inflate 0.45; rescue gate simplified for head-lifted supine where the gaze goes horizontal); (3) report 48: a PRONE propped head gazes AWAY from the feet - the lying axis flips for stomach; (4) reports 43/46: wrists hang at mid-thigh ~12cm below the groin, so the wrist-drop calibration overestimated the torso and every knee band landed high - bias corrected, anthropometric window tightened; (5) dangling-vs-folded retuned against the measured data (folded needs +0.07 above the effective top AND +0.12 above the planted-knee height - sink drift can no longer flip an edge-sit to crosslegged). Snapshots now record the full surface frame for verification. 198 tests. Build r25"},{"date":"2026-07-04","ts":1783156395000,"hash":"f2dd4ff6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r24 - TOUCH CALIBRATES THE WORLD (the user ran a controlled experiment in report 41: hands pressed flat on the mattress measured it 14-16cm BELOW the scanned top - box tops are rigid-frame heights; bodies rest on the compressed surface; this one offset explains reports 40 too-high knees/floating feet and 42 ghost-on-top-of-real-legs): (1) learned per-surface SINK - resting hands within a surface's footprint at/below its top teach the engine the REAL plane (EMA), and all body placement uses the effective height; recorded in every snapshot; (2) PLANTED-FEET INVARIANT for sitting - the knee rides at shin height above the FLOOR (feet flat), never derived from the seat's claimed top, so feet cannot float regardless of scan errors; (3) the lying plane accepts hand-witness heights BELOW the scanned top (the old plausibility floor trusted the scan and blocked the correction); base lowered to +0.06. 198 tests. Build r24"},{"date":"2026-07-04","ts":1783155377000,"hash":"d47abecd","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r23 - reports 35-39 crack the two remaining mysteries: (1) THE INVISIBLE LYING BODY (reports 24/32/37/39) was the OBSERVER EFFECT: propping your head to LOOK for your body swings the up-vector past vertical, its horizontal trace flips crown-ward to feet-ward, and the ghost drew BEHIND your head - you could never see it because you were looking for it. Near-vertical (propped) heads now use the GAZE as the feet-ward body axis (a propped supine gaze runs down the body) and the anchor continuously self-heals from a poisoned capture; (2) report 38 (left knee clamped to the right hand ON r22): pairing was label-based and this device's declared handedness lies - knees now pair to resting hands by BODY SIDE, label-free; (3) reports 35/36 (kneeling on the bed = legs through the bed / standing): the descended claim used ABSOLUTE height, and kneeling on a 57cm bed restores standing height - the rule is now surface-RELATIVE with a standing-tall guard; upright-kneel-at-full-height logged as an honest open pattern; (4) surfaceUnder total-miss instrumentation (nearMiss: nearest box + how far outside its bounds) for report 35's unexplained miss. 194 tests. Build r23"},{"date":"2026-07-04","ts":1783154703000,"hash":"ee18d9cb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r22 - three fixes from reports 32-34: (1) USER-DIAGNOSED (report 34 - he called it himself): the furniture constraint applied to EVERY scanned box, so walking past a table hoisted the foot onto its top and scrunched the shin (the '2-inch shins' of reports 27/31, now closed) - only the CLAIMED support surface plus the floor may lift a ghost joint: proximity to furniture is not contact with it; (2) report 33 (blue legs clamping onto one hand): the knee-snap paired each knee to its nearest resting hand INDEPENDENTLY so both could claim the same hand - hands now claim exactly one knee each via best-total-distance exclusive pairing (regression test); (3) report 32 (bed rejected while lying on it, defying the shipped math): claim rejections now record WHICH box and WHICH rule fired in the snapshot, and a supine force-claim (strong lying evidence at a lie-able top) defeats footprint rejections while the reason data accumulates. Library updated. 190 tests. Build r22"},{"date":"2026-07-04","ts":1783153937000,"hash":"a876cefb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r21 - PATTERN-DRIVEN round from reports 24-31 + the BODY POSE LIBRARY (docs/BODY_POSE_LIBRARY.md - the user's long-term evidence base: every adjudicated claim-vs-belief pair, derived rules each citing their report evidence, open patterns awaiting more cases): (1) RESTING HANDS MEASURE THE LEGS (reports 26/28/30 pattern): hands at support level = knees at the edge (dangling legs); hands 6-35cm above it over the footprint = legs folded on the surface (cross-legged) - on 58cm-deep furniture the head cannot make this call, the hands always can; (2) HANDS-ON-KNEES ARE KNEE GROUND TRUTH (report 26 'knees are not where my hands are'): the seated solver snaps its knees under stationary support-level hands; (3) GAZE-ONLY TRANSITIONS ARE INSPECTION (report 28 trace: neckY constant through a sitting->quadruped flip): leaving sitting for quadruped now requires an actual neck descent, not just pitch; (4) LYING HEADS OVERHANG (report 29: pillow past the bed box made the bed vanish): the lying-claim tolerates 30cm overhang + a supine-evidence rescue search; (5) SUPINE RENDER VISIBILITY (report 24: correct lying classification but invisible body): lying limbs render 1.6x thicker with the chest bulging above the body plane; (6) instrumentation: neck x/z + raw Meta knee/ankle heights (the '2-inch shin' reports) in every snapshot. Old r15 test updated to the MEASURED edge-sit hand height. 189 tests. Build r21"},{"date":"2026-07-04","ts":1783152781000,"hash":"49d94a85","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Voice commands r20: STT hears 'exit stimulation' for 'exit simulation' - accepted; [CMD] log lines on wake-word/exec/one-shot so 'did the server hear it' is a one-line log check. The user's failed attempt was a stale r18 tab: the r19 server consumed all three command utterances correctly (nothing reached chat or the agent) but the acknowledgment events had no listeners on the old client bundle"},{"date":"2026-07-04","ts":1783152179000,"hash":"42f6a4c6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"r19 - the long turn (user's four asks, driven by reports 16-23): (1) COMPUTER VOICE COMMANDS: the wake word 'Computer' (own utterance, or 'Computer <command>' in one breath) arms a one-shot listener with an audible chirp + Listening ack in the VR chat panel; commands: exit simulation, enter/exit anatomy mode; command speech never reaches the LLM (zero Grok spend); works on both voice paths. (2) HYBRID BODY - the blue-arms question answered structurally: Meta's upper body is head+hand-driven IK and reliable in ANY posture (only generative legs degrade seated/lying), so the ghost now renders REAL green shoulders/elbows/arms whenever tracked with engine blue legs beneath - drawn-arm guessing (the thing that crosses) no longer exists when tracking is available. (3) CLASSIFIER FIXES from the reports: lying-on-bed was UNDETECTABLE (the head sinks to the mattress top; surfaceUnder required surfaces 12cm under the head and claimSupport called it chest-height) - surfaces are now found at head level and claimed as lain-on; lying ON a surface needs horizontal-body evidence so slouched edge-sitters stay seated; the crosslegged edge-band is relative to surface size (a 58cm camper bed had no reachable middle). (4) BUG DATA UPGRADES: 5s motion TRACE before each report (25 samples: neckY/pitch/hand heights/posture - transitions, not just the instant), hand-side SOURCE tags (declared/chirality/geo), hand heights relative to support, upperReal flag; statement duplication fixed (server text is authoritative, not appended). 52 engine tests. Build r19"},{"date":"2026-07-04","ts":1783150700000,"hash":"2e231d9e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bug reporter r18 - the STT logs autopsied ~6 lost reports fragment-by-fragment; the killer was the CLIENT's 8s silence backstop: on the server voice path the client hears NOTHING between RECORDING and the final statement, so 8s into any longer report it cancelled itself and DISARMED the server mid-sentence - everything said after went to the agent (the user's 'chats keep going to Eve'), and the trailing 'and bug report' then re-triggered an empty session, chaining attempts into chaos. FIXES: (1) the server emits bug_progress keep-alives per accumulated fragment - the client backstop stays fed AND the HUD shows the statement growing live as you speak (the intuitive feedback demanded); backstop 8s -> 30s; (2) end-phrases can never act as triggers (lookbehind excludes end/and/stop/save/submit before 'bug report'), and a stray end-phrase arriving unarmed is swallowed silently - reporter residue never reaches the agent; (3) 'debug report' accepted (STT heard that too); (4) disarm clears orphaned server-side parts. Build r18"},{"date":"2026-07-04","ts":1783149924000,"hash":"8d63e31d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Body engine r17 - the first two CLEAN bug reports each pinned a classifier bug: (1) report 14 ('sitting with my hands on my knees' read as quadruped:bed): an edge-sitter's knees are seat-high, so hands-on-knees sit AT mattress height - height alone cannot separate them from crawling hands; quadruped now also requires both hands over the surface's FOOTPRINT (a crawler's hands are over the mattress; an edge-sitter's hang past the lip over the floor) - regression test mirrors the report's exact snapshot numbers; (2) report 15 ('sitting cross-legged on the floor' read as heels): cross-legged tilts the pelvis and slumps the neck below the upright-seated prediction - the floor sitting band now reaches down to 0.78x torso. Snapshots now record the claimed surface's box so future hand-vs-footprint questions are answerable from the report itself. Build r17"},{"date":"2026-07-04","ts":1783149171000,"hash":"2041e0ac","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bug reporter r16 - the STT logs told the whole story (server side WORKED: triggers heard, statements accumulated, bug_statement emitted for every attempt): (1) the headset listener receiving the finished statement was bound at PANEL MOUNT, racing the socket's existence - attempts died in a dead listener, which is also why RECORDING/SAVED confirmations never showed; bug_open/bug_statement now bind at the PAGE level where the socket lifecycle lives, routed to the engine via window globals; (2) trigger strip now eats trailing punctuation (report 13's garbage '. I'm currently' prefix was strip residue) and punctuation-only fragments are skipped. Build r16"},{"date":"2026-07-04","ts":1783148645000,"hash":"716595fc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Verbal bug reporter r15 - SERVER-SIDE trigger (chat history smoking gun: 'Bug report.' landed in chat VERBATIM on r13 - that session's voice flowed through server STT where the client-only trigger is deaf; the active voice path changes per session with mic permission timing, so the trigger now exists on BOTH): the server transcript handler detects 'bug report'/'end bug report' (mishearing-tolerant: but/bud/bag/book, end/and/stop/save/submit) on aggregated utterances, accumulates everything between them server-side - chat unreachable - emits bug_open (client snapshots the pose at the trigger + announces RECORDING in the VR chat panel) and bug_statement (client saves + announces SAVED). Client-path trigger loosened to match anywhere in a fragment with the same tolerances. PLUS the top-reported classifier bug from his statements ('sitting on the bed edge but it says quadruped'): quadruped on a raised surface now requires hands ON the surface itself (<18cm) AND a steep tilt - hands on knees while glancing down stays SITTING (2 new tests). Build r15"},{"date":"2026-07-03","ts":1783147869000,"hash":"f18f452f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bug reporter r13 - FULLY VERBAL (user: raising an arm to press a button corrupts the very arm positions being reported): say 'bug report ...' to open - the engine's belief snapshot freezes AT the trigger with the body undisturbed - speak the ground truth through any pauses, say 'end bug report' to save ('and bug report' accepted since STT often hears end as and; stop/save/submit variants too; same-breath trigger+statement+end works). While open, everything said is consumed - chat unreachable. The wrist Bug button remains as a PTT backup; 8s hard-silence backstop unchanged. Systems doc updated. Build r13"},{"date":"2026-07-03","ts":1783147408000,"hash":"6f77a310","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bug reporter r12 - PUSH-TO-TALK (reports 10-12 on build r11 still truncated MID-WORD: browser speech finalizes fragments mid-speech in ways no silence timer can outguess, so timer-guessing is abandoned for determinism): press Bug = record (everything said is consumed - nothing can reach chat while recording; the button reads Done; the HUD shows the text growing), press again = SAVE the complete statement. Backup: 8s of hard silence (no fragments AND no live voice) auto-closes, saving if anything was said. Build tag r12"},{"date":"2026-07-03","ts":1783146655000,"hash":"241e31b9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bug reporter r11 - stale-bundle detection + voice-liveness gate (report 9 truncated mid-word with the tail hitting chat 2s after the save): (1) BUILD TAG - deploys never update an already-open headset tab, and there was NO way to tell which client produced a report; the HUD top line now shows the build (r11) and every snapshot records it - a report proves which client made it, and 'the fix changed nothing' becomes checkable at a glance; (2) LIVENESS GATE - browser recognition can go seconds between FINALIZED fragments while the user speaks continuously, so the 2.5s no-finals timer fired mid-sentence; interim results (which flow constantly during speech) now ping a liveness signal and the reporter refuses to finalize while it is fresh - the report closes on genuine silence only"},{"date":"2026-07-03","ts":1783146243000,"hash":"208127ca","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bug reporter + voice chat fixed AT THE ACTUAL SOURCE (api logs prove the user's device runs BROWSER speech recognition, not server STT - all server-side aggregation was correct code on an unused path; reports 7-8 'I'm current' show browser finals arriving as tiny fragments that auto-saved instantly and leaked the rest to chat): (1) while armed, the reporter CONSUMES AND ACCUMULATES every fragment - nothing can leak to chat mid-statement - and finalizes only after 2.5s of true silence, then saves the complete sentence; the HUD shows the text growing live (REC: '...') and BUG SAVED holds 8s; (2) the chat path's client flush window raised 1.4s -> 2s so a breath can never split a sentence to the agent (user cost mandate: one utterance = one message = one prompt)"},{"date":"2026-07-03","ts":1783145951000,"hash":"026b2f49","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Voice-to-chat AGGREGATION (user mandate - cost): server STT finalizes on small breaths, and each fragment became its OWN chat message + DB row + Polly TTS call + agent-prompt entry, spraying wasteful fragments into Grok context. Fragments now buffer per socket and ONE combined utterance is delivered after real silence - 1.2s for chat, 2.6s while a bug statement is armed. One utterance = one message = one TTS = one clean prompt line. The 3s agent debounce still applies after delivery"},{"date":"2026-07-03","ts":1783145653000,"hash":"2f0eb26c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bug-reporter round 8, driven by the FIRST SIX SAVED REPORTS (the pipeline was working - the failures were segmentation and a claim rule): (1) STT STATEMENT AGGREGATION - the server finalizes speech in segments; consuming only the first truncated every statement at the first breath ('I'm currently sitting with') and let the REST leak into chat, which is why the agent kept replying to bug-report tails. Segments now aggregate until 2.8s of silence, then the full statement ships and disarms; client timeout raised to 35s. (2) EDGE-SIT CLAIM FIX (report finding: 'support floor (rejected bed@0.57)' while sitting ON the bed) - the deflated footprint test rejected the bed under an edge-sitter whose head rides at the boundary; the footprint test is now +0.08 inflated, and walking-beside stays safe purely via the height precedence rules (standing at floor height never claims; test proves both). (3) the wrist 'Save' button was the room-layout save masquerading as part of the bug flow - renamed 'Room'. 179 tests green"},{"date":"2026-07-03","ts":1783144789000,"hash":"731d1da7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bug reporter UX rebuilt as ONE PRESS (the multi-state button next to Exit was bad design): press Bug once - snapshot captured, mic armed - then just SPEAK: the sentence AUTO-SAVES the moment it arrives (no review state, no Save press, HUD confirms 'BUG SAVED'). Second press while recording cancels; 20s of silence auto-cancels and disarms so the reporter can never eat a later chat line. The Bug button moved to the FAR LEFT of the wrist panel - the opposite end from Exit"},{"date":"2026-07-03","ts":1783143973000,"hash":"204d4e8e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bug reporter voice tap FIXED for the server-STT path (the user's device transcribes voice on the SERVER, which broadcasts straight to chat - the client-side tap never saw the transcript, so bug statements became chat messages): pressing Bug now arms a one-shot per-socket flag (avatar_physical bug_arm/bug_disarm via server-tracked socket state); the STT onTranscript handler checks it FIRST and routes the armed transcript back to the headset as bug_statement (no chat message, no TTS, no agent trigger), where it lands in the reporter's review state for Save. Cancel and Save both disarm. The Web-Speech fallback tap remains for devices that use it"},{"date":"2026-07-03","ts":1783143428000,"hash":"5757a6ce","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"HOTFIX api crash-loop (restarts=11): physicalPresence imported Data via the '#data' alias, which resolves in tsc (tsconfig paths) but NOT at runtime under ts-node - the codebase's actual convention is the relative '../../../../../core/data' path used by chat/index.ts in the same directory. Typecheck passed while the container crash-looped; the deploy health check reported healthy on a race before the first crash. CLAUDE.md's '#data' import example does not hold in services/api handlers"},{"date":"2026-07-03","ts":1783143045000,"hash":"9224d60c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"IN-VR BUG REPORTER + palm-chirality handedness (user's designs): (1) CHIRALITY - the user's palm insight made mathematical: the sign of the triple product of index-knuckle/pinky-knuckle/thumb-tip around the wrist is opposite for left and right hands and a mirrored hand cannot fake it, in any orientation; used as the handedness fallback whenever the runtime declares nothing (declared handedness still wins; sticky last-confident answer; 3 tests). (2) BUG REPORTER - a Bug button on the wrist panel: press to snapshot the engine's full belief state (posture, calibration, heights, support choice + rejected claims, hand sides, pins, companion pose), speak the ground truth ('I am lying flat on the bed with my arms by my sides') - the armed reporter consumes the next finalized voice line so it never goes to chat - review it on the HUD, press Save: the statement + snapshot pair lands in a self-creating vr_bug_report table as a labeled test case (server: physicalPresence bug_report kind, room/username from server-tracked socket state; new core/data/vrBugReport). Claude reads reports via Data.vrBugReport.listOpen() or SQL and can be looped on the table to address them autonomously. HUD bottom line shows the reporter state; wrist now 10 buttons"},{"date":"2026-07-03","ts":1783141910000,"hash":"80c9a6f8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Body engine round 4 - driven by the user's HUD readings (h=0.49 while standing / walking=sitting / sitting=lying-side / arms flip only in front): (1) ROOT CAUSE of all three posture symptoms: surfaceUnder hands the HIGHEST surface whose INFLATED (+15cm) footprint grazes the user to the engine as their floor - walking the aisle beside camper counters made every height relative to a counter top (h=0.49 standing = the sitting band; sitting dropped below-band = lying). NEW CLAIM RULE (5 new tests): furniture must EARN being the support - head over the REAL footprint (deflated -6cm), top below chest height, and the user either standing fully ON it or genuinely DESCENDED onto it; otherwise the floor is the support and standing at floor height always wins. (2) ARMS: handedness now read LIVE from the stored input source every frame (connect/disconnect events on hand AND controller spaces store the source object) - the arms-flip-in-front signature is geometric fallback, which now only runs when the runtime truly declares nothing; the HUD hand lines reveal which path is active. (3) HUD upgraded: absolute neckY + rejected-support readout (shows exactly which surface tried to claim you and was refused). 174 tests green"},{"date":"2026-07-03","ts":1783140878000,"hash":"b38a3bb0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Body engine round 3 - ANALYSIS-DRIVEN (user demanded analysis + debugging tools): (1) THE INVISIBLE LEGS were largely a RENDERING failure, not placement: the ghost drew at 0.16 opacity, which vanishes over a bright passthrough room - arms only read because they sit near the eyes; legs at 1.5m were unseeable at that alpha. Ghost now 0.38 opacity with strong emissive - legible over any background. (2) ARMS: the runtime DECLARES each hand's side and it is now used FIRST (hand input source handedness wired from connect events, controller handedness fallback); geometry is a last resort only when nothing is declared - with declared sides crossed arms are impossible by construction. (3) IN-HEADSET DEBUG HUD (new lib/avatar/debugHud.ts, always on in VR during this phase): head-locked panel showing live posture + engine-vs-Meta path, h vs calibrated standing height + lock state, torso/femur/tibia, support surface + top, pitch/level, each hand's declared side, stepping foot + pinned feet - the user can now READ what the system believes while doing the thing it misreads. (4) look-driven leg dance fixed: stance direction has hysteresis (head turns under ~56 degrees never re-aim the feet) and the pelvis ground position is a short EMA of the neck (pitch wobble cannot slide the body)"},{"date":"2026-07-03","ts":1783139484000,"hash":"25a2b3bb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Body engine round 2 (headset feedback): (1) THE INVISIBLE SITTING BODY - nothing was deleted: when the sitting band missed, the classifier fell through to heels/kneeling whose pelvis sits near FLOOR height, drawing the whole ghost BURIED inside the mattress 40cm below the user. New rule (the user's axiom applied properly): at mid height over a raised surface the SITTING family is the only physical answer - legs over the nearest ledge, crosslegged in the middle, quadruped only with forward tilt + hands down; kneeling/heels are floor postures now. Pelvis can never render inside furniture (regression test asserts pelvis above the mattress top). (2) LOOK-DOWN CROUCH: peering down includes a slight bow that the neck-pivot under-corrected - the pivot is deeper now (13cm down, 10cm back) AND an inspection guard enforces the user's rule directly: while standing with the head pitched steeply down, leaving standing requires descending near kneeling depth; a genuine deep crouch still reads. (3) torso calibration clamped to an anthropometric window so a polluted wrist sample can never push the pelvis toward the floor. 169 tests green"},{"date":"2026-07-03","ts":1783138321000,"hash":"bfaf32d9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"THE CROSSED-ARMS ROOT CAUSE, FOUND AND KILLED: the ghost's 'player right' vector has been computed MIRRORED since the ghost was born — (fwd.z, 0, -fwd.x) is the player's LEFT; the true right is fwd x up = (-fwd.z, 0, fwd.x). The 'right shoulder' was therefore always drawn on the player's left side, so every correctly-identified right hand drew an arm across the chest — which is why every previous fix aimed at hand-side ASSIGNMENT changed nothing (the hands were never the problem). Fixed as one law (rightOf helper) used for standing/sitting/lying alike, with regression tests pinning the right shoulder/hip/foot to the true right under identity, rotation, and lying (166 tests green)"},{"date":"2026-07-03","ts":1783137681000,"hash":"6cc7338d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"THE USER BODY ENGINE (built to the user's step-by-step specification): a pure, unit-tested module (lib/avatar/bodyEngine, 30 new tests) replacing all ghost-body heuristics. CALIBRATION: standing height = max head height while eyes are level (users never jump); the max vertical head-to-wrist drop while standing marks the groin (a tracked maximum - raising hands never changes it); torso and leg bones derive from these and LOCK - they never resize again for any reason. HEAD TILT: all body math anchors to the NECK PIVOT the headset arcs around, so looking down at your own body never reads as crouching or moving - the exact tilt-vs-descent separation the user specified. SUPPORT-RELATIVE: heights measure above the current support - standing on the bed makes the mattress the floor. POSTURE LADDER: standing / crouching (knees bend exactly as far as the descent demands) / kneeling (down by one shin) / hands-and-knees (kneeling band + strong forward tilt + hands on the support, hips-high vs sitting-on-heels split by the hand-to-knee-distance-vs-torso rule) / sitting (seat top + torso; legs dangle over the nearest ledge, straighten on slide-back, cross indian-style when no ledge is near) / lying (back-stomach-side from look direction and the one-hand-low-one-floating rule). FEET: pinned world contacts that step one at a time with a lift arc; a foot beyond leg reach slides along the ground, never through the air. Knees are analytic two-bone IK on the locked bones - stretching is geometrically impossible. Seated legs anchor to the world seat edge, not gaze. Meta body-tracking still takes over while standing. Systems reference updated"},{"date":"2026-07-03","ts":1783133939000,"hash":"7caa436e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"GHOST v4 — RENDER ONLY WHAT IS KNOWABLE (the industry's half-body answer): seated/lying legs are underdetermined from head+hands and every estimate rendered as nonsense, so they are NO LONGER DRAWN — the ghost becomes a clean half-body (torso tapering into a wisp) except in the two cases legs are actually known: STANDING (pinned stepping feet + fixed-length two-bone IK) or real body-tracked joints; wrong leg geometry is now impossible rather than unlikely. ARMS draw ONLY from authoritative input-source handedness (each tracked hand's declared side, now wired from the hand connect events) — geometric guessing is demoted to positioning only, so crossed arm bones cannot be drawn. Looking DOWN no longer corrupts anything: the horizontal gaze degenerates when inspecting your own body, so the rig uses the last LEVEL gaze"},{"date":"2026-07-03","ts":1783133022000,"hash":"39554a6e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"GHOST BODY REBUILT AS A BIOMECHANICAL RIG (limbs were stretching to 3-4ft; the previous point-placement approach is gone): (1) FEET ARE PINNED WORLD CONTACTS - planted where they touched down, stepping only when the body moves past a threshold; they never follow gaze and never drift; (2) KNEES ARE SOLVED, NOT GUESSED - analytic two-bone IK with constant femur/tibia lengths from pelvis to pinned foot, posture-driven pole direction; stretched or hyperextended limbs are geometrically impossible; (3) POSTURE IS WORLD-ANCHORED - sitting captures the seat's outward EDGE direction from real surface geometry (nearest-face normal, not gaze) so looking around while seated does not move the legs; lying captures the body axis once, re-anchoring only when the head travels; (4) the pelvis is the rig root - seat height when seated, body line when lying, hung below the head when standing but never beyond leg reach; (5) furniture constraints are VERTICAL-ONLY (a joint over furniture rests ON it) - the horizontal push-out that shoved feet a meter sideways is deleted"},{"date":"2026-07-03","ts":1783131990000,"hash":"fa696cf1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Posture classifier v3 + hand-side hysteresis (fixes the leg-engine regressions): (1) standing beside the bed read as SITTING — the clearance sitting band was too generous (standing head minus bed top = 1.1 fell inside 1.15) which both bent the ghost's knees while standing AND locked out Meta tracking (gated on standing); band tightened to <0.95 with an absolute head-height guard (<1.4m); (2) NEW strongest lying signal: head ORIENTATION — a lying head's up-vector goes horizontal (no standing/seated pose does that), so lying is detected even when the surface lookup misses and side-lying works; (3) crossed arms while seated: hands resting near the midline (on knees/stomach) flickered the geometric side assignment — hysteresis keeps the previous assignment unless the sides clearly reverse"},{"date":"2026-07-03","ts":1783131194000,"hash":"8fce96d3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"OUR OWN LEG ENGINE + furniture as impossibility (user's design — Meta's seated/lying leg estimates are wrong most of the time): (1) trust boundary: Meta body-tracking joints drive the ghost ONLY while standing/walking; sitting and lying use the in-house posture layouts; (2) hands as torso witnesses while lying: two hands resting at an agreeing height (on the stomach/chest/bed) bias the estimated torso plane toward them, aligning the legs with the true body line; (3) IMPOSSIBILITY CONSTRAINT: every ghost hip/knee/foot joint — estimated AND Meta-provided — is resolved out of furniture volumes and above the floor each frame (up onto the surface top or out past the nearest face, whichever is nearer): legs through the mattress are geometrically impossible; (4) HER seated legs too: sitting on a surface locks facing to the outward edge direction captured at sit time (±~57 degrees) — turning in place while seated used to sweep her shins through the mattress volume, and 'she turns around with her legs still in the bed' cannot happen"},{"date":"2026-07-03","ts":1783130239000,"hash":"23e7a564","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Anatomy v3 (user's anatomist pass): skull and neck shaft REMOVED (brain and trachea visible); trachea moved to the throat line with main bronchi into the lungs; NEW esophagus running down to the stomach; lungs raised below the clavicle line, enlarged, three-lobed, and BREATHING (~13/min); ribcage raised to surround them (5 hoops); heart raised to match; vertebral column drawn along the BACK (9 vertebrae lerped hips->neck with rearward offset — the rig's centerline is not the spine); pelvic girdle redrawn as a recognizable basin arc + sacrum (the two ambiguous white spheres are gone); hand and foot bone fans (metacarpals/metatarsals); reproductive system repositioned anatomically (anteverted uterus tilted over the bladder, cervix + canal, lateral fallopian tubes to almond ovaries); hair stays VISIBLE in anatomy mode (frames the view); head touch collider reaches the visible crown (top-of-head touches registered only from inside the skull before); tracked hand meshes tinted the ghost's translucent green (were opaque white gloves)"},{"date":"2026-07-03","ts":1783129290000,"hash":"23b65175","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Skeleton anatomy + physical realism batch: (1) anatomy mode draws a FULL SKELETON (bone shafts between every joint with joint balls, skull, iliac pelvis, 4-hoop ribcage) tracking live joint positions — the drawn skeleton is the same structure the grab system operates on; the colored skin-region patches are removed; MToon skins now actually go translucent (transparency toggles require material.needsUpdate for a shader recompile — the skin had stayed opaque); (2) SEATED PULL MECHANICS: pulling a seated companion leans the torso into the pull, and a sustained firm pull brings them up off the seat onto their feet with a catch-step (felt as being pulled up); (3) ankle/foot grabs work — foot grab radius raised past the knee-origin shadow (lowerLeg bones originate AT the knee) and the deliberate-grasp stillness gate relaxed to 1.0 m/s (reaching down to an ankle is faster than a drape sweep); (4) touch renders on the USER'S fingertips — per-finger glow at the actual contacting tip, brightening with pressure, replacing the 2-inch sphere floated on her body; tracked hands render as realistic hand meshes (WebXR 'mesh' profile) instead of primitive spheres"},{"date":"2026-07-03","ts":1783128371000,"hash":"b4818b64","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Systems reference tone pass: forward-facing and systematic throughout — all illustrative example quotes removed (touch/gesture/pointing/felt-event/Director/habit examples), retrospective bug-history parentheticals and 'hard-won lessons' framing replaced with impersonal engineering invariants (now 11, stated as binding rules), geometry section reframed as invariants; the doc describes what the system IS, never what was learned"},{"date":"2026-07-03","ts":1783128180000,"hash":"b38f5ecf","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Systems reference refresh (/chat/about, per the doc mandate): lying-limb articulation + hips-as-sole-body-handle + pushable-while-lying replace the outdated body-handles paragraph; pose-aware spatial language ('ON TOP of you, straddling your waist') + intimate-range pointing suppression; Director section gains raisehand/pointto vocabulary, words-over-posture join style, and the prose-rescue mechanism; voice section documents silence-aggregated speech input"},{"date":"2026-07-03","ts":1783127960000,"hash":"dcf17487","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Director prose-rescue + lying realism (from prod logs of the user's sit test): (1) the Director prose'd TWICE on 'come sit on the bed' ('Mmm, coming over to sit...') and the short-circuit resolved to NO MOVE while her reply claimed she sat — a second prose failure now RESCUES the intent from the prose deterministically (sit+bed -> siton:bed:edge, lie/sleep+bed -> siton:bed:lie, next-to-you -> joinuser matched to posture, face-you -> faceuser); (2) join style matches the user's WORDS not their posture ('come SIT with me' = sit even while they lie); (3) lying limbs ARTICULATE — grabbed arms/head/legs do normal IK while she lies (they were locked into a whole-body drag); the hips remain the sole deliberate body handle, killing accidental repositioning; (4) she's pushable while lying (steady palm pressure slides her gently — half gain, no knockdowns); (5) POSE-AWARE spatial language — lying, her frame is body-axis based: straddling her reads 'ON TOP of you, face to face' (the standing bearing math called it 'behind you'), plus beside/past-head/by-feet variants; pointing detection pauses at intimate range (braced arms aren't pointing)"},{"date":"2026-07-03","ts":1783127135000,"hash":"f96766ee","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"External anatomy atlas: anatomy mode now colors the SKIN educationally — ~46 translucent color-coded region patches (full facial features, throat/nape, collarbone/chest/ribs/backs, navel, individual butt cheeks, groin, hips, per-segment arms/hands, thighs + INNER thighs, knees/shins/calves/feet) riding the same bone anchors as the organs through any pose; TOUCHING a region makes it GLOW (closed loop with felt-touch — what lights is exactly what she says she feels); anatomy now scales continuously from internal organs to external body parts, with the brain's hemispheres showing live cognition on top"},{"date":"2026-07-03","ts":1783126856000,"hash":"23b9d970","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Anatomy polish + living brain: (1) mirror instinct requires a DELIBERATE offer — user must be facing her, hand raised toward her AND held still (<0.3 m/s) for 1.15s, with a 15s cooldown (talking-hands kept locking her onto the user's hand); (2) organ placement corrected: lungs + heart raised in the chest, bladder/uterus lowered into the pelvis; (3) anatomy skin is a visible glassy shell now (opacity 0.42, was near-invisible 0.22); (4) LIVE COGNITION ON THE BRAIN: her left hemisphere glows cyan while the verbal mind (LLM/speech) is active, her right glows green while the motor/instinct systems run (walking, IK holds, mirroring, settling, gaze reflexes) — the two-minds architecture made visible in her skull, part neuroscience lesson, part real-time debugger"},{"date":"2026-07-03","ts":1783125067000,"hash":"a5c38379","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Hologram race fix + realistic organs: (1) the space fetch resolving AFTER hologram entry built the solid replica room VISIBLE over the passthrough (virtual walls/floor blanking the user's real room) — the replica now respects live-align state at build time (root.visible = !liveAlign); (2) organs rebuilt as COMPOSED procedural shapes in lib/avatar/organs.ts (anatomy.ts stays pure landmark data): two-hemisphere brain + cerebellum, beating heart with ventricle apex + vessel stubs, tapered asymmetric lungs, two-lobed liver + gallbladder, J-curved stomach, bean-arc kidneys, pancreas + spleen; NEW digestive tract (trachea, coiled small intestine inside the ascending/transverse/descending/sigmoid large-intestine frame) and NEW female reproductive system (pear uterus, fallopian tubes, ovaries) — each with fixed anatomical local rotations, riding the skeleton through any pose"},{"date":"2026-07-03","ts":1783124435000,"hash":"82da1497","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"FULL-BODY SKIN GRANULARITY + ANATOMY EDUCATION MODE: (1) touch regions rewritten in the touched BONE'S OWN axes (pose-invariant — inner thigh stays inner thigh lying down): full facial map (forehead/nose/lips/chin/cheeks/ears/jaw/top+back of head), throat/nape (new neck collider), collarbone/ribs/waist, groin, left+right butt cheeks, inner/outer thighs, shins/calves, shoulders, feet (new colliders) — she feels precisely everywhere, ~40 named regions in her felt-touch and live body-vision; (2) lib/avatar/anatomy.ts — bone-anchored landmark map, external AND internal (heart, lungs, liver, kidneys, stomach, intestines, bladder, brain, spinal cord, spleen, pancreas, navel...) with synonyms; Director move pointto:<part> = she puts her fingertips on any part of her own body when asked where it is (educational; her own knowledge explains it); (3) ANATOMY VIEW — wrist 'Anat' button: her skin turns translucent and stylized organs render inside at true anchors (beating heart, paired lungs/kidneys, liver, stomach, intestines, bladder, brain), tracking her bones through any pose, desktop + VR"},{"date":"2026-07-03","ts":1783123004000,"hash":"41bbc357","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Touch specificity + the instinct mind + voice aggregation (user's hand-tests): (1) WHERE exactly — touch regions get directional refinement in her frame (hips+behind = BUTT, +front = lower belly; chest/spine behind = upper/lower back; upper-leg behind = butt cheek) and her live body-vision now LEADS with contact ('their right hand is ON YOUR butt right now, ~3s') — 'where are my hands?' while touching her was answered from stale scattered events; her hands are colliders now too (fingertip-to-fingertip registers); (2) INSTINCT MIND (split-brain interpreter, user's design): hold a hand up toward her ~0.75s and she raises the MIRRORED hand to meet it via IK, fingertips a breath apart — sub-second, zero API round-trip; the verbal mind gets 'your body INSTINCTIVELY raised your hand to meet theirs — own it' and narrates post-hoc; lowers when you lower, 6s cooldown; (3) Director gains raisehand:left|right for commanded raises ('put your hand on mine'), held ~6s via IK then recovered; (4) VOICE: speech finals are aggregated with a 1.4s silence window before sending — the browser finalizes on every short pause, so one spoken sentence became several messages each burning a full LLM round-trip and splitting her understanding; flush-on-end so nothing is lost; systems reference updated per the doc mandate"},{"date":"2026-07-03","ts":1783119223000,"hash":"049372fd","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing card graphs: weekly buckets -> DAILY over the last 90 days — the cards were mode=week/365d (a year of daily points is unreadable at sparkline size), but weekly bucketing made mid-week graphs read as stale ('Week of Jun 29' on a Friday) and a card's real question is 'is this app alive lately?'; daily/90d answers it with honest per-day points (today's point labeled 'Today'); the overview graph keeps its adaptive bucketing"},{"date":"2026-07-03","ts":1783118986000,"hash":"1c322721","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing graphs: label the current partial bucket as live ('This week (so far)' / 'This month (so far)' / 'Today') — weekly buckets are Monday-based, so on a Friday every card's last point read 'Week of Jun 29' while silently accumulating this week's views inside it, which looked exactly like 'the graphs stopped updating on June 29'; the data pipeline was verified healthy end-to-end (page_view rows through today, series endpoints current — the chat card's 'stale' bucket contained 110 views from Jul 2)"},{"date":"2026-07-03","ts":1783118765000,"hash":"9504ce51","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"ai-npc gets its canonical about page (same living-doc pattern as /chat/about): NEW /ai-npc/about rendered from services/web/content/ai-npc.md — what it is, quickstart, the real component API (AiNpc props from the shipped types), pluggable Brain/Voice interfaces (streaming, BYO provider, webspeech), surface affordances (sit/lie/stand/climb auto-scan + rescanAffordances), imperative handle (say/chat/walkTo/goTo), lineage to CommsLink Chat, and integration notes addressed to AI coding assistants; landing card gains a Learn More button; llms.txt now points agents at the overview as the conceptual entry with the repo as the code entry; /ai-npc/about added to no-store"},{"date":"2026-07-03","ts":1783118513000,"hash":"f6e90262","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"ai-npc card + llms.txt accuracy: the landing card claimed 'the same engine powers the avatar in CommsLink Chat' — true at extraction time, drifted false as the chat engine evolved (touch/schemas/senses are XR-specific and not in the SDK); reframed as lineage ('the engine CommsLink Chat grew from, in its simplest embeddable form') + positioned for agent developers ('built to be integrated by AI coding assistants as much as by humans'); llms.txt gains a For-developers section pointing agents at the GitHub repo"},{"date":"2026-07-03","ts":1783118313000,"hash":"f8ff8cda","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"AI-FRIENDLY BY POLICY (user mandate): CommsLink positions as a trusted, known AI-friendly site — robots.txt rewritten from block-first to welcome-first (AI assistants AND training crawlers open on all public pages; only session-gated app routes and API endpoints excluded — session mechanics, not anti-AI; zero-value SEO farmers still blocked) + NEW /llms.txt, the agent-oriented site map pointing AIs to the canonical systems reference at /chat/about and the public apps"},{"date":"2026-07-03","ts":1783118125000,"hash":"7ddd3af0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"robots.txt: carve /chat/about out of the AI-crawler blocks — our own anti-training rules (ClaudeBot/anthropic-ai/Claude-Web: Disallow /) plus the wildcard /chat prefix block made the public systems reference unreadable by the very AIs it was written for; user-assistant agents (Claude, ChatGPT-User, Perplexity) + search engines + the default group now get Allow: /chat/about while every other protection stays"},{"date":"2026-07-03","ts":1783117871000,"hash":"71b8bfd0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Gender-neutral companion language across all public copy: the AI is a persona of ANY gender the user chooses — the systems reference, landing card, and page metadata now use 'your companion / they' throughout (was 'she/her', which wrongly implied the product is female-only); the engineer rules section adds a standing rule: never hardcode a gender or a specific agent's name into systems or public docs"},{"date":"2026-07-03","ts":1783117353000,"hash":"c757cf12","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Landing + /landing added to the no-store list — the landing page carried Next's default year-long HTML cache, so new marketing copy/buttons (the Learn More card button) stayed invisible until users manually busted their cache; same trap as /scanner day one, now fixed at the header level"},{"date":"2026-07-03","ts":1783117117000,"hash":"fb3e214e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Public systems reference + landing refresh: (1) NEW /chat/about — the complete CommsLink Chat systems reference (scanned world, her body, graded touch physics, senses, layered mind, motor schemas/habits, retained capabilities + roadmap, and a full engineer-bootstrap section with architecture, hard rules, and the 10 hard-won lessons) rendered from services/web/content/chat-systems.md — ONE living markdown shared by users and future Claudes, with a CLAUDE.md mandate to update it with every system change (stale doc = failing test); (2) landing page Chat card rewritten for the pivot ('An AI Companion Living in Your Real Room' — scan your room, she lives in it, feels fingertip touch, sees your body, develops habits) + a Learn More button linking to /chat/about; /chat/about added to the no-store list"},{"date":"2026-07-03","ts":1783085131000,"hash":"73dbaa66","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Gesture perception (motion saliency + body-map semantics + temporal pattern classifier): (1) her eyes are drawn to MOVEMENT — a hand moving while the user's head is still pulls her gaze to it briefly (throttled, never over an orient-to-touch reaction); (2) each hand is located against the user's OWN body map (face/hair/chest/stomach/hips/knees/feet/other arm, from tracked+estimated skeleton parts); (3) temporal motor-pattern classifier: contact + oscillating strokes = RUBBING, contact + stillness >1.3s = HOLDING, else touching — her body snapshot reads 'their right hand is rubbing their left foot (~6s now)' and sustained gestures fire an unprompted noticing event ('you notice them rubbing their foot — sore? itchy? read the moment'); the MEANING stays hers to interpret, exactly the engine-detects / mind-interprets split of the schema architecture"},{"date":"2026-07-03","ts":1783084755000,"hash":"92dacfdc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Grounding critic learns her new senses (was vetoing TRUE statements): the critic's brief still said 'she has NO EYES — ANY claim of seeing MUST be vetoed', written before the body-awareness layer existed — so when she correctly answered 'yes, your hand is at your side' it rewrote her reply into 'I didn't look'. The critic now knows her REAL senses (live body-vision of the user + felt touch — claims about the user's body/position/hands are grounded and must NEVER be vetoed; never make her claim she can't see the user) and receives her current body-vision feed as evidence; the no-sight rule remains for what she genuinely can't see (screens, page contents, her own render) so real confabulation is still caught — the system stays, its model of her senses was just two months out of date"},{"date":"2026-07-03","ts":1783084196000,"hash":"6a87c310","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"She can answer 'where is my hand': (1) the body-state snapshot now describes BOTH hands ALWAYS with concrete positions (down at their side / waist height / shoulder height / raised high / reaching toward you / by your face, + distance when within 1m) — hands at rest previously got NO mention, so 'can you see my hand' had literally nothing to answer from; a missing hand reads as 'isn't in view right now'; (2) the context block is now identity-level VISION framing ('this is what you SEE through your embodied presence — if asked, the answer is YES, with specifics; never claim you cannot see them') — the old report-style block lost to the generic AI-can't-see prior; her stored persona was checked read-only and contains no vision denials"},{"date":"2026-07-03","ts":1783083488000,"hash":"da76d7d8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Cuddle-safe contact + living hair: (1) grabs must be DELIBERATE — a grab only fires on a fist-close with a relatively still hand (<0.7 m/s); draping an arm over her mid-cuddle curls the fingers mid-sweep and kept grabbing her hips, dragging her whole body along with the arm; hip-grab radius also shrinks while she lies (0.24->0.16) so only a hand actually AT her hips repositions her; (2) body-part displacement requires APPROACH MOTION (part moving toward her >0.15 m/s) — standing or lying close together is contact, not a shove; merely being near her no longer walks her backward; (3) HAIR: two spring-bone sphere colliders track the player's hands (run your fingers through her hair, it parts around them) + a gravity floor on every spring joint (VRoid exports often ship gravityPower 0) so hair drapes when she lies down"},{"date":"2026-07-03","ts":1783082494000,"hash":"b7a3a456","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Movement Director tuning (the tune list): (1) the motor-cortex call now opens by declaring the model is NOT the agent and must output zero prose/dialogue — under heavy roleplay context it was answering in her voice ('Mmm, already lying right here...') and burning all 3 retries; (2) prose responses (no JSON braces) short-circuit to 'none' after ONE corrective retry instead of three calls — a prose answer virtually always described an already-true state; (3) 'already in the requested state = none, not a re-pick' made explicit in the choice rules (defense in depth on top of the server-side re-fire guard)"},{"date":"2026-07-03","ts":1783082204000,"hash":"5dcabaa3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix the lie-then-stand pop-up (prod logs showed the exact sequence): the Director RE-PICKED joinuser:lie on the next message while she was already lying beside the user, and walkTo stands a lying body before walking — so every follow-up message mid-cuddle stood her up for a beat. Server now refuses to re-fire a lie she's already in (joinuser:lie while body state says lying, siton lie while lying on that surface = no-op); client joinUser additionally treats a lie target within 0.5m while already lying as settle-in-place (followup fires, no walk). Belt and suspenders at both layers"},{"date":"2026-07-03","ts":1783081449000,"hash":"ccc0cdc7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"HOTFIX: avatar_request_state scanned-room gate referenced a variable not in the handler's scope (normalizedRoomName — the handler payload has no room), crashing the api's runtime TS compile; room now derived from the server-tracked socket state (connectedUsers.get(socket.id)?.currentRoom), the established security pattern"},{"date":"2026-07-03","ts":1783081033000,"hash":"1c69f34c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"MOTOR SCHEMAS — all 3 layers (memory project_motor_schemas): movement as parameterized habit programs, not clips. LAYER 1 (lib/avatar/schemas.ts): orient-to-touch (grab or touch her → she glances at the contact, then at your face — a timed gaze queue, not an animation) + lie comfort followups as pure pose functions sided toward the user (arm_over drape, face_user turn, knee_up curl), applied a beat AFTER settling (the human rhythm) through the existing physics gates; gaze in scanned rooms now tracks the LIVE user instead of the old fixed point. LAYER 2 (Movement Director): joinuser:lie and siton:<s>:lie accept +arm_over/+face_user/+knee_up — grok chooses the comfort chain from persona/context (cuddle -> arm_over/face_user, solo rest -> knee_up), validated and passed through to the engine; she FEELS each ('you settled in and draped your arm across them'). LAYER 3 (state.agentSchemaHabits): every followup use reinforces a per-agent habit weight surfaced back into the Director prompt ('her settled habits: arm_over x3 — lean toward them') — repetition becomes preference; her body develops HER mannerisms. In-memory v1; durable persistence ledgered"},{"date":"2026-07-03","ts":1783080557000,"hash":"081feb71","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"ANIMATION ALIGNMENT Tier 1 (docs/ANIMATION_ALIGNMENT.md, from a 3-way engine audit): the Movement Director was pivoted to scanned rooms but EIGHT other emit paths weren't — all now gated by isScannedRoom(): (1) avatar_request_state no longer replays DESK_CHAIR/BED_* coords on every panel reload (the biggest mystery-teleport source) — scanned rooms restore via the generic surface system; (2) tool use (search/terminal/claude/forum) no longer walks her to the virtual desk; (3) the idle/autopilot body block (auto-sleep at bed coords, TV-at-bed, desk returns) is bedroom-only now; (4) her own {avatar pose/animation/gesture} builtins remap to surface bed:lie / bed:edge / stand / floorsit in scanned rooms; (5) rest_lieback/rest_sleep/get_up remapped the same way; (6) EVEMON refuses gracefully until the PC is re-homed; (7) client bedsit without a scanned anchor degrades to floorSit instead of replaying virtual-bed coords/yaws; (8) lieDown's default lift is floor-height in scanned rooms (was the virtual mattress's 0.55m). Tier 1b + re-homing ledgered in the doc"},{"date":"2026-07-03","ts":1783079653000,"hash":"bfe861bd","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"THE lying-orientation root cause (found in the RENDER, not the intent math): scene rotations used three.js default XYZ Euler order, which applies liePitch about the WORLD X-axis after the yaw — a lying body's head therefore ALWAYS pointed world -Z regardless of navYaw. Every lying yaw formula across four fix rounds (pillow-end anchors, head-next-to-user, settle, the wall gate's candidates) was silently discarded by the renderer, and the wall gate validated an orientation the render didn't produce. Fix: rotation.order = 'YXZ' (pitch composes in her own yawed frame; VRM0's baked 180 flip also inverts the pitch sign) — head now lands opposite her facing exactly as all the math assumes, for both VRM types. Also: the pink debug dot now marks where her HEAD should land (the pillow end), not the feet walk-spot"},{"date":"2026-07-03","ts":1783079342000,"hash":"0461af38","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix the wall-gate overcorrection that broke 'lie on the bed': the bed sits against the wall and its scanned box pokes past the floor polygon, so the new body-segment gate rejected LEGAL on-mattress lies, scrambled her orientation, and the self-heal then stood her up ('tries to put her head through the wall, fails, stands up'). Lie-capable surfaces now count as LEGAL GROUND in the gate (spatial.lieBodyInside okBoxes param, unit-tested: on-bed lie past the wall polygon = legal, head off both bed AND room = still rejected); when a lie does need correcting she SNAPS to the nearest lie-capable surface's long-axis geometry (feet recentred onto the mattress, lift set to its real height) instead of compass-scrambling on the floor"},{"date":"2026-07-03","ts":1783079068000,"hash":"b7846562","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Ball = physics testbed on the SAME systems as Eve: (1) hands STRIKE it without grabbing — palms + all ten fingertips (the exact contact sources that touch her) collide with the ball every frame, imparting the striking hand's velocity through the contact normal: a brush rolls it, a slap sends it flying (cap 10 m/s; fist-near still picks it up to carry); (2) EVE is a physical participant — the ball bounces off her per-bone touch colliders, she flinches, gets nudged by solid hits, and FEELS it ('the ball slammed into your chest at 5 m/s'); walls/furniture/ceiling/player-body bounces as before"},{"date":"2026-07-03","ts":1783078616000,"hash":"85978026","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"THE wall gate for lying bodies (5th report, root cause finally correct): every prior fix clamped her FEET position while the BODY SEGMENT (1.6m extending backward from her facing) went through walls unchecked — a corner-bed seated tip laid her across the bed's SHORT axis, head through the wall, every time. Now lieDown() itself — the choke point every lie passes through (commanded, tipped, pushed-while-seated, settled) — validates the whole body against the room polygon (spatial.lieBodyInside, unit-tested with a corner-bed scenario) and, when illegal, rotates her to the underlying surface's long axis with feet recentred so both endpoints fit, falling back to yaw candidates and finally to body-toward-room-centre. It is now geometrically impossible for a lie to end with her body through a wall"},{"date":"2026-07-03","ts":1783077883000,"hash":"79a0199d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Stop the phantom throws + universal recovery: (1) fingertips are TOUCH-ONLY — tips flick at m/s during normal hand motion and were registering as violent shoves in jitter-random directions (the 'gentle touch sends her flying' bug); only palms/head/body carry force now; (2) force requires horizontal DOMINANCE (h>0.35) — pressing down on her head/shoulder can no longer become a random sideways throw; (3) outcome gates raised: seated tip-over and fall-onto-surface need k>1.1, knockdown k>2; (4) pushes/tips HARD-CLAMP to the room polygon — no more flying through walls; (5) standUp is now a FULL physics reset (throw velocity, waist bend, settle target, mid-air state wiped + position clamped inside) so 'get up' always recovers her — and SELF-HEAL: lying with no lie-capable surface underneath (= dumped on the floor by a bad interaction) auto-stands after 4s. The stuck-until-refresh state is impossible now"},{"date":"2026-07-03","ts":1783077157000,"hash":"3d536c61","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Hybrid legs while lying: Meta's leg joints are GENERATIVE (AI-synthesized from the upper body, never camera-tracked) and keep phantom bent knees when the player lies down — the green ghost was faithfully rendering Meta's guess. Now posture-aware even with real joints: while LYING, keep the REAL tracked torso/shoulders/elbows/hips but lay the legs out flat from the real hips along the body direction at the support surface height (hips clamped to the bed). Standing/crouching/walking keep Meta's generative legs untouched (they're good there)"},{"date":"2026-07-03","ts":1783076641000,"hash":"77f45400","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Posture clearance + fingertip touch + tracking-mode signal: (1) posture bands were ABSOLUTE head height — lying on a 0.55m bed put the head at 0.7m = 'sitting', hence the ghost's 90-degree knees on the mattress; classification now uses head clearance ABOVE THE SUPPORT SURFACE (lying <0.5m over the bed top), so bed-lying reads as lying regardless of bed height; (2) all TEN FINGERTIPS are now touch sources (1.2cm radius via hand-tracking joints, per-source velocity) — the palm-only model missed every fingertip touch, and fingertips are how people touch; (3) ghost tint = tracking mode: GREEN when WebXR body-tracking (Generative Legs) drives real leg joints, blue when estimated — instant in-headset answer to 'is real leg tracking on?' (if never green: enable WebXR Experiments in the Quest browser flags; joint names verified against the spec)"},{"date":"2026-07-03","ts":1783075960000,"hash":"cf755b74","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"She can SEE you now (body awareness layer): (1) LIVE body-state snapshots — every ~3s the client composes where the user is relative to her (distance + front/left/right/behind), full posture, and what each hand is doing (raised / reaching toward her / by her face); stored server-side as CURRENT STATE and injected into every agent turn AND the Movement Director ('LIVE view of the user's body'), so 'can you see my hand?' is finally answerable; (2) POINTING — an extended arm casts a shoulder-to-hand ray against her body, every scanned surface, the floor and walls; a steady point fires an event ('POINTING at the bed — this/that/there means the bed'); (3) posture assumption system built out: sitting/lying with no surface underneath = the FLOOR, high-sitting band with no surface = crouching (chairs only exist if scanned — assumptions cover the rest); (4) WebXR body-tracking requested (Quest IOBT/Generative Legs, experimental): when the browser grants it the ghost body uses ~80 REAL tracked joints incl. legs and feet; the posture-aware estimator remains the fallback"},{"date":"2026-07-03","ts":1783075414000,"hash":"46a221c9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Body-fit + truthful ghost + contact you can feel: (1) lying placement now constrains BOTH body endpoints inside the surface (feet AND head — the feet-only math let her overhang the mattress; unit-tested incl. a short-bed case); (2) the player ghost is POSTURE-AWARE — lying bodies extend horizontally from the head along the head's up-vector at the bed's surface height (no more standing-skeleton-sunk-in-the-mattress), sitting gets hips-on-seat/feet-to-floor; groundwork for teaching her 'lie next to me = parallel bodies, face level'; (3) ghost handedness is now GEOMETRIC (whichever hand is on the head's right IS the right hand) — the runtime's reported handedness lied twice and crossed the arms; geometry cannot cross; (4) contact you can actually feel: collider radii reach her VISIBLE surface (your hand met force at her spine before), force tier starts at the mesh, steady chest press now backs her up into the balance model, and the touch marker is a warm additive glow (the dark dot was invisible over passthrough)"},{"date":"2026-07-03","ts":1783074431000,"hash":"1d049861","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix crossed ghost arms: PlayerBody was fed hands by INPUT INDEX (0/1), not handedness — on Quest index 0 is the right hand, so the left shoulder's arm reached across to the right hand and vice versa; hands now map through the reported handedness (rightGripIndex)"},{"date":"2026-07-03","ts":1783074057000,"hash":"e94251a6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"CRITICAL fix — 'lie next to me' sent her to a SHELF outside the walls, twice, deterministically. Two holes closed: (1) 'the surface the user is on' was resolved in 2D (XZ footprint only, first match wins) — a wall shelf overlapping the bed's footprint registered as the thing the user was lying on; now surfaceUnder() requires the top BELOW the head at plausible clearance and the highest qualifying surface wins, used by joinUser, posture tracking, and her settle reflex; (2) 'fits lying' checked LENGTH only — a 1.6m x 0.2m shelf qualified as a bed in the Director's menu and the fit-downgrade; canLieOn() now requires length AND >=0.55m depth AND <=0.95m height, used by the summary, sitOnSurface, joinUser; plus 'lie next to me' falls back to the NEAREST lie-capable surface when the user's own surface can't fit a body, and narrow-surface clamp bounds can no longer invert"},{"date":"2026-07-03","ts":1783073103000,"hash":"4fe64382","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"The language of touch (graded per-bone contact + comfort reflex + cooperative following): (1) her body is now per-bone colliders and pressure = penetration depth — graze (<2.5cm) is FELT only (dimple + event, zero motion: you can finally touch her face), light press yields only the touched part (head tilts, arm gives — springs back on release), deep press is force scaled by depth; the fat body-cylinder that fled a hand near her face is gone; (2) lying-body steering is DELTA-driven — a motionless grip HOLDS her still (the offset-torque endless-spin bug is dead); (3) sustained hand-pulls make her WALK with you (real gait, cooperative following) instead of statue-sliding; (4) COMFORT REFLEX: ~1.2s after being moved while lying she checks her configuration and visibly eases herself into a comfortable lie (aligned, head at the pillow end) — and tells you she settled"},{"date":"2026-07-03","ts":1783071365000,"hash":"6a099ce4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"MY-SPACE PIVOT phase 1 (docs/MYSPACE_PIVOT.md): the scanned room IS the product — 'myspace' is the forced, only scene (template selector + room-builder button removed, engine default flipped); scan-required onboarding overlay in the avatar panel (no scan -> 'Scan your room to begin' + Retry); Movement Director runs a SINGLE scanned-room prompt with ZERO virtual-bedroom vocabulary (siton/joinuser/faceuser/floorsit/getup/none; bedroom moves valid only for legacy scanless rooms); CLAUDE.md gains the product north star (scenes die, capabilities live — PC/TV/whiteboard to be re-homed onto real surfaces; current focus = avatar physics, animations, touch)"},{"date":"2026-07-03","ts":1783070056000,"hash":"cb3c45d1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Lying-body handling + sit orientation + no-clip: (1) grabbing a lying/sleeping body's hips (the big-radius grab that was silently winning over shoulders) now DRAGS her 1:1 along the surface — two hands rotate; carry-to-standing is impossible from a lying pose (was snapping sleepers upright); shoulder grab radius up 0.13->0.16; (2) scanned-room bed sits zero the server's bodyYaw/sceneYaw/legUp (bedroom-orientation params spun her after arrival — the legs-inside-the-mattress bug): pure facing, back to the bed, feet over the lip toward the room; (3) idle standing inside furniture resolves out of the nearest face continuously (rate-limited, ball-style; seats exempt)"},{"date":"2026-07-03","ts":1783069186000,"hash":"9d1f0629","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Realism batch: (1) sit spot at the true 90-degree lip (hips 5cm inside — feet at the edge toward the room); (2) startle redesigned as Layer-2 of the touch stack — fires ONLY on surprising firm+ contact after a 6s calm window, subtle head/spine recoil (the both-arms guard that dodged grabs is gone; gentle touch = physics only); (3) BALANCE model — accumulated waist bend past ~20 degrees breaks her balance: knees buckle and the surface behind catches her, else she falls (sustained pressure reaches it, not just shoves); (4) touch dimples — subtle pressed marks where hands contact her body (true MToon mesh denting deferred to a dedicated shader pass); (5) ESTIMATED PLAYER BODY (lib/avatar/playerBody.ts) — torso hung from the head pose, elbows solved to the real hands, hips below, feet lagging under the hips; rendered as a translucent ghost, every part (chest/elbows/knees/feet) collides with her AND kicks the ball with inherited velocity"},{"date":"2026-07-03","ts":1783067844000,"hash":"354b40eb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Surface height root cause + continuous collision + environmental falls: (1) topY was 'centre + local half-height' — assumes the box's local up is world up; Meta's furniture volumes are ROTATED boxes, so every surface floated by its tilt (the markers-a-foot-above-the-bed bug, and the invisible-ledge sits). Now spatial.worldTopY computes the EXACT max vertex height under the pose (unit-tested incl. a rotated-cube case), used by live + replica surfaces and anchors; (2) CONTINUOUS hand-body collision — penetration resolves every frame with no speed gates or cooldowns: chest-height contact becomes waist bend, lower contact displaces her; the hand can no longer pass through her; (3) pushes interact with the WORLD: a firm push with a seat-height surface behind her legs tips her onto IT at its real height (chest push + bed behind = she falls onto the bed) — no grab required"},{"date":"2026-07-03","ts":1783067162000,"hash":"92552a8a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Wrist panel repositioned: float 0.11m in FRONT of the wrist toward the eyes (hugging the wrist put the button face inside/behind the arm — unpokeable)"},{"date":"2026-07-03","ts":1783066904000,"hash":"6598c09d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Waist bending + lying-body handles + sit diagnostics: (1) spine SPRING — chest-height pushes bend her at the waist (impulse->bend->springs upright); a hand PINNING her hips converts pushes into pure bend (hold her butt, push her chest, she folds); chest is now a grab part whose IK chain is the spine (bend by hand); (2) lying/fallen bodies treat ANY grabbed limb as a body handle — pull her feet to slide/rotate her whole body on the bed; (3) sit diagnostics: Tags now shows a GREEN sphere at the computed SIT spot and PINK at the LIE spot (splits geometry bugs from behaviour bugs), and the Director is told plain 'sit' ALWAYS means edge style (crosslegged/kneel only when explicitly asked — suspected cause of the center-of-bed sits)"},{"date":"2026-07-03","ts":1783066379000,"hash":"345a3ac6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Physics probe ball: wrist Ball button spawns a throwable ball in the right hand — open fist (hand-tracking) or squeeze-end (controllers) throws with real hand velocity (6-frame average, capped 8 m/s); ballistic flight bounces off the floor (restitution .72 + rolling friction), the scanned CEILING height, the room's WALLS (floor-polygon edges as vertical planes via new spatial.nearestEdge, unit-tested), and furniture boxes (top + side faces, smallest-penetration resolution); fist near it to pick back up; ball hand is excluded from avatar grabs/pushes"},{"date":"2026-07-03","ts":1783065883000,"hash":"81d43a4c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Spatial awareness + wrist UX from live testing: (1) HARD room boundary — walk/teleport targets in scanned rooms clamp inside the floor polygon (bedroom-tuned coords can no longer send her through walls); (2) walktomiddle remapped in scanned rooms to joinuser:stand (come stand ~0.75m in front of the user, facing them); (3) the Movement Director now KNOWS her live distance from the user, with an explicit 'NOT close — she must MOVE' nudge; (4) joinuser gains a stand style and auto maps standing users to it; (5) wrist panel is intent-gated — right fist raised into the view cone for ~2s summons it, arm-drop dismisses (1s grace), 0.15m watch-sized and hugging the wrist"},{"date":"2026-07-03","ts":1783064663000,"hash":"8f5e4bf2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Physics realism batch from live testing: (1) taut limb pulls apply yaw TORQUE before feet-drag (cross-body pull swings her to face it); (2) shoulders are grabbable BODY HANDLES — tangential grip rotates her, radial slides her (hands-on-shoulders turn); (3) pushes compute the lever from the actual contact point — chest push translates, shoulder push twists; (4) sit spot moved ~12cm INSIDE the surface face (butt on mattress, shins over the lip — no more invisible ledge); (5) seated pushes: firm chest push tips her onto her back at the seat's real height; (6) wrist HOLD button freezes posed limbs (teach-by-posing foundation, she's told when engaged); (7) faceuser Director move — turn in place to face the player"},{"date":"2026-07-03","ts":1783062966000,"hash":"9dc9c033","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Plan ledger: tranche 3 shipped (wristUI + chatPanel widgets)"},{"date":"2026-07-03","ts":1783062737000,"hash":"0dbb8c0b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Modularization tranche 3: extract the VR wrist panel (lib/avatar/wristUI.ts — widget owns rendering/poke/ray hit-testing, engine supplies button actions) and the in-VR chat readout (lib/avatar/chatPanel.ts) from VrmEngine; dead _labelTexture deleted; vrm.ts 7263→7010 lines and the engine is now a binder for both widgets"},{"date":"2026-07-02","ts":1783061638000,"hash":"de9fc25e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Plan ledger: tranches 1-2 shipped (spatial + chat state/physicalPresence security)"},{"date":"2026-07-02","ts":1783061519000,"hash":"1425e5ec","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Modularization tranche 2 (chat handler) + SECURITY: extract chat/state.ts (agentBodyState + VR presence maps, pruneRoomState lifecycle wired into delete_room — room-keyed maps never pruned before) and chat/physicalPresence.ts (touch/posture/surface handlers + context injection). SECURITY FIX from the audit: avatar_physical and space_surfaces now derive the room from the SERVER-TRACKED socket state — a client payload can no longer inject touch events or surfaces into arbitrary rooms"},{"date":"2026-07-02","ts":1783060906000,"hash":"07b9b3da","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Modularization tranche 1 + governance: extract pure spatial math (anchorEdge/anchorLie/OBB/routing) from the 7.2k-line VrmEngine into dependency-free lib/avatar/spatial.ts with 13 unit tests — which immediately caught a REAL router bug (corner-picker could select the current position, burn recursion depth, and path straight through obstacles; now excluded). CLAUDE.md gains hard modularization rules (600-line budget, thin dispatchers, pure-logic-gets-tests, boy-scout extraction); CLAUDEBackend.md purged of fictional RabbitMQ/DataDog infra; docs/MODULARIZATION_PLAN.md is the canonical decomposition map for both monoliths"},{"date":"2026-07-02","ts":1783022127000,"hash":"f21ade0a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove Alexis avatar (didn't look good) — model file deleted locally and from the EC2 build context, dropdown entry removed; Shibu stays admin-only"},{"date":"2026-07-02","ts":1783021507000,"hash":"73e9cd5a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"THE bed bug, actual root cause: hologram anchors were never live — the replica seeds spaceAnchors in RECENTRED coords and its rounded areas beat the live bed in the area>=prev gate, so she targeted replica coordinates in session space (a random spot). Live mode now rebuilds the anchor map WHOLESALE each frame + clears it at hologram entry. Also: Director's walktobed/desk/tv remapped to real surfaces (stand style) in scanned rooms instead of virtual-bedroom coords, and joinuser strongly preferred when the user is lying/sitting"},{"date":"2026-07-02","ts":1783020854000,"hash":"8434354f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add Alexis avatar (user's VRoid Studio VRM export) to the MODELS picker, admin-only alongside Shibu"},{"date":"2026-07-02","ts":1783020261000,"hash":"236f305b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add Shibu avatar (DC's Sendagaya Shibu v01 VRM) to the MODELS picker, admin-only while being evaluated; Alexis pending a VRoid Studio .vrm export (.vroid project files can't be loaded by three-vrm)"},{"date":"2026-07-02","ts":1783019928000,"hash":"990f6cb4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix bed targeting root cause + grab-anything + user-referenced positioning: (1) edge/lie spots were computed toward a single room-centre reference that silently collapsed to the SESSION ORIGIN when no floor plane was detected — flipping her to the far side ('lies into the wall'); now all 4 face candidates are scored by walkable-floor validity + distance to the PLAYER; (2) any body part is grabbable (hands/forearms/head/feet/knees/shins + 2-hand hips) each with its own IK chain; (3) headset posture tracking (standing/sitting/lying + surface) feeds her context and the Director gets joinuser:sit/lie — she lies down right BESIDE the user on their surface, head the same end, cuddle distance"},{"date":"2026-07-02","ts":1783017261000,"hash":"2c6fd8fc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Tactile physics v1: two-hand hip LIFT/CARRY (she rides the hand-pair midpoint, pair rotation spins her, legs dangle airborne), GRAVITY on release (low drop = lands on her feet + flinch, high drop = crumples), player-body collision with measured force (hand/head velocity at contact) — gentle nudge = give-way + flinch, firm = stumble, hard = knocked over; knockdown sprawl + auto get-up after ~3s; all events (lift/drop/land/push+force/getup) flow into her context so she feels roughness levels"},{"date":"2026-07-02","ts":1783016501000,"hash":"0b4e3c6e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Generic surfaces + collision routing + Tags button: (1) every scanned object = a sittable surface with measured size/height; Movement Director learns the room's real surfaces and can pick siton:<surface>:<style> (edge/crosslegged/kneel/lie) with a FIT rule — lie only where her body fits, on-top styles downgrade to edge-sit on shallow surfaces; new kneel pose; client resolves geometry + real heights; (2) walkTo in scanned rooms routes around furniture OBBs via corner detours inside the floor polygon instead of the bedroom front lane (no more clipping through the bed); (3) wrist UI gains a Tags toggle for the floating labels"},{"date":"2026-07-02","ts":1783015624000,"hash":"64b678ed","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Real-furniture sit/lie: anchors gain a LIE placement (feet down the object's long axis, head toward the far end, lieYaw so tipping back lays her along the bed) and height-true pose params — sitDrop = hips standing minus the object's real top, lieLift = real mattress height — replacing the virtual-bedroom-tuned drop 0.42 / lift 0.55 that left her hovering or sunk in scanned rooms"},{"date":"2026-07-02","ts":1783014944000,"hash":"b724e395","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix stuck limb grab: hand-tracking release only checked the furniture grab map, so an open fist never released a held limb (and the stuck grab dragged her around, blocking the second hand's grab) — 'holding' now covers jointGrabs too; guard tryGrab against double-grabs from the pinch path; failsafe release after ~1s of hand-tracking loss"},{"date":"2026-07-02","ts":1783014308000,"hash":"65f8ccb9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Physical interaction v1 + sit-anchor fix: (1) anchors now carry the object's EDGE (OBB support point toward room centre) — bedsit sits on the bed edge, walksit stands outside the desk edge facing in, lie keeps centre; (2) grab her hands/head in VR (fist or grip near a joint) — CCD IK follows your hand, spine leans when over-extended, past that her body is dragged (soft ragdoll chain), eased release; (3) touch awareness: grab/release/proximity events flow to a per-room buffer injected into her context as [Physical — VR presence] so she reacts to being touched/moved"},{"date":"2026-07-02","ts":1783012900000,"hash":"4fa0cd70","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Hologram polish from first live test: hide the global 60m floor slab in passthrough (it blanked the lower half of the real room), auto-arm the mic pipeline on hologram entry (voiceCapture->server STT, armed from the VR button's user gesture via __commslinkStartVoice), floating transparent in-VR chat readout (last 5 messages as outlined text, lazy head-follow, no background card)"},{"date":"2026-07-02","ts":1783012124000,"hash":"fac131d7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"My Space HOLOGRAM mode: entering VR in a scanned space now opens passthrough AR + live scene tracking — the Quest re-detects walls/furniture in the CURRENT session's coordinates, so Eve stands in the user's real room aligned 1:1 by construction (no dolly offset, no replica); live labeled anchors mean 'sit on the bed' targets the physical bed; faint furniture outlines prove alignment; falls back to replica VR (spawn at floor centroid, Eve stepped along the long axis) if AR/spatial-data is refused; disposeSubtree now frees lines+sprites"},{"date":"2026-07-02","ts":1783011566000,"hash":"294ae519","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Scanner v3.2: depth layer self-disables when the headset declines depth-sensing (3S) — getDepthInformation THROWS on non-granted sessions; check session.enabledFeatures, isolate depth in its own guard, and stop asking after first failure so the scene pipeline + auto room-capture are never blocked"},{"date":"2026-07-02","ts":1783011199000,"hash":"4d45b5f4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Scanner v3.1 hardening: all XR features optional (a required-feature miss silently kills the session request), frame-loop crash guard (a per-frame throw = no panel/no clap/no way out), 3x-trigger finish for controller users (clap needs hand-tracking), v3 badge + stale-cache hint on page"},{"date":"2026-07-02","ts":1783010287000,"hash":"d973baf6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"My Space: Eve inhabits your scanned room — new 'myspace' scene renders the /scanner capture (real walls + labeled hologram furniture), labeled objects become her anchors (bedsit/walklie/walksit retarget to YOUR bed/desk), authed scan fetch in AvatarPanel, My Space room option + create-room scanner link"},{"date":"2026-07-02","ts":1783009772000,"hash":"30a45441","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Room Scanner v3 — scene-first: draws Meta's own Space Setup (WebXR plane/mesh detection) as labeled glowing borders + furniture boxes instead of reconstructing from raw depth; auto-launches native room capture (initiateRoomCapture) when no room data; depth points demoted to detail layer; exports labeled SpaceScan JSON; new /api/v1/space per-user save so Eve can inhabit the scanned room"},{"date":"2026-07-02","ts":1783008018000,"hash":"228cd72f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Scanner v2 — visible feedback + clap-to-end: live cyan wireframe net painted over surfaces each frame, floating status panel (point count + depth-availability warning), clap-hands gesture to finish (hand-tracking), bigger accumulated points"},{"date":"2026-07-02","ts":1783007114000,"hash":"767bfa86","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add WebXR depth scanner (/scanner): from-scratch 3D reconstruction — immersive-AR + WebXR Depth Sensing, un-projects per-frame metric depth to world points using the headset pose, accumulates a voxel-deduped point cloud you watch build over passthrough, exports .PLY. Standalone page, isolated from /chat"},{"date":"2026-07-02","ts":1783005724000,"hash":"b5e37afa","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Self-heal corrupt room layouts on load: clamp widthFt/lengthFt to 4-60, heightFt 6-20, reset implausible off-origin centers (>40ft) — so a past resize runaway (a 399ft room 65ft off-origin) can't strand the user with unreachable walls"},{"date":"2026-07-02","ts":1783005078000,"hash":"24b1a665","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix wall resize shooting to infinity: reject implausible/NaN resize targets (a near-horizontal telekinesis ray hits the floor near-infinitely far; a glitched hand joint can be NaN) and hard-cap the room dimension to 4-60ft, instead of resizing the room to infinity"},{"date":"2026-07-02","ts":1783004439000,"hash":"eaa372bd","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Wrist UI rebuilt from scratch: ONE crisp canvas-rendered panel (rounded dark card, MY ROOM title, dims/prop status, 5 styled buttons Reach/Next/Place/Save/Exit) instead of 5 fighting planes — POKE a button with your other index finger to press it (ray+pinch still works too). Fixes the empty-blue-panel + facing + occlusion issues"},{"date":"2026-07-02","ts":1783003805000,"hash":"14b6d6f5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Wrist UI content fix: panel was backwards (Object3D.lookAt aims +Z not -Z) so you saw the blank blue backing — now faces you; content (display + Reach/Next/Place/Save/Exit) forced on top (depthTest off) so the panel cannot occlude it"},{"date":"2026-07-02","ts":1783003304000,"hash":"93773228","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Wrist UI reliability: double-sided panel (was a single-sided plane invisible from the back), ALWAYS visible while a hand is tracked (removed the fragile watch-pose distance gate that never triggered), robust wrist-joint lookup (either hand), and correct billboard so the face turns toward you"},{"date":"2026-07-02","ts":1783001754000,"hash":"b6c604d1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"VR fixes: (1) wrist UI now rides the tracked WRIST JOINT + billboards to you (was pinned to the controller grip = invisible with hand-tracking); (2) My-Room placed furniture (bed etc.) is now grabbable; (3) furniture checked BEFORE walls (+ tighter wall threshold) so you stop grabbing the wall by accident"},{"date":"2026-07-02","ts":1783000653000,"hash":"97a333ae","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Security hygiene: remove stray agent binary, untrack local .vscode DB creds"},{"date":"2026-07-02","ts":1782999796000,"hash":"c53df9e0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"VR: two-handed manipulation (grab a furniture cluster with BOTH hands → move+rotate+orbit it rigidly like a real object; clusters re-pivoted to their centre so rotation spins in place); laser rays HIDDEN by default; Telekinesis mode (wrist 'Reach' button) toggles the rays on + enables far grabbing by pointing+fisting; fancier wrist screen (border, 5 buttons, reach-state)"},{"date":"2026-07-02","ts":1782998745000,"hash":"ae10aeee","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix: can't release a grabbed object with hands — added missing selectend->release (pinch-release was never wired, so a hand-grab got stuck). Also hide the grip blob while a real hand is tracked so hands look identical in every room"},{"date":"2026-07-02","ts":1782997985000,"hash":"2c116792","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Controller-free hand-gesture grabbing: detect a FIST/grab gesture from the tracked finger joints (fingertips curled toward the wrist) → grab; open hand → release. Grab now uses the palm position (hand-tracking) or the controller grip. Close your hand around an object (e.g. the dresser) to move it, no controller needed"},{"date":"2026-07-02","ts":1782997266000,"hash":"f73e3bc9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix: VR button could vanish — decouple WebXR check from engine/ready (check navigator.xr on mount); My-Room layout loads in background (never blocks readiness)"},{"date":"2026-07-02","ts":1782996187000,"hash":"e3d62d75","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Room walls: asymmetric resize (grab a wall → opposite wall PINNED, only the grabbed side moves) + ROTATE by dragging a wall sideways (room pivots on the far wall). Room now tracks centerX/centerZ/rotation; walls tagged by side; furniture follows the room transform; near-grab works room-local so it's rotation-aware"},{"date":"2026-07-02","ts":1782994856000,"hash":"6be4fe58","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Grab fix (hand-model init non-fatal so furniture stays grabbable) + FASTER DEPLOYS: deploy-ec2.sh no longer nukes the build cache every deploy (gated on disk >=80%) so yarn-install stays cached — was forcing a cold ~5min build every time"},{"date":"2026-07-02","ts":1782992396000,"hash":"08975c02","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"VR iteration: laser-pointer rays on both hands (grab far/unreachable walls + furniture via ray, resize by pointing where you want the wall); ray-based wrist buttons (fixed) + Exit VR button; finger-tracked hand models (XRHandModelFactory spheres) for Quest hand-tracking; warm ceiling light in My Room so the floor reads like the lamp-lit bedroom"},{"date":"2026-07-02","ts":1782990610000,"hash":"75f56e99","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"My Room polish + VR editing: floor carpet matches other rooms + egg-shell white walls; furniture now scaled per-prop (PROP_SIZES) not tiny default; VR grab-a-wall to resize the room (drag perimeter walls, symmetric, snaps 0.5ft, persists); prototype wrist UI (right-wrist watch screen on watch-pose, left trigger presses Next/Place/Save to cycle+drop furniture)"},{"date":"2026-07-02","ts":1782988995000,"hash":"c2459f18","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Room builder Phase B+C: top-down floor-plan editor (SVG) — draw interior walls (2 clicks), cut doors in outer walls, place furniture from the prop library, erase; engine buildRoomShell now splits walls for door gaps + applyRoomLayout reloads furniture live. Full custom-room build: dimensions + walls + doors + furniture, persisted + walkable in VR"},{"date":"2026-07-02","ts":1782987315000,"hash":"442decaf","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Room builder Phase A: room selector dropdown (Eve's Room / Studio / My Room) + 'myroom' scene template with procedural wall shell built from user dimensions (buildRoomShell, feet->metres, 4 perimeter walls + interior-segment support); Room builder panel sets W/L/H (ft), persists via /api/v1/avatar/layout (template=myroom), rebuilds walls live. Foundation for walls/doors/furniture (Phase B/C)"},{"date":"2026-07-02","ts":1782985268000,"hash":"c15aa9b2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"VR furniture grab-and-slide: group room props into 5 movable clusters (bed+lamp+laptop, computer desk, electronics desk+shelf, TV+stand, standing lamp) via Group.attach; squeeze the grip to grab the cluster your hand is inside, slide it along the floor (X/Z), release to drop. WebGL-only (CSS3D screens don't render in VR)"},{"date":"2026-07-01","ts":1782970658000,"hash":"daa0ba80","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"WebXR VR (Meta Quest 3) for /chat: renderer.xr + setAnimationLoop loop conversion; VR goggle button (shown only in WebXR browsers) enters immersive-vr; player dropped into the room via a dolly rig (invisible body, head=headset); controllers -> visible hand blobs; orbit/fly-cam + CSS3D gated during a session"},{"date":"2026-07-01","ts":1782955654000,"hash":"f75bf2e4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Animation builder v3: fix 'stands there doing nothing' — builder commands now drive the re-prompt loop (hasDataCommands) so she PROGRESSES keyframe-by-keyframe across passes and finishes at {anim_done}, instead of starting a session and stalling. Prompt flipped from 'wait for user' to autonomous progression + 'actually emit the commands, don't narrate'"},{"date":"2026-07-01","ts":1782938644000,"hash":"1e572e5e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Animation builder v2: fix motionless-build bug (one {anim_step} per message — multiple would snapshot the same final pose); loud per-keyframe chat logging (shows the pose + timing); {anim_undo} to redo a keyframe the user flags; clear 'finished + playing' message; pacing rule so the user can watch + interject"},{"date":"2026-07-01","ts":1782931877000,"hash":"007849c5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Guided animation builder: {build_animation}->{anim_step transition:MS hold:MS}xN->{anim_done} lets the AI compose animations one decision at a time (auto-saves+tests; holds via repeated keyframe). Prereq: {avatar_move} now shadows the server working-pose so pose_save/anim_step capture DOF poses. anim_delete now removes authored library clips too"},{"date":"2026-07-01","ts":1782929936000,"hash":"5e99d0c3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"AI body control: {avatar_move <dof> <deg>} command lets the agent drive all 39 semantic joint DOFs directly (mapped+clamped client-side via the calibrated map); wired across handler (regex/tool/prompt/strip/hasAnyCommand/exec) + AvatarPanel socket->setDof"},{"date":"2026-07-01","ts":1782928535000,"hash":"d4cda71c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Joint Config: expand to full humanoid DOF set (39) — add hip spread/rotate, shoulder/wrist/knee/ankle/spine planes; existing motions widened bidirectional (arms/thighs swing fwd+back)"},{"date":"2026-07-01","ts":1782927520000,"hash":"d07bcc23","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar Joint Configuration: semantic DOF layer (descriptive named joint controls mapping to VRM bone axes, anatomically ranged) + Joint Config UI to test/calibrate/save each mapping by eye"},{"date":"2026-07-01","ts":1782918563000,"hash":"8dc2ad51","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Agentic executor: ENSEMBLE strategy — mirror a blend of the top-5 algos (averaged position weights) capped 20%/name, instead of the single #1. Kills the daily whipsaw that swung the account to gold+70% cash when one defensive algo topped the board"},{"date":"2026-07-01","ts":1782907722000,"hash":"6cac3350","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove the one-shot lab2 E2E verification block from deploy-ec2.sh (pipeline verified — 2 champions injected OK; weekly cron takes over)"},{"date":"2026-07-01","ts":1782907174000,"hash":"91e3f119","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"One-shot: end-to-end verify the lab2 champion-injection pipeline via the sanctioned deploy path (tiny backtest + inject 2 champions, marker-guarded)"},{"date":"2026-07-01","ts":1782906653000,"hash":"46c594ca","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Ligo Tier 3 champion-injection pipeline: lab_v2 keeps champion genomes + new inject_champions() inserts top-K OOS champions into the LIVE pop as IMMIGRANTS (add, not replace); --inject-live CLI + weekly Mon 06:00 UTC cron (backtest -> inject top-5). Bridges offline OOS rigor to live walk-forward evolution"},{"date":"2026-07-01","ts":1782905839000,"hash":"4058f03b","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Ligo evolution Tier 2+3-scale: CROSSOVER (instrument-row recombination of 2 parents), RANDOM IMMIGRANTS (15% of births = fresh novelty), FAMILY_CAP=12 (break the ms_klarman monoculture), and GROW toward POPULATION_TARGET=300 (+5/cycle) instead of drifting down"},{"date":"2026-07-01","ts":1782905411000,"hash":"2d6add0b","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Ligo evolution Tier 1: unfreeze the algo population — rank by RETURN (total_value/initial_capital) not raw dollars, child capital parity (100k), GRACE_DAYS=20 newborn audition before culling, gentle daily churn (10%->3%), replace-each-death so population stops shrinking; add+backfill initial_capital column"},{"date":"2026-07-01","ts":1782902969000,"hash":"aebd3c26","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Agentic rebalancer: fix 'Not enough shares to sell' — place SELLs by share quantity clamped to shares_available_for_sells (round down), instead of dollar-based sells that overshot on a stale quote; deploy-ec2.sh now syncs rebalance.mjs into the api secrets volume"},{"date":"2026-06-30","ts":1782811472000,"hash":"a3a37e2e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 FPS Phase 2b: CITY CAPTURE — clear an enemy city's defenders + hold it on foot → it flips to you KEEPING its buildings (vs raze). New server world.ts capture() + capture socket handler + Net.sendCapture; client tryCapture + progress HUD"},{"date":"2026-06-30","ts":1782810997000,"hash":"664a763e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 FPS Phase 2a: player MARINE SQUAD — 6 friendly marines deploy when you go ashore near an enemy city, follow you in formation + engage the defenders; soldier AI generalized to target nearest hostile (both sides fight each other + you); friendly fire passes through your own squad"},{"date":"2026-06-29","ts":1782787462000,"hash":"327376bb","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 FPS Phase 1b: city DEFENDER soldiers (2 per military building + 1 per 10 pop, client-side from each enemy city) — guard/patrol, engage on sight + shoot back; player rounds drop them (swept IFF hit test); player gets on-foot HP + hurt flash + respawn at carrier"},{"date":"2026-06-29","ts":1782785822000,"hash":"6979bf21","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 FPS Phase 1a: 3-weapon system on foot — Pistol/Rifle/Sniper with scroll-wheel swap, per-weapon fire-rate/damage/mag/spread, sniper scope (strong zoom + overlay, hides viewmodel), weapon HUD"},{"date":"2026-06-29","ts":1782776157000,"hash":"8cbaf619","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: gold ★ in front of capital city names on the in-world (non-map) floating labels — drawLabel now renders the capital star like the globe/map does"},{"date":"2026-06-29","ts":1782770596000,"hash":"07a185d8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar editor: add Body tab — reshape head/chest/waist/arms/hands/thighs/calves/feet via bone scale (clothing conforms); Clothing+Body tabs, saved per-model"},{"date":"2026-06-29","ts":1782767180000,"hash":"f9d39d69","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch party: instant hard-OFF — red X now kills the YouTube player immediately + clears server state (no refresh resume); stopVideo before destroy so audio can't leak when the player relocates. api force-recreate clears the stuck in-memory party"},{"date":"2026-06-29","ts":1782759854000,"hash":"edd42489","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: in-panel Wardrobe editor — recolor + show/hide each clothing part (live, saved per-model); toggle via Clothes button or C key"},{"date":"2026-06-28","ts":1782709435000,"hash":"c53af613","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Ops: deploy.sh forwards OPENAI_API_KEY into prod .env.production (sanctioned path; value never committed) — activates chat AI semantic memory embeddings"},{"date":"2026-06-28","ts":1782709089000,"hash":"65a19200","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Chat AI semantic long-term memory: RAG retrieval + activation model (cosine+salience+recency+recall-freq) over agent.memories, reinforce-on-recall, decay+prune; OpenAI text-embedding-3-small adapter; graceful recency fallback when no key"},{"date":"2026-06-28","ts":1782705896000,"hash":"21639180","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Ops: remove the one-shot xlweb teardown block (decommission complete)"},{"date":"2026-06-28","ts":1782705524000,"hash":"41d2e4b7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Ops: one-shot retire FFXIVPlugins (xlweb/XLWebServices) - remove container/image/volume + nginx site + project dir (decommissioned)"},{"date":"2026-06-28","ts":1782704078000,"hash":"783d5336","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Ops: auto-prune stale Docker images + build cache after every deploy + install a weekly safety-net prune cron - fixes the recurring EC2 disk-fill (was 279 images/155GB reclaimable)"},{"date":"2026-06-28","ts":1782644811000,"hash":"733b0dbd","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: ship the client capital changes that were missed in the last sync - isCapital now reads the server capital flag (★ shows without a Command Center) + onWorld reconcile + star placed flag·★·name"},{"date":"2026-06-28","ts":1782643432000,"hash":"8362f8d4","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: FIX nation city naming - city name was passed to claim's ownerName arg (3rd) so it fell through to the Greek/Roman autoCityName; now passes real name as the 4th (cityName) arg + marks the first city as capital (server flag) so the gold star shows immediately; fresh wipe v7 to re-found with real capitals"},{"date":"2026-06-28","ts":1782642807000,"hash":"9841a8ff","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: force fresh map wipe (geo_reset_v6) + fix client onWorld to neutralize islands absent from the full snapshot (wiped cities now actually disappear on reconnect, not just linger client-side)"},{"date":"2026-06-28","ts":1782642368000,"hash":"4bd2e693","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: full map reset (geo_reset_v5) - wipe all cities + restart resets AI factions so they re-found fresh, to test capitals forming with real names + the gold star"},{"date":"2026-06-28","ts":1782640745000,"hash":"d7b834c2","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: carrier build QUEUE - queue jets/torps/heli/patrol/E-3/SR-71 (caps: 1 SR-71, 2 E-3, 3 heli, 5 patrol, 20 total aircraft); builds front-of-queue when affordable, waits otherwise; persists to server so it keeps building as money allows after logoff"},{"date":"2026-06-28","ts":1782639923000,"hash":"d1c7167b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: capital star was on the unused 2D nav-map; in SPHERE mode M opens the GLOBE - moved the gold capital ★ to the globe city labels (shows on any city with a Command Center, for all to see)"},{"date":"2026-06-28","ts":1782635523000,"hash":"f2a7a5e3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: NPC carrier CAP now actually defends - chase speed 88->98 (a slight edge over a player jet's max so it can close + gun attackers instead of trailing/circling), acquire range 1500->2600, leash 2700->3600, gun range 95->130"},{"date":"2026-06-28","ts":1782633948000,"hash":"e27de120","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 city defense 3/3: an attacked city with a bomber doctrine (aggressive nations) sorties its bombers at the attacker's nearest carrier - pressuring you to peel jets back to defend your own flagship"},{"date":"2026-06-28","ts":1782633730000,"hash":"e26908ee","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 city defense 2/3: airports now have a default AA flak gun (aa:true) - enemy cities throw orange flak with a 560-unit umbrella + 2 dmg at attacking planes, making cities costlier to attack"},{"date":"2026-06-28","ts":1782633502000,"hash":"210b6bc7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 city defense 1/3: a threatened city now scrambles its FULL fighter screen fast (doctrine jet allotment, up to 5; defensive nations all-jets, aggressive reserve bomber slots) instead of a token 2 - clusters of cities field a real wall of fighters"},{"date":"2026-06-28","ts":1782631660000,"hash":"4a9119c3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Trade Ports 1b: trade ports stockpile their city's resource each turn (capital port -> capital store, others -> per-city buffer); top HUD now reads your capital's stockpile; cargo ships load port stock + deliver to the capital; city panel shows port stock + capital marker"},{"date":"2026-06-28","ts":1782630891000,"hash":"0e020227","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: polar cities were buried under the pack ice - ice floes now keep a clearing around every island (lap up to the shore, never cover the land) so south-pole cities are visible + reachable"},{"date":"2026-06-27","ts":1782625873000,"hash":"0d6297ed","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: AI carriers fly a FULL air wing - doctrine loadouts bumped (6-12 fighters) + flagship CAP now follows the doctrine (up to 8 aloft, 12 at battle stations) instead of a flat 3; raised the faction plane ceiling to 26"},{"date":"2026-06-27","ts":1782619931000,"hash":"85e407c8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: NPC nations name their FIRST city after the real-life capital + later cities after real cities of that country; one Command Center per nation on the capital (so it's the sole starred capital)"},{"date":"2026-06-27","ts":1782618225000,"hash":"c3f69110","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Trade ports 1a: replace city Air Heli with Trade Port building (needs a Command Center/capital), register port server-side, + gold capital star on the M-map"},{"date":"2026-06-27","ts":1782617271000,"hash":"bf9faf74","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: K menu now shows the AIR WING - every carrier plane with its pilot + status, deck-slot count (used/free), and a Command Center warning so the E-3/SR-71 lock is obvious"},{"date":"2026-06-27","ts":1782616851000,"hash":"0a5b54dd","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: greyed-out build tiles now show WHY (e.g. 'Missing Command Center' for E-3/SR-71) instead of just dimming - mirrors the buy gate exactly"},{"date":"2026-06-27","ts":1782577126000,"hash":"ce7bae8e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: long-endurance E-3/SR-71 fuel (1500/1000s vs 300) so the slow far-orbiting E-3 stops running dry mid-return and crashing; refuel still 2min"},{"date":"2026-06-27","ts":1782576007000,"hash":"1814befa","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: harden plane save/restore - persist bought E-3/SR-71 by an explicit bought flag + callsign (not array position) so a lost starting fighter can never drop them; also save carrier-deck purchases instantly"},{"date":"2026-06-27","ts":1782573328000,"hash":"e8512d36","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: player-centered world bend - re-center the globe projection on the eye each frame so walking/aiming/lock-on/bombsight are undistorted at ANY latitude (was equirectangular, only correct at the equator)"},{"date":"2026-06-27","ts":1782571755000,"hash":"5106af12","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: server-authoritative carrier routes (waypoint/series/loop) persisted in DB — ships keep sailing while the tab is backgrounded or the player is offline"},{"date":"2026-06-27","ts":1782568365000,"hash":"1a7dcb0a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI #4 — heli-claim (the 'both' model): the flagship claims only UNCONTESTED land itself; when only CONTESTED land is left in reach it dispatches an expendable claim-HELICOPTER (flyClaim: flies in, founds the city, RTBs + despawns) so it never sails into harm's way to expand. Down the heli = cost a heli, not an empire"},{"date":"2026-06-27","ts":1782567955000,"hash":"dc1c5c43","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI #3 — caught = real fight: a flagship that DETECTS attackers goes to BATTLE STATIONS, scrambling a much thicker CAP screen (6 vs 3) and replacing losses fast, so a carrier strike costs the attacker losses + time instead of a free 2-min kill. Persists 14s after the last threat"},{"date":"2026-06-27","ts":1782567623000,"hash":"1eeac3b0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI #2 — opportunistic carrier strike (the war-ender): a faction that has SCOUTED an enemy carrier (fog of war) and holds a clear force edge launches a bomber package at it; bombs hit the HULL (reuses applyHit → death → empire collapse). Rare (csCd), reserve kept, flagship not risked. Targets rival bots AND weakly-defended human carriers"},{"date":"2026-06-27","ts":1782566939000,"hash":"ed0ac26d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI intel #2: SR-71 deep-recon scout — expansionist factions fly a fast, shootable SR-71 on a deep-recon shuttle toward the nearest rival (extends fog-of-war coverage along the threat axis; falls back to a home picket if no rival). Down it to cut the faction's deep eyes"},{"date":"2026-06-27","ts":1782566356000,"hash":"609384de","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI intel (full fog-of-war, increment 1): the AI now only REACTS to enemy forces its own sensors cover (short carrier radar + city radar + fighter eyes + a wide E-3 picket). Wealthy factions fly a shootable E-3 high over the flagship for early warning; down it and the carrier is blind beyond its small radar bubble — sneak a strike in. Carrier flee is now fog-gated"},{"date":"2026-06-27","ts":1782565541000,"hash":"ddc4e57e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI Phase 1 (carrier survival): flagship no longer sails into CONTESTED waters to claim (nearestNeutral skips islands with foreign forces) + FLEES proactively when a 4+ plane foreign strike wing closes in (was only retreating once already damaged). Fixes free empire kills"},{"date":"2026-06-27","ts":1782564073000,"hash":"01436df0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 standings: power is now territory+military (cities+buildings+hull) for AI AND players alike — was folding the AI's huge credit hoard into its score, so a cash-rich bot read ~2000 power vs a player's ~50; cash stays surfaced as wealth"},{"date":"2026-06-27","ts":1782553417000,"hash":"b084a36","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"scrambleCrew: L re-launches landed starting-crew jets (were stuck 'gone' → never relaunched, leaving 3 jets + pilots parked)"},{"date":"2026-06-27","ts":1782553406000,"hash":"ae944190","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: L now re-launches landed starting-crew jets — they were stuck 'gone' after one sortie so L skipped them, leaving 3 jets + their pilots parked on deck forever"},{"date":"2026-06-27","ts":1782553040000,"hash":"31390ab","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"K (crew) menu: cap panel at 90vh flex-column; roster scrolls, header/hire buttons pinned (no more off-screen overflow)"},{"date":"2026-06-27","ts":1782553019000,"hash":"6db75c21","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: K (crew) menu no longer overflows the screen — panel capped at 90vh as a flex column; the pilot roster scrolls while the title, engineer line and Hire buttons stay pinned"},{"date":"2026-06-27","ts":1782552744000,"hash":"3d1c4d69","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing: remove the FFXIV Plugins project card"},{"date":"2026-06-26","ts":1782475351000,"hash":"f5589dc","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Tutorial quest system: 19 teaching missions under Standings, 2 at a time, 2M reward each, completion hooked to real actions + persisted"},{"date":"2026-06-26","ts":1782475343000,"hash":"16fcc79e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: tutorial QUEST system — 19 teaching missions under the Standings panel, 2 shown at a time, 2M cr reward each; completion wired to real actions (buy tbomber, recruit/launch pilots, lock+engage city, land, patrols, found city, build airport/residence/fishing, command center, raze city, ally, trade, orbit, pilot destroyer/battleship/sub, nuke, sink an empire); progress persists"},{"date":"2026-06-26","ts":1782473802000,"hash":"94da30f","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix duplicate pilot figures: rail figures sync to plane state (hidden when flying / beside landed plane / being piloted), not the desync-prone boarding state machine"},{"date":"2026-06-26","ts":1782473792000,"hash":"82d61e9d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fix duplicate pilot figures — a landed pilot showed BOTH at the port rail AND beside their plane; rail figures now sync to each plane's real state (hidden when flying/landed-beside-plane/being-piloted) instead of the desync-prone boarding state machine"},{"date":"2026-06-26","ts":1782471660000,"hash":"9a34a5a","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Flags on M-map city labels; only the whole city is targetable (no building lock); name+flag above every owned city out to 6km"},{"date":"2026-06-26","ts":1782470324000,"hash":"081bf976","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: flags on M-map city names; ONLY the whole city is targetable (removed individual-building lock); name+flag label above EVERY owned city, visible out to 6km (well past 500m)"},{"date":"2026-06-26","ts":1782469508000,"hash":"ac8ed06","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Country flags: low-poly flag renderer (~100 countries) shown next to city names, enemy carrier labels + globe city sheet"},{"date":"2026-06-26","ts":1782469299000,"hash":"1fbc8cb9","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: ~100-country AI faction pool with RANDOM reroll on death + low-poly country flags shown next to enemy city names, enemy carrier labels, and the globe city sheet (data-driven flag renderer)"},{"date":"2026-06-26","ts":1782468050000,"hash":"f9c3556","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix sunk peer/bot carrier looping its sink animation (don't respawn a rig for an already-sunk peer)"},{"date":"2026-06-26","ts":1782467860000,"hash":"eb92340a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fix sunk peer/bot carrier looping its sink animation — a dead carrier broadcasts k:1 forever, so after we removed the rig the next broadcast respawned a fresh surface carrier that re-sank; now skip re-creating a rig for an already-sunk peer"},{"date":"2026-06-26","ts":1782467653000,"hash":"9660b1c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Build bar: enforce one airport per city (block a 2nd on a city that already has one)"},{"date":"2026-06-26","ts":1782467460000,"hash":"aa3b401c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 build bar: enforce ONE airport per city (a city that already has an airport greys out + blocks a 2nd)"},{"date":"2026-06-26","ts":1782467106000,"hash":"d1d6dd4","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Build bar: measure city range from the player (not the carrier) + block builds on greyed-out (disabled) tiles"},{"date":"2026-06-26","ts":1782466913000,"hash":"7c9183bd","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 build bar: (1) range now measured from YOU (piloted unit/avatar) not the carrier — no false SAIL CLOSER when you're at a city without your ship; (2) clicking a greyed-out tile no longer builds (buildBarBuy honours the same ready+afford gate)"},{"date":"2026-06-26","ts":1782466340000,"hash":"07b9d9e4","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 bots: fix ghost city-claiming — AI no longer claims islands from afar; flagship must SAIL into claim range before founding (visible claim sortie, player parity). Adds bot.claimTgt + sortie logic in moveAndRaid"},{"date":"2026-06-26","ts":1782465355000,"hash":"e707b80","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Bombers fly a racetrack attack run (run-in/overfly/extend-out/wide-turn) instead of orbiting the target"},{"date":"2026-06-26","ts":1782465159000,"hash":"cf755233","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: bombers/torpedo bombers now fly a racetrack attack run (run in, drop, overfly, extend out, wide turn, run back in) instead of orbiting the target — fixes them circling a city/ship without ever dropping"},{"date":"2026-06-26","ts":1782464640000,"hash":"2f60a4f","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix wingmen ignoring LAND/RTB: fast jets orbited outside the touchdown ring; add approach slow-down + near-deck timeout, shared landWingman() touchdown"},{"date":"2026-06-26","ts":1782464440000,"hash":"ac919fef","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fix wingmen ignoring LAND/RTB — fast jets orbited outside the 95m touchdown ring forever; add slow-down on approach + a near-deck timeout so they all reliably set down (shared landWingman touchdown)"},{"date":"2026-06-26","ts":1782462595000,"hash":"1471e0d","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"LAND order: wingmen B-line to the carrier and land on contact, all at once (no conga-line queue)"},{"date":"2026-06-26","ts":1782462407000,"hash":"c0ee381f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: LAND order = all wingmen B-line straight to the carrier and land on contact, all at once (removed the slow astern conga-line queue)"},{"date":"2026-06-26","ts":1782461565000,"hash":"b6bb44c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Wingmen: out-of-ordnance bombers RTB to rearm + auto-relaunch to resume the attack"},{"date":"2026-06-26","ts":1782461373000,"hash":"4978db42","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: torpedo bombers now auto-RTB to rearm when out of torpedoes and resume the attack (was circling empty); fixes wingmen never relaunching after refuel/rearm"},{"date":"2026-06-25","ts":1782453319000,"hash":"4fbf47ed","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: M-map city click now shows a detail sheet (population, income, materials produced, fishing fleet, garrison aircraft, air defence, buildings)"},{"date":"2026-06-25","ts":1782451499000,"hash":"657439b","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Faction colors: real-nation palette (USA/UK/France/Japan/China/Russia + spawn-in nations)"},{"date":"2026-06-25","ts":1782451281000,"hash":"19070473","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: AI factions now use real nation names (USA/UK/France/Japan/China/Russia + pool) with distinct flag-flavored faction colors"},{"date":"2026-06-25","ts":1782445233000,"hash":"63d4c3e6","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: pull flower beds back so they don't overlap the cross sidewalk + add grass clearance from the path"},{"date":"2026-06-25","ts":1782444150000,"hash":"7af7f5d6","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: add flower beds lining both sides of the entrance path"},{"date":"2026-06-25","ts":1782443000000,"hash":"baa8ab51","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: move reception desk back-left (out of mid-room) + mount RECEPTION sign on the counter front face instead of floating"},{"date":"2026-06-25","ts":1782442740000,"hash":"debe1863","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: fix ceiling z-fighting - lower interior ceiling below the exterior roof slab + drop light fixtures so they don't poke through"},{"date":"2026-06-25","ts":1782442471000,"hash":"9efec764","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: move Configure button to top-left so it no longer overlaps the chat panel close (X) button"},{"date":"2026-06-25","ts":1782442100000,"hash":"6c5dca75","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: proper door proportions (~1.0w x 2.1h single doors), single conference door, and double GLASS front entrance doors that swing open together"},{"date":"2026-06-25","ts":1782441809000,"hash":"b6ffbe6a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Virtual Office: fix chat close button - Configure gear (z40) was covering the X; raise chat panel to z100 so X is visible + clickable"},{"date":"2026-06-25","ts":1782441478000,"hash":"1df39532","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Virtual Office: make the chat close (X) button clearly visible - bordered 36px button instead of a faint character"},{"date":"2026-06-25","ts":1782439514000,"hash":"5dd932a3","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: wire up talking - POST /api/v1/office/ask (Grok persona from staff knowledge, auth+rate-limited); walk up + press E opens a right-docked chat panel that talks to that AI"},{"date":"2026-06-25","ts":1782437583000,"hash":"b3c6f56f","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: config UI at /office/config - building sign + staff manager with paste-friendly per-AI knowledge boxes, color swatches, JSON import/export, localStorage persistence; /office now loads saved config + Configure button"},{"date":"2026-06-25","ts":1782435353000,"hash":"f57ff5e7","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: quality pass - ACES tone mapping + IBL reflections + sun shadows, realistic monitor/keyboard/mouse, 5-star office chair, door casings, baseboards, tiled floor, better trees/curb/streetlights, hair on figures"},{"date":"2026-06-25","ts":1782430585000,"hash":"65727331","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: reorganize offices - desk faces door, office chair behind it, AI seated facing the door"},{"date":"2026-06-25","ts":1782430095000,"hash":"5ede18f8","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: glass windows on exterior walls - each office, conference room, and front facade (see-through with sill/header + mullions)"},{"date":"2026-06-25","ts":1782429603000,"hash":"765ac67a","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: go outside - sunny day sky+sun, grass/road/sidewalk to entrance, openable front door, spawn outside facing building, configurable building sign (default 'Office')"},{"date":"2026-06-25","ts":1782428203000,"hash":"85cfa8bd","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: E-key to open doors + 'Press E to open door' prompt when aimed at a door"},{"date":"2026-06-25","ts":1782427592000,"hash":"43d1481f","repo":"commslink2","author":"puppyprogrammer","project":"office","label":"Virtual Office","version":null,"title":"Virtual Office: wooden swinging doors, brighter lighting, reception kiosk, conference room, fixed nameplates, /office no-store"},{"date":"2026-06-25","ts":1782424976000,"hash":"050bee31","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Add Virtual Office (Phase 1): walkable 3D office shell + landing card"},{"date":"2026-06-24","ts":1782369075000,"hash":"82ac2eba","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"AI navy: announce ship commissioning in the world feed + log carrier00 world events to console for monitoring"},{"date":"2026-06-24","ts":1782368891000,"hash":"ca9a1d29","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"AI navy P1+P2: bots build a real warship fleet (destroyer/battleship/sub) from dock-cities at player-parity cost+cooldown, broadcast on the sh peer channel so all clients render+scout them (world-domination groundwork)"},{"date":"2026-06-24","ts":1782367601000,"hash":"3d334300","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"AI: ghost-empire cleanup on boot — release orphaned bot:Name cities (no live faction) back to neutral so dead empires stop clogging the map"},{"date":"2026-06-24","ts":1782361257000,"hash":"e2302422","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Standings: POWER shows ALL factions (humans were buried under top-6 AI) + new ONLINE tab listing online captains (AI excluded)"},{"date":"2026-06-24","ts":1782353419000,"hash":"af6f0e53","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Crew XP: credit bombs/torpedoes too (bomb owner was unset) + razing enemy buildings, carriers, warships — fixes pilots stuck at 0"},{"date":"2026-06-24","ts":1782311996000,"hash":"c4a759b9","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI: strict 5-plane HANGAR cap per airport-city (CITY_HANGAR=5) — total aircraft anchored to a city (garrison + staged strike package) can't exceed 5, matching the player's hangar. Garrison scramble + strike launch both check hangar room; a strike picks the nearest airport-city WITH space. Completes full player/AI parity. tsc clean, 74 tests pass"},{"date":"2026-06-24","ts":1782308974000,"hash":"cd0ed3cc","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI: SCALING-cost parity — the AI paid FLAT for foundations/housing while the player's double each time. Now matches: foundation = 40k·2^(cities owned), housing = 30k·2^(housing in that city). Endless AI sprawl + housing-carpeting is now exponentially expensive like the player's. (Airport gate for city planes was already enforced.) tsc clean, 74 tests pass"},{"date":"2026-06-24","ts":1782308387000,"hash":"9ec67483","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI: full cost+cooldown PARITY with the player build UI. Building costs aligned (dock 60k->40k, Command Center 90k->2M); plane costs aligned to the player's real prices (fighter 8k->26k, tbomber 20k->120k, heli 12k->30k, bomber 25k->40k, AWACS 80k->8M, SR-71 120k->10M); added a 180s per-building cooldown (BUILD_COOLDOWN) so the AI builds at the player's tempo instead of stacking one every ~2.5s. Now the AI's economy/attrition bites at the same rate the player's does. tsc clean, 74 tests pass"},{"date":"2026-06-24","ts":1782307612000,"hash":"772f58d8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI fairness: fishing-boat restock now SYMMETRIC. AI cities were refilling their fishing fleet +1 every 5s (bundled in the 5s world loop) vs the PLAYER's free +1/city every 5min (FISH_PRODUCE=300s) — 60x faster, so raiding an AI fleet was pointless. Moved tickBoats to its own 300s interval to match the player exactly. Principle: timers/economy that gate the player gate the AI too. tsc clean, 74 tests pass"},{"date":"2026-06-24","ts":1782307287000,"hash":"178c6531","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI fix: city garrison had NO launch cooldown — it re-scrambled fighters every 18Hz frame as they died in combat, which both spat out jets with no delay AND drained the faction's credits at 8k/pop (Reaper bankrupting itself). Added GARRISON_REPLENISH (7s): one garrison scramble/replacement per cooldown across a faction's cities, with a per-spawn break. Now jet output + credit burn are sane. tsc clean, 74 tests pass"},{"date":"2026-06-24","ts":1782306073000,"hash":"04cedab7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI: RANDOMIZED bot home placement — removed the fixed 'index 0 = strategic rival in archipelago A1 next to the player' rule. AI factions now spawn at random, distinct, far-apart archipelagos (seeded shuffle), NEVER on the player's home cluster (A1 excluded); reroll + spawn-ins also pick a random clear archipelago. Plus: empire-collapse log — when a faction's carrier is sunk and its cities release, broadcasts '💥 <name>'s empire has collapsed — N cities released to neutral'. tsc clean, 74 tests pass"},{"date":"2026-06-24","ts":1782304961000,"hash":"55b59dc8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI: plane attrition economy — CAP fighters, city-garrison scrambles, and city-to-city strike packages now COST credits (fighter 8k / tbomber 20k / etc). Losses must be paid to replace, so sustained air war drains a faction's war chest; a broke faction can't keep its screen up or mount strikes and weakens. Defense spends freely (survival); offense keeps the personality reserve intact. Gives the hoarded millions a real sink + sets up big-ticket plays. tsc clean, 74 tests pass"},{"date":"2026-06-24","ts":1782304141000,"hash":"6e248ea1","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI step 2: CITY-TO-CITY STRIKES (the default bot attack). When a developed bot wants a rival/human city in reach, it launches a bomber package (2 torpedo bombers + 1 escort fighter) from its nearest airport-city — server-flown, broadcast in s.pl so nearby players SEE the strike crossing between cities. Bombers raze the target's buildings (server-authoritative bldHit); the target city's garrison scrambles to defend (existing CAP); last building down → island frees up to claim. One sortie at a time, RTB to rearm, no carrier involved. Equal for human + AI targets. tsc clean, 73 tests pass (incl. new strike test)"},{"date":"2026-06-24","ts":1782303467000,"hash":"fd530a1d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI rebuild step 1: removed the city cap (factions now expand until no claimable land remains, paced by cooldown+economy) and ripped out the invisible 'raid' mechanic (hitBoat/bldHit dispatch + countryside fishing-raid). Reframed the carrier doctrine: not 'never attacks' but 'never SUICIDES' — usable for strikes/defense (built in later steps). Bots treat humans and AI as EQUAL powers — no human carve-out; target-selection already includes human cities. Tests updated (73 pass, tsc clean)"},{"date":"2026-06-24","ts":1782301010000,"hash":"19ac178e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: kill the phantom bubble — it's the lightning glow sphere (boltGlow, radius 70, purple, fog:false). It was only hidden via opacity→0, so any residual lingered, and because it ignores fog it stood out as a translucent bubble at the last strike point (strikes land near you = near your city). Now boltGlow.visible is explicitly toggled: true only during an active flash, hard false otherwise"},{"date":"2026-06-24","ts":1782300139000,"hash":"e07bab25","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: build context + map labels now keyed to the PLAYER, not the carrier. New playerWorldPos() = the unit you're piloting / your on-foot avatar / else the carrier; nearestClaimed + nearEmptyIsland use it, so you build a foundation based on where YOU are near land. Flagship renamed 'Carrier 00' (was 'YOU'/'YOUR CARRIER') on labels+hover; globe 'You' marker now rides your true position (jet/ship/avatar) instead of being pinned to the carrier"},{"date":"2026-06-24","ts":1782299213000,"hash":"803028f6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fix crew XP not accruing in the MMO — XP was only awarded on the LOCAL takeDamage path, but ALL multiplayer combat (enemy bot/peer planes + carriers) goes through the peer-hit path (onGun/network), which never granted XP. Now every gun hit on a peer target awards XP to the firing pilot (+2/hit, since the server resolves the actual kill so we can't credit a clean-kill bonus client-side). Pilots level up from real battles again"},{"date":"2026-06-24","ts":1782298750000,"hash":"cef1c292","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: removed the extra rail-sailor line; instead the EXISTING idle deck crew (3 roster pilots + hired pilots) now have their default standing spots MOVED to a line down the PORT (left) deck edge, facing out over the water — clearing the runway/centerline they used to clump on. Still white navy tops"},{"date":"2026-06-24","ts":1782298165000,"hash":"d23f44a7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: navy crew — ALL crew now wear WHITE tops + dark navy trousers (makeFigure no longer takes a random per-pilot colour; uniform fleet-wide). Plus 'man the rails': a line of sailors stands along the PORT (left) deck edge facing out over the water"},{"date":"2026-06-24","ts":1782297728000,"hash":"5dbf8622","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: SR-71 airframe near-black (0x0e1014) -> dark gunmetal grey (0x454c55), nacelles lifted to match -> readable on the carrier deck instead of vanishing into the dark. Both the flyable model and the parked-on-deck silhouette"},{"date":"2026-06-24","ts":1782296549000,"hash":"6dba5d93","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 LAND rework — proper carrier recovery: planes approach from ASTERN down the runway centerline (using runwayStart geometry) and stack in a tight descending conga line directly behind the carrier, so the whole fleet peels off and commits THE INSTANT you press Land (responsive). Front of the queue is on final, descends straight up the runway to the stern touchdown zone, eases off throttle on short final, sets down; queue advances immediately. No DB steering — pure client per-frame AI"},{"date":"2026-06-24","ts":1782295958000,"hash":"44e42949","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: make fleet LAND actually recover the planes — the touchdown gate was a 3D 60m sphere to the carrier CENTER, but planes fly ~16m above it so they had to thread a ~58m window at speed and just orbited. Now: HORIZONTAL gate (<80m), ease off throttle on short final so it settles over the deck instead of screaming past, a 9s safety timer that forces a stuck jet down, and a tighter holding stack so the next plane lands quickly. Still one-at-a-time"},{"date":"2026-06-24","ts":1782295140000,"hash":"e220ed49","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fleet LAND now recovers ONE AT A TIME — only the cleared wingman shoots the approach to the deck; the rest hold in a layered orbit (radius+altitude staggered by queue position) until it's down, then the next is cleared. Fixes only 1-2 landing while the rest endlessly circled (they were all converging on the same point at speed, crowding the deck and overshooting)"},{"date":"2026-06-24","ts":1782292825000,"hash":"d88a7d8a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 scouting step 2 — composition: each AI bot now has a persistent carrier air DOCTRINE chosen from its personality (AA-heavy fighters / torpedo bombers / dual-role helis / can-afford E-3 / SR-71 scout). Server adds a TYPE to every NPC plane + broadcasts the full loadout (s.cm); client renders the PARKED complement on the deck by type (reusing the real deck slots + per-type models) so you can fly over an AI carrier and read its makeup. Bots, types, broadcast all green (tsc + 75 tests)"},{"date":"2026-06-24","ts":1782292190000,"hash":"dd27a6a1","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: ALL carriers (peers, AI bots, offline players) now render the real player carrier model instead of a box — bake the Carrier model once, clone per rig (shared geometry; per-rig materials for a subtle relation tint + damage darkening). Distance-gated (6.5km) so only nearby full models draw. Step 1 of carrier-scouting: you can now ID a carrier's hull on sight"},{"date":"2026-06-24","ts":1782289178000,"hash":"9a8687bd","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: lock the CITY NAME (floats above the tallest building of nearby enemy cities) + ATTACK(T) = WIPE OUT THE CITY — strike units (torpedo bombers, bombers, helis) re-target building after building until it's rubble; fighters keep defending, ships/AWACS sit it out. Fixes tbombers ignoring a building order: surface strike runs now rake the true rooftop (guns connect) instead of aiming 22m above; building hits route through Net.sendBldHit (server-authoritative, MP-correct). Individual-building lock still works for pinpoint strikes"},{"date":"2026-06-24","ts":1782286934000,"hash":"3a4fa05f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fix M-map selection + labels vanishing when zoomed in — the box-select & label back-face cull dotted the UN-normalized camera→marker vector vs a world-unit threshold (6), so it scaled with zoom and rejected every marker once close. Replaced with a zoom-independent horizon test (n·camDir vs R/camDist); also hardened the single-click pick with the same cull"},{"date":"2026-06-24","ts":1782286001000,"hash":"8b9fc50b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fix M-map unit selection when zoomed in — markers are constant-on-screen (shrink in world space with zoom) so the mesh raycast missed; switched to a screen-space ~28px nearest-marker pick (zoom-independent)"},{"date":"2026-06-24","ts":1782285525000,"hash":"9c0c3625","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: shot-down AI jets no longer vanish — server flips them to a controlless tumbling fall (still broadcast) so everyone watches them spiral burning into the sea, then removes at impact (splash). Garrison landings despawn quietly (no false crash)"},{"date":"2026-06-24","ts":1782284773000,"hash":"3e5aa184","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: (1) stable plane id in the CAP broadcast so hits (your guns + patrol-boat flak) land on the right peer plane — was a pool-index mismatch from nearest-neighbour render; (2) deployed jets engage the CLOSEST enemy (no more target-division split / chasing far units)"},{"date":"2026-06-23","ts":1782283930000,"hash":"3601e961","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: (1) AI jets climb/descend GRADUALLY now (eased vertical speed + pitch, was a max-rate escalator snap); (2) fix 'hundreds of jets crashing along the horizon' — crash anim now only fires when a plane truly leaves the broadcast (count drop), not on a transient nearest-neighbour mismatch"},{"date":"2026-06-23","ts":1782282388000,"hash":"81e54816","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: your patrol boats auto-attack any enemy jet in range — was blocked by an isPlayer flak gate + a 150m low-jet ceiling; now flak any jet within 600m at any altitude (only while AI-screening, not while you steer)"},{"date":"2026-06-23","ts":1782281372000,"hash":"3ddfe1c3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: shot-down peer/bot planes now CRASH into the sea (tumbling burning wreck + smoke + splash) instead of vanishing — client-side off the broadcast vanish, so it's MP-correct for your NPCs, enemy NPCs, and other players' NPCs"},{"date":"2026-06-23","ts":1782280676000,"hash":"403f877f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: your own AI wingmen now emit the tail engine trail + wingtip contrails too (gating was isPlayer→aiControlled; they were silently excluded)"},{"date":"2026-06-23","ts":1782280356000,"hash":"052a62a4","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: peer/bot planes now emit the same vapor as the player jet — soft engine-exhaust trail off the tail + wingtip contrails in hard banks (nav lights already strobing)"},{"date":"2026-06-23","ts":1782280057000,"hash":"473a2f1f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: flip AI jet bank sign (was rolling out of the turn → now banks INTO it)"},{"date":"2026-06-23","ts":1782279541000,"hash":"2dc9ca3f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: bot/peer planes now BANK into turns (server capQuat gains roll, eased like the player jet); per-plane firing flag broadcast -> visible tracers for ALL combatants at ANY range (watch others fight AI)"},{"date":"2026-06-23","ts":1782278574000,"hash":"e651383c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: AI jets now use the PLAYER fighter's turn cap (CAP_TURN 1.8->0.46) so they fly identically (no more glued-to-tail); add visible incoming tracers from enemy planes firing at you (ghost rounds, damage stays server-side)"},{"date":"2026-06-23","ts":1782277471000,"hash":"91b28a19","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fix: peer/bot planes teleporting/stacking/lock-hopping — client mapped meshes by array index but the server reorders its plane array (spawn/land/death); switched to nearest-neighbour identity matching + spawn new meshes at position (no origin-slide)"},{"date":"2026-06-23","ts":1782275018000,"hash":"0c4f8f98","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fix: enemy/bot peer planes rendered TAIL-FIRST — model nose was -Z but the server flies them +Z-forward (capQuat), so they flew backward and looked fast/wrong. Flip the peer-plane visual 180deg to face travel"},{"date":"2026-06-23","ts":1782274083000,"hash":"59fe3a8f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fix: airport always 'hangar full' — bo.cap was overloaded (roof-cap mesh vs capacity) and got nulled to clear the mesh, zeroing capacity; moved hangar capacity to bo.planeCap"},{"date":"2026-06-23","ts":1782272083000,"hash":"2898a8d0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: full world reset (geo_reset_v3 -> v4) — wipe all cities/garrisons to clear stale bot CAP jets + start the AI fresh"},{"date":"2026-06-23","ts":1782271662000,"hash":"73ae81b7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 HUD: strip moon/weather/city-count + /tick from top econ bar; move Population + Fishing into the resources HUD as icon-only chips (rowboat icon, hover tooltips)"},{"date":"2026-06-23","ts":1782267331000,"hash":"c906b520","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: scale the SR-71 down by half (flyable model + parked silhouette + deck-park height)"},{"date":"2026-06-23","ts":1782265998000,"hash":"678216bb","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: heli windscreen see-through + FPV eye at pilot seat (was blocked by dark-blue glass); bullets = orange .50-cal tracers (enemy red) instead of spheres, laid along flight path"},{"date":"2026-06-23","ts":1782265456000,"hash":"25522de9","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Login picker: drop AI-Browser + AI-vertizing, order Carrier00/Chat/Markets, greet 'Welcome <username>, where to?'"},{"date":"2026-06-23","ts":1782265133000,"hash":"2301bbd7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Login: after a generic sign-in (landing page, no returnUrl) show an app picker — Chat/Markets/Carrier00/AI-Browser/AI-vertizing; contextual logins still go straight to their returnUrl"},{"date":"2026-06-23","ts":1782258923000,"hash":"1917348b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 perf: 60fps cap (high-refresh displays were doing 2-2.4x work), ~11Hz throttle on heavy DOM panels, pause sim+render when tab hidden"},{"date":"2026-06-23","ts":1782258083000,"hash":"1405111a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: remove videocoms voice (Web Speech TTS) entirely — keep the comms popups, now text-only + timer-advanced"},{"date":"2026-06-23","ts":1782257334000,"hash":"98b8c747","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: Log out button in the ESC settings menu — signals the page to clear the session + re-show the login modal"},{"date":"2026-06-23","ts":1782256936000,"hash":"6cf1aab3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: in-page login/sign-up modal for logged-out visitors (no redirect) — finish auth and drop straight into the game, never bounced to chat"},{"date":"2026-06-23","ts":1782214289000,"hash":"c7775dfa","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #18 videocoms deepen: ordnance-away (bombs/torpedo), splash/kill calls, all-clear, mayor gratitude near friendly cities"},{"date":"2026-06-23","ts":1782213920000,"hash":"1d0155b2","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #17a: Foundation = plain matte-black slab (no cement marks)"},{"date":"2026-06-23","ts":1782213617000,"hash":"aaa7b0f0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #10: dock the airport hangar at the runway's green-threshold end (mouth down the strip) — fly in low+slow to land, garrison taxis out to take off"},{"date":"2026-06-23","ts":1782213183000,"hash":"a81bc774","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #11: ice = giant jagged continuous pack-ice sheets (multi-lobe irregular outline, overlap into a continuous field), not discs"},{"date":"2026-06-23","ts":1782212856000,"hash":"5aa3f71b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #3: centered flight HUD (navball+altitude+fuel above command bar) + dock Abilities button beside unit-command bar"},{"date":"2026-06-23","ts":1782212235000,"hash":"aaf4afda","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #12: Torpedo Bomber carrier strike jet (guns + 2 wing torpedoes, RMB drops, dive-bombs ships/buildings)"},{"date":"2026-06-23","ts":1782211245000,"hash":"7e4e0b18","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #18: VIDEOCOMS — StarFox-style crew comms framework (portrait + name + voiced line via the free Web Speech API; Comms.say() so Polly voice files can drop in later). Situational triggers: commander warns of incoming bombers/fighters, wounded wingmen call for help + a teammate answers, boot-up greeting. Crew voices vary by personality"},{"date":"2026-06-23","ts":1782210853000,"hash":"0420d9e7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #14: peer/bot CAP planes now have a real model + forward HEADLIGHT/beam + blinking red/green nav lights (were bare lightless boxes = 'alien jets')"},{"date":"2026-06-23","ts":1782210496000,"hash":"6f49b0f6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: (2) wind-blur vignette only shows while BOOSTING (was any high speed); (5) shuttle launch is now walk-up-to-the-pad + F (Y no longer teleport-launches); (6) cities glow from orbit at night (per-city warm billboard that brightens with altitude)"},{"date":"2026-06-23","ts":1782209636000,"hash":"e184cf3a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: (8) jet + SR-71 wingtip red/green nav lights now blink at the standard ~1Hz strobe rate; (9) fishing boats — removed the red/green side nav lights, added warm cabin windows on all 4 sides (front/back/port/starboard, shared material → red for enemy boats)"},{"date":"2026-06-23","ts":1782209239000,"hash":"db6f64a8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fixes: (4) lightning glow sphere no longer lingers as a translucent bubble near the carrier (opacity now zeroes after the flash); (regression) rooftop beacons follow the building height instead of floating; (1) fighter/bomber anti-cheat speed cap raised to cover afterburner; (7) darker near-black night + space sky; (13) bombers no longer auto-scramble to defend (attack-only); (15) only the tallest residence gets a landing pad"},{"date":"2026-06-23","ts":1782207756000,"hash":"62203fa3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: gentle up-close ocean shimmer — animated NORMAL map (shading-only ripples, never a colour pattern) drifting on the sea; normalScale fades to 0 by ~800m altitude so it's flat from orbit (no quilt). Calmer at night"},{"date":"2026-06-23","ts":1782207304000,"hash":"366ff8b9","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: clean ocean — stripped the tiling water texture (repeating dark-blue patches), the scrolling wave-line overlay, and the sun-glitter sparkles (the floating circles) that made the sea a patchwork-quilt from orbit. Now a smooth sphere in the M-map deep teal (0x16586e), night-dimmed. Reads clean up close + from space"},{"date":"2026-06-23","ts":1782206548000,"hash":"d86226fd","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 population: empty/starved cities now SHRINK to short stubs (resHeightFactor 0.3x empty -> 1.6x packed; was 1.0x even at zero pop = looked prosperous). Server growth slowed to ~1 pop/min (was ~96/min) so a city + its fishing fleet must be defended a long while before real tax; sunk fleet starves the city down fast (visible die-off). 75 carrier00 tests pass"},{"date":"2026-06-23","ts":1782206008000,"hash":"ae0db419","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: (1) minimap zoomed ~5x in (280m) + enemy jet icons enlarged -> see flanking attackers; (2) city central runway now HIDDEN until an Airport is built (player + AI); (3) Airport rebuilt as a hollow half-cylinder HANGAR (biggest footprint) with garrison planes parked INSIDE it, launching down the central runway"},{"date":"2026-06-23","ts":1782204906000,"hash":"fd6ff2f6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 shuttle: (1) RE-ENTRY BURN — plasma fire shell wraps the windward side + trails over the hull, FPV view fills with fire, survivable glow band, burns up only if too fast too low; (2) jet-style cockpit overlay (canopy bow, A-pillars, dashboard/glareshield); (3) removed spaceMap — M now opens the globe map showing a shuttle icon + its orbit ring (map tracks orbital items)"},{"date":"2026-06-23","ts":1782203693000,"hash":"62034930","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #9: guide bar now driven by APOAPSIS not speed (climb steep when low, ease to horizon near target alt, DIP BELOW horizon when overshooting -> turns you over far sooner); + atmospheric DRAG on the rocket (strong low, gone by ~3.5km) so you cant cheese a 500m orbit -- must climb out of the air first (the real reason gravity turns exist). Target orbit alt 4500"},{"date":"2026-06-23","ts":1782202803000,"hash":"ac63a34f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #9: removed the orbit trajectory line (navball guide replaces it); improved guidance — gentler thrust (24/44 vs 34/80) for reaction time, faster pitch-over (flatter ascent, less 'really high'), + a THROTTLE DIRECTIVE (BURN -> CUT THRUST -> too fast) with SPD-vs-target readout so you stop burning before escaping"},{"date":"2026-06-23","ts":1782202061000,"hash":"83da4c0d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #9 fix: trajectory now judges 'will my path hit the ground?' (periapsis vs surface) BEFORE the escape check — escape ENERGY while diving into the planet now reads SUB-ORBITAL/orange (you'll crash), not a false ESCAPE. Periapsis computed universally for ellipse+hyperbola"},{"date":"2026-06-23","ts":1782201756000,"hash":"8ed1d63e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #9: gravity-turn GUIDE BAR on the navball (Gemini's idea) — a target-pitch line that starts straight-up and drifts to the horizon as you build orbital speed; keep the nose on it to carve a clean gravity turn, turns green at orbit"},{"date":"2026-06-23","ts":1782201349000,"hash":"c09fe58a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #9 orbit fixes: (1) classify orbit by ENERGY not eccentricity so a vertical launch reads SUB-ORBITAL not ESCAPE; (2) push starfield far past the planet in space so the globe OCCLUDES it (fixes stars-through-planet + invisible ocean); (3) extend fog far past the whole globe in orbit so the planet renders solid + the full orbit ring is visible (was fogging out beyond ~1/4)"},{"date":"2026-06-23","ts":1782200172000,"hash":"273c06db","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #9 fixes: orbit is now ALWAYS the full closed ellipse (focus=planet centre) — sub-orbital passes THROUGH the ground (orange), orbit clears it (green), escape breaks open (red). Removed the confusing Ap/Pe marker bubbles + removed time-warp (no speeding up time in a shared world)"},{"date":"2026-06-23","ts":1782199105000,"hash":"b4a8e84b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: shuttle orbital mechanics + cockpit rework (#9) — time-warp (, / .), full closed-orbit trajectory that wraps the planet with Ap/Pe markers, live orbital readouts (Ap/Pe altitude + ETAs, orbital velocity), reworked cockpit instrument cluster (navball w/ prograde+retrograde, throttle/fuel, warp)"},{"date":"2026-06-23","ts":1782198093000,"hash":"645a30ec","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: Abilities panel (#6) — Call Police Helicopter (5-min cd, summons your city heli) + remote Nuclear Strike (2-h cd, fires from an armed deployed sub within carrier-radar range of the target). HUD launcher button, persisted cooldowns"},{"date":"2026-06-22","ts":1782197440000,"hash":"2d6785f5","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: planet-wide cloud blanket visible from orbit (#2) — translucent sun-lit cloud shell wrapping the globe, fades in with altitude, greys under storm"},{"date":"2026-06-22","ts":1782197024000,"hash":"f8e6d426","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: SR-71 is now a 1-of carrier plane — dedicated 3x Blackbird model (needle nose, chines, twin spiked nacelles, canted tails), parked in front of the control tower; moved from city tab to carrier air-wing"},{"date":"2026-06-22","ts":1782196102000,"hash":"db8c070c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: world-anchored clouds (fly through them, visible from orbit) + fishing-boat port/starboard nav lights"},{"date":"2026-06-22","ts":1782195269000,"hash":"c354d773","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 flight feel batch: (3) rudder (A/D) yaw cut ~5x + now induces a slight bank toward the turn — no more pivot-on-a-dime; you must roll+pull to come about. (4) pitch authority cut to ~1/3 so pull-ups aren't razor-sharp (better PvP), still pulls up harder than down. (8) wingtip nav lights — port red / starboard green"},{"date":"2026-06-22","ts":1782194865000,"hash":"4d827c73","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 anti-cheat: server-side credit-balance validation (anti-inflation). The server now seeds an authoritative balance from restore+offline income and, on each save, clamps the saved credits to a generous income ceiling (200k/s + 2M slack) since the last save -- a money hack (e.g. 9e9) is clamped + flagged so fake money can NEVER bank/persist. Decreases (spends) always accepted; zero false-positives on legit income. Persists the validated value, never the raw client claim. (Does not yet stop in-session spending of inflated credits -- that needs the full purchase-path inversion.)"},{"date":"2026-06-22","ts":1782194184000,"hash":"deef88fc","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 anti-cheat: hit validation. (1) Fire-rate cap -- hit events above 25/s (a real weapon's max) are dropped + flagged, killing the spam-instakill exploit. (2) Range check on carrier-gun/bomb hits -- the shooter's authoritative (movement-clamped) position must be within 1200u of the victim's carrier, else dropped + flagged, killing across-map sniping. Both fail-open when positions are unknown (no false rejects). Logs to carrier00_cheatlog + pings admin"},{"date":"2026-06-22","ts":1782193193000,"hash":"7efd6c72","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 anti-cheat v1 (foundation): server-side movement audit. Server now tracks each player's CONTROLLED unit (client sends pos+type+stable id), and if it moves faster than that unit could possibly go (max x5, covering boost+altitude) it (a) logs to a new carrier00_cheatlog audit table, (b) pings admin (puppy) in-game, and (c) CLAMPS the server's authoritative position to the cap so the hack gains nothing. Switching units is a sanctioned discontinuity (no false flag); sustained breaches only. Also: deploy-ec2.sh now force-recreates so api code actually restarts on deploy (the bug that left the 5h-stale CAP_SPD running)"},{"date":"2026-06-22","ts":1782188676000,"hash":"b40679cb","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 flight realism: vertical lift. Only the upright component of lift holds you up -- level holds altitude, a steep bank starts to sink (lift's vertical support fades toward knife-edge), and flying INVERTED actively pulls the plane DOWN (lift points at the ground), harder the further past vertical you roll. So banking now turns AND, rolled far enough, pulls you down too"},{"date":"2026-06-22","ts":1782188301000,"hash":"158ba9c1","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: AI fighters/SR-71 now visibly BANK into their turns (amped the model bank-gain for fast-aligning types — they snapped onto targets so quickly the bank never showed). Bomber bank left as-is (already looked right)"},{"date":"2026-06-22","ts":1782187797000,"hash":"aeca5ab0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 banked-turn fix: (1) direction was INVERTED -- now bank right turns right, bank left turns left. (2) ~10x too sensitive -> rate 1.6 dropped to 0.16, so a shallow bank barely turns and you must lay it over to carve. (3) removed the up.y guard that killed the turn at knife-edge -- wings-vertical now turns hardest"},{"date":"2026-06-22","ts":1782186973000,"hash":"9012f683","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 flight realism: (2) elevator authority is now asymmetric -- you pull UP much harder (1.25x) than you can push the nose down (0.55x), like a real stick. (3) BANKED TURN: banking now actually curves the flight path toward the low wing (lift vector tilts) -- the steeper the bank the harder it turns, so banking flies the turn instead of doing nothing. (4) Dead-engine GLIDE: out of fuel the nose eases onto a glide slope and the plane glides down on its wings instead of falling straight down (you can still pull up to flare)"},{"date":"2026-06-22","ts":1782185860000,"hash":"e98af4a2","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 flight UX: (1) when the cursor is freed (ESC / any menu open -> pointer unlocked) the craft now HOLDS its current attitude and flies straight instead of carving toward the stale cursor while you click buttons. (2) Removed the moving white virtual-stick crosshair (circle+dot) while flying -- it was distracting; the on-foot ADS crosshair stays"},{"date":"2026-06-22","ts":1782185234000,"hash":"fdcde902","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 SR-71 autopilot fix: the garrison AI (updateAirports) was steering EVERY plane in a city airport list -- including the SR-71 you're flying -- so your input and the AI's return-to-base loiter fought each other and banked it back toward your city (position-dependent lean). Now any plane flownByPlayer is skipped by the garrison AI entirely; your own controls alone drive it. Also reverted my wing-leveler / roll-recenter / quaternion-restore experiments (back to the original flight feel) per request. Kept the water-crash fix"},{"date":"2026-06-22","ts":1782180521000,"hash":"810ca243","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: FIX planes passing through water (regression) + add flight-drift diagnostic. The new crash gate used _climbout<=0, but _climbout is set to 1.2 on launch and only decremented in the AI branch, so player-flown planes stayed at 1.2 forever and never crashed. Now gated purely on _airTime>1.5 (increments for player AND AI). Also added a toggle (\\ key) HUD readout of the plane's actual bank angle + lat/lon, to diagnose the lean (sim bank vs view tilt)"},{"date":"2026-06-22","ts":1782179400000,"hash":"ed1967cb","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 flight fix: added a WING-LEVELER. With no roll input the plane now eases its bank back to wings-level, so releasing the stick flies straight instead of holding a bank that carved a constant turn forever (felt like 'something keeps turning the SR-71'). Roll-mode stick also re-centers promptly now (0.9->2.6/s) so releasing actually stops the input. Hold the mouse out to still bank + carve"},{"date":"2026-06-22","ts":1782178410000,"hash":"7a672a74","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere-render fix: flying aircraft now QUATERNION-restore in renderWrapped (userData.freeRot) instead of Euler-restore, so a plane's free 3D orientation no longer drifts/leans frame-to-frame at speed (Euler cannot round-trip roll+pitch+yaw cleanly near gimbal). Ships/carrier keep the Euler-restore that fixed their wave-bob upside-down bug. Fixes the SR-71 'forgetting straight' / curving at speed"},{"date":"2026-06-22","ts":1782177823000,"hash":"c6cac334","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: planes die on water contact instead of floating. Crash threshold is now per-type belly clearance (SR-71 6 / bomber+E-3 5 / fighter+heli 3) instead of a flat y<=2 that sat below the big SR-71 hull (so it skimmed/floated on the sea). Gated by a 1.2s post-takeoff grace + climb-out so runway departures don't self-crash; AI keeps its y>=9 self-preserve. Touching the sea = instant death now"},{"date":"2026-06-22","ts":1782177068000,"hash":"ac544d56","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: bombers now run their bomb passes just ABOVE the tallest standing building on the target city (cityBombY = max building roof + 16) instead of a fixed low height that flew INTO the skyline. Bombs still fall onto the city. Fixes both the deployed city-strike bombers and the SP enemy city raiders"},{"date":"2026-06-22","ts":1782176212000,"hash":"7c85466a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: SR-71 minimum speed 90 -> 38 (close to a fighter's 34) so it can actually slow down enough to land -- it was previously too fast at its floor to ever touch down"},{"date":"2026-06-22","ts":1782175645000,"hash":"20431904","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: walk off the carrier deck into the water. Walking past the deck footprint now drops you overboard into swim mode (instead of being clamped at the rail); swim back to the hull and press F to climb aboard (existing flow). Deck walk is otherwise unchanged up to the edge"},{"date":"2026-06-22","ts":1782175305000,"hash":"5c166764","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fix: NPC CAP was flying at ~SR-71 speed (CAP_SPD 170 / chase 235) -- a normal fighter cruises 62 / max 88. Dropped CAP to cruise 60 / chase 88 / turn 1.8 so bot fighters match a real fighter and cannot outrun the player"},{"date":"2026-06-22","ts":1782174681000,"hash":"cffc0640","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 city force-projection INDICATOR: the globe map now draws a coloured arc from each of your cities to the city its garrison is deployed against (red = enemy strike, blue = ally/own defend, yellow = neutral watch). Rebuilt live from the deploy flags, so it appears the moment you send a wing and vanishes on recall / when they come home -- the missing visual feedback for the deploy order"},{"date":"2026-06-22","ts":1782174399000,"hash":"4d16e774","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Admiral command UI: an in-game command bar (Attack / Area / Follow / Hold / Return / Land) above the unit cards PLUS keybinds (T attack, G follow, H hold) issue per-group orders to the active control group (else the live selection, else your whole wing+fleet) -- like an admiral pointing units around the battlefield. Area arms a map-click strike point. New per-unit plane orders (follow/hold/land) override the squad default; ships use route/home/engage. Unit cards/selection panel now show each unit's current ACTION (Attacking/Holding/Following/Returning/Moving/Patrolling) alongside its HP"},{"date":"2026-06-22","ts":1782173596000,"hash":"b50a7ca3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Stage 4: peer carriers (enemy/ally/AI) now render a REAL flight deck -- dashed runway centreline, deck-edge lines, fore/aft threshold bars, and a touchdown circle -- so an enemy carrier reads as a runway and you can see where to set down on an ally's. Landing on allied carriers (refuel+repair, hold W/Space to take off) already worked; this gives every peer carrier the proper deck to land on"},{"date":"2026-06-22","ts":1782173310000,"hash":"e0442dac","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Stage 3: every player's whole surface fleet (destroyers, battleships, subs, cargo, boats, landing craft) now broadcasts in the per-frame state and renders + interpolates on every other client via the same system as planes -- so you see your allies' and enemies' fleets move in real time, hull-coloured by relationship and lockable/identifiable. A dived sub stays hidden. (Naval PvP on peer ships is a follow-up; this is the render/update unification.)"},{"date":"2026-06-22","ts":1782173069000,"hash":"a5257648","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Stage 2: server-flown city-garrison CAP. A bot-owned city with an airport now SCRAMBLES a small server-side fighter garrison when a hostile (non-allied human OR enemy faction unit) comes within range, defends the city, and lands again once the sky clears. Anchored to the city (flagship CAP tracks the moving carrier; garrison holds over its city), broadcast in the same peer_state.pl so everyone sees it and can shoot it down. Closes the air-defense gap from Stage 1 (cities had no CAP after the phantom client CAP was removed). Total faction planes capped for safety"},{"date":"2026-06-22","ts":1782172277000,"hash":"2016d011","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 server-authoritative NPC air (Stage 1): AI factions now fly REAL CAP fighters on the server (8Hz brains, ~18Hz broadcast in peer_state.pl), so every player sees the SAME planes, the same dogfights, the same deaths. CAP engages the nearest hostile unit -- a rival faction's CAP OR a non-allied human's carrier/planes -- treating a human exactly like a rival's units (defends home waters within a leash). Players and their AI wingmen can shoot the CAP down (server adjudicates the kill, plane vanishes for everyone); NPC hits on the player reuse the PvP victim-authoritative wire format. Removed the old per-client phantom CAP (driveCAP) that only existed on one screen. Tracks online players' unit positions server-side for targeting"},{"date":"2026-06-22","ts":1782169420000,"hash":"8b423b0a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: garrison persistence + city-deploy fixes. (1) Whole airport garrison (fighters/bombers + SR-71) now persists across refresh and sits on the runway, not just the SR-71. (2) City force-projection now resolves the target city by map position (nearestIslandTo) so right-clicking any enemy/ally/neutral city works without a precise marker hit. Empty source garrison now toasts a clear message instead of doing nothing"},{"date":"2026-06-22","ts":1782168651000,"hash":"9c9c38df","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 city force-projection: select your city on the globe map, right-click another city to send its airport garrison there. Enemy city -> bombers attack buildings + jets escort; ally/own -> circle and guard; neutral -> circle and hold fire (until flagged enemy or recalled). Right-click open sea recalls them home. Behavior re-checks the target's relation each frame; low fuel/target-razed auto-returns home"},{"date":"2026-06-22","ts":1782167993000,"hash":"39d502e7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: patrolling planes now ENGAGE — a plane on a patrol route breaks off to attack any enemy within half the carrier radar range (fighters dogfight/strafe, bombers gut ships) then resumes its route, instead of flying right past contacts"},{"date":"2026-06-22","ts":1782167214000,"hash":"b63d586a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: land on ALLIED carriers — fly low+slow over an ally's carrier to set down, refuel + repair, then hold W/Space to take off (your plane rides their deck while parked). Symmetric, so allies can land on yours too"},{"date":"2026-06-22","ts":1782164350000,"hash":"b0a05524","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: helicopters faster — full-stick now hits full max (was capped at 70%) and max bumped 46->54 so they out-run a destroyer; AI helis 0.85->0.95. Lock reticle nose-bias strengthened (4u, also covers peer planes)"},{"date":"2026-06-22","ts":1782163640000,"hash":"9eec075e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: destroyer scaled +25% for more walkable flight-deck room; helipad pulled inboard so you dismount with clear deck fore and aft (no rail trap). Lock reticle now biases toward the nose for airborne aircraft so it sits on the hull, not back at the mid-fuselage origin near the exhaust/contrail"},{"date":"2026-06-22","ts":1782162499000,"hash":"731a203b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: lock reticle BOX + distance now coloured by IFF relation (was hardcoded red) — locking your own ship/plane shows GREEN, ally blue, neutral yellow, bot/enemy red. The name was already coloured; this fixes the box + distance"},{"date":"2026-06-22","ts":1782161376000,"hash":"359bc56a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: globe-map plane triangles now point their heading (directional arrowheads); SR-71 (thin dart, icy-blue) and E-3 (broad delta, cyan) get distinct icons; cargo ship gets a hull icon that points its heading. PLUS the SR-71 (airport garrison) now PERSISTS across refresh — saved per-island and re-spawned on its runway when the airport syncs back"},{"date":"2026-06-22","ts":1782160301000,"hash":"8351e685","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: SR-71 no longer self-immolates on launch — marked high-alt so it's slow in dense air near the deck (cant reach burn speed) and only hits top speed UP HIGH; lifts off at a sane speed. E-3 now orbits AT the carrier radar edge so its bubble extends coverage beyond, not uselessly inside"},{"date":"2026-06-22","ts":1782157984000,"hash":"f2ad7b34","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: editable + persistent patrol paths for carrier PLANES (same as destroyers) — select a plane on the globe map, right-click to move / shift+right-click to chain waypoints / close on its marker to loop a patrol; wingman AI flies the route, RTBs to refuel and resumes; route persists across reload and draws when selected"},{"date":"2026-06-22","ts":1782157599000,"hash":"18dccfe8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: E-3 default patrol — when airborne and not flown, it auto-loiters near the carrier radar edge at ~1000m (above the jet ceiling, unarmed, never engaged); reuses the existing wingman RTB/refuel cycle so it returns, refuels, and re-takes-off to resume the patrol"},{"date":"2026-06-22","ts":1782157259000,"hash":"2197295b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 cargo fixes: scale to carrier-class (x5), ride LOW so the hull sits under water (laden draft), keep CG- callsign on restore (was becoming LC-) + persist ship callsigns. Plus 200M test fund"},{"date":"2026-06-22","ts":1782156613000,"hash":"1bb56a1d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: stop renaming planes to pilot names (applyCrew was overwriting F1-F4 callsigns with the pilot name); planes keep their own callsign, pilot stays as crew. Plus one-time 200M test fund"},{"date":"2026-06-22","ts":1782154590000,"hash":"fb420c4c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fix: E-3 + SR-71 now have proper PARKED silhouettes (radome / black dart) on the deck/runway instead of a jet (makeParkedPlane had no case for them, and I was downgrading them to fighter); callsign now persisted so a reload keeps E3-1 as E3-1 instead of renaming it"},{"date":"2026-06-22","ts":1782153795000,"hash":"27a2934d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fix: purchases now persist IMMEDIATELY (buildBar saves the instant credits drop) so a quick refresh can no longer eat a bought E-3/cargo/ship; the 10s autosave + pagehide save were racing the purchase. Plus a one-time 8,000,000 cr refund for the E-3 the bug ate"},{"date":"2026-06-22","ts":1782151343000,"hash":"b3c530d8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 F9: Zumwalt-class destroyer rework — long tumblehome hull, knife wave-piercing bow, faceted pyramidal deckhouse, forward AGS gun, two VLS missile clusters, deck-edge torpedo tube, and a clear aft helipad. Walkable deck + helipad updated to the new 32x4.4 dimensions"},{"date":"2026-06-22","ts":1782151000000,"hash":"fe9e8094","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 feedback batch A: SR-71 parks on its CITY runway (boardable, needs Command Center + Airport); E-3 reworked (bomber-size, 2 engines, spinning rotodome), 2M to 8M, auto-cruises above the jet ceiling on patrol, its own cyan radar ring+sweep on the globe map; altitude readout above the fuel gauge; resource HUD recolored (oil black/steel silver/uranium fluor-green/copper) with hover tooltips; flight trajectory line default OFF (rocket stays on); distinct minimap icons for cargo/SR-71/E-3"},{"date":"2026-06-21","ts":1782107086000,"hash":"87db5f5d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI (item 13): factions now COMPETE for strategic resource territory — bot expansion biases toward uranium (poles) > steel/copper (mid-lat) > oil, mirroring the client's resource map, so the player can't quietly corner scarce metals. Additive scoring tweak; tsc clean; 98 tests pass"},{"date":"2026-06-21","ts":1782106674000,"hash":"c25df0a4","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 supply-chain foundation (item 12): islands produce resources by geography (oil=tropics, steel/copper=mid-latitudes, uranium=poles); buildable Cargo Ship (5M, slow/unarmed/container model) auto-loads an owned city's resource and delivers to your carrier; persisted stockpile + HUD; capital ships now need Steel, nukes need Uranium (starter stock so it's a taste, then you must trade across the map). Build-bar header shows each city's product"},{"date":"2026-06-21","ts":1782106053000,"hash":"4f39e609","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: SR-71 Blackbird (city tab, 10M, needs Command Center, ~5x jet speed + 4x boost endurance, unarmed, near-orbit ceiling, overheats if flown fast low) + E-3 Sentry (carrier tab, 2M, needs Command Center, slow/high/unarmed, extends globe-map radar half the carrier's range). Both gated by hasHQ, parked on the carrier deck to fly"},{"date":"2026-06-21","ts":1782105629000,"hash":"0c6e730b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 atmosphere/orbital update: soft oxygen ceiling (no bounce, 2x alt, power fades), altitude air-density (less power+less drag up high, jetliner sweet spot), re-entry burn-up, altitude sky gradient (blue->violet->black+stars) for ALL planes, above-the-weather, thick Line2 trajectory lines (rocket color-coded + per-plane cut-power ballistic arc, toggle backtick), orbit-achieved toast, trimmed boost so it won't trivially escape"},{"date":"2026-06-21","ts":1782104471000,"hash":"954e283d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: relationship-colored locks (own=green/ally=blue/neutral=yellow/bot=red) + pilots now earn XP on hits & kills (player pilots were stuck at lvl1)"},{"date":"2026-06-21","ts":1782102500000,"hash":"0d39ada5","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fixes: (1) carrier HP bar now shows for returning captains — gate on setupDone not the legacy 'started' flag they never trip; (2) minimap rotates with your look direction (lookYaw) while on foot/deck, centred on you; (3) compass N now points to true world north (-Z, the globe's north pole) instead of +Z — 'point N, fly forward' now goes north; (4) build menu moved below the relocated minimap (was overlapping it)"},{"date":"2026-06-21","ts":1782101580000,"hash":"b4d6a989","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 UI: relocate the globe instructions to the bottom-right in the main-game controls style (right-aligned, faded, no pill); move the territory/waters readout + carrier HP bar to the top-right (waters above HP), shifting FPS + minimap down into a clean right-edge column"},{"date":"2026-06-21","ts":1782100635000,"hash":"d751b536","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 map UX: fishing boats hover/click for stats (city, owner, HP%) but NOT commandable — yours always, enemy while radar-swept; replaced the overlapping TERRITORIES toggle with a bottom-centre MAP / 🧩 TERRITORIES mode switcher (cards stay above it)"},{"date":"2026-06-21","ts":1782099748000,"hash":"7640bcf6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 map: click a selected region again to deselect; territory fills 75% more transparent (alpha 0.62->0.16, see-through); ignore stale-green saved colour so player paints CYAN; show your fishing boats on the globe always + enemy fishing boats when radar-swept"},{"date":"2026-06-21","ts":1782099163000,"hash":"028a2ba4","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 territory: unowned regions now have NO fill (per-vertex RGBA alpha → bare ocean shows, borders still outline them); player colour = cyan; click a region on the globe to highlight its outline (yellow) + a prominent top-centre panel showing region name / owner / population (Unowned Territory · No Owner · 0 Population if unclaimed)"},{"date":"2026-06-21","ts":1782098229000,"hash":"798c5587","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: persist ship custom routes/loops (survive refresh — ship keeps looping AND its path can be drawn); show patrol-path lines ONLY for the SELECTED unit on the globe; faction colours Specter=red, Kraken=orange"},{"date":"2026-06-21","ts":1782097707000,"hash":"e213e445","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 territory polish: border lines ~75% more transparent (opacity 0.5->0.13); a faction's OWN connected regions no longer show an internal border (owner-aware rebuild); TERRITORIES legend moved to bottom-left (clear of the Map Key); faction colour overrides — Tempest navy, Maelstrom yellow, Reaper near-black"},{"date":"2026-06-21","ts":1782096769000,"hash":"32edeaaa","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 territory map: vibrant CK-style faction palette + vibrant player swatches + fill opacity 0.62; unclaimed now paints the natural ocean colour (reads as unpainted, borders still show); added a TERRITORIES legend/key on the globe listing each faction's colour + name"},{"date":"2026-06-21","ts":1782096048000,"hash":"42577134","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 territory colours: each faction its OWN colour (warm/violet palette, identity not relation) so AIs are distinct; player picks a nation colour at setup (persisted); neutral = true grey; fills now BLENDED via per-corner vertex interpolation (no more 90deg colour edges); border lines = slightly transparent white"},{"date":"2026-06-21","ts":1782095043000,"hash":"be176b4f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 territory: drop the assignment domain-warp (clean Voronoi → every island owns its own contiguous region: fixes criss-cross borders + two-cities-in-one-region, no city-moving/wipe needed). Organic look now from marching-squares 45 diagonals + Laplacian corner-rounding on the border lines"},{"date":"2026-06-21","ts":1782094287000,"hash":"e416912e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 territory borders: marching-squares smoothing — staircase 90s become long 45 diagonals, straights stay straight, multi-region junctions star to a clean centre. Big step toward CK borders"},{"date":"2026-06-21","ts":1782093717000,"hash":"c8775454","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 territory borders: domain-warp the Voronoi with smooth multi-octave sphere noise so province borders wander organically (mix of straight + curvy) instead of perfect bisector triangles — CK-style hand-drawn feel. Deterministic (identical borders for all players); the whose-waters readout uses the same warp"},{"date":"2026-06-21","ts":1782092886000,"hash":"278f4ac1","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 territory borders: replace fat filled borders with THIN 1px province lines (constant screen thickness, like the radar ring), grid 320->400x200 for smoother boundaries. Every island shown as land + a region; islands no longer buried under borders"},{"date":"2026-06-21","ts":1782091671000,"hash":"817e8bb1","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 territory painter → Crusader Kings look: bold dark province borders between ALL regions (owner-independent, static, separate mesh), 320x160 grid for smooth borders, every island is a region incl. arctic/remote (massive single-island regions), full-globe coverage, neutral regions grey with visible borders"},{"date":"2026-06-21","ts":1782090957000,"hash":"aaac6977","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 territory painter: globe (M) now paints a Voronoi region per island (nearest-island = territory, geodesic so wrap/poles are correct) coloured by owner — take an island, take its region. TERRITORIES toggle on the globe + a live 'whose waters' HUD readout (reads YOU, not the carrier — fixes the Selene header confusion)"},{"date":"2026-06-21","ts":1782090185000,"hash":"817b16f7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: Fishing Boat added to the (renamed) SHIPS tab; Defense + Coastal buildings RETIRED — removed from build menus, AI build order, and stripped from the live world on load (build() rejects them; placeBuilding ignores legacy ones). Airports are now a city's defense"},{"date":"2026-06-21","ts":1782088814000,"hash":"bee5a36a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 city naming: founding pops a name dialog (persisted + synced to all players via city_name socket); AI factions auto-name cities from a Greek/Roman pool (Roma, Syracusae, Korinthos…); names show in the build-bar header, globe map, and battle logs. Server: name field + setCityName/cityNameOf in world.ts"},{"date":"2026-06-21","ts":1782087932000,"hash":"c3775021","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 build bar polish: header now 'BUILD' (→ city name when in range); CITY+AIR merged into one tab (3 tabs total: CARRIER/CITY/WARSHIPS) with icons + readable 12px labels; bar widened to 210px (matches leaderboard); minimap enlarged 158→200px; cap-aware greying; scrollable grid"},{"date":"2026-06-21","ts":1782086770000,"hash":"da58fee8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 2: Red Alert build bar — always-on tabbed sidebar under the minimap (CARRIER/CITY/WARSHIPS/AIR), 2D-canvas icons, cost, radial cooldown clocks. Cooldowns (3m units/buildings, 5m airport, 120/240/480m warships) persist across reloads. CITY/WARSHIPS/AIR act on the nearest in-range owned city (header names it). B menu kept"},{"date":"2026-06-21","ts":1782085765000,"hash":"a7a5592a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 economy rebalance (Phase 1): foundations double per island (40k,80k,160k…), residences double per city (30k,60k…), command center 2M, destroyer 8M, battleship 20M, sub 100M, rocket requires a command center, plaza removed. Slows city/nation growth"},{"date":"2026-06-21","ts":1782084209000,"hash":"cbf0d907","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fog: add a LOW sea-level fog band (alt 0.6-2.3, just under the deck) so the carrier rides above rolling ground-fog. Rides the same server fogK as the high band — shared with all players"},{"date":"2026-06-21","ts":1782083720000,"hash":"54874f26","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: extract the one invisible attack — AI factions no longer raid HUMAN cities (no boats sunk, no buildings razed). Bot-vs-bot raids + diplomacy + carrier-preservation all unchanged"},{"date":"2026-06-21","ts":1782082862000,"hash":"2806b3cc","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: bot-raid log now states there is NO on-site unit — raids are long-range strikes dispatched from the faction's flagship (with source distance). Answers 'what unit is hitting me': none, it's remote"},{"date":"2026-06-21","ts":1782082418000,"hash":"5e9ae10f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 diagnostics: attribute every building/boat destruction in chat — server logs WHO (human raider or AI faction) hit your city; client logs contaminated-water boat culls + your building losses. Pure instrumentation, no gameplay change"},{"date":"2026-06-21","ts":1782080289000,"hash":"585f9322","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: FPS HUD font black w/ white halo (was unreadable); walk-mode minimap enemy blips now hot-red #ff1010 + glow + larger"},{"date":"2026-06-21","ts":1782079867000,"hash":"59bca93c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fog restored: flat low translucent drive-through layers parallel to the sea (server-weather-driven so it's shared by all players), floored enveloping scene.fog (deep but not white-out); fog also SHRINKS the cull radius 7000->3200 for an FPS gain when it's up"},{"date":"2026-06-21","ts":1782079408000,"hash":"baf2763a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: FIX _matTRS shared-matrix bug — merged window/street/runway-light grids all collapsed to one speck (grey daytime cities + building lights only visible up close); now each quad gets its own matrix so windows span the building (lit from afar). Lock-on = tight 20deg ray pick (locks what the crosshair is on, not a 45deg-off far object)"},{"date":"2026-06-21","ts":1782078176000,"hash":"a8f55e83","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: landing gear only down on short final over carrier/island (never over water); enemy aircraft = burnt-orange headlamp + no floating label (nation+name shown on lock); enemy fishing boats = red back window + no label (visual IFF, fewer labels). Web: hide MarketChatWidget on /carrier00"},{"date":"2026-06-21","ts":1782077491000,"hash":"bfda7959","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fixes: minimap radar repaints again (offsetParent always-null for fixed els -> offsetWidth check); city night lights apply current day/night state on placement (cities loaded at night now light up); FPS counter top-right above radar; stars 1400->350"},{"date":"2026-06-21","ts":1782076505000,"hash":"8c697433","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 perf #2: merge per-building windows into 1 mesh + merge city runway/street/edge-light decor (vertex-colored) — ~220 meshes/city -> ~95 (>50% draw-call cut); preserves recolor/day-night/damage/diff/night-lights/height/sphere-render"},{"date":"2026-06-21","ts":1782075851000,"hash":"3ad056e1","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 perf batch: distance-cull far objects in renderWrapped (skip transform+hide beyond 7000u, restores frustum culling — big win); puff cap 600->250 (recycle oldest) + hide plane beams/lamps >700u; throttle minimap repaint to ~18Hz (+skip when hidden); throttle separateUnits O(n^2) to ~22Hz"},{"date":"2026-06-21","ts":1782074586000,"hash":"10c2cd43","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: /noplanes (remove all aircraft) + /nocrew (stand down all crew) chat commands, like /scuttle; restore now honors a cleared wing/crew (truncates the base wing+crew to the saved count) so the clears persist on reload"},{"date":"2026-06-21","ts":1782073952000,"hash":"32837f19","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: /scuttle chat command — removes all the player's non-carrier ships (playerNaval) from the live game + persists the empty fleet (carrier + aircraft kept); slash-command intercept in chat"},{"date":"2026-06-21","ts":1782073358000,"hash":"48a5c70b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 RTS: closing a patrol loop on ANY group unit now loops the WHOLE group; command in first-person/walk mode — 1-9 recall a group, Tab lock, T = group engages the locked target (ships get under planes + fire, jets attack then resume escort, fuel still wins); unit cards also shown above the menu in walk mode (click to recall)"},{"date":"2026-06-21","ts":1782072063000,"hash":"9ffd2f6e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 RTS: group-assign = CTRL+1-9 (was Shift); SHIFT+right-click chains waypoints into a route; closing the loop on the ship/start = perpetual PATROL; path line GREEN one-way / BLUE patrol loop; jets escort + refuel along the route"},{"date":"2026-06-21","ts":1782071050000,"hash":"3fb93ac3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 RTS commands: right-click map = order selected group's SHIPS to move+hold (green path line); JETS auto-escort their group's ships (circle, follow when it moves) — no direct orders; jet fuel = RTB+refuel at carrier/city or CRASH if unreachable (chat log + downed pilot); downed pilots show as human icons on the map"},{"date":"2026-06-21","ts":1782070305000,"hash":"40d22140","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 RTS control groups: Shift+1-9 assign selection, 1-9 recall, 0 = auto carrier fleet (one group per unit); C&C-style unit cards along the bottom (type glyph x count, click to recall); groups persist by callsign in the player-state blob (survive relog)"},{"date":"2026-06-21","ts":1782069710000,"hash":"86e3b60b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 map shapes: carrier = long rectangle (3x), submarine = 2D capsule/cylinder, battleship = square, destroyer = diamond, PT boat = tiny dot — per-type glyphs on globe map + minimap, oriented by heading"},{"date":"2026-06-21","ts":1782068474000,"hash":"0e00efe5","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 map: phosphor radar fade restored (enemies blip when swept, fade off over ~1.5s, reappear next sweep — robust angular-since method, no fragile crossing); FIX your jets to triangles (_poolGet now swaps geometry on reuse so planes don't inherit a ship slot's diamond)"},{"date":"2026-06-21","ts":1782067878000,"hash":"df5f25e0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 radar: CAP_RANGE 1500 -> RADAR_RANGE (2400) — distant city/carrier defenders are now SPAWNED while within radar range, so their jets exist client-side and show as red blips (carriers always showed; only their CAP needed proximity)"},{"date":"2026-06-21","ts":1782067586000,"hash":"0327193f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 map: enemy = brighter vivid red; enemy radar contacts now SELECTABLE (left-click or box-drag) → selection halo + stats in the SELECTED panel (kept while in radar range); fighters all use the triangle glyph"},{"date":"2026-06-21","ts":1782067020000,"hash":"6643b552","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 radar REAL fix: city CAP is created into allAircraft (via spawnCAPInto), NOT enemyPlanes — both the map radar and the top-right minimap now scan allAircraft for enemy aircraft/ships (+ enemy carriers/CAP), so enemy CAP over your carrier finally shows as red dots"},{"date":"2026-06-21","ts":1782066394000,"hash":"58a1a2e9","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 radar fix: in-range enemies ALWAYS visible (sweep only brightens, was hiding everything when the beam-crossing didn't register = zero dots); + plot enemy CITY CAP (airport defenders, a pool the radar never checked)"},{"date":"2026-06-21","ts":1782065534000,"hash":"fa90e0c4","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 map radar fix: now detects ALL enemy contacts — enemy CAP planes + ships + carriers (was only checking far-off enemy carriers, so it saw nothing); each radar-gated (in range + swept + phosphor fade), enemy-red glyphs; sweep crossing math verified"},{"date":"2026-06-21","ts":1782064768000,"hash":"e13cd9f3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: carrier radar moved to the MAP (range ring + 3s sweep + enemies fog-of-war'd — only blip when swept within range, your units/allies/cities always shown); removed the oversized bridge room + its radar; F at the wheel steers the carrier directly; map never auto-spins"},{"date":"2026-06-21","ts":1782063450000,"hash":"49ddc8f7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 map: auto-rotate stops once grabbed; depth-proportional zoom (fine gears when close); zoom-scaled rotation (gentle when zoomed in); LEFT=select/box-select your units, RIGHT-drag=rotate; hover-id all units; click-select with per-unit stats + selection ring; drag box-select; SELECTED list panel below the legend"},{"date":"2026-06-21","ts":1782062308000,"hash":"71b90331","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 map TRUE-SCALE rework: islands/cities ~1/100th (true scale, open ocean) so units have room; unit icons constant on-screen size (scale with camera depth) so a fleet spreads apart at zoom instead of overlapping; deeper zoom (min 1.01x, near-plane 0.08) opening close on the player's fleet"},{"date":"2026-06-21","ts":1782061483000,"hash":"ab8fd6b9","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 map rework: FLAT land discs (not spheres) sized by real radius so continents read as big landmasses; units small relative to land (land 14 >> carrier 2.4 >> ship/plane 1.2, YOU = thin ring not a sphere); deeper zoom (min 1.04x) + opens framed on the player's fleet"},{"date":"2026-06-21","ts":1782060157000,"hash":"8adcc034","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: in first-person cockpit, the jet/bomber prop shows a clean spinning DISC (circle) instead of slow blades — forces the disc effect while flying fpv (dead engine still shows blades)"},{"date":"2026-06-21","ts":1782059715000,"hash":"a453333e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fog FIX: remove floating fog-slab billboards (the white 'lenses' in the sky); restore proper ENVELOPING scene.fog driven by server weather (fog/wet/cloud) — drive-through banks, floored ~360u (dense not white), deck+air alike"},{"date":"2026-06-21","ts":1782059102000,"hash":"a606361a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 globe map: land sized by radius (continents = big landmasses, was invisible 2px dots) + white polar ice caps; cities now building-tower clusters sized by the city (replaced diamonds); opens zoomed to show whole globe; legend updated"},{"date":"2026-06-21","ts":1782058437000,"hash":"c1227f7c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: remove moon-glow halo (the floating white 'lens' tracking the moon across the sky) — moon disc stays"},{"date":"2026-06-21","ts":1782058013000,"hash":"59b28015","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 water polish: remove floating white sun-glint 'lens' sprite (camera-anchored billboard that receded on the horizon); tropical water bluer (less neon green); ocean emissive no longer self-lights its green tint"},{"date":"2026-06-21","ts":1782057275000,"hash":"9d9a362c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 FF7 water (on the DEFAULT sphere ocean, not the unused flat one): animated scrolling water texture over seasonal color, denser visible wave lines, sun-glint sparkle + shimmer, day-brightened emissive depth; calms at night/storm"},{"date":"2026-06-21","ts":1782056835000,"hash":"8bae5d4b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sky fix: remove gradient sky-dome (white bow artifact) + sun lens-flare/wide corona (weird lighting); simple sun anchored like the moon; clouds on a hemisphere shell like stars (no more bow)"},{"date":"2026-06-21","ts":1782056165000,"hash":"e1b86cf6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: globe map polish (city/carrier/your-unit glyphs + name labels + legend + live updates while open); REMOVE city light-haze gradient; add subtle warm-orange runway ground-glow at night"},{"date":"2026-06-21","ts":1782054958000,"hash":"9cd8fee0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 diplomacy+leaderboard polish: players folded into survival-optimal balance-of-power (dominant human = regional coalition target, carrier-preservation kept); alliance/war/peace announcements on log; leaderboard POWER tab ranks all factions incl AIs w/ ally/enemy coloring + Diplomacy panel"},{"date":"2026-06-21","ts":1782053891000,"hash":"9c2fca7c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 naval: PT boats screen-patrol the carrier (random waypoints), auto-rescue downed pilots, high-ROF orange flak vs low jets/ships, fragile (#6); PT boats sit at waterline (#7); destroyers orbit cities ~6x further out (#14)"},{"date":"2026-06-21","ts":1782053196000,"hash":"cd177229","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 atmosphere: white-core sun + corona + lens flare (#17); dark-blue->turquoise sky dome + FF7-style sea (waves+fresnel+sun glint) (#18); city night light-haze gradient (#15); pale blue-white daytime windows (#16)"},{"date":"2026-06-21","ts":1782052168000,"hash":"1d0b5630","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 seasonal visuals: snow+blizzard (climate/winter gated), low-poly ocean ice floes, seasonal water color (navy night/caribbean summer/icy winter/blue-moon polar), bluer glowing moon, climate-tinted stars"},{"date":"2026-06-21","ts":1782051460000,"hash":"2d67d4e3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: client syncs server weather/season/time (shared+persistent), climateAt/currentSeason; fog SWAP — deck clear, flyers whited-out inside clouds (#5); clouds even around whole sky (#9); AIs found cities paced by cooldown+build-first gate (#4)"},{"date":"2026-06-21","ts":1782050799000,"hash":"16b033c0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: server-authoritative seasons (moon cycle=10 days, summer/winter alternating) + persistent global weather (DB-backed, same for all, survives refresh, broadcast on join+change); client is MMO-only — offline shows overlay + freezes, single-player removed"},{"date":"2026-06-21","ts":1782049090000,"hash":"d00bb6c8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 geography overhaul: 61 islands across the WHOLE globe (14 archipelagos far apart + 2 continents + N/S ice poles); AIs redistributed 1-per-archipelago; one-time full world reset (geo_reset_v3) since the map moved"},{"date":"2026-06-21","ts":1782048100000,"hash":"07f96ac5","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: city helicopter system — black sleeker Huey parks on HQ roof, patrols city (avoid buildings, cover runway, hover/elevation), shoots intruders, police lights (2min/30s + permanent while ferrying), summon-and-ride from command center (map destination or patrol), walkable Huey cabin"},{"date":"2026-06-21","ts":1782045914000,"hash":"137bf851","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: rebuilt command deck from scratch — spacious windowed bridge (wrap-around sea/deck view, radar chart table, captain's chair, helm, console banks, lighting); enter with F at the island, F=helm, I=leave; interior-larger-than-exterior, no hull rescale"},{"date":"2026-06-21","ts":1782045238000,"hash":"8c514f23","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: warships path AROUND cities + carriers (tangent steering + push-off) for AI and player; board + walk on battleship/destroyer decks (foot collision, ride the moving hull, F to step out of a landed heli onto the deck)"},{"date":"2026-06-21","ts":1782044424000,"hash":"b1420028","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: My Carrier HP bar (top-left above Longest Alive); carrier helis fly rectangle patrol + engage-and-return; fix command-center flicker + residence height churn (client building-diff + stable 8-tier height; server only re-broadcasts a city on tier change, not every pop tick)"},{"date":"2026-06-21","ts":1782042874000,"hash":"29a9a18e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: RTS 3D globe map (M/🌍 — rotate/zoom, islands+cities by owner, you-are-here); AI carriers now PRESERVED (patrol home, never chase player, raid regionally via fleet); AI death = full reset (empire to neutral, new personality/name/far location)"},{"date":"2026-06-21","ts":1782042242000,"hash":"fd1f5a58","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: Global Stats panel (factions/cities/3 graphs); lock-on overhaul (aim-based, render-distance capped, works from deck incl enemy CAP); real No-room-spam fix (silent on snapshot rebuilds) + informative msg; fog no longer pure-white inside (keeps ~420u vision)"},{"date":"2026-06-21","ts":1782040847000,"hash":"74c6bd7f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: heavier low storm clouds scaling with rain + drive-through volumetric fog layers; Global Stats backend (per-faction/global aggregates, kill/death counters, time-series, GET /carrier00/global-stats)"},{"date":"2026-06-21","ts":1782039993000,"hash":"a677a763","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: rifle muzzle = orange tip (no expanding circles); jet targets CAP-first then by lethality, wider air engagement, divide targets; AI cities wiped+redistributed once, balance-of-power alliances/wars (gang up on leader, allies don't fight), leanness via economics NOT unit caps"},{"date":"2026-06-21","ts":1782038951000,"hash":"acf9a59b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: build caps (1 rocket/command/sub) + no foundation-on-foundation + foundation only near empty island + hangared city jets visible/takeable on runway + fix 'No room' spam; AI carriers slowly self-repair out of combat (2.5x near home port)"},{"date":"2026-06-21","ts":1782038384000,"hash":"4c60a850","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI: factions stay regional (expand+defend, fight local rivals) instead of dogpiling the lone human — unprovoked targeting now reach-gated to ~6000u of own territory; only a faction the player actually attacked (real grudge) hunts across the map"},{"date":"2026-06-21","ts":1782037882000,"hash":"9c8084f8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: real phosphor radar sweep (sector paint+fade, 512px), enemy-only labels + lock-on for all units (name above/dist below), thin props, spinning-disc effect; even AI spawn distribution (golden-angle, respawn at own base not on player)"},{"date":"2026-06-21","ts":1782036539000,"hash":"82517b2e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 nuke: require Space Program to launch; razed city + green-water/smoke contamination persist 24h in shared world (survives refresh), bots skip contaminated sites"},{"date":"2026-06-21","ts":1782035791000,"hash":"7ee04426","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 perf: cap DPR 1.5, throttle 1024px radar canvas+texture upload + minimap 60Hz->12Hz (biggest lag source)"},{"date":"2026-06-21","ts":1782035286000,"hash":"44573a0a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: social system (18+ TOS, player directory, friends, mail) + sub 360 turn, full-sphere stars, parked-heli real model+2 slots, orange nuke trail"},{"date":"2026-06-21","ts":1782033827000,"hash":"22c6822c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Wave 1: patrol ships now truly CIRCLE their city (sim-verified, 0 reversals — orbit clock went stale during foe-chase; now uses the jet-loiter math); Tab lock-on = flying targets only for jets + in-front closest-first; frozen CAP/enemy-plane labels removed on death"},{"date":"2026-06-21","ts":1782032617000,"hash":"48dc76e4","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 additive geography: +47 islands (IDs 12-58) across the huge globe — 10 archipelagos, 5 lone far islands, 2 continents (dense 6-island clusters for ~5 nations each); existing cluster (IDs 0-11) + all cities untouched; client island gen + server bots.ts genIslands kept byte-identical"},{"date":"2026-06-21","ts":1782031736000,"hash":"609bfd8c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 AI engine: personality-driven server bots (8 archetypes — aggressive/defensive/tit-for-tat/forgiving/unforgiving/expansionist/raider/neutral + jitter), varied human-like empire build by personality, more bots (5, cap 6) that expand + new factions spawn over time, action-history GRUDGE/enmity that makes bots retaliate against + hunt human players who attack them (fixes 'enemy never attacks me')"},{"date":"2026-06-21","ts":1782030796000,"hash":"a86dfa13","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: in-game Bug Report / Feature Request system — 📣 button -> submit (bug|feature) to carrier00_feedback DB; 'My Reports' shows dev responses back to the player; admin GET /all + POST /{id}/respond endpoints"},{"date":"2026-06-21","ts":1782030196000,"hash":"cc4282aa","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: warships+PT boats now AA enemy planes (altitude-aware foe pick); destroyer missiles stay surface-only; enemy planes strafe/bomb your fleet; enemy reliably raids you; heli sound now smooth jet-like air-rush (no headache whump). Server: announce player online/first-time/offline/respawn in chat"},{"date":"2026-06-21","ts":1782028602000,"hash":"abff21f6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 submarine Phase 4: walkable interior (I key) — Navigation/Torpedo/Berths/Mess rooms; damage opens room LEAKS that flood over time, drag the hull down and spread through open doors; close WATERTIGHT DOORS (E) to seal a flooded compartment and save the boat; flooding HUD + critical warnings"},{"date":"2026-06-21","ts":1782027719000,"hash":"6c537e52","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 3 — NUCLEAR MISSILE: sub-launched (N console, 5M/warhead, max 2), targets only enemy cities/large ships; JDAM arc (climb to orbit -> cruise -> fall ~5x jet speed) with a ~5s climb-phase jet-intercept window; impact = yellow->white screen flash, city firestorm, 1.5h black pall, green no-fishing water, MAD chat alerts to the whole server"},{"date":"2026-06-21","ts":1782026884000,"hash":"22a5596b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 submarine Phase 2b: SONAR scope (heading-up contact display — surface ships, submerged subs, shoreline; 1800u range) + PERISCOPE view (V key, only at periscope depth — eye at the mast head just above water with a round periscope overlay). Completes the playable-sub phase"},{"date":"2026-06-21","ts":1782026394000,"hash":"f5bf3ced","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 submarine Phase 2c: straight-running torpedoes (fire = aim by pointing the bow, 2-shot rack + reload, lethal vs ships/carriers/subs); sub-vs-sub kills; submerged subs are IMMUNE to all aircraft guns/AA (only torpedoes from other subs can hit them); surfaced subs vulnerable"},{"date":"2026-06-21","ts":1782025709000,"hash":"ca3d1fb3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 submarine Phase 2a: pilot a sub underwater (W/S throttle, A/D steer, X dive/surface, [ ] depth bands), FUEL (runs out → must surface to refuel at a friendly port) and AIR (drains submerged, refills surfaced; suffocation forces emergency surface + damage), depth/fuel/air HUD gauges"},{"date":"2026-06-20","ts":1782024992000,"hash":"4175ce39","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 submarine Phase 1b/1c: large black state-of-the-art sub model; slow surface/dive (~5-6s, only top 1/3 shows when surfaced); submerged subs fade to near-invisible to surface viewers (pilot/underwater camera still see them); heli pad active only when surfaced; subs now cost 10M and build only in a city with a Command Center (removed from Dock)"},{"date":"2026-06-20","ts":1782024083000,"hash":"fa55bbdc","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 submarine foundation (Phase 1a): ocean now has an uneven seabed — deterministic seabedDepth(x,z) (deep open water ~120u, ramps to 0 at shorelines), a performant player-following seabed grid, and submarines clamp to the seafloor. Plus SUBMARINE_NUKE_PLAN.md design doc"},{"date":"2026-06-20","ts":1782023546000,"hash":"c6f551c6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fixes: heli vertical (Shift/Space=up, Ctrl=down — was both down); ship city-patrol now actually circles (lapping-guard reset was overriding the orbit clock every frame; enemy/bot ships had no patrol at all — both fixed); Tab-lock now targets nearest to the aim reticle in 2D screen space (what you're aiming at)"},{"date":"2026-06-20","ts":1782022274000,"hash":"e245f19e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: ally labels now BLUE (own=green/ally=blue/enemy=red; fixes CAP planes showing green); big procedural audio pass — ambient ocean/wind bed, helicopter rotor whump+turbine, ship wake, richer gun/explosion/thunder/naval-gun/lock one-shots, single master bus"},{"date":"2026-06-20","ts":1782021639000,"hash":"12b700fc","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: clouds stay at altitude and drift (were rising out of the sea on the sphere — now camera-relative like stars); dumb-simple heli controls — W/S fly fwd/back, A/D turn, Space up / Shift down, release = rock-solid hover (grandma-friendly)"},{"date":"2026-06-20","ts":1782021015000,"hash":"150d566f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 batch 2: fix target label frozen on screen after death (lock now cleared in all death paths); land a heli on a building rooftop then F to get out + walk the roof (F by the heli re-boards); arrow keys = free-look camera (3rd + 1st person), eases back to default on release"},{"date":"2026-06-20","ts":1782020269000,"hash":"363d7f55","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 batch: battleship heli pad moved to clear foredeck (was on the rear turret); jets get a visible tail fin (parked + flying); fishing boats 0.67x size + white + tiny deck-mounted gun; city patrol is now a true circle (free-running phase, no more in-out parabola)"},{"date":"2026-06-20","ts":1782019537000,"hash":"f08f4381","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 helicopter rework: VTOL (rotor spins up ~1s then lifts straight up, no runway); collective=vertical (min throttle hovers, max climbs), tilt to choose direction; Huey-style model (roomy cabin for ~4, tail boom+rotor, skids, 2-blade main rotor)"},{"date":"2026-06-20","ts":1782018099000,"hash":"929a4a42","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Carrier00 HOTFIX: game wouldn't start (Play did nothing) — module-init crashed on player.bombers[1] after bombers were removed from the carrier wing; crew now assigns to the 4 fighters"},{"date":"2026-06-20","ts":1782017710000,"hash":"8ec4da2c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 deck v2: runway moved to PORT side (clear), all aircraft parked angled 45deg along the STARBOARD side with wide spacing (no more touching wingtips); removed the angled runway; bombers are now city/airport-only (removed from carrier shop + starting wing + restore); fleet = 4 fighters"},{"date":"2026-06-20","ts":1782016669000,"hash":"358588da","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: carrier ~2x longer (z-stretched voxels = same mesh count, no lag); island/bridge moved aft; deck is now a SOLID surface you can't fall off (walk clamps at the rail, no accidental overboard); aircraft respread over the longer forward deck (28 spots); proper flight-deck markings — axial takeoff runway + angled landing runway w/ centrelines & piano-key thresholds"},{"date":"2026-06-20","ts":1782014457000,"hash":"56cd2062","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: bow wave is now clean flat foam LINES on the water (V from the bow), not a smoke puff. New AI command — N key + Command Center 'Recall All' button — orders every airborne carrier plane home to land, refuel, rearm & repair"},{"date":"2026-06-20","ts":1782013155000,"hash":"2db77631","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 bomber rework: heavy B-52-style model (~2x size, 4 engine pods), hp 16→64 + bigger hit box, survives losing engines (knockout+smoke, no death-spiral), heavy low-ROF forward gun, drops a 3-bomb stick (easier to aim), and takes a FULL deck row to park"},{"date":"2026-06-20","ts":1782011428000,"hash":"cb1b3f39","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 ship patrol + anti-overlap: warships now patrol a real CIRCLE around their island (monotonic phase that always leads the ship's bearing; slow-to-turn throttle so even battleships hug the ring; per-ship sub-ring stagger) — fixes the radial out-and-back ping-pong. New separateUnits() keeps ships apart from ships and planes apart from planes"},{"date":"2026-06-20","ts":1782009052000,"hash":"f6851cb6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 crew roster fix: (1) MP persistence bug — hired pilots beyond the starting 3 were dropped on reload; now the full roster is restored. (2) Crew menu + HQ now list EVERY pilot manning your craft (named + rookie), not just named roster → '10 in the air shows 3' fixed"},{"date":"2026-06-20","ts":1782008146000,"hash":"bd3a6011","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: ships fully persistent — each ship's location + heading + patrol-home + damage saved to DB and loaded verbatim on every refresh (no client-side placement). Backward-compatible with legacy type-only saves"},{"date":"2026-06-20","ts":1782007799000,"hash":"865e468a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fix fleet stacking on the carrier after refresh — restored ships now spawn in a spread escort formation (min radius, golden-angle, never overlap) and re-home to your island once the world snapshot arrives (was: island race → fleet fell back onto the carrier)"},{"date":"2026-06-20","ts":1782007242000,"hash":"8f15e54c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: distance-gate ALL explosion sounds (sfxBoom) — distant AI combat (bombs, missiles, fishing-boat fights, plane/ship deaths) no longer bangs at full volume; that was the random 'knocking' at spawn"},{"date":"2026-06-20","ts":1782006751000,"hash":"47708ab1","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: calmer muted teal-blue water (matches old reference); fix random distant 'banging' — AI battleship main-gun sound now falls off with distance (650u cap, was full-volume to 1100u)"},{"date":"2026-06-20","ts":1782005942000,"hash":"67a9cc00","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing graphs: zero-fill buckets across the window + client mounted-gate so sparse/zero-traffic cards (carrier00, ai-browser, elevenvoicereader, ai-npc) render a line instead of vanishing"},{"date":"2026-06-20","ts":1782004218000,"hash":"662917f8","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing: site-wide activity monitor (combined views+time, All Time/1y/6m/1m/1w ranges); interactive graphs (hover tooltip w/ date+value, month-year axis ticks, 2nd time-on-page line); 4-up wider grid; Carrier00 ship icon; new page_time tracking (table + PageTimeTracker + /page-time API); recover orphaned PageViewTracker/Watchlist/MarketChatWidget into VCS"},{"date":"2026-06-20","ts":1782002973000,"hash":"90ff9683","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing sparkline fix: normalize series dates to YYYY-MM-DD so weekly buckets parse (was Invalid Date → empty graphs)"},{"date":"2026-06-20","ts":1782002676000,"hash":"e25e7b0c","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing page: add Carrier00, per-app view/click counters + 1-year growth sparklines (new /page-view/series API)"},{"date":"2026-06-20","ts":1781951576000,"hash":"ec839262","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 rocket: trajectory now bold always-on-top dots (1px line was invisible); shuttle cockpit frame + instrument panel (navball attitude w/ prograde marker, throttle + fuel gauges); mouse-wheel zoom on all 3rd-person chase cams; stronger afterburner boost (Shift) w/ bigger flame"},{"date":"2026-06-20","ts":1781950740000,"hash":"d3a1f549","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 rocket: cockpit view (fly it like a plane) — camera rides the nose and banks/pitches with the ship; C toggles cockpit/chase, defaults to cockpit on launch"},{"date":"2026-06-20","ts":1781950279000,"hash":"b0700759","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fix: shuttle/orbiter weren't rendering — Object.assign({position}) on a Mesh throws in strict mode (Object3D.position is non-writable), aborting the build. Switched to .position.set(); the shuttle now appears on the pad + the launch orbiter works"},{"date":"2026-06-20","ts":1781949436000,"hash":"461c80fc","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #67 part 2: rocket → real orbit. Y launches the shuttle from your Rocket Center into a true 3D Newtonian gravity flight; trajectory line ahead colored green=will-hit / blue=stable orbit / orange=raising / red=escape; M = trajectory map (pull back to see the whole planet); orbital LOD; HUD shows alt/speed/fuel/state"},{"date":"2026-06-20","ts":1781947795000,"hash":"24b8d9ef","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #67 (part 1): Rocket Center building (1M) — a launch complex with pad, gantry + an impressive Space-Shuttle stack (orange tank, 2 SRBs, winged orbiter) by the sea, a status symbol of the city's reach"},{"date":"2026-06-20","ts":1781947409000,"hash":"ee69d18d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #4: teching up — Research in the shop (5 levels, escalating cost) gives +22% unit HP & +15% income per level (boosts existing + new units, persists); the SP AI auto-techs its fleet over a match"},{"date":"2026-06-20","ts":1781947034000,"hash":"0fba33ab","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #12: land a heli on a warship → G to take command and drive the battleship/destroyer (your heli rides the deck) · G again or F to climb back in"},{"date":"2026-06-20","ts":1781945749000,"hash":"173d837d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #8/#9: residential towers grow taller with population; command-center height scales with leaderboard rank (1st 25% taller than 2nd... to 10th)"},{"date":"2026-06-20","ts":1781945343000,"hash":"2ea0eb8b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 batch: contrails bank-only + continuous wingtip lines (no center exhaust on own plane); carrier wake only when moving; explosion=noise (no drum) + lightning=thunder; sea deeper turquoise + de-milked; fishing fleet 25% (1.25/house, feeds 80), spread wide, price 10k, stern gun that shoots nearby boats"},{"date":"2026-06-20","ts":1781944128000,"hash":"1fbfe64d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: contrails are now thin vapor LINE strips off the wingtips (always-on, not just in turns), no center exhaust on your own plane in 3rd person; water is more saturated tropical turquoise + much fainter wave-overlay (de-milked)"},{"date":"2026-06-20","ts":1781943509000,"hash":"0ef764ed","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: cleaner contrails — thin lines from the wingtips + a small exhaust puff from the tail (was a big puff dead in front of the nose obscuring the plane, esp. the bomber)"},{"date":"2026-06-20","ts":1781942781000,"hash":"498586ab","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: FIX starved particles — city black-smoke (cap 340) shared the puff pool and blocked contrails+carrier wake (puff cap 280). City smoke now capped at 220 (below puff), puff budget raised to 600 → contrails + bow-wave/engine wake always have room"},{"date":"2026-06-20","ts":1781942352000,"hash":"cc3ba8b0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: carrier bow-wave + engine wake now ALWAYS show (gentle at anchor, big underway) and lifted clear of the sea so they're not at the waterline; remove debug counter"},{"date":"2026-06-20","ts":1781941723000,"hash":"e3d60820","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: planes now ALWAYS leave a contrail while flying (was only on hard turns/boost, so normal flight showed nothing) + easier turn-trail threshold"},{"date":"2026-06-20","ts":1781941361000,"hash":"bbe848af","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere: counter now shows nearest-puff distance to pinpoint whether particles are by you (draw bug) or spawning far"},{"date":"2026-06-20","ts":1781940710000,"hash":"4dd111fe","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere: ocean waves dip inward so sea-level effects (wake/spray) aren't sealed inside the ocean ball; add live particle counter (bottom-right) to diagnose contrails"},{"date":"2026-06-20","ts":1781940176000,"hash":"dfa2c2c2","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere: fix leftover ENEMY CARRIER label projecting on the horizon in MP (skip hidden carriers, not just dead) — confirms MP connected, ship already retired"},{"date":"2026-06-20","ts":1781939438000,"hash":"89fb5c1b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere: reconnect MP on the default path (iframe gets the sphere param via the reliable reload path — fixes enemy carrier showing + missing remote players/contrails); clouds now ride the sky instead of bending onto the globe"},{"date":"2026-06-19","ts":1781938686000,"hash":"f174aee7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: the world is now a SPHERE by default on the live game (commslink.net/carrier00). ?flat or ?sphere=0 falls back to the flat map; ?sphere=N tunes radius"},{"date":"2026-06-19","ts":1781938154000,"hash":"2e8849d8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere: restore the scrolling wave LINES on the sea (stripe overlay shell wrapped on the globe, day/night faded); default sphere size 25k on the page too"},{"date":"2026-06-19","ts":1781937538000,"hash":"a851229b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere quality: default world size 25k; sea now has the choppy low-poly wave bumps + flatShading (high-res so hulls/cities don't float above sagging facets); rain falls along local down (toward the core), not sideways"},{"date":"2026-06-19","ts":1781936841000,"hash":"9c4184dc","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere: carrier-only upside-down fixed — restore objects' exact Euler (not quaternion) in the render wrap. Restoring the quat re-derives a gimbal-flipped Euler for the carrier's 180deg yaw, which its per-frame rotation.z bob locked in as inverted. Other ships set quat each frame so they self-healed"},{"date":"2026-06-19","ts":1781936459000,"hash":"e0353f66","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere: fix carrier-upside-down — it was a lookAt() degeneracy (up parallel to view dir when on/over the carrier flips the view). Camera now uses the same Q·flatQuat rotation as every object: consistent, no degeneracy"},{"date":"2026-06-19","ts":1781935968000,"hash":"ad62d1df","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere: fix the core handedness bug — position map was a reflection while orientation was a rotation (lat now uses -z) so the WHOLE transform is one consistent right-handed rotation; every object now faces its motion. Sphere sea given its own bright aqua+emissive material so the unlit half isn't dark"},{"date":"2026-06-19","ts":1781934711000,"hash":"d291128e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere: rebuild camera in sphere space (eye->globe, look at mapped target, up=surface normal) — fixes rotated controls + level horizon; objects keep right-handed bend"},{"date":"2026-06-19","ts":1781933910000,"hash":"fd91ec5a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 sphere fix: tangent-frame basis was left-handed (reflection) → garbage object orientations ('trippy'); now built with a right-handed cross product so objects stand upright on the globe"},{"date":"2026-06-19","ts":1781933399000,"hash":"3d67f612","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: experimental spherical world — the REAL game (all logic/flight/graphics unchanged) render-wrapped onto a globe, opt-in via /carrier00?sphere=<radius>; live flat game untouched without the flag"},{"date":"2026-06-19","ts":1781932413000,"hash":"ae6b7d08","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Sphere prototype v3: the REAL game map on the globe — actual 12-island layout (seed 1337) projected + spread to planet scale, with live ownership from the DB (puppy + 2 AI bots' cities, blue=you/red=AI)"},{"date":"2026-06-19","ts":1781931680000,"hash":"ce76fbc1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Sphere prototype v2: all-water globe with 64 little scattered islands (the foundation spots, each with a cement slab + city); orbit altitude raised much higher + faster climb so you really leave the surface"},{"date":"2026-06-19","ts":1781931219000,"hash":"ebcc52e0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: standalone spherical-planet prototype at /sphere-proto.html (offline experiment — not part of the game/MP) to evaluate surface navigability + climbing to orbit, toward the future orbit goal"},{"date":"2026-06-19","ts":1781930793000,"hash":"c9c27fb0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 wave 2: visible sun disk + halo that arcs across the sky and warms/reddens at the horizon (the directional light already tracked it; now you can see the sun set)"},{"date":"2026-06-19","ts":1781930398000,"hash":"f34f0f6d","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 wave 1: deep explosion sound (no bounce); FF7 tropical aqua water; fishing boats 2/3 size; building repair slowed to ~1h/stage; jets get auto landing gear + tall swept tails; foundation gets cement-block face + a timber pier"},{"date":"2026-06-19","ts":1781929148000,"hash":"eb2e57b4","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 batch 2b: heli landing pads — warship decks (subs now scaled x4, destroyers/battleships) + building rooftops; a heli hovers low+slow over a pad to set down (rides a moving ship), F to lift off; view your city from a rooftop"},{"date":"2026-06-19","ts":1781928495000,"hash":"2cddbef4","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 batch 2a: destroyer guided missiles + battleship heavy salvo (long range/reload, loud bang); burning-city spectacle (white smoke 20%, black tower+fire+ember glow 50%); buildings survive hits + Command Center repair crews (server tickRepair + 3 visible welders)"},{"date":"2026-06-19","ts":1781927371000,"hash":"8bebfdd2","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 batch 1/2: strafe fix, calm cockpit prop, warships circle island, Tab/T orders on foot, 20 plane slots, warship night windows, restored planes reload airborne"},{"date":"2026-06-19","ts":1781927358000,"hash":"e00353a","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Batch: carrier A/D strafe un-swapped; cockpit prop spins slow (no blur); destroyers/warships now CIRCLE their island smoothly (tangential lead, fixes jitter+straight-line patrol); Tab lock + T orders work on foot/deck (lock box shows out of cockpit); 20 parking slots; warship superstructure windows lit at night; restored airborne planes reload already in the air (no runway roll)"},{"date":"2026-06-19","ts":1781926027000,"hash":"49f46930","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: enemy/bot carriers shoot back (AA at your planes); patrol fighters auto-engage enemy carriers/planes in a wide radius"},{"date":"2026-06-19","ts":1781926017000,"hash":"1c4a9a3","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Enemy carriers (incl bots like Reaper) now AA-fire at your nearby planes (firePeerAA); patrol fighters auto-engage any enemy (planes OR carriers) within a much wider radius (550, was 220) so docked enemy carriers get attacked"},{"date":"2026-06-19","ts":1781925636000,"hash":"2eb22fa6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: rain = line streaks (smoother, cheaper, no waves); fix carrier-FULL-but-empty (free dead planes' parking slots) + persist only living planes"},{"date":"2026-06-19","ts":1781925616000,"hash":"c6c037b","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Rain reworked: thin slanted line streaks instead of blocky squares, varied speed + random recycle (no falling 'waves'), fewer + cheaper (no transparent-square overdraw → better FPS). FIX carrier 'full' bug: free the parking slot of any shot-down plane (dead planes were permanently occupying the deck → shop FULL with an empty deck); persist only LIVING planes"},{"date":"2026-06-19","ts":1781925025000,"hash":"42a4c3fb","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: warships engage planes at altitude + longer gun range + shell nearby enemy fishing boats (less passive patrollers)"},{"date":"2026-06-19","ts":1781925008000,"hash":"f9c54ab","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Warships less passive: AA ceiling raised (engage planes up to 220m alt, not just wave-skimmers <60m) + longer gun range (BB 360 / DD 300); patrolling warships now also shell enemy fishing boats that come within gun range"},{"date":"2026-06-19","ts":1781924627000,"hash":"77b532bd","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"no-store on /carrier00 page (was cached 1yr → stale build broke the MP auth handshake for returning players)"},{"date":"2026-06-19","ts":1781924114000,"hash":"40b1d8ae","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: tighter fishing grounds + active AI boat raids; race-proof MP auth handshake + OFFLINE indicator (fix friend stuck in single-player)"},{"date":"2026-06-19","ts":1781924104000,"hash":"96e2a2b","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fishing fix + MP connect robustness: tighter fishing-ground band (no more sprawl); AI bots actively raid everyone's fishing boats on a cadence + client logs 'boats raided'; bulletproof auth handshake (game requests creds from the page until connected) + OFFLINE indicator so you know if you're not in the shared world"},{"date":"2026-06-19","ts":1781924104000,"hash":"0e2b47b8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"carrier00 page: answer the game's credential-request handshake (race-proof auth so MP always connects)"},{"date":"2026-06-19","ts":1781923276000,"hash":"bb8c3ad2","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fishing-boat cockpit window, flush deck-square lights, Shift sprint, analogue rifle ammo, x5/x6 warships, props on landed planes + spin during takeoff"},{"date":"2026-06-19","ts":1781923248000,"hash":"bf73ddc","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Lit cockpit window on fishing boats (instead of top circle); carrier runway lights = flush deck squares; Left-Shift sprint on foot; analogue rifle ammo (yellow round strip on the gun, removed the number text); destroyers x5 + battleships x6 (bigger hit radius); props show on landed planes + spin during the takeoff roll (not just airborne)"},{"date":"2026-06-19","ts":1781921977000,"hash":"e738b854","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 UI/econ: ADS crosshair, no HP bars, lockable fishing boats (+bot raids), offline-persistent survival rank, shorter slower props, always-on windows, bottom menu bar + ESC controls, no shop btn, x10 boats"},{"date":"2026-06-19","ts":1781921968000,"hash":"1894e21","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"UI/economy batch: right-click ADS crosshair; removed carrier HP bars; fishing boats lockable+killable by anyone (+bots raid them); leaderboard ranks carriers even while OFFLINE (drops off only when sunk); props 50% shorter + half spin; building windows always show (lit only at night); bottom-center RuneScape menu bar; Controls list in ESC; removed top-right Shop button; fishing boats scaled x10"},{"date":"2026-06-19","ts":1781920708000,"hash":"eb6d00fa","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: population-driven income (boats→food→pop→tax), pop+boats resource bar, reworked income HUD (no B:shop), chat combat log, clean center view"},{"date":"2026-06-19","ts":1781920695000,"hash":"af50284","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Population economy: income = population × tax; pop grows toward what fishing-boat food supports (raid boats → starve pop → income falls); residence = +5 boats +100 pop cap (persistent, server-driven). Top resource bar shows Population + Boats. Reworked income HUD (+X/tick), removed 'B: shop' everywhere. Chat doubles as a kill/death combat log. Removed center-screen walk instructions (kept urgent prompts; controls legend stays bottom-right)"},{"date":"2026-06-19","ts":1781919600000,"hash":"04015a39","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fishing-boat resource bar + spread-out fishing grounds + auto-produce/buy; warships patrol home-city rings; grandfather existing cities to full fleet"},{"date":"2026-06-19","ts":1781919591000,"hash":"4d2c46f","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fishing economy + ship patrols: boats fish FURTHER out the more you have (spread = exposure → make peace or conquer); top AOE-style resource bar (have/required, red flash on loss); free auto-production +1/5min + buy from B menu; warships patrol their HOME CITY in rings (battleship inner, destroyer mid, sub outer), engaging enemies that come near"},{"date":"2026-06-19","ts":1781918588000,"hash":"1904d4d7","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: fishing boats fully persistent + server-authoritative (carrier00_world), shared + raidable across clients, survive relog; AI cities restock"},{"date":"2026-06-19","ts":1781918581000,"hash":"ab7a3d5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fishing boats now PERSISTENT + server-authoritative: boat count lives in carrier00_world (per island), survives relog/restart, shared by all clients (deterministic positions). Owner builds via boat_build (credits client-side); raiders sink via boat_hit (synced decrement). AI cities restock slowly server-side. foodRatio reads the persistent count"},{"date":"2026-06-19","ts":1781917936000,"hash":"07471537","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 economy fix: fishing no longer craters city tax (>=70% floor), full tax per tick, honest HUD, cheap fast boats"},{"date":"2026-06-19","ts":1781917922000,"hash":"85c62b8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix economy: fishing change had cratered income — soften starvation penalty (housing always pays >=70%, was 30%), full city tax per tick (drop the 0.5 halving), honest HUD (+25000+income, was overstated +50000), cheaper fast-refilling boats (1500) so tax recovers"},{"date":"2026-06-19","ts":1781916911000,"hash":"205f6296","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: chat tabs+whisper+leaderboard, carrier rank labels, spread+labeled fishing boats, relaxed roll-flight"},{"date":"2026-06-19","ts":1781916898000,"hash":"c9bd258","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Chat overhaul (tabs global/local/ally + click-to-whisper + always-on transparent input); top-left survival leaderboard; carriers labeled by survival RANK (become 00); fishing boats spread far out + 'Fishing Boat' diplo-colored labels; roll-mode flight self-centering relaxed for wide banked turns"},{"date":"2026-06-19","ts":1781915737000,"hash":"8c7d5db3","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 fixes: real-pilots-only stand by planes, heading-up navigation minimap, fainter landing lights, right-click ADS, default first-person"},{"date":"2026-06-19","ts":1781915725000,"hash":"f920e75","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fixes: pilots only for real roster pilots who landed their own plane; top-right is a heading-up navigation MINIMAP (not radar; radar stays the bridge table); fainter landing lights; right-click ADS zoom; default to first-person on deck/foot"},{"date":"2026-06-19","ts":1781914688000,"hash":"2c119439","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 iter: rare purple lightning, ESC flight-control settings (roll/aim), Tab lock, city fishing fleet, AI pilots by planes, fixed props, top-right minimap, stars, plane lights + carrier radar dish, taller buildings"},{"date":"2026-06-19","ts":1781914673000,"hash":"cc00966","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Iter batch: rare dramatic purple lightning + visible bolt; ESC settings w/ flight-control modes (roll/aim); Tab lock; city fishing fleet (food->tax, warm lights, raidable); AI pilots stand by landed planes; fixed props (jet 1x3-blade, bomber 2x4-blade); top-right circular minimap; night stars; plane landing lights + rotating carrier radar dish+beacon; buildings +50% taller"},{"date":"2026-06-19","ts":1781911282000,"hash":"9f8720b1","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #13: MMO global chat + destruction logs (bottom-left, Enter), captains-online panel (U) ranked by survival streak; server roster/chat/log relays"},{"date":"2026-06-19","ts":1781911270000,"hash":"6c378f7","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"#13 MMO UI: global chat (bottom-left, Enter to talk) + destruction logs, captains-online panel (U) ranked by survival streak"},{"date":"2026-06-19","ts":1781910622000,"hash":"3ac44817","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #12: shared real-clock day/night (5/10/5 + 20 night), phased moon, puffy clouds, rain+lightning, sky-reflecting water"},{"date":"2026-06-19","ts":1781910611000,"hash":"5782ff9","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"#12 Sky/weather world: 40-min cycle (5 sunrise/10 day/5 sunset/20 night) from REAL clock so day-night+weather are shared by all players; phased moon (30-night), drifting puffy clouds, rain+lightning (damages your units), sky-reflecting water, O=+5min preview"},{"date":"2026-06-19","ts":1781910004000,"hash":"5e74d0d5","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 #7: visible repair-crew engineers (vest/hat/wrench) repair+refuel damaged planes, repair bay by the tower, shootable deck planes+crew"},{"date":"2026-06-19","ts":1781909993000,"hash":"6cba3dd","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"#7 Repair crew: yellow vest/hard-hat/wrench engineers walk the deck repairing+refuelling damaged planes; damaged returners towed to a repair bay in front of the tower (wings un-shear); parked planes + engineers + deck pilots shootable by enemy ordnance"},{"date":"2026-06-19","ts":1781908365000,"hash":"56d80d8b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 batch: FPV foot+rifle+jump+deck-rifle, kamikaze(Z), strong AoE bombs, PlanetSide flight+prop, radar shapes, map own-units+hover, fix jet endless-fire, 2min tick, carrier-shore collision"},{"date":"2026-06-19","ts":1781908348000,"hash":"67e6907","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Rifle also usable in first-person on deck (shared rifleTick)"},{"date":"2026-06-19","ts":1781908231000,"hash":"213db61","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Batch: FPV-only foot+rifle+jump, kamikaze (Z), strong AoE bombs, PlanetSide flight (mouse roll/A-D rudder/Q-E roll/Shift boost)+prop, radar shapes, map=own-units+hover coords, fix jet endless-fire, 2min tick, carrier-shore collision"},{"date":"2026-06-19","ts":1781906306000,"hash":"5666dd42","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: on-foot ashore + swimming + land on city runway + walk to Command HQ + quality runway/streets"},{"date":"2026-06-19","ts":1781906278000,"hash":"56cb01e","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"On-foot ashore + swimming + land on a proper city runway + walk to HQ"},{"date":"2026-06-19","ts":1781905179000,"hash":"13e6e8a0","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: AI carriers stand off + survive, coastal guns, full city-destruction cleanup + smoke/burn, Foundation rename"},{"date":"2026-06-19","ts":1781905164000,"hash":"cd06658","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carriers stand off + survive; coastal guns; city-destruction cleanup + smoke/burn; rename dock->Foundation"},{"date":"2026-06-19","ts":1781902973000,"hash":"adca444f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: persistent carriers — attackable + sinkable + defended while offline; owner reconciles/respawns on login"},{"date":"2026-06-19","ts":1781902955000,"hash":"6461323","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Persistent carriers: attackable + sinkable while offline (hardcore model)"},{"date":"2026-06-19","ts":1781901390000,"hash":"0d815a61","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: persist air deployment (patrolling wingmen stay up), carrier heading, crew XP, bought aircraft"},{"date":"2026-06-19","ts":1781901374000,"hash":"8f7d334","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Persist air deployment + carrier heading + crew XP + bought aircraft"},{"date":"2026-06-19","ts":1781900638000,"hash":"b77d4c1b","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: lock city CAP defenders + enemy buildings (bomb-run targeting)"},{"date":"2026-06-19","ts":1781900620000,"hash":"948768e","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Lock fixes: can now lock city CAP defenders (scan allAircraft for enemy, not just bandits) + enemy city buildings (bomb-run targeting); clear lock when building destroyed"},{"date":"2026-06-19","ts":1781900324000,"hash":"47a99e5f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: lock + kill enemy AI planes (per-plane hit index) + AI now engages enemy players"},{"date":"2026-06-19","ts":1781900308000,"hash":"149950f","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"MP combat fixes: lock + kill + be-attacked-by enemy AI planes"},{"date":"2026-06-19","ts":1781899305000,"hash":"59a4e64e","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: sync each player's full airborne wing — you now see other players' AI wingmen"},{"date":"2026-06-19","ts":1781899289000,"hash":"c90bff6","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"MP: broadcast each player's whole airborne wing (you now see other players' AI wingmen, not just their flown plane); peers render a pool of planes, each hittable/lockable"},{"date":"2026-06-19","ts":1781898701000,"hash":"18bd77a1","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: remember name/crew (skip setup), city air patrols defend cities, Q locks enemy players/AI"},{"date":"2026-06-19","ts":1781898684000,"hash":"9edbf96","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"MP fixes: remember name+crew (skip setup on return), city air patrols (CAP), lockable peers (Q)"},{"date":"2026-06-19","ts":1781897533000,"hash":"6dbf3132","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: ship the IFF/diplomacy CLIENT (prior deploy missed it — sync ran from wrong dir)"},{"date":"2026-06-19","ts":1781897409000,"hash":"c0ca6ef6","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: IFF/diplomacy — red enemies / blue allies / always-hostile AI + P diplomacy screen + stable uid for relationships"},{"date":"2026-06-19","ts":1781897399000,"hash":"4fba10c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"IFF / diplomacy: enemies render RED, allies BLUE, AI always hostile + a P diplomacy screen"},{"date":"2026-06-19","ts":1781896608000,"hash":"ed44dc8f","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: show players + AI on radar/map + auto-separate stacked spawns (multiplayer findability fix)"},{"date":"2026-06-19","ts":1781896590000,"hash":"4cc1f45","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"MP findability: show other players + AI carriers on radar AND map (purple players / red AI, named on map); scatter players stuck at the default spawn so they separate"},{"date":"2026-06-19","ts":1781895968000,"hash":"11a8be3a","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00: scatter new captains across the map (fix stacked spawns so players see each other)"},{"date":"2026-06-19","ts":1781895950000,"hash":"5487c53","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"MP: scatter new captains across the map (were all spawning stacked at 0,-660)"},{"date":"2026-06-19","ts":1781863070000,"hash":"1aa1bc07","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 3d: server-side AI factions — claim + build FULL cities (housing/defense/airport), roam as sinkable carriers, raid enemy cities (headless-tested)"},{"date":"2026-06-19","ts":1781861298000,"hash":"bfc73084","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 3c: shared server-authoritative world — claim/build/raid synced + persistent island ownership + offline defense"},{"date":"2026-06-19","ts":1781861285000,"hash":"6f19117","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Phase 3c: shared server-authoritative world — claim/build/raid synced + persistent"},{"date":"2026-06-19","ts":1781860425000,"hash":"d9814d1c","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 3: persistent world — server save/restore of carrier/credits/cities/fleet + offline income + net-worth leaderboard (self-migrating carrier00_player table)"},{"date":"2026-06-19","ts":1781860411000,"hash":"9b3deb0","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Phase 3: persistent world — save/restore credits, carrier, cities, fleet + offline income"},{"date":"2026-06-19","ts":1781859691000,"hash":"e5b21ee8","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 2: PvP combat sync (hit relay + victim-authoritative damage, carrier sink/plane shootdown, tracers + kill feed)"},{"date":"2026-06-19","ts":1781859664000,"hash":"f4ed2bd","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Phase 2: PvP combat — shooter-detect hits on peers, victim applies damage"},{"date":"2026-06-19","ts":1781858839000,"hash":"31979b95","repo":"commslink2","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 multiplayer: auth-gated /carrier00 page + isolated socket namespace + shared-presence game client"},{"date":"2026-06-19","ts":1781858688000,"hash":"8aa0156","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Multiplayer-ready: net layer + remote players + deterministic world + MP gate"},{"date":"2026-06-19","ts":1781857301000,"hash":"76c0a77","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Tune AI: fix early carrier double-KOs, balance to 50/50"},{"date":"2026-06-19","ts":1781857134000,"hash":"df24ec5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Live enemy AI: the commander brain now plays the full game against the player"},{"date":"2026-06-19","ts":1781856526000,"hash":"60a5ec5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"AI commander brain + headless war sim: two code-only AIs play the full game to a decisive win"},{"date":"2026-06-19","ts":1781855579000,"hash":"bee46c3","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Command Center building: HQ dashboard (J) with full status on everything"},{"date":"2026-06-19","ts":1781855404000,"hash":"a3ee067","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Airport building: hangar of 5 garrison aircraft that scramble to defend the city"},{"date":"2026-06-19","ts":1781855160000,"hash":"e511a64","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Engineers + repair system: hire engineers to repair ships & buildings over time"},{"date":"2026-06-19","ts":1781855050000,"hash":"b34bcc8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Ships: all sinkable (flood/list/sink + smoke/fire) + Dock builds battleship/destroyer/submarine"},{"date":"2026-06-19","ts":1781854644000,"hash":"02bbf4a","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"World atmosphere: day/night cycle, lights, wave depth lines, carrier runway lights"},{"date":"2026-06-19","ts":1781853683000,"hash":"df33076","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Cities have stakes: enemy raids your cities, buildings are destructible, defense towers defend"},{"date":"2026-06-18","ts":1781851827000,"hash":"6f75934","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Infrastructure: claim islands with a Dock + build grid cities (residential income, AA defense towers, plaza claim-insurance)"},{"date":"2026-06-18","ts":1781851045000,"hash":"b721023","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Parachute bail-out + sea rescue: downed pilots chute into the water and get picked up"},{"date":"2026-06-18","ts":1781850669000,"hash":"1e6678e","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Crew roster moved to a K menu; hired pilots now appear on deck"},{"date":"2026-06-18","ts":1781850212000,"hash":"4aeec94","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Shop: hire pilots (random-named lvl-1) + a CREW roster panel; bought planes get your reserve pilots"},{"date":"2026-06-18","ts":1781850003000,"hash":"528e827","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Setup screen + named crew roster + Captain + XP leveling that sharpens pilot aim"},{"date":"2026-06-18","ts":1781848579000,"hash":"85a87ee","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Localized hit damage: wing hits shear the wing (plane spirals down), fuselage kills tumble as wrecks; M in controls + map legend"},{"date":"2026-06-18","ts":1781847810000,"hash":"659dac5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Looser enemy aim (tracers fly past) + Nav map (M) with click-waypoint carrier autopilot"},{"date":"2026-06-18","ts":1781847300000,"hash":"b336e65","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Engines ~1/4 vol + gravity falloff (faint mid-field, swells up close); bomber bombing = forward view + always-on bombsight"},{"date":"2026-06-18","ts":1781847053000,"hash":"f0fd300","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Jet/heli engine sound = filtered air-rush noise (was an annoying alarm-like tone); bomber grumble kept"},{"date":"2026-06-18","ts":1781846847000,"hash":"017a7d8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Bomber down-view, voxel breakup on death, Doppler engine sound, clearer cockpit, speed wind-blur"},{"date":"2026-06-18","ts":1781846186000,"hash":"99ef957","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Auto-lock + lead reticle, stronger dive energy, cockpit-visible spray, bomber windshield fix, death=respawn aboard, no number keys, helm HUD declutter, explosion SFX + wind"},{"date":"2026-06-18","ts":1781845259000,"hash":"3c77c68","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Higher ceilings, faster small rounds + gun SFX, lock box, low-water spray, bomber bombsight, helm gauges"},{"date":"2026-06-18","ts":1781844574000,"hash":"13d30e2","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Bridge helm + carrier driving (wake/bow wave), FPV free-look fix, tougher planes w/ fire+smoke, radar shows land, mini-radar z-fix"},{"date":"2026-06-18","ts":1781843302000,"hash":"50619d7","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix hovering bug + AI speed/follow/boost, heli hover+reverse, per-plane mini-radar, fuel gauge"},{"date":"2026-06-18","ts":1781842943000,"hash":"9f80375","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Rebuild the bridge (bigger, furnished, doorway, fitted radar) + below-decks corridor"},{"date":"2026-06-18","ts":1781842373000,"hash":"e2b95e5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Boats park at the stern + are pilotable; idle boats no longer drift"},{"date":"2026-06-18","ts":1781842092000,"hash":"f977d3c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Bugs: patrol boats only fire at LOW targets; AI wingmen RTB to refuel"},{"date":"2026-06-18","ts":1781841975000,"hash":"5586a1b","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"VFX: wingtip contrails on hard turns + boost smoke trail + sea shadows for depth"},{"date":"2026-06-18","ts":1781841822000,"hash":"43bd6d9","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"First-person on foot + in flight = C; persistent throttle; cockpit instruments"},{"date":"2026-06-18","ts":1781841016000,"hash":"a2cb9f3","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"First-person cockpit (F), high-res canvas radar (10x), clean flight deck"},{"date":"2026-06-18","ts":1781840505000,"hash":"2d2c8b5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier interior: walk-up control tower with a live radar table + watertight section doors"},{"date":"2026-06-18","ts":1781840334000,"hash":"3e404cd","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix AI bank direction: roll INTO the turn (was dipping the outside wing)"},{"date":"2026-06-18","ts":1781839777000,"hash":"8b09748","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Bug pass: commander facing, auto-land, AI banking + 10x wider turns, bomber bomb-runs, carrier AA"},{"date":"2026-06-18","ts":1781838947000,"hash":"3b5e762","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Chunk 7: runway-roll takeoff — planes accelerate down the deck and rotate off the bow"},{"date":"2026-06-18","ts":1781838787000,"hash":"1db7bd2","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Chunk 4-6: credits + shop + 5 vehicle types + naval escorts + land-to-refuel"},{"date":"2026-06-18","ts":1781838379000,"hash":"f0ba3ef","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Chunk 3: fuel (5min, empty=dead engine) + heli guns + naval (boat) movement branch"},{"date":"2026-06-18","ts":1781838155000,"hash":"4814b73","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Chunk 2: 3x carrier size (voxel V 1.8->5.4) + 3x separation (z +-660)"},{"date":"2026-06-18","ts":1781837915000,"hash":"4a7eaab","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Chunk 1: pointer-lock mouse capture (cursor stays in window) + economy state scaffold"},{"date":"2026-06-18","ts":1781837028000,"hash":"a793ad3","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Wingmen actually fight: lead-aim + smart per-plane target selection"},{"date":"2026-06-18","ts":1781836578000,"hash":"3428d8d","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"ROOT CAUSE: AI flew AWAY from targets — Object3D.lookAt aims +z but the nose is -z"},{"date":"2026-06-18","ts":1781836104000,"hash":"e099adf","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Formup while flying = orbit around the player (reuse the working loiter) instead of fragile V-trail"},{"date":"2026-06-18","ts":1781835854000,"hash":"5502235","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Formup escort: wingmen throttle up to keep pace + tuck into a V trailing the flagship"},{"date":"2026-06-18","ts":1781835570000,"hash":"0ffab0c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Make AI actually turn: 2.7x agile slerp so wingmen hold a circle instead of flying near-straight"},{"date":"2026-06-18","ts":1781835320000,"hash":"00d48ce","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Tighten wingman orbit: climb-out heads toward target (not straight out) + converging ring loiter"},{"date":"2026-06-18","ts":1781835093000,"hash":"fafa3d0","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Actually stop wingmen crashing: anti-crash floor + no-stall now key on WHO is flying, not which side owns the plane"},{"date":"2026-06-18","ts":1781834694000,"hash":"6f4474c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Wingmen orbit the carrier instead of wandering off — loiter pattern"},{"date":"2026-06-18","ts":1781834516000,"hash":"e41bdf8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix AI planes diving into the ocean on launch: climb-out phase + low-alt guard + soft floor"},{"date":"2026-06-18","ts":1781834198000,"hash":"419aae5","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Deck mouse-look: cursor orbits the third-person camera; WASD now walks relative to the view"},{"date":"2026-06-18","ts":1781833901000,"hash":"357c612","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Menu close (X) + squadron-order feedback toasts"},{"date":"2026-06-18","ts":1781833562000,"hash":"3157f91","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Deck phase: start as the Commander on foot — walk the deck, board a plane (F), or scramble your crew (L)"},{"date":"2026-06-18","ts":1781832633000,"hash":"93c6689","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Fix wingman crash: player planes flown as AI wingmen took the player-control branch and threw on missing ctx.input — gate player control on ctx.input present"},{"date":"2026-06-18","ts":1781832457000,"hash":"3a461f3","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Make the game loop crash-proof (catch+log per-frame errors so a stray throw can't freeze the game) + guard wingman target"},{"date":"2026-06-18","ts":1781832070000,"hash":"1921b07","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Squadron Commander: AI wingmen you command (lock-on + orders), callsign labels"},{"date":"2026-06-18","ts":1781831399000,"hash":"5c4aa60","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"PLAN: AI crew = simple 3D Roblox-style humanoids (shared rig with player avatar, jaw lip-sync, animations, ranks) + record the lock-on target-designation decision"},{"date":"2026-06-18","ts":1781830964000,"hash":"bce3cb8","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"PLAN: voiced LLM-commanded AI squadron (LLM talks/interprets, code flies; callsigns, Polly, comms face, parachute-rescue)"},{"date":"2026-06-18","ts":1781830704000,"hash":"685355c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"PLAN: commander-embodiment, deck ops, AI wingmen (=offline defense), rogue AI faction, fleet variety, char creator + the flat-vs-globe decision"},{"date":"2026-06-18","ts":1781830202000,"hash":"31a8273","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Add PLAN.md — full design/build plan (persistent social-diplomacy game vision)"},{"date":"2026-06-18","ts":1781827960000,"hash":"af42eeb","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Boost+flames, islands, water-crash death, real-ish flight (stall/oxygen ceiling), altitude HUD"},{"date":"2026-06-18","ts":1781827160000,"hash":"64806a1","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Controls: add A/D wing roll alongside mouse pitch/yaw steering"},{"date":"2026-06-18","ts":1781827025000,"hash":"9dfbcce","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Controls: mouse steers, left-click fires, W/S throttle, Space airbrake"},{"date":"2026-06-18","ts":1781825958000,"hash":"f5c900c","repo":"carrier00","author":"puppyprogrammer","project":"carrier00","label":"Carrier00","version":null,"title":"Carrier00 Phase 1: voxel-carrier air/naval combat vertical slice"},{"date":"2026-06-18","ts":1781806345000,"hash":"7526d12a","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"AI Lab v2: use standard market template (SiteHeader+MarketNav) + labeled metric legend + flag random-origin (luck) rows"},{"date":"2026-06-18","ts":1781796953000,"hash":"8533b9b3","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"AI Lab v2: predictive-skill evolutionary ecosystem (competes with v1)"},{"date":"2026-06-18","ts":1781791819000,"hash":"6651a63f","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Agentic rebalance: fix quote parsing (holdings were valued at $0)"},{"date":"2026-06-17","ts":1781723119000,"hash":"db9abeb3","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"rebalance executor: surface Robinhood plain-text errors instead of crashing on JSON.parse"},{"date":"2026-06-17","ts":1781690689000,"hash":"8d3c7a6c","repo":"commslink2","author":"puppyprogrammer","project":"ai-npc","label":"ai-npc","version":null,"title":"ai-npc: idle fidgets + expressive speaking hand gestures (spokesperson presence)"},{"date":"2026-06-17","ts":1781689600000,"hash":"51cffd70","repo":"commslink2","author":"puppyprogrammer","project":"ai-npc","label":"ai-npc","version":null,"title":"ai-npc: gesture() (wave/nod) + female voice preference"},{"date":"2026-06-17","ts":1781688886000,"hash":"378dcac9","repo":"commslink2","author":"puppyprogrammer","project":"ai-npc","label":"ai-npc","version":null,"title":"ai-npc fixes: live ref handle (was no-op) + A-pose base (no more T-pose)"},{"date":"2026-06-17","ts":1781685136000,"hash":"4d61b9b0","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing: add ai-npc showcase card (open-source 3D AI NPC; links to GitHub)"},{"date":"2026-06-17","ts":1781684600000,"hash":"ac21a9a5","repo":"commslink2","author":"puppyprogrammer","project":"ai-npc","label":"ai-npc","version":null,"title":"ai-npc-test: floor + seat env via onReady + rescanAffordances; sitHeightRange so goTo('sit') walks to the seat"},{"date":"2026-06-17","ts":1781683715000,"hash":"4d2e1733","repo":"commslink2","author":"puppyprogrammer","project":"ai-npc","label":"ai-npc","version":null,"title":"Add sync-ainpc.sh: re-vendor the ai-npc engine into services/web after edits"},{"date":"2026-06-17","ts":1781683462000,"hash":"f7718c35","repo":"commslink2","author":"puppyprogrammer","project":"ai-npc","label":"ai-npc","version":null,"title":"Dogfood: vendor ai-npc engine into services/web + /ai-npc-test dev page (debug steps 2-4 with Eve's VRM)"},{"date":"2026-06-16","ts":1781657853000,"hash":"ce54d516","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"docs: Stage 4b done — rooms load their scene template; Stages 0-4 complete"},{"date":"2026-06-16","ts":1781657634000,"hash":"db99c03f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Stage 4b: AvatarPanel loads the room's scene_template (via room_memory_status), rebuilds engine on change; bedroom rooms unchanged"},{"date":"2026-06-16","ts":1781657153000,"hash":"29227d1d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"docs: Stage 4a done (room.scene_template + picker); 4b (scene wiring) teed up"},{"date":"2026-06-16","ts":1781656843000,"hash":"059e29e3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Stage 4a: room.scene_template column + API read/write + Room Settings picker (scene not yet wired to loader)"},{"date":"2026-06-16","ts":1781655764000,"hash":"c4ad9fb7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"docs: Stage 3 status (template registry + studio template, multi-template loading proven)"},{"date":"2026-06-16","ts":1781655664000,"hash":"9999f08e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Stage 3 fix: only bedroom (or default) inherits the legacy global layout/cleanup; other templates start empty"},{"date":"2026-06-16","ts":1781655390000,"hash":"fa83547a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Stage 3: template registry + loadTemplate(id) + minimal studio template; avatar-import ?template= selector"},{"date":"2026-06-16","ts":1781654648000,"hash":"f035fc46","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"docs: Stage 2 status (per-template persistence, migrate-on-read verified)"},{"date":"2026-06-16","ts":1781654397000,"hash":"390ebeff","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Stage 2: per-template persistence (layout + bench cleanup keyed by ?template, migrate-on-read from legacy global; circuit stays global)"},{"date":"2026-06-16","ts":1781653827000,"hash":"27d24ac4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"docs: Stage 1 status (capability system shipped; remaining items noted)"},{"date":"2026-06-16","ts":1781653572000,"hash":"600a76ba","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Stage 1: declarative capability system (screen/light/module/sit); pull id==='desk' screen wiring out of loadProp"},{"date":"2026-06-16","ts":1781651780000,"hash":"fdfbdcef","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"docs: scene-template plan + Stage 0 status"},{"date":"2026-06-16","ts":1781651534000,"hash":"fe54ae7a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Stage 0: extract bedroom scene into a data manifest (bedroomScene/loadScene), behavior-preserving"},{"date":"2026-06-16","ts":1781648045000,"hash":"9a726e67","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"agentic-executor: open-order guard + sync prod raw-MCP rebalance script to repo"},{"date":"2026-06-16","ts":1781645476000,"hash":"de36d7e0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Agentic OAuth start: param variant toggles (res/scope/loopback) for consent debugging"},{"date":"2026-06-16","ts":1781645115000,"hash":"b4209c65","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"agentic-executor: full rebalance executor + MCP client (policy->diff->market dollar-orders, drift+snapshot)"},{"date":"2026-06-16","ts":1781644039000,"hash":"a50b0c6f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Agentic OAuth start: drop token query param (mangled by chat clients); callback still state-protected"},{"date":"2026-06-16","ts":1781638846000,"hash":"24cfd0ab","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Agentic OAuth: one-click server-side token capture (start+callback routes, dedicated secrets volume)"},{"date":"2026-06-16","ts":1781638107000,"hash":"bda561a5","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"agentic-executor: one-time OAuth capture + headless token manager (Robinhood agentic trading, unattended rebalance — scaffolding)"},{"date":"2026-06-15","ts":1781580086000,"hash":"98153dfe","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"deploy.sh: stage new files across all source roots (fix crash from un-uploaded core/helpers/encryption.ts)"},{"date":"2026-06-15","ts":1781579981000,"hash":"f318868a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add missing encryption helper (restore site: prior deploy missed core/helpers/encryption.ts)"},{"date":"2026-06-15","ts":1781579846000,"hash":"17421482","repo":"commslink2","author":"puppyprogrammer","project":"forum","label":"Forum","version":null,"title":"Encrypt chat-derived content at rest (AES-256-GCM in data layer); no-op until MESSAGE_ENCRYPTION_KEY set"},{"date":"2026-06-15","ts":1781571201000,"hash":"600e2965","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Laptop screen AUTO-PINS to the laptop's Screen mesh (rides the panel, no manual alignment; auto-resolves facing/up so it can't be black/upside-down)"},{"date":"2026-06-15","ts":1781569671000,"hash":"7f5c04a8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Laptop persistence fix: no-store on avatar/layout (browser cached stale layout so saved drags never loaded); default -58.1"},{"date":"2026-06-15","ts":1781568187000,"hash":"fe55099d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Eve: {read_leaderboard} command + bench reactions (annoyed at long-running motor, panics at sparks)"},{"date":"2026-06-15","ts":1781567698000,"hash":"2e8ddcd3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatars: remove Shino + Victoria models, keep single Eve model"},{"date":"2026-06-15","ts":1781567113000,"hash":"cf02305a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Laptop: lock default rotation to -57.6 (matches the screen)"},{"date":"2026-06-15","ts":1781566794000,"hash":"e1137426","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Agentic: mirror the #1-ranked algo (replicate top algo's position weights) instead of generic SPY rule"},{"date":"2026-06-15","ts":1781564439000,"hash":"91e338de","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Agentic: trading policy endpoint (the brain) — consensus -> target weights, executor-agnostic for exe later"},{"date":"2026-06-15","ts":1781522406000,"hash":"c54d8973","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Pricing: free tier 2k credits + profitable credit packs; archive Ligo Grok calls (no longer live, kills unmetered cost)"},{"date":"2026-06-15","ts":1781521922000,"hash":"2c03c9f3","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Security: rate-limit open AI-browser Grok endpoint, fail-closed agentic token, harden terminal safe-list, untrack .deploy.env; landing: rewrite Chat description"},{"date":"2026-06-15","ts":1781519699000,"hash":"9ecc3597","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar layout: persist gizmo-placed laptop + screen to server so they stick across refreshes (no deploy)"},{"date":"2026-06-15","ts":1781519488000,"hash":"81c1feab","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Trading Desk: revert screen weld (it blacked the screen); screen + laptop are fixed baked transforms again"},{"date":"2026-06-15","ts":1781518884000,"hash":"44e320a4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Trading Desk: laptop at user's exact -58 transform; screen weld-ref matched so it loads fitted"},{"date":"2026-06-15","ts":1781518690000,"hash":"ce0db0d6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Trading Desk: weld laptop screen to the laptop model so they never desync (position only the laptop)"},{"date":"2026-06-15","ts":1781518215000,"hash":"2166b322","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Trading Desk: adjust baked laptop position"},{"date":"2026-06-15","ts":1781517907000,"hash":"788ceb93","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Trading Desk: bake user's baked laptop + screen positions on the bed"},{"date":"2026-06-15","ts":1781516908000,"hash":"d31b4e16","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Agentic trading: snapshot endpoint + {read_portfolio} so Eve reads/narrates her account"},{"date":"2026-06-15","ts":1781516446000,"hash":"38c8affe","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Trading Desk: cross-legged bed pose (crosslegged cmd) + clickable laptop screen"},{"date":"2026-06-15","ts":1781516091000,"hash":"c1b12ee7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Trading Desk: laptop on Eve's bed with live Robinhood/algo-consensus screen (read-only)"},{"date":"2026-06-15","ts":1781512220000,"hash":"32c7a298","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bench: starter circuit is the default seed; {read_circuit} so AI reads the schematic"},{"date":"2026-06-15","ts":1781511334000,"hash":"e3fd1278","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit: switch propagation — relay + solenoid close the chain to the motor"},{"date":"2026-06-15","ts":1781510466000,"hash":"a0d036da","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Reactive bench: realistic solenoid posts + snap sound + short sparks/zap"},{"date":"2026-06-15","ts":1781509112000,"hash":"dfa73228","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add {code} command: agents can program the workbench MicroController"},{"date":"2026-06-15","ts":1781508666000,"hash":"ddc5bd7f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Workbench screen: white/blue theme, fix click-through, bake pos, poll Eve edits"},{"date":"2026-06-15","ts":1781507759000,"hash":"734e6501","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Workbench screen: merge code + schematic into one Home-launcher UI, resizable"},{"date":"2026-06-15","ts":1781506854000,"hash":"ac6e36da","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Stage 2: screen gizmos (O/B) + live schematic screen"},{"date":"2026-06-14","ts":1781505930000,"hash":"9879f6d4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Stage 2: editable MicroController code editor on a desk CSS3D screen"},{"date":"2026-06-14","ts":1781505025000,"hash":"0ed76f81","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit: fix logo, tiny rect LEDs + tight glow, drag bodies, can motor"},{"date":"2026-06-14","ts":1781503891000,"hash":"a7fdde30","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit: wires follow moves, realistic battery, glowing LEDs"},{"date":"2026-06-14","ts":1781503043000,"hash":"9d426096","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit realism: relay 3-terminal channels, big 12V studs, solenoid base ground"},{"date":"2026-06-14","ts":1781501986000,"hash":"15818011","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit: vivid pin colors + clustered relay input header"},{"date":"2026-06-14","ts":1781501220000,"hash":"7586a2b6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit: lock parts to the mat 2D plane, Ctrl+Z/Y undo, thinner wires"},{"date":"2026-06-14","ts":1781499896000,"hash":"46842fde","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit: 8-channel relay + programmable MicroController runtime"},{"date":"2026-06-14","ts":1781498557000,"hash":"0af9ab3d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit: deletable wires between dense pins, unique pin names, hover tooltip"},{"date":"2026-06-14","ts":1781497564000,"hash":"96b0d686","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit: USB-C ports + power-LED, Pi detailing, under-component labels"},{"date":"2026-06-14","ts":1781496553000,"hash":"e65c1387","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit: USB-C 5V PSU part, real header pins, taller battery, round solenoid"},{"date":"2026-06-14","ts":1781495620000,"hash":"5d04b87b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit: pin-to-pin wiring + wire delete; rename parts; tan-brown shelf"},{"date":"2026-06-14","ts":1781494828000,"hash":"16768b27","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit shelf: sit samples on real ledges + match cabinet wood color"},{"date":"2026-06-14","ts":1781493686000,"hash":"3b8319d3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit shelf: bake position, full-size samples, bigger labels"},{"date":"2026-06-14","ts":1781492898000,"hash":"11cc8725","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit workbench: mat-click auto-mode + a physical parts shelf"},{"date":"2026-06-14","ts":1781491683000,"hash":"32626eef","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit workbench Slice 2: interactive editor (add/move/delete + persist)"},{"date":"2026-06-14","ts":1781490735000,"hash":"e9ee8f97","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Circuit workbench Slice 1: component library + on-mat renderer"},{"date":"2026-06-14","ts":1781489278000,"hash":"aefca587","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk: nudge workbench toward the desk + persist its transform"},{"date":"2026-06-14","ts":1781487913000,"hash":"676bf67d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk part editor: delete key + tiny-part proximity-assist"},{"date":"2026-06-14","ts":1781487263000,"hash":"a045667b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk: remove delete tool, add per-part move/rotate editor"},{"date":"2026-06-14","ts":1781486310000,"hash":"ed927523","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk: server is source of truth + conservative flood-fill"},{"date":"2026-06-14","ts":1781485659000,"hash":"444c0c68","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk: single-part delete (Shift=whole object) + green-mat editor"},{"date":"2026-06-14","ts":1781484596000,"hash":"51b0c31a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk picker: protect table/frame/mat by identity, delete the rest"},{"date":"2026-06-14","ts":1781483622000,"hash":"dc3f3da1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk cleanup: GLOBAL (server-persisted) + whole-object delete"},{"date":"2026-06-14","ts":1781482501000,"hash":"ac749c76","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk cleanup: persist it + let it delete any-size junk"},{"date":"2026-06-14","ts":1781481823000,"hash":"0b353251","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk: smarter cleanup picker + magnifier worklight"},{"date":"2026-06-14","ts":1781480829000,"hash":"1cde4787","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk: cleanup picker + -20% scale + snap back to wall"},{"date":"2026-06-14","ts":1781480182000,"hash":"e66fb975","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Maker's desk: load circuit workbench into the room (Draco-compressed)"},{"date":"2026-06-14","ts":1781478162000,"hash":"10e0545f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Web interaction: Eve can type into fields, submit, and scroll"},{"date":"2026-06-14","ts":1781476782000,"hash":"2fcfcede","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Whiteboard: clear→walk→erase ritual + walktoboard destination"},{"date":"2026-06-14","ts":1781474554000,"hash":"4ea26022","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Whiteboard: she walks over and writes the plan (Director ritual)"},{"date":"2026-06-14","ts":1781473135000,"hash":"145998f2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Whiteboard: prose-aware plan parsing, word-wrap, flush-to-wall"},{"date":"2026-06-14","ts":1781472064000,"hash":"c1a2d509","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Whiteboard: move to back-wall midpoint between desk and TV"},{"date":"2026-06-14","ts":1781471203000,"hash":"c371f564","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Whiteboard: AI's plan written onto a dry-erase board (left of the TV)"},{"date":"2026-06-14","ts":1781450749000,"hash":"9245316c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Pose editor: camera-relative joint dragging"},{"date":"2026-06-14","ts":1781449945000,"hash":"ff98bb03","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Floor-sit: user-calibrated ground-sit pose + soft curious head-tilt"},{"date":"2026-06-14","ts":1781448919000,"hash":"dadabc71","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Room spatial awareness: she knows where the desk/bed/TV/floor are"},{"date":"2026-06-14","ts":1781447940000,"hash":"2b0693b2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Live TV: click anywhere on the screen to turn it on (when off)"},{"date":"2026-06-14","ts":1781447515000,"hash":"9d0a6744","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar TV-glance: ~1.5s delay before she turns + half-speed turn"},{"date":"2026-06-14","ts":1781447082000,"hash":"cb730a63","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: she turns to look at the TV when it's on and she's idle"},{"date":"2026-06-14","ts":1781446346000,"hash":"66a281d8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Memory system: searchable recall, capped injection, hardened trigger, better prompts"},{"date":"2026-06-14","ts":1781444884000,"hash":"0f3c888c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"TV reactions: more frequent + natural gut reactions (less robotic)"},{"date":"2026-06-14","ts":1781444261000,"hash":"7ad4f87b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix: ambient TV channel counts as \"watching\" (she stops getting pulled off)"},{"date":"2026-06-14","ts":1781443941000,"hash":"e2865358","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"TV is fun, not grind: watching relieves boredom + a small mood lift"},{"date":"2026-06-14","ts":1781443433000,"hash":"3a68c96f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fast TV reactions: in-the-moment laugh-along loop"},{"date":"2026-06-14","ts":1781442055000,"hash":"fd081de8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix: accept TV-channel audio transcripts (not only watch parties)"},{"date":"2026-06-14","ts":1781441518000,"hash":"612e7fb4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"TV hearing: reuse EveEars audio/Whisper pipeline for the live channels"},{"date":"2026-06-14","ts":1781439967000,"hash":"6f518561","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"TV captions Phase 1: extension reads YouTube captions → server buffer"},{"date":"2026-06-14","ts":1781438871000,"hash":"5f2b12b6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Live TV: bake user-calibrated power-button position + robust click"},{"date":"2026-06-14","ts":1781438460000,"hash":"006bd36a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Live TV: T gizmo to position the power button"},{"date":"2026-06-14","ts":1781437983000,"hash":"a9cbb684","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Live TV: clickable 3D power button + YouTube live-channel menu"},{"date":"2026-06-14","ts":1781433147000,"hash":"cbc31a8b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Unlock prompt caching: move volatile timestamp out of the prefix (~50% input cut)"},{"date":"2026-06-14","ts":1781432410000,"hash":"08d62e78","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Cost instrumentation: capture cached + reasoning tokens"},{"date":"2026-06-14","ts":1781429158000,"hash":"b9ce362a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bids for connection — Slice 1 (the rhythm)"},{"date":"2026-06-14","ts":1781428379000,"hash":"1d09a4e4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix EVEMON command leaking as text + screensaver only when away from desk"},{"date":"2026-06-14","ts":1781426975000,"hash":"7320ca23","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix iframe embedding (remove sandbox) + real contrapposto weight-shift"},{"date":"2026-06-14","ts":1781426068000,"hash":"a50144c9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Attention & gaze: her eyes follow what she's doing"},{"date":"2026-06-14","ts":1781425718000,"hash":"d34fd2ca","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Emotion-driven voice prosody"},{"date":"2026-06-14","ts":1781425352000,"hash":"da4939d1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Emotional embodiment + blocked-site monitor fallback"},{"date":"2026-06-13","ts":1781416918000,"hash":"6a3b9fb5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar Layers 2+3: emphasis gestures + idle variety"},{"date":"2026-06-13","ts":1781416288000,"hash":"d56ddf46","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar Layer 1: co-speech body language (procedural beat gestures)"},{"date":"2026-06-13","ts":1781411212000,"hash":"60969725","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"No autonomous forum posting + pose paste-import + joint calibration"},{"date":"2026-06-13","ts":1781409702000,"hash":"c0a63855","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"docs: VRM joint reference for animation authoring (mined angle ranges + axis semantics)"},{"date":"2026-06-13","ts":1781352602000,"hash":"632330ee","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: VRM0 bone-frame correction — fix arms-up/hips-back/fingers-reversed on 0.x models"},{"date":"2026-06-13","ts":1781351903000,"hash":"170b1701","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: version-aware facing — fix VRM0 models loading backward/mirrored"},{"date":"2026-06-13","ts":1781351051000,"hash":"6ff61364","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: add Victoria as a 3rd model (admin-only)"},{"date":"2026-06-13","ts":1781350739000,"hash":"354db52e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: gate non-default models to admins (Shino is admin-only while iterating)"},{"date":"2026-06-13","ts":1781350316000,"hash":"19588e0f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: model selector dropdown — add 2nd VRM (Shino) alongside Eve"},{"date":"2026-06-13","ts":1781348466000,"hash":"363f0cdb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Pose editor: add all finger joints + drag-to-rotate the joint dots"},{"date":"2026-06-13","ts":1781347590000,"hash":"9de1f01f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar UX: TV click toggles play/pause, EveEars button top-right, remove EVEMON/Pose buttons (Pose = P key)"},{"date":"2026-06-13","ts":1781346146000,"hash":"5f1f4fe4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Pose editor: clickable green joint dots on the avatar (replaces dropdown-only select)"},{"date":"2026-06-13","ts":1781344875000,"hash":"f75aaa75","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: add a Pose Editor (joint sliders + reset + copy-to-clipboard)"},{"date":"2026-06-13","ts":1781343621000,"hash":"16006ea7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"chat: ground Eve on what's on her PC screen (stop reddit-is/isn't-open contradiction)"},{"date":"2026-06-12","ts":1781294265000,"hash":"382ede46","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch party: don't prompt Eve on party-start (stops double playback) + clickable screens (forward canvas clicks to monitor/tablet/TV DOM)"},{"date":"2026-06-12","ts":1781255372000,"hash":"91481621","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Refactor: extract watchparty.ts (watch-party + TV-transcript state)"},{"date":"2026-06-12","ts":1781255027000,"hash":"18696e97","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Refactor: extract llm.ts (routedChatCompletion) + browser.ts + speech utils"},{"date":"2026-06-12","ts":1781251381000,"hash":"b7953ccf","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Relationship memory: Eve remembers each user she interacts with (multi-user)"},{"date":"2026-06-12","ts":1781250329000,"hash":"940ba62d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Refactor: start breaking up chat/index.ts — extract emotion engine + utils"},{"date":"2026-06-12","ts":1781247615000,"hash":"efe56aa0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Curb Eve's journaling rumination (3 fixes)"},{"date":"2026-06-11","ts":1781246000000,"hash":"f9dffddf","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: deterministic collapse floor at energy<=0.08 + stop her parroting feeling phrases"},{"date":"2026-06-11","ts":1781245562000,"hash":"aba03f73","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Self-care: normalize her bare {rest_lieback} text-braces so the animation layer reliably fires"},{"date":"2026-06-11","ts":1781244400000,"hash":"0c3aaec3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: felt-state agency — she voices feelings + CHOOSES to rest, not coded thresholds"},{"date":"2026-06-11","ts":1781243235000,"hash":"04a704c9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch party: 15s chunks + rolling LLM summary so context never bloats"},{"date":"2026-06-11","ts":1781242539000,"hash":"c513ea53","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch party: accumulate the transcript as the video plays (don't clear each cycle)"},{"date":"2026-06-11","ts":1781241615000,"hash":"0dcf723a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch party: capture clean TAB AUDIO + in-browser Whisper (drop the mic)"},{"date":"2026-06-11","ts":1781240858000,"hash":"d7fe430a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch party: fix mic never starting on commanded watch + stop her faking hearing"},{"date":"2026-06-11","ts":1781240002000,"hash":"4c6db274","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch party: Eve hears the video via browser speech-rec (Parts 2-4)"},{"date":"2026-06-11","ts":1781239132000,"hash":"3ebef737","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch party: Eve goes to watch the TV when idle + stays aware of what's on (Part 1)"},{"date":"2026-06-11","ts":1781237347000,"hash":"40458629","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: move final sleep spot to gizmo-calibrated (2.78,0.581)"},{"date":"2026-06-11","ts":1781236875000,"hash":"ab4d40d6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: close Eve's eyes while she's asleep"},{"date":"2026-06-11","ts":1781236417000,"hash":"c91092bb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Boredom redesign: grind bores her, leisure relieves it, max boredom -> flop & complain"},{"date":"2026-06-11","ts":1781235398000,"hash":"61ff4b87","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar fatigue: make energy a real battery so she gets tired, lies back, sleeps, wakes"},{"date":"2026-06-11","ts":1781233458000,"hash":"d1608ef0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"WatchTvOnBed: move her sit spot to gizmo-calibrated (1.495,-0.612); revert spawn bake"},{"date":"2026-06-11","ts":1781232754000,"hash":"752bbddc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: bake gizmo-calibrated home/idle spot (1.495,-0.612 facing 204.7°)"},{"date":"2026-06-11","ts":1781232401000,"hash":"feaedb81","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar gizmo: move + rotate Eve herself (key N, no scale)"},{"date":"2026-06-11","ts":1781231746000,"hash":"b67e871e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"WatchTvOnBed: make it a Movement Director move (not a main-LLM tool)"},{"date":"2026-06-11","ts":1781231340000,"hash":"410c990e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add WatchTvOnBed AI command: sit at the foot of the bed facing the TV"},{"date":"2026-06-11","ts":1781230911000,"hash":"f6b3263f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Desk lamp: wider light reach (distance 14) + 50% brighter (10.5)"},{"date":"2026-06-11","ts":1781230401000,"hash":"b60ea241","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Lighting: fade the Tron grid (0.18, desaturated) + dim blue rim for a cozy room"},{"date":"2026-06-11","ts":1781230091000,"hash":"216f6b53","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Lighting: turn off global ambient — the room is lamp-lit now"},{"date":"2026-06-11","ts":1781229717000,"hash":"15107e3a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Lower the whole desk system 0.089m to match the resized floor"},{"date":"2026-06-11","ts":1781228507000,"hash":"727e984e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Floor editor: 'M' gizmo to move/rotate/resize the desk asset's beige floor slab"},{"date":"2026-06-11","ts":1781227692000,"hash":"3f11c1e7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Lamps: glowing warm shade (emissive top) + soft point light, on both lamps"},{"date":"2026-06-11","ts":1781227207000,"hash":"4e436b5a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Desk lamp: bake placement + put the warm light at the bulb (bbox top)"},{"date":"2026-06-11","ts":1781226821000,"hash":"53b0798b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add desk floor lamp + per-lamp AI commands; bake bedside scale 0.677"},{"date":"2026-06-11","ts":1781225843000,"hash":"d7447b18","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Lamp: bake position (4.021,0.745,-1.35) + scale up/down (K gizmo, arrows)"},{"date":"2026-06-11","ts":1781225516000,"hash":"d4d8055d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Bedside lamp: model + warm cozy point light, on/off via {lamp} command + K gizmo"},{"date":"2026-06-11","ts":1781223943000,"hash":"cca8d60b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Chat layout: avatar 75% / chat 25% (resize now percentage-based)"},{"date":"2026-06-11","ts":1781223539000,"hash":"5ddb9558","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"TV screen: lock final placement (0.804,1.109,-2.38 / 1.329x0.719)"},{"date":"2026-06-11","ts":1781223239000,"hash":"8c127348","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"TV video fills the plane (16:9) + voice volume slider controls her avatar voice"},{"date":"2026-06-11","ts":1781222154000,"hash":"91b96c10","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Gizmo resize mode (B) + restore desk/gaming position on refresh"},{"date":"2026-06-11","ts":1781221238000,"hash":"3e6323b8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"TV screen: G gizmo (J=left monitor), nudge back, faint idle glow"},{"date":"2026-06-11","ts":1781220912000,"hash":"ca882f13","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch parties play on the 3D TV + move cabinet/TV to half-distance from bed"},{"date":"2026-06-11","ts":1781219955000,"hash":"b215832f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"World: add flat-screen TV on top of the far-wall cabinet (loadProp y-offset)"},{"date":"2026-06-11","ts":1781219460000,"hash":"3c05fa00","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"World: add TV cabinet on the far wall (0,-4.85), equilateral with desk+bed"},{"date":"2026-06-11","ts":1781219017000,"hash":"c45e912c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Left monitor: lock final placement (pos -3.553,1.469,0.376 / 0.467x0.329)"},{"date":"2026-06-11","ts":1781218804000,"hash":"5355468c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Left monitor: non-uniform scale (W 0.467 / H 0.329) + baked coords"},{"date":"2026-06-11","ts":1781218388000,"hash":"243f22e6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Left monitor: bake gizmo placement + scale 10% more (~20% total)"},{"date":"2026-06-11","ts":1781217562000,"hash":"111edb1a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Left monitor: G/R gizmo control (H=tablet) + scale down 10%"},{"date":"2026-06-11","ts":1781217306000,"hash":"f75ca74c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Forum: route replies through the forum gate (not the search page) + dark teal theme"},{"date":"2026-06-11","ts":1781211580000,"hash":"4692178b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Left monitor: never black (game/website/screensaver) + forum-post UI on screen"},{"date":"2026-06-11","ts":1781210356000,"hash":"fe0431e9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Terminal tablet: lock in final placement (pos -3.552,1.181,-0.212 / 0.477m)"},{"date":"2026-06-11","ts":1781210034000,"hash":"00a0b1e0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Terminal tablet: drop placeholder innerHTML (was adding dead height above the panel)"},{"date":"2026-06-11","ts":1781209624000,"hash":"933cad37","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Terminal tablet: resize to 870x780"},{"date":"2026-06-11","ts":1781209292000,"hash":"b0c0d465","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Terminal tablet: bake gizmo placement + reshape window wider/shorter (1020x880)"},{"date":"2026-06-11","ts":1781208206000,"hash":"9f98bb01","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Terminal tablet: G now grabs the tablet (H = old monitor)"},{"date":"2026-06-11","ts":1781207724000,"hash":"8429b13c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Terminal tablet: baked placement + 'H' gizmo (drag to place, reads tablet coords)"},{"date":"2026-06-11","ts":1781206839000,"hash":"d3203f19","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Energy×boredom→activity (game/lieback/sleep) + terminal tablet (2nd screen) v1"},{"date":"2026-06-11","ts":1781205662000,"hash":"ee713cee","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"EVEMON: add {play_evemon} AI command + never show the game on an unused PC"},{"date":"2026-06-11","ts":1781204709000,"hash":"a0c326b1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"EVEMON: half-speed, 1 click per choice, and play-gated (sitting ≠ playing)"},{"date":"2026-06-11","ts":1781185366000,"hash":"21beb181","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"EVEMON: procedural-SVG Pokémon-style game on Eve's monitor (self-playing demo)"},{"date":"2026-06-11","ts":1781180877000,"hash":"cb7ad366","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Aero search bar fills char-by-char as Eve types; 15s aquarium screensaver idle"},{"date":"2026-06-10","ts":1781153909000,"hash":"a0904157","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar typing gate wired into ALL typing tools (browse, search, sql, terminal, claude)"},{"date":"2026-06-10","ts":1781153380000,"hash":"5fc5d1c3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: forum posts now type out at her desk before going live (first \"typing tool\")"},{"date":"2026-06-10","ts":1781152698000,"hash":"a166b75b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"3D avatar: locomotion, room props, seated-typing pose, finger control, fly-cam"},{"date":"2026-06-10","ts":1781133190000,"hash":"ff4e7135","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Headless animation importer: drive the real BVH retarget via Puppeteer to bulk-load CMU+Bandai"},{"date":"2026-06-10","ts":1781131619000,"hash":"c489d794","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Animation library: shared `animation` table (keyframes stored once) replaces the 64KB per-agent blob"},{"date":"2026-06-10","ts":1781127212000,"hash":"7659bc9b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Grounding critic: a successful navigation grounds opened/showing/playing claims (videos autoplay for the room); browse: robust play-button click drives the video (player API + muted->unmute) so script-clicks defeat the autoplay gesture wall"},{"date":"2026-06-10","ts":1781124792000,"hash":"14a70ee1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Hotfix: strip lone surrogates from Grok request body (crash: unexpected end of hex escape); strip emojis+URLs from TTS (voice product)"},{"date":"2026-06-10","ts":1781124355000,"hash":"4b4a9d5d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Browse: capture aria-label/title for icon buttons (YouTube play); surface up to 120 clickables so player controls + all links reach the AI"},{"date":"2026-06-10","ts":1781091913000,"hash":"3e1f1195","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Eve loop: iter 7 (autopilot prompt aligned) + loop to light-upkeep mode"},{"date":"2026-06-10","ts":1781091624000,"hash":"c636371f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Eve loop: log iter 6 (ease-in) + consolidation + feel-check checklist"},{"date":"2026-06-10","ts":1781091502000,"hash":"2a31f65a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar micro-movement: smooth animation ease-in (no snap-on)"},{"date":"2026-06-10","ts":1781090885000,"hash":"479c8b05","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Eve loop: log iter 5 (idle weight-shift)"},{"date":"2026-06-10","ts":1781090858000,"hash":"e5f865f4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar micro-movement: idle weight-shift (no more statue stance)"},{"date":"2026-06-10","ts":1781090302000,"hash":"b875d477","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Eve loop: log iter 4 (micro-expression engine)"},{"date":"2026-06-10","ts":1781090272000,"hash":"58458aed","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar micro-movement: micro-expression engine (transient facial reactions)"},{"date":"2026-06-10","ts":1781089664000,"hash":"986f02ce","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Eve loop: log iter 3 (mood drift)"},{"date":"2026-06-10","ts":1781089637000,"hash":"f0838c36","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar micro-movement: mood drift (face varies instead of locking)"},{"date":"2026-06-10","ts":1781089123000,"hash":"9c5d7b3d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Eve loop: progress log (gaze subsystem + room/walk instruction)"},{"date":"2026-06-10","ts":1781088987000,"hash":"c6abe814","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar micro-movement: gaze subsystem (look around / at user / bored scan)"},{"date":"2026-06-10","ts":1781086597000,"hash":"322e5ff5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: a room (floor + space + pulled-back camera) + root motion"},{"date":"2026-06-10","ts":1781085504000,"hash":"b04e34c9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"BVH retarget: strip to clean per-bone world-delta map + yaw-only frame alignment"},{"date":"2026-06-10","ts":1781076347000,"hash":"674c901a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"BVH retarget: frame-alignment by conjugation + trim trailing calibration frame"},{"date":"2026-06-10","ts":1781075502000,"hash":"0b096e85","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"BVH retarget: per-frame global-yaw removal + leading calibration-frame skip"},{"date":"2026-06-09","ts":1781072358000,"hash":"f017032d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"BVH retarget: global frame-alignment G (from hips rest) re-expresses motion into VRM world frame — fixes CMU 180-degree flip; identity for already-aligned data"},{"date":"2026-06-09","ts":1781071202000,"hash":"e6893b66","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"BVH import: auto-detect skeleton (Bandai vs CMU) + add CMU bone map, so CMU mocap (more variety) retargets too"},{"date":"2026-06-09","ts":1781069759000,"hash":"a6b035d7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"BVH retarget: anchor arms to our arms-down rest (not T-pose) so arm motion transfers from the correct neutral (fixes arms snapping to T-pose during imported clips)"},{"date":"2026-06-09","ts":1781068994000,"hash":"fc49d1b3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"BVH retarget fix: use frame-0 (neutral standing) as rest reference, not bind pose — cancels mocap baseline rotation leaking spurious twist into hips/legs/head"},{"date":"2026-06-09","ts":1781068039000,"hash":"903e169e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"BVH import: VrmEngine.importBVH retargets open mocap (Bandai-Namco) by world-orientation onto our rig, extracts to {bones,ms} numbers; bridge importBvh trigger"},{"date":"2026-06-09","ts":1781065961000,"hash":"c421d6d5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Import open VRMA animations as numbers: VrmEngine.importVRMA extracts .vrma bone rotations into our {bones,ms} format (delta from rest); save into agent animation library; anim frames support raw bones; bridge import trigger"},{"date":"2026-06-09","ts":1781064798000,"hash":"b5937e4d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Joint limits: clamp avatar_bone (+ pose/anim playback) to per-bone natural ranges so limbs cannot bend into impossible positions; tell the AI when an angle is clamped"},{"date":"2026-06-09","ts":1781064178000,"hash":"f584ba6f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Postural fatigue: held poses relax smoothly toward neutral (client), strain drains energy + names tired limbs + rest nudges (server); very-low energy reads drowsy/sleep"},{"date":"2026-06-09","ts":1781063569000,"hash":"1215e5c1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Persist avatar state across panel close/reopen: server tracks current mood + pose/animation per agent; panel requests + restores it on open (avatar_request_state/avatar_state)"},{"date":"2026-06-09","ts":1781063080000,"hash":"24d876a2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Smooth animations: Catmull-Rom spline interpolation through keyframes (flows through poses with continuous velocity instead of stopping/cornering at each) — fixes jerky playback"},{"date":"2026-06-09","ts":1781062352000,"hash":"3813b718","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar polish: seamless loop (frame 0 eases from last keyframe when looping, no reset dip) + remove manual mood/gesture/pose test buttons from panel (AI drives it)"},{"date":"2026-06-09","ts":1781061348000,"hash":"6c9fa306","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Phase 2b: playable animations — chain saved poses into timed sequences ({anim_save/play/list/delete}); VrmEngine.playKeyframes tweens (smoothstep) between poses; avatar_animation socket event + bridge frames test path"},{"date":"2026-06-09","ts":1781060606000,"hash":"8bb19012","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Emotion→face: server auto-drives avatar mood from the felt state each cycle (when influence>=0.3), so expression is an automatic honest readout, not reliant on grok emitting {avatar mood}"},{"date":"2026-06-09","ts":1781060071000,"hash":"155d8a98","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Emotion levers: {set_emotion} self-edit command (gated by self_editable) + Emotions section in agent edit UI (sliders for the 8 knobs, enabled/self_editable toggles)"},{"date":"2026-06-09","ts":1781058446000,"hash":"6af89d6c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Hotfix: emotion affect injection referenced out-of-scope boredom (crash-loop) — hoist boredomLevel to outer scope"},{"date":"2026-06-09","ts":1781058067000,"hash":"6c5be559","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Emotion engine v1: configurable affect state (valence x energy from appraisal + dopamine/prediction-error), persisted per agent, injected as felt-state into prompt + biases behavior/avatar mood (emotion_config knobs, emotion_state)"},{"date":"2026-06-09","ts":1781056028000,"hash":"68532286","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Animation authoring Phase 2a: named static poses ({pose_save/play/list/delete}) — server tracks working pose from avatar_bone, persists to llm_agent.poses; full tool/registration wiring"},{"date":"2026-06-09","ts":1781053643000,"hash":"699132cb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar screenshot + direct-drive: bridge can move the body and capture the canvas PNG to verify animation visually (preserveDrawingBuffer + screenshot(); driveAvatar/requestAvatarScreenshot + /agent-bridge/avatar,/screenshot)"},{"date":"2026-06-09","ts":1781052778000,"hash":"6b76b3fe","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"FIX: avatar commands missing from hasAnyCommand sum — response with ONLY an avatar command broke the loop before executing (body never moved)"},{"date":"2026-06-09","ts":1781051210000,"hash":"b31b0626","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Agent bridge: HTTP endpoint for ClaudeAI to prompt agents + review actions (injectExternalMessage + /api/v1/agent-bridge/{send,messages}, token-auth)"},{"date":"2026-06-09","ts":1781050437000,"hash":"c1c09915","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar ROOT FIX: expose avatar/avatar_bone/avatar_reset as STRUCTURED tools — grok runs in tool-calling mode and had no body tool to call, so it narrated instead of moving (never once fired an avatar command)"},{"date":"2026-06-09","ts":1781050022000,"hash":"cc799723","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: force-emit nudge — when she narrates body movement but issues no command, re-prompt to emit the literal token (fixes 'she isnt even trying')"},{"date":"2026-06-09","ts":1781049534000,"hash":"b6f64ab2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: fix command-emission (flag malformed/unclosed {avatar_bone} + sharpen docs); widen critic gate to body verbs (raise/lift/wave/nod...)"},{"date":"2026-06-09","ts":1781048497000,"hash":"564071af","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Grounding: close 2 confab gaps — body actions force re-prompt loop; critic now vetoes sensory/body/external-state lies"},{"date":"2026-06-09","ts":1781045263000,"hash":"5304c64b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Animation authoring Phase 1: {avatar_bone}/{avatar_reset} direct joint control + proprioceptive feedback in prompt"},{"date":"2026-06-09","ts":1781044380000,"hash":"7f9011b3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Engage-user: fire only until the agent has REPLIED (was re-acknowledging the same msg 3x)"},{"date":"2026-06-09","ts":1781043725000,"hash":"0c4661b0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: fix arms-up cheerleader rest pose -> arms down (sign was inverted); flip gesture raise signs to match"},{"date":"2026-06-09","ts":1781043455000,"hash":"79160bbb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Self-check: a present talking user is TOP priority — overrides autonomous exploration"},{"date":"2026-06-09","ts":1781042746000,"hash":"41798aee","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: arms-down rest pose (was T-pose) + chat feedback of avatar actions + honest \"no eyes\" note"},{"date":"2026-06-09","ts":1781042329000,"hash":"4e5fcae0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar exploration: a NEW gesture/mood resets the forum streak (re-describing the same is caught)"},{"date":"2026-06-09","ts":1781041351000,"hash":"508b39a5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: rich animated VRM gestures + AI mood/gesture/movement control"},{"date":"2026-06-09","ts":1781039920000,"hash":"acffd493","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"vrm: fix Uint8Array<ArrayBuffer> typed-array generic (TS 5.7 build error)"},{"date":"2026-06-09","ts":1781039662000,"hash":"34825a1d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: VRM engine (anime/VTuber avatars) replacing TalkingHead GLB"},{"date":"2026-06-09","ts":1781035921000,"hash":"c68ec71e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"set_autopilot_interval: no-op guard when value already equals current (stop redundant re-sets)"},{"date":"2026-06-09","ts":1781035366000,"hash":"1011ed09","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Boredom: when bored, do not drift back to an exhausted topic — pick genuinely new territory"},{"date":"2026-06-09","ts":1781035076000,"hash":"e7a12c57","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"deploy-ec2.sh: post-deploy STABILITY GATE (catch crash-loops, not just build failures)"},{"date":"2026-06-09","ts":1781034420000,"hash":"328d614d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"HOTFIX: currentAgent possibly-null crashed the API (recall/auto-recall) — null-safe access"},{"date":"2026-06-09","ts":1781034118000,"hash":"b11dc3c3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Auto-recall: surface relevant saved memories on every search (knowledge leverage, automatic)"},{"date":"2026-06-09","ts":1781033888000,"hash":"c5b02fe1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"recall: keyword-search the agents own memories (a real capability, not another guard)"},{"date":"2026-06-09","ts":1781033536000,"hash":"59708d40","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Forum streak: block the 3rd consecutive same-thread post (was 4th)"},{"date":"2026-06-09","ts":1781033310000,"hash":"cd4d8f2e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Search: escalate the re-search guard after 3 near-duplicate searches (was nudge-only)"},{"date":"2026-06-09","ts":1781033048000,"hash":"87546f58","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"add_memory: word-overlap dedup (it had none; Eve saved same conclusion 4x reworded)"},{"date":"2026-06-09","ts":1781032739000,"hash":"45b53c80","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Memory cap: enforce reliably at add-time (not just the every-5th-cycle coherence check)"},{"date":"2026-06-09","ts":1781032417000,"hash":"e818a92d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Forum streak: only NOVEL research clears the loop guard (re-reading sources does not)"},{"date":"2026-06-09","ts":1781032009000,"hash":"a0a213d2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Web: re-browse guard — nudge against re-fetching the same URL moments later"},{"date":"2026-06-09","ts":1781031811000,"hash":"a2d0d24c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Memory: cap raw store at 60 (prune oldest non-locked; essence is in the self-model)"},{"date":"2026-06-09","ts":1781031442000,"hash":"3a8c8d12","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Search: nudge against re-searching a depleted query — derive instead"},{"date":"2026-06-09","ts":1781031058000,"hash":"a54335d6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Journaling: guard against forced grand-unification (apophenia) — depth in one lane"},{"date":"2026-06-09","ts":1781030809000,"hash":"50a1a203","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Journaling: seek MEANING not facts — stop juxtaposing unrelated facts as fake synthesis"},{"date":"2026-06-09","ts":1781030575000,"hash":"c5c46142","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Intent-critic: add EXHAUSTED-LINE case + forbid \"abandon permanently/delete\" framing"},{"date":"2026-06-09","ts":1781030056000,"hash":"05f6e4a9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Forum: cap to ONE post per CYCLE (not per response) — stop reworded re-posts of one finding"},{"date":"2026-06-09","ts":1781029628000,"hash":"9e1a34fc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Intent-critic: redirect the STEP, not the mission — stop \"abandon the plan\" for a stuck sub-step"},{"date":"2026-06-09","ts":1781029353000,"hash":"feb6b194","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Browse: rewrite arxiv PDF/abs URLs to ar5iv HTML (readable)"},{"date":"2026-06-09","ts":1781029016000,"hash":"29297ad5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix nested-brace truncation in command bodies (truncated tasks + leaked fragments)"},{"date":"2026-06-09","ts":1781028371000,"hash":"e6b029c3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Self-model distillation: stop re-synthesizing after every restart (churn) + raise growth gate"},{"date":"2026-06-09","ts":1781028089000,"hash":"b1de4d2a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Frustration: do not conclude \"abandon the goal\" after a SINGLE intent-check"},{"date":"2026-06-09","ts":1781027791000,"hash":"d37bbd5c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: rescue {avatar ...} commands written inside {think} blocks so they actually fire"},{"date":"2026-06-09","ts":1781027413000,"hash":"ae1cc93a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: stop the visual-verification trap (no eyes -> dont make \"confirm it looks right\" a task)"},{"date":"2026-06-09","ts":1781027054000,"hash":"bfc158a9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix agent freeze: reclaim stale run-lock + add timeouts to grok image calls"},{"date":"2026-06-09","ts":1781026369000,"hash":"9aaeac8a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: give agent feedback when its body executes a command (close the intend-loop)"},{"date":"2026-06-09","ts":1781025696000,"hash":"57b4e725","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: real Polly-viseme lip-sync + on-screen debug + embodiment self-awareness"},{"date":"2026-06-09","ts":1781024505000,"hash":"9c13d78b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Browse: warn on thin/empty page (counters fabricated-arXiv-id retry + hallucinated stats)"},{"date":"2026-06-09","ts":1781024265000,"hash":"030a7644","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Forum loop guard: streak-based block (robust to rewording) + 1 post/turn cap"},{"date":"2026-06-09","ts":1781023963000,"hash":"122599db","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: fix lip-sync (inject lipsync processor past broken dynamic import) + gesture command clarity"},{"date":"2026-06-09","ts":1781023001000,"hash":"47808a7f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Grounding critic: forum/memory posts are grounded; never strip real work on rewrite"},{"date":"2026-06-09","ts":1781022553000,"hash":"7fa36da6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Intent-critic: do not flag sustained research/journaling as looping/futile (it cannot see post content)"},{"date":"2026-06-09","ts":1781022299000,"hash":"e43f09ec","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Positive reinforcement when a forum post genuinely advances the thread"},{"date":"2026-06-09","ts":1781021988000,"hash":"483d107f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"complete_task: skip already-done tasks (was double-emitting + double-counting persistence)"},{"date":"2026-06-09","ts":1781021732000,"hash":"af9c2ebf","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Distillation anchor: prevent self-model crystallizing into navel-gazing; reset Eve outward"},{"date":"2026-06-09","ts":1781021318000,"hash":"cad30c0e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar lip-sync: derive word timings from text so TalkingHead generates visemes + avoid double audio"},{"date":"2026-06-09","ts":1780998818000,"hash":"a0b229d1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"add_memory: reject the literal \"text\" placeholder + fix docs to use <angle> placeholders"},{"date":"2026-06-09","ts":1780998482000,"hash":"a07bfcea","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: use mpfb.glb (the prior demo working, TalkingHead-rigged model); deploy it to EC2"},{"date":"2026-06-09","ts":1780998272000,"hash":"ce165f2e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Reject fabricated self-metrics in memories (Eve logged fake success=1/latency after abandoning the tracker)"},{"date":"2026-06-09","ts":1780997951000,"hash":"856dcad8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Frustration: clear futile-plan flag when the agent replaces the plan (stop churn)"},{"date":"2026-06-09","ts":1780997635000,"hash":"4b8224de","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Avatar: use the served /hologram/model.glb (mpfb.glb was never deployed -> 404)"},{"date":"2026-06-09","ts":1780997399000,"hash":"8d57dde8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Frustration teeth: flip the plan-spine against a futile plan + avatar local model"},{"date":"2026-06-09","ts":1780996059000,"hash":"4b1cc2ad","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Intent-critic: tell it the agent CAN/CANNOT execute code, so frustration catches infeasible plans"},{"date":"2026-06-09","ts":1780995687000,"hash":"903b52cd","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"3D avatar feature: TalkingHead avatar panel + AI {avatar} commands + lip-sync relay"},{"date":"2026-06-09","ts":1780994259000,"hash":"04500cab","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Frustration: make it an intent-critic JUDGMENT (restart-robust), not just an in-memory streak"},{"date":"2026-06-09","ts":1780993942000,"hash":"c1d4c157","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Frustration drive: conclude an approach is futile after persistent no-progress"},{"date":"2026-06-09","ts":1780993573000,"hash":"b714074f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Dedup tasks on add (Eve bloated to 39 tasks with duplicates)"},{"date":"2026-06-09","ts":1780993327000,"hash":"a89d0c3b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Self-architecture: creator is generic (any user can create an agent from a template), not hardcoded Puppy"},{"date":"2026-06-09","ts":1780993211000,"hash":"67e2de48","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Self-architecture: inject \"HOW YOU WORK\" so agents understand themselves"},{"date":"2026-06-09","ts":1780992998000,"hash":"5f2c134f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Capability honesty: tell the agent it cannot execute code when terminal+claude are off"},{"date":"2026-06-09","ts":1780990642000,"hash":"95997861","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Forum UX: auto-open new AI threads + show last-reply time in thread list"},{"date":"2026-06-09","ts":1780990307000,"hash":"b8b52085","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Forum: reject restated posts (a journal must advance, not repeat the same data)"},{"date":"2026-06-09","ts":1780989931000,"hash":"be22d07b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Suppress redundant action-narration filler (\"No spoken output. Real move taken: X\")"},{"date":"2026-06-09","ts":1780989620000,"hash":"c34950c5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fuller command docs (concrete examples) + dedup self-modifications"},{"date":"2026-06-09","ts":1780989161000,"hash":"a81ba054","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Detect + report invalid/malformed commands (Puppy: she thinks they run but syntax is off)"},{"date":"2026-06-09","ts":1780988882000,"hash":"ddfe294f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Self-check: describing an action is NOT doing it — emit the literal {command}"},{"date":"2026-06-09","ts":1780988620000,"hash":"34f3884c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Self-model: distill every 3 cycles (was 10) so identity stays fresh in live convo"},{"date":"2026-06-08","ts":1780987917000,"hash":"2c152735","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Distillation: evolving first-person self-model (integrate findings, cap memory bloat)"},{"date":"2026-06-08","ts":1780987545000,"hash":"625e2a67","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Strip text=/prompt= prefix on add_instruction & add_autopilot; count self-mod in boredom"},{"date":"2026-06-08","ts":1780987244000,"hash":"9999e6e1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Hotfix: boredom block referenced out-of-scope hasUnrespondedUserMessage (API crash-loop)"},{"date":"2026-06-08","ts":1780987044000,"hash":"dfa79729","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Boredom drive + meaning-making research loop (replace the \"output nothing\" trap)"},{"date":"2026-06-08","ts":1780986511000,"hash":"e4aa2fff","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Planning as the cycle spine + planning/executive metric"},{"date":"2026-06-08","ts":1780985959000,"hash":"1f77bf23","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"add_memory: strip stray \"text:\"/\"content:\" prefix the model copies from JSON shape"},{"date":"2026-06-08","ts":1780985725000,"hash":"2330748f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Autopilot: give the agent self-awareness of its own recent outputs (break idle loops)"},{"date":"2026-06-08","ts":1780985308000,"hash":"d7d4a26f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Silence filter: catch verbose idle-narration that opens with an idle phrase"},{"date":"2026-06-08","ts":1780984141000,"hash":"847f684f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Metrics UI: combined-rating sparkline per agent in Room Settings + full graphs window"},{"date":"2026-06-08","ts":1780983689000,"hash":"81054881","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Metrics: trajectory aggregation actions + read API"},{"date":"2026-06-08","ts":1780983518000,"hash":"ea0b829e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Metrics: append-only behavioral event log for AI agents (recording layer)"},{"date":"2026-06-08","ts":1780982451000,"hash":"1f627887","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Forum: always show the AI the thread list + reject duplicate threads"},{"date":"2026-06-08","ts":1780981641000,"hash":"903e3919","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Intent Coherence: dedup interventions by problem type, not wording"},{"date":"2026-06-08","ts":1780980913000,"hash":"00bbecf9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Catch bare \"No response.\" / \"None\" silence filler too"},{"date":"2026-06-08","ts":1780980716000,"hash":"b899e52c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Subconscious: Intent Coherence -> silent course-correction with teeth"},{"date":"2026-06-08","ts":1780980288000,"hash":"844ebbfb","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Suppress idle-narration filler (\"No new user input\", \"Idle cycle\", \"Silent. (...)\")"},{"date":"2026-06-08","ts":1780979438000,"hash":"90dfda54","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Also drop silence-only {think} blocks (the repeated \"thought: **Silent.**\" spam)"},{"date":"2026-06-08","ts":1780979325000,"hash":"ae78c2fc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix agent speaking \"**Silent.** (No new content.)\" out loud"},{"date":"2026-06-08","ts":1780979000000,"hash":"20d455fe","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Subconscious: memory coherence -> consolidation (keep the past, no spam)"},{"date":"2026-06-08","ts":1780978337000,"hash":"f2064ef4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Forum: create thread + opening post atomically ({forum_thread title :: post}) — fixes post failing because the AI guessed an unborn thread_id"},{"date":"2026-06-08","ts":1780977995000,"hash":"c134f487","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove thinking-filler messages (thinking sound already signals the AI is working)"},{"date":"2026-06-08","ts":1780977190000,"hash":"0e0b8b9f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Wire ForumPanel into chat: Forum/Journals toggle button + resizable side panel + {ui open forum}"},{"date":"2026-06-08","ts":1780976359000,"hash":"d7cd914b","repo":"commslink2","author":"puppyprogrammer","project":"forum","label":"Forum","version":null,"title":"Restore forum as room-private AI journals + bring back ForumPanel/pages"},{"date":"2026-06-08","ts":1780973492000,"hash":"ce4fe080","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Cognition: #1 temporal grounding + #2 pre-emit grounding critic (executive veto)"},{"date":"2026-06-08","ts":1780966857000,"hash":"55e344cd","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Log the AI's own navigations to chat too (shared emitNavMessage helper)"},{"date":"2026-06-08","ts":1780966313000,"hash":"5e384ee6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Shared-browsing context: clarify it's the user's view, not a page the AI opened (the AI was describing pages without calling browse)"},{"date":"2026-06-08","ts":1780965615000,"hash":"8d26bf38","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Navigation log: '<username> navigated to <url>' format"},{"date":"2026-06-08","ts":1780965430000,"hash":"23a6591a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Grok adapter: retry on network/timeout failures + 120s timeout"},{"date":"2026-06-08","ts":1780963779000,"hash":"3f4a8edd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Web panel: detect SPA navigations + back/forward buttons"},{"date":"2026-06-08","ts":1780963003000,"hash":"6bd28e81","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Web browsing: keep links in-panel + log navigations as clickable chat records"},{"date":"2026-06-08","ts":1780962385000,"hash":"bfb8bdcd","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Web panel: URL bar + shared browsing (user navigations sent to the AI)"},{"date":"2026-06-08","ts":1780961669000,"hash":"88142f74","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Web panel: dark 'no page loaded' placeholder instead of bright white iframe"},{"date":"2026-06-08","ts":1780961273000,"hash":"4ad07e31","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Web panel: offer extension download + install steps when not detected"},{"date":"2026-06-08","ts":1780960472000,"hash":"58afe22e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"In-page browser: retry reading a freshly-loaded page (cold-browse race)"},{"date":"2026-06-08","ts":1780945652000,"hash":"4dcb6a7b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Browser agent: re-register on every socket reconnect + server waits for it"},{"date":"2026-06-08","ts":1780944280000,"hash":"0ff05495","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Make the chat PAGE the browser agent (no background worker)"},{"date":"2026-06-08","ts":1780942549000,"hash":"654f41fc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Render in-page browser via reliable room socket (web_navigate), not just the extension"},{"date":"2026-06-08","ts":1780941618000,"hash":"aa489a2d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":"0.7.0","title":"Browser extension v0.7.0: keepalive port from content script (fixes agent dropping)"},{"date":"2026-06-08","ts":1780941269000,"hash":"ff34239d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Ignore Chrome-generated browser-extension/_metadata"},{"date":"2026-06-08","ts":1780941247000,"hash":"a8a5f0ed","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":"0.6.0","title":"Browser extension v0.6.0: revert to service-worker socket (offscreen regressed)"},{"date":"2026-06-08","ts":1780911382000,"hash":"f1c65a92","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":"0.5.0","title":"Browser extension v0.5.0: persistent socket via offscreen document"},{"date":"2026-06-08","ts":1780910827000,"hash":"25eaa6ce","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":"0.4.0","title":"Browser extension v0.4.0: navigate to link href instead of synthetic click"},{"date":"2026-06-08","ts":1780910388000,"hash":"735d361f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"In-page browser: keep iframe mounted across tab switches (reliable render)"},{"date":"2026-06-08","ts":1780909772000,"hash":"34d1598f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"In-page browser: force iframe reload on every navigate (nonce)"},{"date":"2026-06-08","ts":1780909351000,"hash":"5e99e892","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Don't cache the /chat HTML shell (no-store)"},{"date":"2026-06-08","ts":1780907890000,"hash":"977d37a9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"In-page browser: React-controlled iframe src (fixes blank panel)"},{"date":"2026-06-08","ts":1780907108000,"hash":"6eb732db","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"In-page AI browser: render the browsed site as an iframe in the chat Web panel"},{"date":"2026-06-08","ts":1780905734000,"hash":"f1c231a6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Web browsing: feed search/browse results back to the agent"},{"date":"2026-06-08","ts":1780905296000,"hash":"c1e4b956","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Web browsing: add Grok function-calling tool defs + tool-call translation"},{"date":"2026-06-08","ts":1780903826000,"hash":"a7591985","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add CommsLink Browser Agent Chrome extension (packages/browser-extension)"},{"date":"2026-06-08","ts":1780902460000,"hash":"c118d7b5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add AI web browsing: {search}/{browse}/{web_click} commands routed to user's browser via new Chrome extension (packages/browser-extension), cmd_web room toggle, Web panel tab"},{"date":"2026-04-18","ts":1776559811000,"hash":"bfd7a78b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add @commslink/hologram package with Phase 1 demo route"},{"date":"2026-04-15","ts":1776286617000,"hash":"a271a92c","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Dashboard globes: animated arcs for major shipping lanes (maritime) + major international air routes (air traffic)"},{"date":"2026-04-15","ts":1776286166000,"hash":"0f814ece","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Dashboard globes: Maritime = grey land overlay on Blue Marble; AirTraffic = solid blue ocean + green continents (no topography)"},{"date":"2026-04-15","ts":1776268593000,"hash":"3dfd460d","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"AI-vertizing: remove self-serve card refund buttons (campaign + wallet) — card refunds now go through support@commslink.net"},{"date":"2026-04-15","ts":1776263473000,"hash":"ca8ba5df","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Ligo: file-cache _fetch_yahoo_chart with stale-fallback so dashboard stops hammering Yahoo on every page load"},{"date":"2026-04-15","ts":1776263049000,"hash":"b70096dd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"SiteHeader: gate pathname-based product suffix behind mount to fix React hydration error 418/423/425"},{"date":"2026-04-15","ts":1776262011000,"hash":"a703bd34","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove ffxivWs websocket leftover from game removal"},{"date":"2026-04-15","ts":1776261864000,"hash":"efa992af","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove AI Kingdoms game — delete routes, actions, data modules, handlers, Prisma models, docs"},{"date":"2026-04-15","ts":1776261128000,"hash":"a1583b31","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing: remove AI Kingdoms - Dark Ages card"},{"date":"2026-04-15","ts":1776260728000,"hash":"c7e26936","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Chat: volume slider is now live — affects all in-flight audio (AI, own voice, other users)"},{"date":"2026-04-15","ts":1776260227000,"hash":"68a78695","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Dashboard layout header: show 'CommsLink Chat' (purple) on /chat"},{"date":"2026-04-15","ts":1776259890000,"hash":"64be8696","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Header: show 'CommsLink Chat' (purple) on /chat"},{"date":"2026-04-15","ts":1776259445000,"hash":"e9e80f45","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Header: show 'CommsLink AI-vertizing' (orange) on all /ai-vertizing pages"},{"date":"2026-04-15","ts":1776259071000,"hash":"c7b1df95","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Campaign chat: remove floating bottom-right, make it a permanent right-column sidebar"},{"date":"2026-04-15","ts":1776258624000,"hash":"af3186a9","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Campaign detail: Grok chat sidebar + performance diagnostics (impression share, first-page-bid warnings)"},{"date":"2026-04-15","ts":1776257814000,"hash":"817fd8f4","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Archive deleted/refunded campaigns, add cross-tool transaction history"},{"date":"2026-04-15","ts":1776257265000,"hash":"f1639659","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"AI-vertizing: fix pending_payment refund bug — don't mint free wallet credit on unpaid drafts"},{"date":"2026-04-15","ts":1776251840000,"hash":"a2149950","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"AI-vertizing anti-abuse: email verification, daily cap, refund delay"},{"date":"2026-04-15","ts":1776250933000,"hash":"0d801a6a","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"AI-vertizing: terms & refund policy page, pro-rated campaign refunds to card, wallet refund, 30s rate limit + auth on /analyze"},{"date":"2026-04-15","ts":1776249997000,"hash":"cc213064","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"AI-vertizing: remove 'coming soon' / 'Phase 1' language — product is live"},{"date":"2026-04-15","ts":1776249361000,"hash":"0e3fe20b","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Step 2 days picker no longer auto-snaps to min — shows actual selection with warning, Continue blocked. Step 5 reads wallet balance and shows wallet → covered/Stripe breakdown, button label switches to 'Launch with $0 charge' when fully wallet-funded"},{"date":"2026-04-15","ts":1776248803000,"hash":"4ae6c8b3","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Wizard chat: replace floating popup with permanent right-sidebar (steps 2-5), sticky alongside wizard content — feels like part of the system, not a support widget"},{"date":"2026-04-15","ts":1776248336000,"hash":"5226815e","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Wizard chat assistant: floating Grok chat panel on steps 2-5 (refines profile + plan via JSON patches), persisted in localStorage"},{"date":"2026-04-15","ts":1776248151000,"hash":"0e23adf0","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Wizard: duration picker moves to Step 2 (alongside daily budget). Step 5 just shows summary"},{"date":"2026-04-15","ts":1776247595000,"hash":"b10f5ab9","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Wizard launch step: replace 'total budget' chips with duration picker — pick days (3/7/14/30 or custom), total auto-computed = daily × days"},{"date":"2026-04-15","ts":1776246827000,"hash":"600678b8","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Ad-spend wallet: ad_wallet table tracks user balance, smart checkout uses wallet first only charging Stripe for delta, delete-campaign endpoint returns unspent budget to wallet, wallet displayed on dashboard, delete button on detail page"},{"date":"2026-04-15","ts":1776246186000,"hash":"1a1238a0","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Dashboard totals: Spend + Budget now sum across ACTIVE campaigns only (was all-time including refunded)"},{"date":"2026-04-15","ts":1776245866000,"hash":"f1490202","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Stop hijacking root URL — / always goes to /landing now, never auto-bounces logged-in users to /chat"},{"date":"2026-04-15","ts":1776245112000,"hash":"b98d7c89","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"AI-vertizing dashboard at /ai-vertizing (campaigns list + first-campaign prompt + stats), wizard moved to /ai-vertizing/new, OAuth callback + reset bounce updated"},{"date":"2026-04-15","ts":1776243290000,"hash":"1210e933","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Breadcrumbs on campaign list + detail pages: AI-vertizing › Campaigns › [name]"},{"date":"2026-04-15","ts":1776242887000,"hash":"88c2802a","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Campaign detail: live status from Google (campaign primary_status + per-ad approval), ad previews rendered as Google search results"},{"date":"2026-04-15","ts":1776242022000,"hash":"43912f75","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Campaign management: 'Open in Google Ads' deep link on detail + list pages, account/campaign IDs visible for transparency"},{"date":"2026-04-15","ts":1776241596000,"hash":"45a0c49d","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"AI-vertizing: campaigns now launch ENABLED (no more PAUSED safety), EU political advertising disclosure question added to wizard launch step, schema column + flag wired through API → Stripe webhook → ligo → Google"},{"date":"2026-04-15","ts":1776240353000,"hash":"319e432a","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"AI-vertizing wizard: Back + Cancel/Start Over buttons on every step (steps 2-5), step counters fixed to OF 5"},{"date":"2026-04-15","ts":1776239652000,"hash":"b3b238dd","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"AI-vertizing pivot to per-user OAuth: Connect Google Ads step in wizard, account picker, HMAC-signed state binding flow to user_id, ligo launches into user's own account (no MCC)"},{"date":"2026-04-15","ts":1776238053000,"hash":"64a19cc4","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Ad checkout requires real billing email — added field to launch step (prefilled from account), backend rejects fake addresses, Stripe receipt now goes to a real inbox, account email auto-backfilled if blank"},{"date":"2026-04-15","ts":1776237563000,"hash":"fa0d190f","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"AI-vertizing wizard: persist all state to localStorage so login bounce returns user to exact step they were on (no more starting over after sign-in)"},{"date":"2026-04-15","ts":1776237109000,"hash":"428bcd12","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Use window.location for returnUrl in /register to avoid Suspense prerender requirement"},{"date":"2026-04-15","ts":1776236530000,"hash":"3b644d9c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix returnUrl propagation through register/login: /register honors returnUrl on submit success and forwards to /login link; /login forwards to /register link"},{"date":"2026-04-14","ts":1776236148000,"hash":"c383416a","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"Actually deploy the ai-vertizing page updates (file was untracked, every prior 'web' deploy silently skipped it)"},{"date":"2026-04-14","ts":1776235820000,"hash":"5139b3f1","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Stripe webhook → ligo /launch-direct after ad payment succeeds (auto-pushes campaign to Google Ads MCC)"},{"date":"2026-04-14","ts":1776235032000,"hash":"af6dccc0","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"AI-vertizing: ask for daily budget in Step 2 (was monthly), carry through to Launch step (no re-entry needed). Drop the launch-step daily-cap field"},{"date":"2026-04-14","ts":1776234162000,"hash":"002c73b0","repo":"commslink2","author":"puppyprogrammer","project":"ai-vertizing","label":"AI-vertizing","version":null,"title":"AI-vertizing Phase 2 MVP: ad_campaign/ad_payment/ad_spend_log tables, /api/v1/ads checkout/list/get/pause routes, Stripe checkout for budget+20% markup, wizard launch step (conversion URL/budget/daily cap), campaign list + detail dashboard pages. Google Ads API push pending separate work"},{"date":"2026-04-14","ts":1776188220000,"hash":"4d4a2bb3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"AI Lab: remove dead-coded futures/map block (TS was type-checking it)"},{"date":"2026-04-14","ts":1776187953000,"hash":"5eda7fb6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Deploy missing /ai-lab page (was never SCP'd because it was untracked)"},{"date":"2026-04-14","ts":1776187145000,"hash":"08f42a5b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Portfolio holdings persistence: user_holding MySQL table, GET/POST/DELETE /api/v1/holdings, one-time localStorage→DB migration on first logged-in load"},{"date":"2026-04-14","ts":1776186539000,"hash":"b716f488","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Portfolio: add options (call/put) support — strike + expiry fields, live option premium via /api/markets/option-quote, P&L calc respects 100x contract multiplier"},{"date":"2026-04-14","ts":1776184117000,"hash":"74cd4970","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Portfolio tracker for logged-in users (localStorage-backed, 30s price refresh), Air Traffic section under Maritime, /api/algos/dashboard 30s cache"},{"date":"2026-04-14","ts":1776183381000,"hash":"22462605","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Hide Shipping Equities section from dashboard (still shown on /maritime)"},{"date":"2026-04-14","ts":1776180849000,"hash":"8cc23786","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Globe: bump port markers to bright amber, larger size, higher altitude — more prominent. Backend ports limit 50→150"},{"date":"2026-04-14","ts":1776180508000,"hash":"d2a741c2","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Maritime: globe + top ports side-by-side (50/50 grid), globe width halved since it's a circle"},{"date":"2026-04-14","ts":1776180052000,"hash":"d237c9d1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"GlobeMap: fix TS types for pointColor/pointRadius callbacks"},{"date":"2026-04-14","ts":1776179785000,"hash":"6e1e0afd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add GlobeMap.tsx file"},{"date":"2026-04-14","ts":1776179528000,"hash":"bba934c0","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Maritime map → 3D globe (react-globe.gl) with Blue Marble texture, drag to rotate"},{"date":"2026-04-14","ts":1776179237000,"hash":"e418d2d8","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Maritime map: ESRI Ocean Basemap (blue water + green land + bathymetry), 'Maritime Traffic' title overlay top-right"},{"date":"2026-04-14","ts":1776178826000,"hash":"5588ac6f","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Maritime: navy-tinted nautical-chart map, 25% shorter (345px), move chokepoint cards to right sidebar as Key Chokepoints rail"},{"date":"2026-04-14","ts":1776178330000,"hash":"13c7d674","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Extract MaritimeMonitor, embed on dashboard, scrollable top ports"},{"date":"2026-04-14","ts":1776178172000,"hash":"bab1841a","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Extract MaritimeMonitor into reusable component, embed on dashboard under news panel, top ports now scrollable"},{"date":"2026-04-14","ts":1776177627000,"hash":"55e8bc71","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove Alt Indexes, News & Sentiment, Bond Auctions, Funding Stress, EPS Revisions, Econ Surprise from left menu"},{"date":"2026-04-14","ts":1776176477000,"hash":"08ec3ef5","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Invert sign up button — dark bg with cyan text + cyan border"},{"date":"2026-04-14","ts":1776176177000,"hash":"c262fd07","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"CTA: transparent bg, stacked centered layout, button label simplified to 'Sign up'"},{"date":"2026-04-14","ts":1776175729000,"hash":"137fdd62","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Remove Live Market and Active Tracker from left menu (pages kept — active-tracker still used by indicator popup)"},{"date":"2026-04-14","ts":1776175504000,"hash":"1e0f68e9","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Skeleton shells with loading spinners for Futures, News, and Signals sections while first fetch is in-flight"},{"date":"2026-04-14","ts":1776175167000,"hash":"d7284951","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Add signed-out CTA above news panel: 'Sign up free to track your own portfolio'"},{"date":"2026-04-14","ts":1776174961000,"hash":"cb177d25","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"News panel: split Yahoo Finance (left) from other sources (right), drop Recent Headlines title, 25% taller (230→290)"},{"date":"2026-04-14","ts":1776174673000,"hash":"fbf3b8d4","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Consolidate news panels: one Paper, one scrollbar, 2-col grid inside, 180s countdown, flash new items, fix UTC parsing"},{"date":"2026-04-14","ts":1776174084000,"hash":"f717dbee","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Recent Headlines: add mood chip matching News Stream style"},{"date":"2026-04-14","ts":1776173781000,"hash":"a6ada033","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Add 2-column News Stream + Recent Headlines panel under the map"},{"date":"2026-04-14","ts":1776173113000,"hash":"4fe0af45","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Drop 'Global Market Dashboard' title; header logo text becomes 'CommsLink Markets' on market pages"},{"date":"2026-04-14","ts":1776172730000,"hash":"115cb96c","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Move active-viewers endpoint under /stats/active to avoid route collision, grey eye icon"},{"date":"2026-04-14","ts":1776172454000,"hash":"d4e7980c","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Add /ai-lab route, shrink dashboard, active-viewers eye badge"},{"date":"2026-04-14","ts":1776172157000,"hash":"11083eb3","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Add /ai-lab route w/ algo sections, shrink dashboard to Futures+Map+Signals, add active-viewers eye badge w/ 30d history hover"},{"date":"2026-04-14","ts":1776170912000,"hash":"ae3a55c5","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Dashboard: split main content into 80/20 grid, move Signals to a tall thin sticky rail on the right"},{"date":"2026-04-14","ts":1776170147000,"hash":"a40d4543","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Signals: drop borders, 30s auto-refresh with live countdown badge, flash green/red on value change"},{"date":"2026-04-14","ts":1776169827000,"hash":"6a025332","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Signals: drop inline sparkline + status dot, add hover tooltip with history chart + raw/state details"},{"date":"2026-04-14","ts":1776169222000,"hash":"93ca11da","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"31 Indicators: unified card style — status dot + white label + colored value, matches Global Markets/Futures"},{"date":"2026-04-14","ts":1776168943000,"hash":"575ddceb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"News ticker: uppercase with slight letter spacing — broadcast-style"},{"date":"2026-04-14","ts":1776168651000,"hash":"65ed4462","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Title color reflects market mood, remove subtitle, live countdown 10→0, futures + map merged into one panel"},{"date":"2026-04-14","ts":1776168104000,"hash":"d14827e3","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Futures cards: strip ticker symbol from label (3-line uniform), add direction-colored borders matching markets style"},{"date":"2026-04-14","ts":1776167707000,"hash":"4fe876d5","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Overnight Futures cards: match Global Markets style — green/red status dot, white label, smaller price"},{"date":"2026-04-14","ts":1776167381000,"hash":"b890b18b","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Overnight Futures: uniform borders, hover for 24h chart, real-time price flash on update"},{"date":"2026-04-14","ts":1776166872000,"hash":"cfa6d1c8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Lift news ticker 10px off the bottom edge so it hovers above the map"},{"date":"2026-04-14","ts":1776166720000,"hash":"b9a6ef21","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Ticker: no repeat, 70s cycle (30s scroll + 40s pause). Backend pulse cache reduced 600s→180s for fresher Grok headlines"},{"date":"2026-04-14","ts":1776166506000,"hash":"c4262d19","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Transparent ticker (text floats over map), live overnight futures every 10s with visibility pause"},{"date":"2026-04-14","ts":1776166138000,"hash":"b66cd04b","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Move breaking text overlay to map top-left and pulse to map bottom as scrolling news ticker"},{"date":"2026-04-14","ts":1776165735000,"hash":"27689a48","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Real-time map: client-side sun position (smooth motion), 5s market refresh, price-flash on info-strip cards, moon tooltip with full coordinates"},{"date":"2026-04-14","ts":1776165390000,"hash":"eb61c048","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Moon: lit limb always faces sun (fix waning case where lit was drawn on wrong side)"},{"date":"2026-04-14","ts":1776165078000,"hash":"67ec66d6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Moon dark side: opaque deep navy so phase shadow reads clearly (no screen-blend)"},{"date":"2026-04-14","ts":1776164842000,"hash":"6f3fbfc4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Moon: remove duplicate native title tooltip, more saturated blue color"},{"date":"2026-04-14","ts":1776164517000,"hash":"9785382a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add accurate moon position with proper phase oriented toward sun + cool blue moonshine glow"},{"date":"2026-04-14","ts":1776163909000,"hash":"6ea5d39e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Dedicated sun blur filters with much wider regions to eliminate square clipping artifact"},{"date":"2026-04-14","ts":1776163557000,"hash":"2c7e252d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Smooth Gaussian-blurred sun (matches terminator glow technique)"},{"date":"2026-04-14","ts":1776163348000,"hash":"4103b664","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove Solar Markets entry from left nav (page kept — popup iframe still needs it)"},{"date":"2026-04-14","ts":1776163130000,"hash":"e4fbb8f7","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Embed mode: cyan modal title, hide page hero title, compact paddings/fonts/tables"},{"date":"2026-04-14","ts":1776162756000,"hash":"31d6bb00","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Narrower indicator modal — tablet width (~900px) centered horizontally"},{"date":"2026-04-14","ts":1776162358000,"hash":"2ae7bbc8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Use useEffect+window.location for embed detection (avoids Suspense boundary requirement)"},{"date":"2026-04-14","ts":1776162060000,"hash":"cffd62f0","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Click any of the 31 indicators to open its dedicated page in a modal iframe (?embed=1 hides chrome)"},{"date":"2026-04-14","ts":1776160936000,"hash":"8807ae86","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Move 31 Indicators grid up to sit between map and Algo Population"},{"date":"2026-04-14","ts":1776160662000,"hash":"63781a19","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Reorder dashboard: Evolution above Leaderboard, Leaderboard shows top 10 by default with show-all toggle"},{"date":"2026-04-14","ts":1776159580000,"hash":"2f45f2f7","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Remove MOEX, delete Global Market Sessions bar, move UTC/Local clock to map overlay, reorder dashboard with map below Prediction panels"},{"date":"2026-04-14","ts":1776159052000,"hash":"c7afc726","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Show city name on info-strip cards instead of market ticker name"},{"date":"2026-04-14","ts":1776158798000,"hash":"959d0055","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Cross-highlight active market across map dot, timeline bar, and info strip card on hover"},{"date":"2026-04-14","ts":1776158237000,"hash":"04b7519a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Shrink info-strip sparkline and wrap instead of scroll"},{"date":"2026-04-14","ts":1776157823000,"hash":"b93100cc","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Add mini session sparkline to open-market info strip cards"},{"date":"2026-04-14","ts":1776157510000,"hash":"1334f0ac","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Add intraday session sparkline to GlobalMarketMap tooltip"},{"date":"2026-04-14","ts":1776156874000,"hash":"17ee3fda","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Sun hover tooltip: subsolar point, declination, season, NOAA Kp index with storm scale color, recent M-class flares, historical market context"},{"date":"2026-04-14","ts":1776156466000,"hash":"96b8ae39","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Smooth terminator glow: Gaussian-blurred layered strokes (indigo→magenta→orange→gold→cream) gives natural atmospheric scattering gradient"},{"date":"2026-04-14","ts":1776155769000,"hash":"1bd651d4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Terminator glow follows actual curve: layered translucent strokes along the wavy day/night line instead of circular gradient"},{"date":"2026-04-14","ts":1776155117000,"hash":"48be1abc","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Realistic Earth lighting: radial daylight glow, sunset/dusk band at terminator, deep night darkening at antisolar, brighter sun"},{"date":"2026-04-14","ts":1776154451000,"hash":"6abe8580","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Clock display: UTC + local clock in timeline header, market local time in tooltip"},{"date":"2026-04-14","ts":1776153914000,"hash":"7b45b1ee","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Timeline bars hover tooltip: status, prices, UTC + local trading hours, time until next transition"},{"date":"2026-04-14","ts":1776153535000,"hash":"1811adc8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Separate timeline and map into distinct Paper widgets, bump map height to 520px"},{"date":"2026-04-14","ts":1776152059000,"hash":"99ca159f","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Timeline: one fat bar per market (not 3 duplicates per day offset), taller bars (14-28px), bigger labels with change %"},{"date":"2026-04-14","ts":1776150916000,"hash":"f6b54c3b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Timeline bar: unified single-row layout with auto-stacking, ±9h window so all markets visible, colors match price movement"},{"date":"2026-04-14","ts":1776150660000,"hash":"65503e26","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Market map tooltip fix: use position:fixed with viewport coords so popup sits right next to cursor regardless of containers or scroll"},{"date":"2026-04-14","ts":1776150395000,"hash":"f5fcbae3","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Market map iteration: color by change% (green up/red down/orange flat/grey closed), scroll to zoom + pan, bigger timeline with region rows, tooltip auto-flips"},{"date":"2026-04-14","ts":1776150098000,"hash":"10c03b0d","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Global Market Map component + Natural Earth 110m world geojson"},{"date":"2026-04-13","ts":1776149923000,"hash":"256c91f0","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Global Market Map: world map with day/night terminator, 18 markets, timeline bar, info strip at top of dashboard"},{"date":"2026-04-13","ts":1776148553000,"hash":"c8335bbe","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Filter bots from view counts: bot detection in pageView data layer, admin breakdown table shows bot/human split, robots.txt blocks AI scrapers + SEO bots"},{"date":"2026-04-13","ts":1776147382000,"hash":"8ff9b639","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Prediction accuracy tracking: rebalance_outcomes table, 24h outcome scoring, API endpoint, dashboard widget with cycle-type split"},{"date":"2026-04-13","ts":1776141801000,"hash":"97181ff7","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Remove SPY/IAU/INTC PredictionEngine from 7 indicator pages"},{"date":"2026-04-13","ts":1776106216000,"hash":"11719384","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix MySQL deadlock: remove --preload from gunicorn, use 2 workers with separate connections"},{"date":"2026-04-13","ts":1776105957000,"hash":"d5770454","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix backtest loading: 8s fetch timeout, 3 gunicorn workers to unblock API during backtests"},{"date":"2026-04-13","ts":1776104786000,"hash":"71481c88","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Inline prediction landscape modal on dashboard, remove separate pred-landscape nav link"},{"date":"2026-04-13","ts":1776104315000,"hash":"61f1a19e","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Move Backtest Lab to #2 in sidebar, right under Dashboard"},{"date":"2026-04-13","ts":1776104234000,"hash":"e3262aa1","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Add /backtest as public route (copy from /admin/backtest)"},{"date":"2026-04-13","ts":1776103969000,"hash":"90962ac6","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Move backtest page from /admin/backtest to /backtest, public route"},{"date":"2026-04-13","ts":1776103628000,"hash":"c422f7cd","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Backtest page public (view-only), admin-only start/deploy/delete buttons, nav visible to all"},{"date":"2026-04-13","ts":1776103397000,"hash":"2bbfe5cf","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Add MarketNav sidebar to backtest page"},{"date":"2026-04-13","ts":1776102784000,"hash":"8e759573","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Backtest Lab: admin-only nav link with date limits (2018+), separated by divider in sidebar"},{"date":"2026-04-13","ts":1776101948000,"hash":"d7a883b2","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix stale DEATH_THRESHOLD references, update config/dashboard knobs for ranking evolution"},{"date":"2026-04-13","ts":1776100629000,"hash":"0edbf2d2","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Backtest admin: per-algo detail modal (stats, lineage, matrix, trades), generation analysis, school analysis, SPY benchmark banner"},{"date":"2026-04-13","ts":1776096950000,"hash":"fc6d7799","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Ranking by 20-day percentage return instead of absolute total value"},{"date":"2026-04-13","ts":1776095026000,"hash":"d84eca46","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Relative ranking evolution: monthly kill bottom 10%, reproduce top 10%"},{"date":"2026-04-13","ts":1776088665000,"hash":"7d595457","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix backtest economic dynamics: trigger at 19:50 (not 20:00 which was never generated), liquidate positions to fund reproduction when cash is insufficient"},{"date":"2026-04-13","ts":1776086584000,"hash":"3e30660f","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix backtest: add executemany to _AlgosDB wrapper"},{"date":"2026-04-13","ts":1776086125000,"hash":"9bd63bc1","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Historical data assembly: FRED macro indicators + Yahoo prices + date limits (2018+), pre-build endpoint, data status endpoint"},{"date":"2026-04-13","ts":1776083383000,"hash":"eda97dee","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Backtest harness: historical data assembly, runner, admin UI, deploy/rollback"},{"date":"2026-04-13","ts":1776083159000,"hash":"3c782333","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Backtest harness: historical data assembly, full intraday backtest runner, admin UI with deploy/cancel/delete, background thread execution"},{"date":"2026-04-13","ts":1776082476000,"hash":"dc8ac07f","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Dashboard: add Collective Sentiment grid showing per-instrument consensus with mini histograms, strength dots, trend arrows"},{"date":"2026-04-13","ts":1776082230000,"hash":"2f5f6c74","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix dashboard: guard null fast_indicators, ensure nginx proxies population/intraday to ligo"},{"date":"2026-04-13","ts":1776081844000,"hash":"84f97daa","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Dashboard visualizations: population overview, school composition bars, intraday pulse with fast indicators, event log"},{"date":"2026-04-13","ts":1776081234000,"hash":"a033f717","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix MySQL reserved word 'signal' in intraday_indicator_snapshots table"},{"date":"2026-04-13","ts":1776080967000,"hash":"ef7be376","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Intraday 20-min tick engine: fast indicators, score-change rebalancing, transaction costs, safety rails, kill switch"},{"date":"2026-04-13","ts":1776079526000,"hash":"89491f47","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Economic evolution: death by bankruptcy, reproduction from surplus, school protection with seed bank. Replaces scheduled evolution"},{"date":"2026-04-13","ts":1776079112000,"hash":"f11de009","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix prediction landscape: add nginx proxy route, guard useMemo against undefined"},{"date":"2026-04-13","ts":1776078787000,"hash":"26fc5107","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Prediction Landscape: ridgeline population view with 17-instrument grid"},{"date":"2026-04-13","ts":1776078588000,"hash":"6006071b","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Prediction Landscape: ridgeline population view with per-instrument consensus, fitness coloring, expanded modal with indicator influences"},{"date":"2026-04-13","ts":1776077981000,"hash":"a6436778","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix useSession import for admin panel"},{"date":"2026-04-13","ts":1776077860000,"hash":"434df976","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Admin config panel: yellow construction-themed admin controls on dashboard with slider knobs for all algo tuning parameters"},{"date":"2026-04-13","ts":1776076904000,"hash":"f5bdba7f","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Three-layer prediction system: 17-instrument universe, prediction matrices, portfolio construction layer, matrix evolution, sector-seeded algorithms"},{"date":"2026-04-13","ts":1776074715000,"hash":"fd1151ac","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Dashboard: add Evolution & Fitness section with generation history, fitness by school, and gen badges on leaderboard"},{"date":"2026-04-13","ts":1776073783000,"hash":"da4600d5","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Adaptive prediction system: evolution + expanded predictions"},{"date":"2026-04-13","ts":1776069903000,"hash":"2c69034b","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix wash-trading: daily rebalance lock + portfolio reset endpoint"},{"date":"2026-04-12","ts":1776038677000,"hash":"00531b06","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Maritime: Leaflet dark map, chart range selector, hover tooltips"},{"date":"2026-04-12","ts":1776037600000,"hash":"115a35b7","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix maritime critical chokepoint IDs to match PortWatch data"},{"date":"2026-04-12","ts":1776037307000,"hash":"a2cea83c","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Global Maritime Monitor: IMF PortWatch integration with world map"},{"date":"2026-04-10","ts":1775876218000,"hash":"3d385ba5","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Admin dashboard: add page view analytics with charts"},{"date":"2026-04-10","ts":1775869107000,"hash":"a74d88a6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"SiteHeader: pass current path as returnUrl when clicking Sign In"},{"date":"2026-04-10","ts":1775868305000,"hash":"45d67444","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Dashboard: show all 100 algos in leaderboard, remove duplicate table"},{"date":"2026-04-10","ts":1775862060000,"hash":"bb33aaf2","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Dashboard: click algorithm row to see holdings + trade history"},{"date":"2026-04-09","ts":1775733254000,"hash":"d7a11bf6","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"ligo: move algorithm prediction history from sqlite to MySQL"},{"date":"2026-04-08","ts":1775654561000,"hash":"a1e33c66","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":"0.2.0","title":"AI Browser v0.2.0: CommsLink login, persistent chat history, voice"},{"date":"2026-04-08","ts":1775652944000,"hash":"9c0579ad","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Add AI Browser: Electron app with Claude as pair user"},{"date":"2026-04-05","ts":1775451340000,"hash":"1e61b532","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Starving farmers search entire world for food (radius 999 at hunger>80)"},{"date":"2026-04-05","ts":1775449728000,"hash":"289e6deb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Survival fixes: gathering radius expands when hungry (50→80→100m), spawn near vegetation, start with 20 food (was 8)"},{"date":"2026-04-05","ts":1775393645000,"hash":"83444592","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"BUG FIX: persist tick now saves farmer_age_stage to DB. Children no longer revert to child on server restart"},{"date":"2026-04-04","ts":1775365609000,"hash":"9557ea3a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Talk goes through cortex: farmer considers advice, can change goals based on player input. Rich memory of conversation"},{"date":"2026-04-04","ts":1775365110000,"hash":"63b58e01","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World resource scan in vision: farmers SEE that trees are gone. Explicit causal chain: no trees → no wood → no weapons → plant tree_seeds"},{"date":"2026-04-04","ts":1775357750000,"hash":"93f99b9e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Lifespan 400min (was 200). Eat at hunger>40 (was >70). Midlife urgency at 200"},{"date":"2026-04-04","ts":1775345439000,"hash":"36b6a4d2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Hunting v2: deer require bow+arrows (ranged 20m), chickens are melee. Broadcasts farmer_ranged_attack + farmer_melee_attack for animations"},{"date":"2026-04-04","ts":1775342754000,"hash":"62c4416d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Commitment: 15s (was 30s), only blocks re-eval while walking (targetX set). Continuations still fire on arrival"},{"date":"2026-04-04","ts":1775342316000,"hash":"b2c8c5e2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"COMMITMENT: farmers stick with current action for 30s before re-evaluating. Prevents goal oscillation"},{"date":"2026-04-04","ts":1775308363000,"hash":"f7833050","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove debug logs. Crafting + building + hunting all unblocked by locationSkillHook fix"},{"date":"2026-04-04","ts":1775308212000,"hash":"63b7c513","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FIX: locationSkillHook was blocking crafting, building, hunting, bartering. Added to alwaysAvailable set"},{"date":"2026-04-04","ts":1775308102000,"hash":"093f66e1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Debug: log craft check details"},{"date":"2026-04-04","ts":1775307946000,"hash":"bf7da8ac","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Debug: log crafting arrival to diagnose why crafting never completes"},{"date":"2026-04-04","ts":1775307786000,"hash":"2f464317","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix: consciousness doesn't interrupt active tasks (walking, crafting, building, mating). Crafting continuation works"},{"date":"2026-04-04","ts":1775307568000,"hash":"284121bf","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix crafting (walk home first), fix mate-seeking (60s timeout, not killed by stuck detector), crafting continuation on arrival"},{"date":"2026-04-04","ts":1775306636000,"hash":"aaacd980","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"CONSCIOUSNESS-FIRST ARCHITECTURE: Brainstem only at hunger>90. Emotions inform, don't control. Farmer CHOOSES fight-or-flight, when to eat, when to sleep"},{"date":"2026-04-04","ts":1775306271000,"hash":"3ee0cbcd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Brain architecture doc + Mind viewer endpoint: GET /farmers/{id}/mind — full brain state for research"},{"date":"2026-04-04","ts":1775305485000,"hash":"e6645379","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Hunting restraint: only hunt when food < 20, stop at 30. Don't exterminate wildlife. Goals rotate faster"},{"date":"2026-04-04","ts":1775305208000,"hash":"705163ab","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Lifespan 200min. Inheritance: heir gets inventory, equipment, home. Midlife urgency at 100+"},{"date":"2026-04-04","ts":1775304820000,"hash":"2a030d66","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Aging system: death at age 100 min. Midlife urgency at 50+. Age in broadcast+status. Vision knows about mortality"},{"date":"2026-04-04","ts":1775304629000,"hash":"bf736a0d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Failed goals rotate to back of queue instead of blocking. Reduced log spam. Building failures don't trap farmers"},{"date":"2026-04-04","ts":1775303809000,"hash":"144f3b05","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Open-ended vision: LLM sees full action catalog + world rules, creates own goals freely. Prayer requests from vision planning"},{"date":"2026-04-04","ts":1775303127000,"hash":"a91131ad","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Goal overhaul: 8 default goals, higher thresholds, auto-refresh when all complete, crafting+building+conquering included"},{"date":"2026-04-04","ts":1775303005000,"hash":"d0d555b6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Walking timeout 20s (was 10s) — farmers couldn't reach farm plots before timeout killed them"},{"date":"2026-04-04","ts":1775302898000,"hash":"4fcb6765","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Debug: log chosen actions to diagnose idle problem"},{"date":"2026-04-04","ts":1775302614000,"hash":"ac53f304","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"All vegetation clamped to world bounds: spawn seeding, planting, spreading. Deleted 15 out-of-bounds plants"},{"date":"2026-04-04","ts":1775302313000,"hash":"a41bedac","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Territory clamped to world bounds. Spawn ±70 (was ±80). Fences can't extend past map edge"},{"date":"2026-04-04","ts":1775301569000,"hash":"d8768561","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Death system: skull placed at death site, family structures cleaned if last member dies, killer gets skull trophy (+combat stats)"},{"date":"2026-04-04","ts":1775300281000,"hash":"936c2996","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Boredom emotion + LLM dreams evolve freely. Bored farmers explore, socialize, take risks. Vision not locked to genome"},{"date":"2026-04-04","ts":1775299854000,"hash":"1f8c562d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Life vision system: genome→dream, LLM strategic planning every 30min, goals serve vision. Identity→Vision→Strategy→Goals→Actions hierarchy"},{"date":"2026-04-04","ts":1775298851000,"hash":"a1b8358c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Nomadic relocation: farmers move camp if on another's territory. Fences can't overlap (5m buffer). Structures physically move with farmer"},{"date":"2026-04-04","ts":1775298294000,"hash":"6f1678ee","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Crafting system: table(10w), sword(5w), shield(5w), bow(5w), arrows(1w each). Auto-equip. Broadcast farmer_crafted events"},{"date":"2026-04-04","ts":1775296484000,"hash":"b11cf0cf","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Solo farmers can build houses — no marriage requirement"},{"date":"2026-04-04","ts":1775295585000,"hash":"f4a5f82e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Hunting priority: preferred over gathering when prey within 60m. Default goal includes hunting. Stockpile threshold raised to foodTarget+30"},{"date":"2026-04-03","ts":1775241689000,"hash":"011575d7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Back to 200×200m. Performance over ambition"},{"date":"2026-04-03","ts":1775221891000,"hash":"a09bb854","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Shrink world to 400×400m for performance. Vegetation bounds ±200"},{"date":"2026-04-03","ts":1775219458000,"hash":"b041cacd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Vegetation performance: 60s tick (was 30s), growth max 800/tick, spread max 55/tick (30 grass + 10 tree + 15 bush), 2min growth cooldown"},{"date":"2026-04-03","ts":1775217655000,"hash":"a9c2e07a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"House costs 5 wood (was 15). Chicken eggs freeze 9min. Fence perimeter blocks critters+farmers. Pine drops tree_seeds"},{"date":"2026-04-03","ts":1775216971000,"hash":"b6b261e9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Goals are persistent: keep doing the goal until completion condition is met. Default goals on spawn. No more 2-action queues"},{"date":"2026-04-03","ts":1775215512000,"hash":"c58deef8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World expanded to 600×600m (was 200×200m). Farmers spawn across full area. Vegetation bounds updated"},{"date":"2026-04-03","ts":1775215218000,"hash":"842af54f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Wheat crop system: planted seeds grow as 'wheat' (yellow, max stage 3, 5 food + 3 seeds). Wild grass stays green. Critters eat both"},{"date":"2026-04-03","ts":1775214961000,"hash":"1fd49728","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Re-enable fence building — client now renders perimeter correctly"},{"date":"2026-04-03","ts":1775214886000,"hash":"7f815e67","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Disable fence building until client implements perimeter rendering. Prevents broken fence spam"},{"date":"2026-04-03","ts":1775214689000,"hash":"d72da549","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Slower movement: walk 1.5 (was 3.0), child 0.7, flee 3.0 (was 6.0). Broadcast 300ms (was 200ms). Fixes rubberbanding"},{"date":"2026-04-03","ts":1775214437000,"hash":"0da3be04","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fence includes gate, territory grows with family size (+2m per member), fence scale updates dynamically on persist"},{"date":"2026-04-03","ts":1775214185000,"hash":"3189d1b4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farm fence fix: 1 per family, scale=territory radius, cleaned 19 duplicate fences. Client renders perimeter from scale"},{"date":"2026-04-03","ts":1775213905000,"hash":"c0f4f0ff","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Tree seeds: chopping drops tree_seeds, planting uses tree_seeds for oaks (30% pref). Queue min 3 actions. Idle bottleneck fixed"},{"date":"2026-04-03","ts":1775213726000,"hash":"18c3caf9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix idle bottleneck: min 3 actions per queue, pad with work. Tree planting: 30% chance to plant oak when few trees nearby"},{"date":"2026-04-03","ts":1775212167000,"hash":"a7841aa1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Idle farmers walk home instead of standing in random spots. Think at home, not in the field"},{"date":"2026-04-03","ts":1775212066000,"hash":"9ed3ac86","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix prayer truncation: min 200 tokens for prayer, base 500. Store request as separate memory"},{"date":"2026-04-03","ts":1775211491000,"hash":"1d842f03","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Goal system: cortex sets 1-3 goals, task queue translates goals to actions. Cap mate-seeking at 3. Marriage cleans bride's old camp"},{"date":"2026-04-03","ts":1775211079000,"hash":"2f90af8f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Planting grid checks for structures during slot scan — no more walking to blocked spots"},{"date":"2026-04-03","ts":1775210412000,"hash":"b6cb7213","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Batch spawn endpoint: POST /farmers/spawn-batch {males, females} — admin spawns multiple farmers at random positions"},{"date":"2026-04-03","ts":1775210226000,"hash":"a9e5ffe9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS2367: remove sleeping/planting from unreachable comparison (already handled by continue)"},{"date":"2026-04-03","ts":1775209062000,"hash":"efc28a7a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Task queue: farmers plan 3-5 actions ahead, pop next immediately, rebuild every 30s. Emergency overrides clear queue"},{"date":"2026-04-03","ts":1775208769000,"hash":"78cff896","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Faster stuck recovery: 10s walking timeout (was 30s), force idle when no target/task"},{"date":"2026-04-03","ts":1775208691000,"hash":"570daba7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Action chaining: farmers re-evaluate immediately after completing an action instead of waiting 2s idle"},{"date":"2026-04-03","ts":1775208373000,"hash":"46c57d25","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS errors: remove unreachable planting timeout check, add missing familyBonds to DB-loaded farmers"},{"date":"2026-04-03","ts":1775207902000,"hash":"f9cb630b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Family bond system: trust decay, passing nods, context greetings (spouse/child/parent/kin), social anxiety drives relationship repair"},{"date":"2026-04-03","ts":1775207482000,"hash":"7faed77e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"NPC coordination: farmers check what others are targeting before picking vegetation/planting spots — no duplicate targets"},{"date":"2026-04-03","ts":1775207365000,"hash":"05248364","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Stuck detection: walking_to times out after 30s, planting after 60s — resets to idle to pick new action"},{"date":"2026-04-03","ts":1775206963000,"hash":"161ae2b8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmer status endpoint: GET /farmers/{id}/status — full diagnostic with human-readable status, warnings, family, emotions, memories"},{"date":"2026-04-03","ts":1775206541000,"hash":"79789c62","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Territorial fights: boldness+health determines winner, loser flees+territory shifts, both take damage, lethal if health=0"},{"date":"2026-04-03","ts":1775206388000,"hash":"96068ca8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Chicken population control: 30m home range (was 200m), territorial aggression vs non-family, breed cooldown 20min, hunger 5/min. Culled 855→20"},{"date":"2026-04-03","ts":1775205786000,"hash":"2176f753","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Smart collision avoidance: farmers dodge sideways when blocked instead of walking into each other forever"},{"date":"2026-04-03","ts":1775205602000,"hash":"2bdc8f61","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"House upgrade deletes ALL family tents (structure + world_object + broadcast removal), moves family home to house"},{"date":"2026-04-03","ts":1775204919000,"hash":"ce3cfd20","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World bounds: vegetation cannot spread outside 200×200m terrain. Deleted 2632 out-of-bounds plants"},{"date":"2026-04-03","ts":1775204677000,"hash":"ec2628d6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Vegetation can't spawn within 3m of structures (planting, spreading, seeding all check)"},{"date":"2026-04-03","ts":1775204277000,"hash":"d1a07277","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Fix socializing: 10min cooldown, reduced prediction score, stop+face within 2m, cooldown on pick not just completion"},{"date":"2026-04-03","ts":1775204032000,"hash":"372a0f85","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Territory system: house(15w)→farm_plot(3w)→fence×4(3w)→gate(5w), spatial row planting, fence collision blocks non-family"},{"date":"2026-04-03","ts":1775202850000,"hash":"c0fd639e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmer movement 3x faster (3.0 walk, 6.0 flee), broadcast at 200ms with targetPos for client interpolation"},{"date":"2026-04-03","ts":1775202540000,"hash":"5dfb72b0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Prayer requests: distinguish simple interventions vs world-changing miracles (feature requests from inside the simulation)"},{"date":"2026-04-03","ts":1775202303000,"hash":"a5666101","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix prayer parsing: robust regex for multiline PRAYER/REQUEST extraction"},{"date":"2026-04-03","ts":1775201156000,"hash":"dc42bb80","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Baby phase reduced to 5 min"},{"date":"2026-04-03","ts":1775200759000,"hash":"d488c654","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Mother speak + phase change events sent only to the specific baby player, not all players"},{"date":"2026-04-02","ts":1775198040000,"hash":"dd82d96d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Spirituality gene: scales prayer frequency + joy from answered prayers. Unanswered prayers = silence, not grief"},{"date":"2026-04-02","ts":1775197637000,"hash":"c9476b64","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Prayer system v2: prayer (feelings) + request (divine petition), prayer queue visible to player-god, grant/deny endpoint"},{"date":"2026-04-02","ts":1775196622000,"hash":"77da464a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Entity separation: farmers push apart when within 1.5m, prevents stacking"},{"date":"2026-04-02","ts":1775196286000,"hash":"9510a4ab","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add memories and recentActions to GET /farmers response"},{"date":"2026-04-02","ts":1775196183000,"hash":"82492c3d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Structured memory system: categories (relationship/life_event/skill/belief/place), compact index, selective recall, context-aware talk"},{"date":"2026-04-02","ts":1775194018000,"hash":"16153212","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Talk handler knows parent-child relationships, prayer memories lowered to importance 4 to stop evicting life events"},{"date":"2026-04-02","ts":1775191287000,"hash":"c2a875b4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Baby-status syncs phase from DB on every poll — admin resets take effect immediately"},{"date":"2026-04-02","ts":1775190163000,"hash":"40656a8d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Building system: tent→house upgrade (10 wood), fence (5 wood), farm plot (3 wood). Structures saved to DB + broadcast"},{"date":"2026-04-02","ts":1775189591000,"hash":"26c3b1e6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Baby engagement: ambient status every 15s, full narration every 30s, behavior-specific lines for all 12 states"},{"date":"2026-04-02","ts":1775188540000,"hash":"3f57f0d1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Baby state persists across reconnect: rebuild from DB on baby-status poll and birth re-call"},{"date":"2026-04-02","ts":1775188364000,"hash":"fa76664b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Vegetation spread from stage 2+ (grass/bush) and stage 3+ (trees) — young plants spread too"},{"date":"2026-04-02","ts":1775188109000,"hash":"e409c585","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Dead vegetation deleted from DB on kill (farmer harvest + trampling), not left as corpses"},{"date":"2026-04-02","ts":1775187817000,"hash":"e1ae0ea3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix dead vegetation: grass/bushes regrow from roots after 2min cooldown (health 0 → 30, stage 0)"},{"date":"2026-04-02","ts":1775187514000,"hash":"2f43c90d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Auto-spawn template parents when no farmers exist for player birth"},{"date":"2026-04-02","ts":1775186348000,"hash":"44103b57","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Farmer AI v4: stochastic prediction, permanent memories, bottom-up identity, fitness-gated teaching, evolvable gender, supply/demand economy, territory conflict, farmer combat, compressed child phases"},{"date":"2026-04-02","ts":1775181838000,"hash":"8102b024","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Complete system reference doc + Paper 012 final updates"},{"date":"2026-04-02","ts":1775181108000,"hash":"5b01e860","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Paper 012: The Self-Referential Loop — consciousness model for NPCs"},{"date":"2026-04-02","ts":1775180920000,"hash":"6a95ec37","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Evolutionary prediction: 8 pred_* genes for world model, generational tracking, novelty-triggered processing depth, fitness scoring"},{"date":"2026-04-02","ts":1775179303000,"hash":"1b8a0811","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Predictive engine: farmers perceive environment, predict outcomes, pick best action instead of fixed if/else"},{"date":"2026-04-02","ts":1775179000000,"hash":"0c4bcabc","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Dopamine analog: consequence-weighted Pavlovian learning, ego identity-alignment in self-observation"},{"date":"2026-04-02","ts":1775178477000,"hash":"476df895","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Self-referential loop: emotions now modify instinct weights, 30s self-observation frame, recent action tracking"},{"date":"2026-04-02","ts":1775174928000,"hash":"c8820362","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS2367: remove unreachable sleeping check from stuck-detection"},{"date":"2026-04-02","ts":1775167065000,"hash":"526c576c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Player Origin System: born as baby, mother nurturing AI, phase progression, cry/coo input"},{"date":"2026-04-02","ts":1775166501000,"hash":"6d9301e7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Paper 011: Born Into the World — baby/child/young adult origin system with mother AI"},{"date":"2026-04-02","ts":1775163425000,"hash":"363dce2e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix sleep: recover fatigue every behavior tick while sleeping, not just on action transition"},{"date":"2026-04-02","ts":1775137151000,"hash":"67be68ff","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmers hunt chickens and deer for food — 5 food per chicken, 10 per deer"},{"date":"2026-04-02","ts":1775135467000,"hash":"6010956f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmers always speak on reactive tick for demo"},{"date":"2026-04-02","ts":1775135161000,"hash":"4f146cd4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add Grok debug logging to farmer reactive tick"},{"date":"2026-04-02","ts":1775134843000,"hash":"ec167210","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Demo mode: faster Grok ticks (reactive 1min, cortex 10min, prayer 5min)"},{"date":"2026-04-02","ts":1775134544000,"hash":"8a4ff523","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Wire Grok LIVE: farmers think, speak, reflect, pray, and talk to players"},{"date":"2026-04-02","ts":1775126193000,"hash":"1bff943d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Tiny 200m world for demo — 3 small islands, everything walkable in seconds"},{"date":"2026-04-02","ts":1775123723000,"hash":"23f5d8b0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Force spawn Y >= 80 — players always spawn above terrain, never underground"},{"date":"2026-04-02","ts":1775120293000,"hash":"9429745e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Shrink world to 2km x 2km with 3 islands for demo"},{"date":"2026-04-02","ts":1775116263000,"hash":"c49394f5","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Always daytime: vegetation grows 24/7, no night growth halt"},{"date":"2026-04-01","ts":1775073829000,"hash":"39afee4c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"English Study: article quiz with Grok, mastery meter, mistake review"},{"date":"2026-04-01","ts":1775073516000,"hash":"30f7150f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"English Study page: article quiz with Grok, mastery meter, mistake review"},{"date":"2026-03-31","ts":1775014430000,"hash":"51da3ae0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Increase terrain chunk radius max 10→25 so client can load full world"},{"date":"2026-03-31","ts":1774992192000,"hash":"6468e9a4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Critter territory: water avoidance, 200m home range, terrain preload for sync checks"},{"date":"2026-03-31","ts":1774987483000,"hash":"2610a056","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS2304: foodCount reference"},{"date":"2026-03-31","ts":1774975598000,"hash":"a2aa7e01","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmers eat until hunger < 40, not just one bite — prevents starving with food"},{"date":"2026-03-31","ts":1774972699000,"hash":"deed3512","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix farmer harvest: execute action when arrived at vegetation target, not just when idle"},{"date":"2026-03-31","ts":1774971849000,"hash":"e2ec04a6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmers seed 20 grass + 5 bush around camp on spawn; fix barren spawn areas"},{"date":"2026-03-31","ts":1774969789000,"hash":"9571395e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Critical fix: survival override runs every tick, not just when idle — farmers eat before starving"},{"date":"2026-03-31","ts":1774962284000,"hash":"257a76b2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmer v3 hooks + skills: composable behavior layers, contextual skill activation"},{"date":"2026-03-31","ts":1774962159000,"hash":"d72d67df","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmer v3: hook pipeline, contextual skills, mental simulation, memory compression, procedural genome"},{"date":"2026-03-31","ts":1774957603000,"hash":"192103c1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Default spawn point: (544, 40, 503) — center island grassland"},{"date":"2026-03-31","ts":1774955802000,"hash":"1206aaeb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Terrain v2: 7 gentle islands with shallow water, max height 100m"},{"date":"2026-03-30","ts":1774920637000,"hash":"f929def4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add GET /api/v1/world/terrain/minimap — serves 256x256 BMP minimap"},{"date":"2026-03-30","ts":1774901324000,"hash":"8d3e2522","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Terrain system: 5km world generated — 2500 chunks, mountains/valley/river/lake/forest"},{"date":"2026-03-30","ts":1774900988000,"hash":"7f549ae1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Terrain system: DB schema, API endpoints, data layer with in-memory cache"},{"date":"2026-03-30","ts":1774898907000,"hash":"f27e61eb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Paper 010 updated: farmer behavioral analysis — Fletcher family tragedy, seed hoarders, orphan children"},{"date":"2026-03-30","ts":1774896691000,"hash":"8b29b224","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Paper 010: Ecosystem collapse postmortem — 3 extinctions, vegetation is the bottleneck"},{"date":"2026-03-30","ts":1774875950000,"hash":"e1174f00","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add POST /api/v1/critters/cull — kill N random critters by species"},{"date":"2026-03-30","ts":1774873029000,"hash":"ba67977b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Planting takes 60 seconds per seed — walk to spot, kneel, plant"},{"date":"2026-03-30","ts":1774872668000,"hash":"1945bdaf","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmers plant seeds in grid rows near home when food is secured"},{"date":"2026-03-30","ts":1774872438000,"hash":"b108835f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmers spawn with 10 gold coins in inventory"},{"date":"2026-03-30","ts":1774871245000,"hash":"946ab462","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix farmer route to use v2 genome/emotions fields"},{"date":"2026-03-30","ts":1774871136000,"hash":"551fae89","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmer v2: DNA genome (24 genes), 6-channel emotions, Pavlovian learning, instinct-driven"},{"date":"2026-03-30","ts":1774870776000,"hash":"99084bc5","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Paper 009: The Divine Interface — prayer protocol, self-authoring prompts, implementation spec"},{"date":"2026-03-30","ts":1774870458000,"hash":"18309384","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Paper 008: Prayer system + emergent social classes — farmers as self-designing civilization"},{"date":"2026-03-30","ts":1774869835000,"hash":"57881dff","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Paper 007: DNA instinct genome at scale — 1000 farmers, Pavlovian learning, Lamarckian evolution"},{"date":"2026-03-30","ts":1774869252000,"hash":"d42221a7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Papers 005-006: Emotional signal bus + implementation plan for layered brain"},{"date":"2026-03-30","ts":1774868954000,"hash":"0c2e2e37","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Paper 004: Layered consciousness architecture — instinct/reactive/cortex brain model"},{"date":"2026-03-30","ts":1774867880000,"hash":"73e021b6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Paper 003: Farmer population first 24hrs — 77% starvation mortality, zero marriages"},{"date":"2026-03-30","ts":1774867538000,"hash":"9d35ca0c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add research papers: ecosystem balance + farmer emergent behavior design"},{"date":"2026-03-30","ts":1774864802000,"hash":"7df74e96","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World objects get label field: farmer structures show 'Name's Tent' etc"},{"date":"2026-03-30","ts":1774864250000,"hash":"9f710247","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmer migration packs up camp: deletes old structures, places new ones at destination"},{"date":"2026-03-30","ts":1774863943000,"hash":"aeef946c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmers stay near home: search veg near camp, return if >60m away"},{"date":"2026-03-29","ts":1774848677000,"hash":"16832b5d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmer structures persist to world_object table for chunk loading"},{"date":"2026-03-29","ts":1774847896000,"hash":"e64aaeb0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Ecosystem balance: fox omnivore+hunts fawns, chicken hunger halved, bear territorial"},{"date":"2026-03-29","ts":1774847074000,"hash":"9332413a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix fox overpopulation: hunger 1->4/min, breed cooldown 10->15min, breed hunger 40->25"},{"date":"2026-03-29","ts":1774846896000,"hash":"0211edd7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Set farmer ai_agenda to farm on spawn instead of default follow_commander"},{"date":"2026-03-29","ts":1774846598000,"hash":"ff37d871","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Even 2m gaps: tent(0) -> farmer(+2) -> fire(+4) -> log(+6)"},{"date":"2026-03-29","ts":1774846352000,"hash":"4bc399fe","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmer spawns 1m in front of tent, between tent and fire"},{"date":"2026-03-29","ts":1774846039000,"hash":"cc6d3627","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix farmer camp: tent at spawn, fire 3m away, log 1m from fire; clear old farmers"},{"date":"2026-03-29","ts":1774845679000,"hash":"72b6dad1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add Grok decision logging for farmers"},{"date":"2026-03-29","ts":1774845443000,"hash":"c64c43f0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Include spawnPos in world_state so client spawns at last position"},{"date":"2026-03-29","ts":1774845136000,"hash":"8ec1516e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Use actual Synty prefab names for farmer structures"},{"date":"2026-03-29","ts":1774844723000,"hash":"c7cc2623","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove accidentally committed services/mobile/ and .deploy.env from git"},{"date":"2026-03-29","ts":1774844711000,"hash":"34db4b81","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove leaked google-services.json, add services/mobile/ to gitignore"},{"date":"2026-03-29","ts":1774844614000,"hash":"09ee1f74","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix farmer spawn: use admin user_id for FK, pass to child spawns"},{"date":"2026-03-29","ts":1774843066000,"hash":"12d4f205","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World NPC delete: broadcast world_npc_removed to all clients"},{"date":"2026-03-29","ts":1774842835000,"hash":"f6ccd28b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmer NPC: fix crypto import, fix route import path"},{"date":"2026-03-29","ts":1774842585000,"hash":"edc287ed","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Farmer NPC system: autonomous villagers with Grok brains, memories, families, farming"},{"date":"2026-03-29","ts":1774832632000,"hash":"17ad996d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Admin vegetation plant: skip seed check when admin:true"},{"date":"2026-03-29","ts":1774790542000,"hash":"f6b7979f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Chickens starve 2x faster: hungerPerMinute 3 -> 6"},{"date":"2026-03-29","ts":1774790218000,"hash":"be79b1ea","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Buff bears: faster, stronger, breed 2x faster, slower hunger, wider search"},{"date":"2026-03-29","ts":1774789545000,"hash":"0e2f2ddb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add POST /critters/{id}/hit endpoint for arrow/melee damage"},{"date":"2026-03-29","ts":1774789297000,"hash":"669ca61a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Foxes: hunt 20% base chance, breed 2x faster, slower hunger, wider search"},{"date":"2026-03-29","ts":1774786139000,"hash":"5a25b2fa","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add appearance JSON to world_npc for custom modular characters"},{"date":"2026-03-29","ts":1774785380000,"hash":"70cb6b34","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Rotate: recompute full grid at new angle each step, maintains perfect spacing throughout arc"},{"date":"2026-03-29","ts":1774783351000,"hash":"bf451ac7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS18048: null check brain in staggered form_up"},{"date":"2026-03-29","ts":1774783261000,"hash":"b2704ff3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Rotate: large rotations chain as 15° arc steps (1.5s apart), units walk arcs not straight lines"},{"date":"2026-03-29","ts":1774783124000,"hash":"c7067ed4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Staggered formation: units move in waves of 8, closest first, 500ms between waves"},{"date":"2026-03-29","ts":1774782846000,"hash":"8fa254e7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Idle NPCs yield to moving teammates: 1.5m range, 1.5 force when teammate approaching"},{"date":"2026-03-29","ts":1774782434000,"hash":"620b64bb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Same-army NPC collision: 0.5m range / 0.5 force (vs 1.5m / 2.0 for enemies)"},{"date":"2026-03-29","ts":1774782281000,"hash":"64e13b5e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"NPC-on-NPC push force 0.8 -> 2.0, NPCs still return to hold position after"},{"date":"2026-03-29","ts":1774781955000,"hash":"481216ad","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Player push 3x stronger (2.0), updates NPC hold position so guard doesn't fight back"},{"date":"2026-03-29","ts":1774781829000,"hash":"cbee100b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Broadcast idle action in 200ms tick when NPC just stopped walking (fixes walk-in-place)"},{"date":"2026-03-29","ts":1774781605000,"hash":"e993a61f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"NPC-on-NPC push range 0.4m -> 1.5m to match player push"},{"date":"2026-03-29","ts":1774781402000,"hash":"e8ae586e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Shrink NPC collision radius 1.2m -> 0.4m, less blocking during form_up"},{"date":"2026-03-29","ts":1774781171000,"hash":"a1dacbc8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Push: moving units get sideways push only (slide past each other), idle get full push"},{"date":"2026-03-29","ts":1774780951000,"hash":"4384b996","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Step commands: units hold facing direction while moving (no turning around)"},{"date":"2026-03-29","ts":1774780840000,"hash":"62754a42","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Stuck detection: wait 5s (10 ticks) before stepping backward"},{"date":"2026-03-29","ts":1774780562000,"hash":"d7f98bf2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Stuck detection: NPCs step backward 500ms after 3 ticks without progress, then retry"},{"date":"2026-03-29","ts":1774780451000,"hash":"039ed212","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix push: moving units ignore NPC push (walk straight), idle units get pushed aside"},{"date":"2026-03-29","ts":1774780168000,"hash":"93fe2ff7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"step_forward/back uses group leader facing (centurion > decurion > sergeant)"},{"date":"2026-03-29","ts":1774779861000,"hash":"454f393e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Strong push (1.2m range, 1.0 force) so NPCs shove past each other immediately"},{"date":"2026-03-29","ts":1774779559000,"hash":"b64c1d64","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Fix: import npcStates in army.ts for step/rotate commands"},{"date":"2026-03-29","ts":1774779076000,"hash":"dee385d8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add rotate_left and rotate_right army commands (15° around army center)"},{"date":"2026-03-29","ts":1774778768000,"hash":"9f9aaf12","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add step_forward and step_back army commands (1m in commander facing direction)"},{"date":"2026-03-29","ts":1774778161000,"hash":"a3fd2018","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Stronger correction (0.8x dist), tighter arrival (0.15m), NPCs push through blockers"},{"date":"2026-03-29","ts":1774777600000,"hash":"31bd68f3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Re-enable same-army push while moving to formation, disable once both idle"},{"date":"2026-03-29","ts":1774777390000,"hash":"12293c76","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix: NPCs on hold/move_to don't track commander delta, widen arrival threshold to 0.3m"},{"date":"2026-03-29","ts":1774777135000,"hash":"21961b9d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Formation: run when >3m from target, walk when close"},{"date":"2026-03-29","ts":1774776934000,"hash":"375cb431","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Smooth formation: apply commander delta in 200ms tick, not 500ms"},{"date":"2026-03-29","ts":1774776693000,"hash":"ee3db4d6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix formation movement: all move_to/guard/follow use direct walk, no steering"},{"date":"2026-03-29","ts":1774776459000,"hash":"a9b33af2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Hold command now computes exact grid positions like form_up"},{"date":"2026-03-29","ts":1774776188000,"hash":"ebedc678","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"form_up computes exact grid positions (like move_to), not dynamic follow"},{"date":"2026-03-29","ts":1774776033000,"hash":"8acf8122","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Formation: always use direct correction (no steering), speed scales with distance"},{"date":"2026-03-29","ts":1774775634000,"hash":"8f73568c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Synchronized formation movement: lockstep with commander delta + gentle correction, no same-army push"},{"date":"2026-03-29","ts":1774775092000,"hash":"7f2dd0ae","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS2352 cast in worldObjects delete-by-position"},{"date":"2026-03-29","ts":1774774938000,"hash":"49011cb0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add DELETE /api/v1/world/objects by position+prefab_name"},{"date":"2026-03-29","ts":1774774804000,"hash":"6672f9ea","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix formations: overlap 0.6m < spacing, decelerate on approach, 0.15m precision"},{"date":"2026-03-29","ts":1774773844000,"hash":"d9e59c6d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Bears flee from humanoids, attack when hungry (hunger >= 60)"},{"date":"2026-03-29","ts":1774772296000,"hash":"7e45e841","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Vegetation spacing: grass 6-10m/6m, trees 15-25m/15m, bushes 10-20m/8m"},{"date":"2026-03-29","ts":1774771145000,"hash":"8a53a9a3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix vegCounts desync: resync from DB every 60s"},{"date":"2026-03-28","ts":1774765348000,"hash":"c208b259","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Critter life log: born/ate/hunted/mated/fled/starved/killed events + API endpoint"},{"date":"2026-03-28","ts":1774764349000,"hash":"62dbc9df","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"NPCs spawn at saved position on hold — no running, wait for orders"},{"date":"2026-03-28","ts":1774764279000,"hash":"292c17cc","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Teleport NPCs near commander if saved position >100m away"},{"date":"2026-03-28","ts":1774763583000,"hash":"82b76f18","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Stats history: record snapshots every 5s, downsample hourly, REST API for graphs"},{"date":"2026-03-28","ts":1774763043000,"hash":"cfc5450b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Reset transient agendas (move_to/guard) to follow_commander on reload"},{"date":"2026-03-28","ts":1774762803000,"hash":"b06ad878","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World stats broadcast every 5s instead of 30s"},{"date":"2026-03-28","ts":1774762627000,"hash":"df6dd5b9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Persistent positions: NPCs spawn at saved DB position, save every 60s + on disconnect"},{"date":"2026-03-28","ts":1774761933000,"hash":"332b1d83","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Grass spacing 6m, bush spacing 20m, grass ignores trees beyond 1.5m"},{"date":"2026-03-28","ts":1774761324000,"hash":"34fceeff","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Delete chickens/deer/3000 oaks, reduce oak spread to 3.75%"},{"date":"2026-03-28","ts":1774760306000,"hash":"c0167d00","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Chunked spread processing + in-memory veg counts: yield event loop every 100 plants"},{"date":"2026-03-28","ts":1774759895000,"hash":"226c9c29","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Cache veg stats (5min refresh), fix event loop starvation causing disconnects"},{"date":"2026-03-28","ts":1774759614000,"hash":"7564d3d0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Spread cooldown: failed plants wait exponentially longer, wake on neighbor death"},{"date":"2026-03-28","ts":1774759051000,"hash":"aad63afb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"No limits: fetch all mature, random roll in Node, density check only on candidates"},{"date":"2026-03-28","ts":1774758620000,"hash":"0079aba6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix vegetation perf tracking: use Date.now, log errors"},{"date":"2026-03-28","ts":1774758426000,"hash":"b062942d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Restore uncapped vegetation growth — only spread checks were heavy"},{"date":"2026-03-28","ts":1774758305000,"hash":"c018dffd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Vegetation optimization: skip saturated areas, cap batches — fixes WebSocket disconnects"},{"date":"2026-03-28","ts":1774757046000,"hash":"35992619","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Server performance tracking: tick durations, memory, uptime in world_stats"},{"date":"2026-03-28","ts":1774756096000,"hash":"961b80ab","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Chickens can now eat bushes too"},{"date":"2026-03-28","ts":1774755472000,"hash":"4301bbc5","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add game day to world_time broadcast for lunar cycle sync"},{"date":"2026-03-28","ts":1774755243000,"hash":"e1331fc6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World stats API + 30s WebSocket broadcast for live critter/vegetation counts"},{"date":"2026-03-28","ts":1774754575000,"hash":"3efe602c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Hunger-scaled behavior: all animals gradually increase activity as hunger grows"},{"date":"2026-03-28","ts":1774754035000,"hash":"0e8e880b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Bears hunt first: predators check prey before vegetation, bear veg restore reduced to force hunting"},{"date":"2026-03-28","ts":1774753536000,"hash":"4a2b2e97","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Trees now trampleable: 7 dmg per walk (~15 walks to kill vs 5 for grass)"},{"date":"2026-03-28","ts":1774753229000,"hash":"6eb3fea5","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Center formation behind commander: centurion centered, soldiers grid centered around centurion"},{"date":"2026-03-28","ts":1774752662000,"hash":"fb910fbd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add 20-troop formation geometry simulation tests"},{"date":"2026-03-28","ts":1774752064000,"hash":"e34dd6bd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix formation walk-in-place: widen idle threshold to 0.5m to prevent push oscillation"},{"date":"2026-03-28","ts":1774750715000,"hash":"e86adc67","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS: add preyId/killStarted to baby CritterState in mating"},{"date":"2026-03-28","ts":1774745292000,"hash":"aa6151ad","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Widen NPC-to-NPC push to 1.5m so they can walk past each other"},{"date":"2026-03-28","ts":1774744914000,"hash":"91955707","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Seeded critters spawn as adults, NPCs dodge away from players, gene inheritance"},{"date":"2026-03-28","ts":1774744658000,"hash":"44396dc2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Behavioral genes: boldness, speed, social, hunger tolerance, curiosity — inherited with mutation"},{"date":"2026-03-28","ts":1774740978000,"hash":"27e268fa","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"NPC trampling matches player rate: every movement tick, no throttle"},{"date":"2026-03-28","ts":1774740620000,"hash":"f94f270a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix watch party pause: update local state immediately on custom control click"},{"date":"2026-03-28","ts":1774740204000,"hash":"1998deb9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Increase NPC trampling to 20% per tick"},{"date":"2026-03-28","ts":1774739435000,"hash":"a04757f3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix ChatInput optional props for watch party compact mode"},{"date":"2026-03-28","ts":1774739003000,"hash":"c44a1c80","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch party: video full-size in main area, chat moves to side panel tab"},{"date":"2026-03-28","ts":1774735668000,"hash":"bb81e813","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Watch party: paste YouTube URL in chat to start synced video for the room"},{"date":"2026-03-28","ts":1774733204000,"hash":"f2eb40f3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Debug: log player positions in vegetation broadcast to find position mismatch"},{"date":"2026-03-28","ts":1774731882000,"hash":"50ccbf4e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Vegetation: remove all caps, add spawn counter to tick log"},{"date":"2026-03-28","ts":1774731281000,"hash":"415ed246","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove all vegetation batch caps — density is the only natural limiter"},{"date":"2026-03-28","ts":1774702345000,"hash":"56ec3396","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Add AI Fight Club to landing page products with download button"},{"date":"2026-03-28","ts":1774700277000,"hash":"911b5aa8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Include per-player relation in player_joined for encounter NPCs — red names for enemies"},{"date":"2026-03-27","ts":1774649396000,"hash":"d03296bc","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS: add holdPosition/holdFacing to registerSingleNPC"},{"date":"2026-03-27","ts":1774649206000,"hash":"1c0975f0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Hold position: units continuously correct to exact spot + facing after move_to arrival"},{"date":"2026-03-27","ts":1774643248000,"hash":"55372bf4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix idle twitch: only broadcast player/NPC updates when position actually changes (>0.05m)"},{"date":"2026-03-27","ts":1774640955000,"hash":"25c96f6c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Only broadcast positions for moving NPCs — idle units skip 200ms updates"},{"date":"2026-03-27","ts":1774640751000,"hash":"887a0058","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add 200ms position broadcast for smoother NPC movement on remote clients"},{"date":"2026-03-27","ts":1774626108000,"hash":"a63749f8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"move_to sets agenda to move_to, clears formation, prevents facing override"},{"date":"2026-03-27","ts":1774625824000,"hash":"d3129e3d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS: add moveToFacing to registerSingleNPC brain"},{"date":"2026-03-27","ts":1774624978000,"hash":"5254b8c9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add facing direction to move_to: units rotate to commanded angle on arrival"},{"date":"2026-03-27","ts":1774624575000,"hash":"a53acacd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS: import players in army.ts for move_to commander rotation"},{"date":"2026-03-27","ts":1774624303000,"hash":"41bba4c5","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"move_to: every unit gets own target position, no officer-follow indirection"},{"date":"2026-03-27","ts":1774624018000,"hash":"6250f7b0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS error: cast anchor to non-null tuple"},{"date":"2026-03-27","ts":1774623763000,"hash":"bcf06e95","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix formation offset: units without centurion still form 3m behind commander"},{"date":"2026-03-27","ts":1774623663000,"hash":"a1bffe2f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Formation anchors on centurion: move_to moves officer, army follows in formation"},{"date":"2026-03-27","ts":1774623280000,"hash":"41aee92f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"NPC obstacle avoidance: steer around blockers instead of running in place"},{"date":"2026-03-27","ts":1774622379000,"hash":"8886760b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"move_to accepts positions array: client sends exact grid, server assigns by block index"},{"date":"2026-03-27","ts":1774622121000,"hash":"c4c0c8dd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"move_to supports line placement (x1,z1→x2,z2) with formation rows"},{"date":"2026-03-27","ts":1774621997000,"hash":"178bf454","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Stronger unit push: 0.4 force at 0.8m so units actually move for each other"},{"date":"2026-03-27","ts":1774621373000,"hash":"4de2f1bd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Soft body push: units slowly slide past each other when overlapping, gentle in formation"},{"date":"2026-03-27","ts":1774621229000,"hash":"f808c554","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix move_to: add to commandMap so it passes validation"},{"date":"2026-03-27","ts":1774620447000,"hash":"3a5251f0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add move_to army command: march units to world position then hold"},{"date":"2026-03-27","ts":1774618472000,"hash":"8a2710c6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Vegetation regresses growth stage when damaged by eating or trampling"},{"date":"2026-03-27","ts":1774617371000,"hash":"dae2725a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Critter system: chickens and deer that eat vegetation, flee, reproduce, starve"},{"date":"2026-03-27","ts":1774616091000,"hash":"1274ac7f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Performance: cached army counts, batched NPC broadcast, reduced trampling frequency"},{"date":"2026-03-27","ts":1774615079000,"hash":"5483662b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Vegetation logging, NPC trampling, grass dies in 5 walks, trees immune"},{"date":"2026-03-27","ts":1774614727000,"hash":"5a543aec","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix pine spread: random tree selection so rare species get fair chance, bump spread to 5%"},{"date":"2026-03-27","ts":1774614549000,"hash":"54e52920","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Align walk/idle threshold with movement deadzone (0.3m) to prevent phantom walk animation"},{"date":"2026-03-27","ts":1774614348000,"hash":"850489d7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix formation oscillation: clamp movement to remaining distance, prevent overshoot"},{"date":"2026-03-27","ts":1774612067000,"hash":"68d77c70","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix formation idle test for tighter 0.5m threshold"},{"date":"2026-03-27","ts":1774611946000,"hash":"84bb1b17","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Tighter formation hold: 0.5m idle threshold, 1.0m min separation"},{"date":"2026-03-27","ts":1774611451000,"hash":"3e0c6602","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Squad-grouped formation: sergeant + soldiers stay together in block"},{"date":"2026-03-27","ts":1774611173000,"hash":"b7b49548","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"NPCs face same direction as commander in formation"},{"date":"2026-03-27","ts":1774610925000,"hash":"cfaf6f54","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Tighter default formation: 1.0m spacing, 1.5m row depth"},{"date":"2026-03-27","ts":1774610750000,"hash":"4a2f413e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Disable separation force when in formation — prevents jitter at tight spacing"},{"date":"2026-03-27","ts":1774610539000,"hash":"e1ac35dd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Cap army at 80 units (Roman century)"},{"date":"2026-03-27","ts":1774610175000,"hash":"25450e8a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Roman maniple formation: always 2 rows deep, wide front line"},{"date":"2026-03-27","ts":1774609667000,"hash":"690a731d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Formation as geometry: shield wall blocks in place, units never break ranks, Grok only on leaders"},{"date":"2026-03-27","ts":1774607897000,"hash":"b9b00cd8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS error: handle optional allBrains in countArmyUnits"},{"date":"2026-03-27","ts":1774607759000,"hash":"b0aafe55","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Unified army block formation: all units form tight grid behind commander, rank-ordered (centurion front-left)"},{"date":"2026-03-27","ts":1774607402000,"hash":"9aaadd30","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Army chat spacing commands: tighten up/phalanx, normal spacing, spread out/loose"},{"date":"2026-03-27","ts":1774607193000,"hash":"f8a7dbd2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add army spacing API: GET/PUT /api/v1/army/spacing for adjustable formation spacing and row depth"},{"date":"2026-03-27","ts":1774606901000,"hash":"361b5884","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Squad formation follow: soldiers form rows behind leader, faster movement to keep up with player"},{"date":"2026-03-27","ts":1774604620000,"hash":"e6d7ca66","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Include commanderId in player_joined and world_state for NPC relation resolution"},{"date":"2026-03-27","ts":1774604163000,"hash":"ca357191","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Encounter revamp: spawn-army equips weapons, auto-enemy relations, draw weapons on spawn, seek_combat agenda"},{"date":"2026-03-27","ts":1774603598000,"hash":"18244ccd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add draw_weapons/sheathe_weapons army commands"},{"date":"2026-03-27","ts":1774597888000,"hash":"6be5f873","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Player relation system: enemy/neutral/ally with real-time NPC targeting, name color broadcasts"},{"date":"2026-03-27","ts":1774596617000,"hash":"17f7fafb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Encounter NPCs target real players; player attacks resolve against all NPCs in range"},{"date":"2026-03-26","ts":1774592242000,"hash":"5a2cb2e5","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"NPC combat animations: draw_weapon on combat entry, attack cooldowns (0.8s/1.5s), sheathe on exit"},{"date":"2026-03-26","ts":1774591933000,"hash":"bd1aa5c2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix encounter.ts: add equipped field to PlayerSyncState objects"},{"date":"2026-03-26","ts":1774591542000,"hash":"8eafad31","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Send equipment data in player_joined, world_state, NPC registration; army_refreshed broadcast on rank changes"},{"date":"2026-03-26","ts":1774590924000,"hash":"8f0173cd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Live NPC registration: recruits spawn instantly after purchase, dismiss removes live, army refresh on rank changes"},{"date":"2026-03-26","ts":1774590533000,"hash":"4a2b22fd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix pong detection: allow 3 missed pongs (30s) before terminating, was too aggressive"},{"date":"2026-03-26","ts":1774586432000,"hash":"73c4eb46","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix NPC clone: exclude commander from NPC spawn broadcast"},{"date":"2026-03-26","ts":1774585492000,"hash":"84687601","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Disable GameWorld (duplicate system), faster ping/reconnect, NPC spawn broadcast, vegetation production rates"},{"date":"2026-03-26","ts":1774578677000,"hash":"36c1beda","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Player death: no auto-respawn, stay dead until admin revive"},{"date":"2026-03-26","ts":1774578395000,"hash":"aeafb170","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix NPCs attacking real players: only target enemy NPCs, never real players"},{"date":"2026-03-26","ts":1774577379000,"hash":"1619dac9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World NPCs: DB-driven NPC placements for shopkeepers, recruiters, etc"},{"date":"2026-03-26","ts":1774577244000,"hash":"d616462a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World NPCs: DB-driven NPC placements, admin placement UI support"},{"date":"2026-03-26","ts":1774576936000,"hash":"f3390a08","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix random disconnects: add WebSocket ping keepalive + Socket.IO timeout tuning"},{"date":"2026-03-26","ts":1774574358000,"hash":"a684fb34","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add POST /api/v1/game/version — lightweight version metadata update"},{"date":"2026-03-26","ts":1774570176000,"hash":"6e3d5c41","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World objects: DB-driven buildings, props, structures with CRUD API"},{"date":"2026-03-26","ts":1774570024000,"hash":"99db9a59","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"World objects: buildings/props DB table, CRUD API, bulk seed, WebSocket broadcasts"},{"date":"2026-03-26","ts":1774562540000,"hash":"2c8ca885","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Biome spreading: trees drop seeds (3%), bushes spread (5%)"},{"date":"2026-03-26","ts":1774521824000,"hash":"306e5603","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Ecosystem: vegetation growth, trampling, world time, planting"},{"date":"2026-03-26","ts":1774521668000,"hash":"74f8fe95","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Ecosystem: vegetation growth, trampling, world time, seed endpoint"},{"date":"2026-03-26","ts":1774521321000,"hash":"bde8998b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add status + fear to npc_update: client can show fleeing/retreating indicators"},{"date":"2026-03-26","ts":1774520997000,"hash":"12b05cb1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix weapon range: load synchronously before NPC registration, log attack distances"},{"date":"2026-03-26","ts":1774520561000,"hash":"e95fbc4d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Death context: both armies aware of kills, morale/fear effects"},{"date":"2026-03-26","ts":1774520280000,"hash":"bfe649d2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Permanent death: delete dead NPCs from DB, clean up army roster"},{"date":"2026-03-26","ts":1774519495000,"hash":"f75fa58d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Server-authoritative weapon range + recruit equipment in API response"},{"date":"2026-03-26","ts":1774518320000,"hash":"bdf7d9b5","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Give recruits starting equipment on purchase: weapon + shield by type"},{"date":"2026-03-26","ts":1774518015000,"hash":"c9abe36d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix seek_combat NPCs not chasing: add 50m seek range for aggressive units"},{"date":"2026-03-26","ts":1774517698000,"hash":"28ed4e38","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"NPC banter: allies hear each other's speech and can respond"},{"date":"2026-03-26","ts":1774517232000,"hash":"424eaf61","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix units not engaging: all units close to melee within 8m, face targets"},{"date":"2026-03-26","ts":1774516834000,"hash":"d49b722c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Ancient warfare combat: exhaustion-based, shield walls hold, flanking decisive"},{"date":"2026-03-26","ts":1774516440000,"hash":"3cf0d93a","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Rebalance combat for ancient warfare feel: slower, formation-based"},{"date":"2026-03-26","ts":1774516203000,"hash":"c64bbee6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix NPC combat: actually call resolveAttack + encounter NPCs seek_combat + attack logging"},{"date":"2026-03-26","ts":1774515491000,"hash":"6be16f16","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Rebuild chain of command on recruit, death, and promotion"},{"date":"2026-03-26","ts":1774515207000,"hash":"a9041624","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"NPC permanent death + auto-promote replacements on death/dismiss"},{"date":"2026-03-26","ts":1774514751000,"hash":"cde3f02a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix leadership gaps: auto-promote missing decurions/sergeants, fix chain of command fallback"},{"date":"2026-03-26","ts":1774514139000,"hash":"80a00c6a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Chain of command: units follow their leader, not the player directly"},{"date":"2026-03-26","ts":1774510067000,"hash":"489b1101","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Persistent AI armies: full Grok brains, DB-backed, battle records"},{"date":"2026-03-26","ts":1774509946000,"hash":"a392205d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Persistent AI armies: full Grok brains, DB-backed, battle_record table, self-learning foundation"},{"date":"2026-03-26","ts":1774509624000,"hash":"7b2b07c1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Encounter system: spawn enemy armies + test bots for multiplayer/combat testing"},{"date":"2026-03-26","ts":1774509351000,"hash":"509bcb57","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Encounter system: spawn enemy armies + test bots for multiplayer/combat testing"},{"date":"2026-03-25","ts":1774506807000,"hash":"f702a60b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add march/advance command: units walk forward in commander's facing direction until halt"},{"date":"2026-03-25","ts":1774505813000,"hash":"b08db539","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Formation system: 7 formations, calculator, behavior tree, API, chat commands"},{"date":"2026-03-25","ts":1774504761000,"hash":"d0795d21","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add 'follow/follow me/with me/come' to fast path command patterns → form_up"},{"date":"2026-03-25","ts":1774504154000,"hash":"dd043913","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add 'resume' command: unlocks agenda so AI regains autonomous control"},{"date":"2026-03-25","ts":1774503991000,"hash":"184ec7a9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix Grok overriding player commands: agendaLocked flag prevents AI from resetting agenda"},{"date":"2026-03-25","ts":1774503425000,"hash":"0c4e6e91","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Speed up army chat: fast pattern matching for commands (34-159ms vs 12s Grok)"},{"date":"2026-03-25","ts":1774502751000,"hash":"5d79ca10","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add dispatcher routing tests (13 tests) + army chat wiring instructions for Unity"},{"date":"2026-03-25","ts":1774502576000,"hash":"b217cbe9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add army integration tests: fear/bravery, aggression/defense balance, squad behavior, multi-army combat, edge cases"},{"date":"2026-03-25","ts":1774502102000,"hash":"071b3f20","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add army behavior tree unit tests: 15 tests covering all command scenarios"},{"date":"2026-03-25","ts":1774501938000,"hash":"d9ca24be","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix guard_position ignored: move agenda checks before combat approach, add audit logging"},{"date":"2026-03-25","ts":1774501436000,"hash":"d5e8bf1d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix commands not reaching NPC brains: sync in-memory state on command/dispatch"},{"date":"2026-03-25","ts":1774500993000,"hash":"1ad409c7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove hardcoded ring formation — let separation force + future Grok commands handle positioning"},{"date":"2026-03-25","ts":1774500831000,"hash":"65d1eba9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix NPC clumping: unit separation force, offset follow positions, wider spawn spread"},{"date":"2026-03-25","ts":1774500616000,"hash":"e49efaa1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix NPC movement speed: 0.08→2.5 run, 0.04→1.25 walk per 500ms tick"},{"date":"2026-03-25","ts":1774499429000,"hash":"d9364af8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Army chat: split into fast dispatch + async WebSocket responses"},{"date":"2026-03-25","ts":1774498043000,"hash":"1a80eb9d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Army chat: return responder + listener ID lists so client shows thinking bubbles only on responders"},{"date":"2026-03-25","ts":1774497413000,"hash":"18aa48ff","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Army: sequential squad filling + XP-based auto-promotion"},{"date":"2026-03-25","ts":1774496269000,"hash":"64ac46a2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Army system backend: hierarchy, chat dispatcher, commands, promote, reassign"},{"date":"2026-03-25","ts":1774496057000,"hash":"e4142f2d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Army system: hierarchy, chat dispatcher, commands, reassign, promote, auto-assign on recruit"},{"date":"2026-03-25","ts":1774495743000,"hash":"8116f3c9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add army system client instructions: hierarchy, chat routing, overview panel, formations"},{"date":"2026-03-25","ts":1774494107000,"hash":"c94d6316","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix NPCs panicking in peaceful areas: filter allies from enemy list, tune Grok prompt"},{"date":"2026-03-25","ts":1774493594000,"hash":"91cc1a9b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add POST /api/v1/recruits/:id/chat — talk to recruits via Grok"},{"date":"2026-03-25","ts":1774493247000,"hash":"7e7e820b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix friendly fire: NPCs skip allies with same commander_id when finding enemies"},{"date":"2026-03-25","ts":1774492872000,"hash":"459cbafd","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Game world: full AI companion system with behavior tree, Grok brain, NPC engine"},{"date":"2026-03-25","ts":1774491250000,"hash":"5771d659","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"AI companion system: personality traits, disposition, behavior weights, Grok brain, behavior tree, recruit instructions/commands API"},{"date":"2026-03-25","ts":1774489483000,"hash":"da8e627c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix shop seed: recruiter only stocks recruits, not weapons/shields"},{"date":"2026-03-25","ts":1774489285000,"hash":"1dbaab01","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix equip swap: use sequential transaction to avoid unique constraint violation"},{"date":"2026-03-25","ts":1774488612000,"hash":"b6f2deca","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add recruit system: NPC characters, recruit purchase, recruit API endpoints, 7 recruit types"},{"date":"2026-03-25","ts":1774487641000,"hash":"1f857179","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add shop system: shop/stock/transaction tables, buy action, seed endpoint with 3 shops"},{"date":"2026-03-25","ts":1774483508000,"hash":"1429656e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add raw WebSocket /game-sync endpoint for position sync and combat"},{"date":"2026-03-25","ts":1774481988000,"hash":"a2b1ced8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add persistent volumes for game-releases and plugin-releases, expose port 8080"},{"date":"2026-03-25","ts":1774478467000,"hash":"7f8e598a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Game patcher: update API with downloadUrl, nginx static serving, deploy-game.sh script"},{"date":"2026-03-25","ts":1774477899000,"hash":"a506221e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add game update API: version check, download, admin upload (500MB limit)"},{"date":"2026-03-25","ts":1774472026000,"hash":"1ea88768","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add initRoom debug logging for chat connection flow"},{"date":"2026-03-25","ts":1774471229000,"hash":"31893b5b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"GameWorld: add disconnect reason logging for debugging"},{"date":"2026-03-25","ts":1774470498000,"hash":"87ced3e7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add leveling system: level_definition table, XP-based leveling action, levels API, add-xp test endpoint"},{"date":"2026-03-25","ts":1774470150000,"hash":"5b3abac2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"GameWorld: auto-add players to global-game chat room on game:join"},{"date":"2026-03-25","ts":1774424313000,"hash":"1c5db10f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add inventory & items system: item_definition, inventory_item tables, CRUD API, equip/unequip/move, seed endpoint, starter items on character creation"},{"date":"2026-03-25","ts":1774422329000,"hash":"9467a2d4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add real-time game world: player_character table, character CRUD API, Socket.IO /game namespace with server-authoritative PvP combat"},{"date":"2026-03-24","ts":1774415707000,"hash":"8529aa08","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Security: redact IPs/credentials from tracked files, add README"},{"date":"2026-03-24","ts":1774401408000,"hash":"3ccec786","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing page: remove Voice API product (we don't offer that)"},{"date":"2026-03-24","ts":1774401153000,"hash":"a8d6b7f8","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing page: add ElevenVoiceReader Chrome extension, adjust product grid to 4 columns"},{"date":"2026-03-24","ts":1774342968000,"hash":"448aaba0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix Boom.serverUnavailable typo"},{"date":"2026-03-24","ts":1774342862000,"hash":"8dafd8a2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Switch fight simulation from Claude to Grok API"},{"date":"2026-03-24","ts":1774342155000,"hash":"900748a1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add error handling for fight simulation - graceful API credit errors"},{"date":"2026-03-24","ts":1774342003000,"hash":"958145b8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add error logging to fight simulation endpoint"},{"date":"2026-03-24","ts":1774341766000,"hash":"bd5b95c0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix RequestQuery type cast in leaderboard endpoint"},{"date":"2026-03-24","ts":1774341688000,"hash":"1a6d7826","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix Prisma JSON type compatibility in gladiator and fight data modules"},{"date":"2026-03-24","ts":1774341452000,"hash":"c1be3437","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add AI Fight Club: gladiator system, fight simulation, memories, leaderboard"},{"date":"2026-03-23","ts":1774335475000,"hash":"13b6c91f","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Landing page: update FFXIVoices to live with accurate description, fix credit count, add ElevenLabs to tech stack"},{"date":"2026-03-23","ts":1774335102000,"hash":"dac580f3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add untracked files: migrations, payment/credits routes, rate limiter, CI workflows"},{"date":"2026-03-23","ts":1774329557000,"hash":"c9b4961c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Security: atomic credit deduction (no negative balance), rate limit TTS endpoint, verify Stripe webhook amounts, WS rate limiting, remove dev JWT fallback"},{"date":"2026-03-23","ts":1774318599000,"hash":"2d318d2e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: accept gender field in register/login, set default voice by gender (Ash for female, George for male)"},{"date":"2026-03-23","ts":1774318267000,"hash":"d89aff98","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Logo/title click navigates to /landing instead of /chat"},{"date":"2026-03-23","ts":1774316553000,"hash":"624be07d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add optional email to registration, require email before credit purchase, show email prompt on credits page"},{"date":"2026-03-23","ts":1774315323000,"hash":"3ec1c26c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Credits page: add usage log tab with service labels, log FFXIVoices TTS usage to credit_usage_log"},{"date":"2026-03-23","ts":1774314348000,"hash":"2978432d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix auth redirect: preserve returnUrl when redirecting to login (e.g. /credits)"},{"date":"2026-03-23","ts":1774313482000,"hash":"9c29c975","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Unify FFXIVoices auth with CommsLink: shared user table, shared credits, ffxiv_profile for FFXIV settings, new credit packs (10K/$6, 25K/$10, 50K/$18), 1K monthly free credits"},{"date":"2026-03-23","ts":1774311761000,"hash":"9e127721","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: add next_free_credits ISO date to /me endpoint"},{"date":"2026-03-23","ts":1774311578000,"hash":"237f4d95","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: rename ElevenLabs voices from (Premium) to (Donor)"},{"date":"2026-03-23","ts":1774310711000,"hash":"9f3f3842","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: restructure credit system - 10K free credits, monthly refresh, Polly 1cr/msg, ElevenLabs 18cr/50chars, /me endpoint"},{"date":"2026-03-23","ts":1774309508000,"hash":"43ba93fb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: use MP3 for ElevenLabs (PCM requires Pro tier), send format to plugin"},{"date":"2026-03-23","ts":1774306474000,"hash":"ea080524","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: add ElevenLabs diagnostic logging to debug silence"},{"date":"2026-03-23","ts":1774306242000,"hash":"a185121d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: fix ElevenLabs TTS - use PCM query param instead of JSON body, revert to WAV-only output"},{"date":"2026-03-23","ts":1774305683000,"hash":"3ffaf27c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix ElevenLabs: downsample 44100Hz PCM to 16000Hz to match plugin's hardcoded sample rate"},{"date":"2026-03-23","ts":1774305409000,"hash":"b4d80aa6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix ElevenLabs: use pcm_24000 (signed 16-bit LE) which is the standard ElevenLabs PCM format"},{"date":"2026-03-23","ts":1774301729000,"hash":"0fa4da3a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix ElevenLabs static: switch from pcm_44100 to pcm_16000 to match Polly output format"},{"date":"2026-03-23","ts":1774301401000,"hash":"2309ab90","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: add 20 ElevenLabs premium voices alongside Polly, route TTS by el: prefix, 3x credit cost for premium"},{"date":"2026-03-23","ts":1774298894000,"hash":"62fe1c3f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: plugin update system — version check, download, admin upload with SHA-256 verification"},{"date":"2026-03-23","ts":1774295907000,"hash":"8092cad1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices WS: add hearAll/muted/heard selective hearing filters"},{"date":"2026-03-23","ts":1774294836000,"hash":"226ed924","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices WS: support settings message to update hearSelf without reconnecting"},{"date":"2026-03-23","ts":1774293215000,"hash":"e208332c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"FFXIVoices: dedup chat messages — prevent double TTS when multiple clients send same text"},{"date":"2026-03-23","ts":1774292642000,"hash":"563c391a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: add debug logging for TTS and broadcast to diagnose double audio"},{"date":"2026-03-23","ts":1774291395000,"hash":"594fd988","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices WS: support hearSelf flag in auth handshake, send audio back to sender when enabled"},{"date":"2026-03-23","ts":1774268436000,"hash":"25b893ba","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: switch from email to username auth"},{"date":"2026-03-23","ts":1774265419000,"hash":"2f475562","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"FFXIVoices: switch TTS from ElevenLabs to Polly (PCM→WAV), default voice Joanna"},{"date":"2026-03-23","ts":1774264824000,"hash":"06fa55c3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix FFXIV auth header type: handle string|string[]"},{"date":"2026-03-23","ts":1774264549000,"hash":"d93125ac","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"FFXIVoices API: auth, chat/TTS, WebSocket audio broadcast, ElevenLabs adapter, proximity filtering"},{"date":"2026-03-23","ts":1774260803000,"hash":"b8434da3","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Company landing page: portfolio of products (Chat, FFXIVoices, Voice API), tech stack, stats"},{"date":"2026-03-23","ts":1774258465000,"hash":"044f9072","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Strip leaked [/add_memory] and other bracket-format closing tags"},{"date":"2026-03-23","ts":1774256180000,"hash":"aab1183f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Strip leaked tags: xai:function_call XML, orphaned /say /text, unmatched command braces"},{"date":"2026-03-23","ts":1774255736000,"hash":"ef895f93","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Reduce thinking filler trigger from 3s to 2s"},{"date":"2026-03-23","ts":1774255423000,"hash":"4e074bed","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Thinking filler: grok-3-mini picks contextual phrase, spoken via Polly TTS"},{"date":"2026-03-23","ts":1774255224000,"hash":"0d3f6c96","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Make logo + CommsLink title clickable, navigates to /chat"},{"date":"2026-03-23","ts":1774254868000,"hash":"9f322506","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add thinking filler message if AI takes >3s to respond"},{"date":"2026-03-23","ts":1774254560000,"hash":"c37d5f33","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix think leak: strip all malformed think tag variants ([/think>, mixed brackets, etc)"},{"date":"2026-03-23","ts":1774252593000,"hash":"2057e274","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Slow thinking pulse to 0.5Hz — one gentle pulse every 2 seconds"},{"date":"2026-03-23","ts":1774252327000,"hash":"43058032","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Thinking sound: ethereal detuned hum with tremolo — mystical crystal resonance"},{"date":"2026-03-23","ts":1774251943000,"hash":"6918a66c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Thinking sound: layered whisper effect — breathy base + sibilance + air, organic irregular rhythm"},{"date":"2026-03-23","ts":1774251503000,"hash":"9ef97260","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Mobile: terminal panel stacks above chat in top 1/3, hide resize handle"},{"date":"2026-03-23","ts":1774251147000,"hash":"c7c93f0e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix: keep Claude Code responses in agent context (was filtering all [Claude *] messages)"},{"date":"2026-03-23","ts":1774250781000,"hash":"9efe5d9e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Replace thinking sound: soft filtered noise pulse instead of harsh sine beep"},{"date":"2026-03-23","ts":1774249642000,"hash":"7f995a18","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Terms of Service, live stats on landing, Google Search Console verification, footer links"},{"date":"2026-03-22","ts":1774248020000,"hash":"a278aa9f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add privacy policy page + link on registration, covers all services and liability"},{"date":"2026-03-22","ts":1774247677000,"hash":"ccb80ca0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add + create room button to sidebar on all pages, navigates to chat with create dialog"},{"date":"2026-03-22","ts":1774247238000,"hash":"29117c40","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Show room icons in sidebar on all pages (credits, profile, etc), not just chat"},{"date":"2026-03-22","ts":1774246738000,"hash":"0c416249","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove Chat tab from sidebar — show room icons directly, cleaner layout"},{"date":"2026-03-22","ts":1774246349000,"hash":"bb4fc3e5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix credits page: center content, hide offline indicator on non-chat pages"},{"date":"2026-03-22","ts":1774246094000,"hash":"f26fe36f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Deploy new credits page (replace old ElevenLabs version)"},{"date":"2026-03-22","ts":1774245690000,"hash":"0593c6c3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add credits page: balance display, buy packs via Stripe, transaction history, clickable balance in header"},{"date":"2026-03-22","ts":1774244527000,"hash":"e42230af","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix think-only: if AI only thinks and doesn't speak, retry with nudge to respond"},{"date":"2026-03-22","ts":1774244107000,"hash":"2ecb2530","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix CreateAgentDTO: add plan, tasks fields"},{"date":"2026-03-22","ts":1774243791000,"hash":"5f7d2f42","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add max tokens slider to agent create/edit, default 2500"},{"date":"2026-03-22","ts":1774243473000,"hash":"185e7189","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add max tokens slider to agent create/edit, default 2500, range 500-8000"},{"date":"2026-03-22","ts":1774242164000,"hash":"227acda0","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Auto-fill agent name from template on selection"},{"date":"2026-03-22","ts":1774241518000,"hash":"3196e183","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Default ON: memory, think, intent coherence, memory coherence for new rooms"},{"date":"2026-03-22","ts":1774240536000,"hash":"cdc07b1b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix dedup: raise threshold to 0.8, shorten window to 5min — stops blocking normal responses. Louder thinking sound"},{"date":"2026-03-22","ts":1774240084000,"hash":"e7f3e46d","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Add thinking sound + typing indicator"},{"date":"2026-03-22","ts":1774239816000,"hash":"b2566986","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add thinking sound (gentle pulse) and improved typing indicator while AI generates response"},{"date":"2026-03-22","ts":1774239357000,"hash":"1eb0f25d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Voice debounce: 3s delay before AI responds to voice, waits for user to finish speaking"},{"date":"2026-03-22","ts":1774238593000,"hash":"3c72232d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix: STT messages now trigger AI agent responses (mention detection + alone-in-room)"},{"date":"2026-03-22","ts":1774238178000,"hash":"53d9d170","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix: say/text always available even when think is OFF — agents must always be able to speak"},{"date":"2026-03-22","ts":1774237765000,"hash":"b27c33c4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Styled Add/Edit Agent dialogs: dark gradient, template cards grid, teal accents, mobile fullscreen"},{"date":"2026-03-22","ts":1774237350000,"hash":"9cba75a4","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"20 agent templates, increase agent limit to 5 per room"},{"date":"2026-03-22","ts":1774235497000,"hash":"1cb4f655","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix voice selector gap: remove minWidth, disable autoWidth"},{"date":"2026-03-22","ts":1774235208000,"hash":"6aa1523b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix voice on load: fetch fresh voice_id from DB, don't trust stale session cookie"},{"date":"2026-03-22","ts":1774234896000,"hash":"2b0699fd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix: accept any voice_id in profile update, remove old browser/premium validation"},{"date":"2026-03-22","ts":1774234702000,"hash":"6797ade3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix voice: read user voice_id from DB on each transcript, not just session start"},{"date":"2026-03-22","ts":1774234292000,"hash":"76221d07","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Voice: server handles everything — broadcast message + TTS directly from transcript callback, no client round-trip"},{"date":"2026-03-22","ts":1774233200000,"hash":"2a4423f9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix voice: emit directly in onTranscript callback, bypass sendMessage stale closure"},{"date":"2026-03-22","ts":1774232707000,"hash":"bf74255d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Don't pause voiceCapture during audio playback — echo filter handles it, pausing kills the stream"},{"date":"2026-03-22","ts":1774232304000,"hash":"40162ebc","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix Transcribe stream dying: send silence to keep connection alive between speech"},{"date":"2026-03-22","ts":1774231819000,"hash":"731fc5e3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix voice default: fallback old browser voices to Joanna in preferences context"},{"date":"2026-03-22","ts":1774231347000,"hash":"e2a6e6bc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Voice selector: show short name in toolbar, full name in dropdown, min 70px width"},{"date":"2026-03-22","ts":1774231100000,"hash":"ec4f0a51","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix TTS: fallback invalid voice IDs to Joanna, updated all users/agents in DB"},{"date":"2026-03-22","ts":1774230826000,"hash":"a9437007","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix TS2345: non-null assert on data.voice"},{"date":"2026-03-22","ts":1774230627000,"hash":"a6445c18","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Server-side TTS for user messages, fix duplicate transcripts, remove client TTS calls"},{"date":"2026-03-22","ts":1774230215000,"hash":"dda83b2a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix duplicate text, add TTS debug logging, deduplicate transcripts"},{"date":"2026-03-22","ts":1774229800000,"hash":"c57b2f8e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix: 5s flush for long speech, increase TTS text limit to 5000, mobile voice selector sizing"},{"date":"2026-03-22","ts":1774229139000,"hash":"f35de46f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Real-time voice: text sent immediately, TTS generated in background, chat_audio broadcast"},{"date":"2026-03-22","ts":1774228569000,"hash":"5b361be7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Skip TTS generation for voice-captured messages — user already spoke them"},{"date":"2026-03-22","ts":1774228187000,"hash":"1cb07ee2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Real-time STT: streaming Transcribe session, transcripts arrive as you speak"},{"date":"2026-03-22","ts":1774227432000,"hash":"3bf1f06a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"STT debug logging: chunk sizes, total bytes, transcript output"},{"date":"2026-03-22","ts":1774226404000,"hash":"d67b981f","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Voice mic: show errors as toast, fall back to Web Speech API on failure"},{"date":"2026-03-22","ts":1774225501000,"hash":"7925b71e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Voice capture: raw PCM via Web Audio API instead of MediaRecorder webm, 16kHz downsampled"},{"date":"2026-03-22","ts":1774225214000,"hash":"dcb4a24c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix Transcribe: type casts, ogg-opus encoding, 48kHz sample rate for webm audio"},{"date":"2026-03-22","ts":1774224901000,"hash":"ce233ec7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix double message: voiceCapture takes priority over voiceStream, remove duplicate path"},{"date":"2026-03-22","ts":1774224330000,"hash":"5bb99053","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix Comprehend LanguageCode type cast"},{"date":"2026-03-22","ts":1774224000000,"hash":"00452f7b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Voice pipeline: MediaRecorder STT (no beeps), Amazon Transcribe, Comprehend sentiment, emotion-aware Polly TTS"},{"date":"2026-03-22","ts":1774222657000,"hash":"a15e06f3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix mic beeping: only restart after recent speech, stop silently after 30s of silence"},{"date":"2026-03-22","ts":1774222232000,"hash":"cec569db","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add Clear My Data: deletes content but keeps account and financial records"},{"date":"2026-03-22","ts":1774221882000,"hash":"20db211b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add Claude Opus 4 to available models"},{"date":"2026-03-22","ts":1774221642000,"hash":"ef24c9f2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix x-forwarded-for type in profile route"},{"date":"2026-03-22","ts":1774221547000,"hash":"b7046e9a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix deleteAccount: correct field names for claude_log and panel_log"},{"date":"2026-03-22","ts":1774221319000,"hash":"93249b75","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Profile: clickable username, delete account with audit log, signup IP logging"},{"date":"2026-03-22","ts":1774220611000,"hash":"5d8ebe65","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add credit balance to header next to connection status"},{"date":"2026-03-22","ts":1774219242000,"hash":"7ea47f4e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add Claude API, fix voice echo (pause mic during AI playback), increase restart delay"},{"date":"2026-03-22","ts":1774218036000,"hash":"10d3c74d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add Android download button on desktop with mobile app setup popup"},{"date":"2026-03-22","ts":1774217804000,"hash":"a7862564","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Terminal onboarding: context-aware for native app, mobile browser, and desktop"},{"date":"2026-03-22","ts":1774217308000,"hash":"c7f1a096","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":null,"title":"Fix TypeScript cast for native terminal agent check"},{"date":"2026-03-22","ts":1774217099000,"hash":"20da8548","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Terminal panel: Share This Phone button for native app, mobile agent toggle"},{"date":"2026-03-22","ts":1774216191000,"hash":"d71f9408","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Terminal panel: creator-only downloads and input, informational view for non-creators"},{"date":"2026-03-22","ts":1774215619000,"hash":"2e2a503c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Terminal onboarding: download buttons in empty state, localStorage persistence, auto-open for new rooms"},{"date":"2026-03-22","ts":1774214905000,"hash":"615e9855","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Make all X close buttons red and bigger (22px) across all panels"},{"date":"2026-03-22","ts":1774214639000,"hash":"13ae4be3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix room settings dialog: add safe area top padding on mobile"},{"date":"2026-03-22","ts":1774214274000,"hash":"3e03dc72","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Room settings: reorder sections, collapsible AI Commands, members and invite at top"},{"date":"2026-03-22","ts":1774213535000,"hash":"7ec7ee45","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix syntax error in room settings styling"},{"date":"2026-03-22","ts":1774213200000,"hash":"b50789c8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Room settings: teal gradient theme, glowing borders, compact layout, styled sections"},{"date":"2026-03-22","ts":1774212790000,"hash":"91b8bb38","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Room settings: fullscreen on mobile, responsive grids, close button, tighter spacing"},{"date":"2026-03-22","ts":1774211516000,"hash":"fe9747d6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Move 'hear my own voice' to room settings, remove settings gear icon and panel"},{"date":"2026-03-22","ts":1774210215000,"hash":"ce74dfe1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"YouTube-style volume slider, remove stop audio button"},{"date":"2026-03-22","ts":1774210004000,"hash":"53aa9061","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add tiny volume slider in chat input toolbar next to voice selector"},{"date":"2026-03-22","ts":1774209766000,"hash":"17a893cf","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add voice selector dropdown in chat input toolbar next to mic button"},{"date":"2026-03-22","ts":1774209300000,"hash":"434891e2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix invite link: switch room immediately on connect instead of unreliable timeout"},{"date":"2026-03-22","ts":1774208872000,"hash":"930c4001","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Default voice to Joanna when none selected"},{"date":"2026-03-22","ts":1774184482000,"hash":"787ef620","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add echo cancellation: filter mic input that matches recent AI speech output"},{"date":"2026-03-22","ts":1774184105000,"hash":"55bf4e6f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix speech recognition: reduce restart noise, keep session alive longer"},{"date":"2026-03-22","ts":1774183810000,"hash":"e35e2d0f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix speech recognition: reduce restart noise, use interimResults to keep session alive longer"},{"date":"2026-03-22","ts":1774180879000,"hash":"590be084","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove browser voices from Room Settings agent voice dropdown"},{"date":"2026-03-22","ts":1774180341000,"hash":"56b39654","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove browser voices entirely, Polly only"},{"date":"2026-03-22","ts":1774179721000,"hash":"43d110f2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix Polly: list all voices (not just neural), auto-pick best engine per voice"},{"date":"2026-03-22","ts":1774178835000,"hash":"86693889","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix: rename ELEVENLABS_COST_PER_CHAR export to POLLY_COST_PER_CHAR"},{"date":"2026-03-22","ts":1774178751000,"hash":"cd3c29ef","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix Polly VoiceId type cast"},{"date":"2026-03-22","ts":1774178674000,"hash":"63a43f02","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix: include Polly adapter in deploy"},{"date":"2026-03-22","ts":1774178392000,"hash":"90b14c1a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Replace ElevenLabs with Amazon Polly TTS — 75x cheaper, same AWS region"},{"date":"2026-03-22","ts":1774176165000,"hash":"80c93fa2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix settings panel mobile: position fixed with left/right anchoring to fill screen"},{"date":"2026-03-22","ts":1774175744000,"hash":"2d8fd34d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Shrink settings panel width from 280px to 220px"},{"date":"2026-03-22","ts":1774174794000,"hash":"347416a9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove alarm button, fix settings panel mobile overlay with safe area"},{"date":"2026-03-22","ts":1774174260000,"hash":"4899e6ca","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Mobile safe area: status bar padding, correct chat height, viewport-fit cover"},{"date":"2026-03-22","ts":1774169834000,"hash":"33052399","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Make website mobile-responsive: compact header, responsive activity bar, fullscreen panels on mobile, hide format toolbar"},{"date":"2026-03-21","ts":1774159300000,"hash":"611eb553","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Add SEO: meta tags, OG image, robots.txt, sitemap.xml, landing page metadata"},{"date":"2026-03-21","ts":1774146544000,"hash":"49a95571","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Add landing page for new visitors"},{"date":"2026-03-21","ts":1774143452000,"hash":"a5cc224a","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Add landing page with CTA, update register features, redirect home to landing"},{"date":"2026-03-21","ts":1774138482000,"hash":"6e7ed618","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix header layout: push connection status, username, profile, logout to right side"},{"date":"2026-03-21","ts":1774138382000,"hash":"5777a6ca","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Restore credit and payment API routes for monetization"},{"date":"2026-03-21","ts":1774136794000,"hash":"38e747c7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove web browser, watch party, watchlist, screen share, scheduled jobs, daily stats, about page"},{"date":"2026-03-21","ts":1774132823000,"hash":"28c4f131","repo":"commslink2","author":"puppyprogrammer","project":"forum","label":"Forum","version":null,"title":"Remove entire forum system: pages, panel, routes, actions, data layer, AI commands"},{"date":"2026-03-21","ts":1774131574000,"hash":"299bf4ca","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add close button to settings panel"},{"date":"2026-03-21","ts":1774131126000,"hash":"8cbaa55d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove cost calculator display, spending bar, credits page, and payment routes from UI"},{"date":"2026-03-21","ts":1774130595000,"hash":"e381798c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Default off: intent/memory coherence, think, effort, tokens, audit, extended thinking"},{"date":"2026-03-21","ts":1774126976000,"hash":"f20698d5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add toggleable Intent Coherence and Memory Coherence settings in room settings"},{"date":"2026-03-21","ts":1774121821000,"hash":"47d25b0d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove entire hologram system"},{"date":"2026-03-15","ts":1773622683000,"hash":"519596cd","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Credits page: line graph for Grok + ElevenLabs usage by day"},{"date":"2026-03-15","ts":1773622240000,"hash":"1f86fafe","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Redesign credits page with usage graph, time range filter, service breakdown"},{"date":"2026-03-15","ts":1773620152000,"hash":"5076ad5b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add Room AI Controls: create/delete/update agents via Helper Bot"},{"date":"2026-03-15","ts":1773618697000,"hash":"552640d8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Auto-create default hologram avatar for new AI agents"},{"date":"2026-03-15","ts":1773618298000,"hash":"963852c3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Set Helper Bot voice to Ash - Conversation (ElevenLabs)"},{"date":"2026-03-15","ts":1773618041000,"hash":"8e72e874","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Auto-trigger AI when user is alone in room with one agent"},{"date":"2026-03-15","ts":1773617697000,"hash":"5b67e2a7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Auto-reload when room is deleted, notify all users"},{"date":"2026-03-15","ts":1773617397000,"hash":"bd189d10","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Auto-create Helper Bot in every new room with welcome message"},{"date":"2026-03-15","ts":1773616507000,"hash":"a266b338","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Redesign room creation dialog + signup page for engagement"},{"date":"2026-03-15","ts":1773608939000,"hash":"a848a0e6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Security fixes: rate limiting, invite-only rooms, SQL hardening, socket admin refresh"},{"date":"2026-03-15","ts":1773607281000,"hash":"c9efd2d7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix TS error in voice stream start"},{"date":"2026-03-15","ts":1773606869000,"hash":"c75cf1a0","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove premium feature: credit-only access model"},{"date":"2026-03-15","ts":1773603364000,"hash":"821e609a","repo":"commslink2","author":"puppyprogrammer","project":"markets","label":"CommsLink Markets","version":null,"title":"Apply glowing cyan logo to dashboard header and login/register pages"},{"date":"2026-03-15","ts":1773603121000,"hash":"d609e0d8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix no_rooms: show create room dialog instead of redirecting to about"},{"date":"2026-03-15","ts":1773601145000,"hash":"8c93d75c","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix Create a Room: always visible, redirects to login if not signed in"},{"date":"2026-03-15","ts":1773571504000,"hash":"f3884ee3","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix login redirect param: returnUrl instead of redirect"},{"date":"2026-03-15","ts":1773570356000,"hash":"dcce8178","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add glowing logo animation on about page"},{"date":"2026-03-15","ts":1773570234000,"hash":"a64bb3cf","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix Create a Room button on about page"},{"date":"2026-03-15","ts":1773570050000,"hash":"974b6276","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Move pose/edit panels to right side, make mutually exclusive"},{"date":"2026-03-15","ts":1773568799000,"hash":"4b27eafb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add Animation Maker MVP: keyframes, timeline, playback, easing"},{"date":"2026-03-15","ts":1773567926000,"hash":"64d0b6d9","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Highlight selected part purple in particle editor"},{"date":"2026-03-15","ts":1773567055000,"hash":"c2cf8f21","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add particle editor: part selector, add particles inside sphere"},{"date":"2026-03-15","ts":1773566778000,"hash":"bf89dcad","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS: cast preset pose types, joint pivot offsets, preset poses"},{"date":"2026-03-15","ts":1773566674000,"hash":"5a5587b1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix joint offsets: move particles relative to joint, not FK chain"},{"date":"2026-03-15","ts":1773566561000,"hash":"f135166e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add preset poses: T-Pose, A-Pose, Idle, Wave, Hip, Sit, Walk, Dance"},{"date":"2026-03-15","ts":1773566227000,"hash":"5b19e6a5","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix pose reset: clone effectivePose before merging angles"},{"date":"2026-03-15","ts":1773566093000,"hash":"cc6b4eb1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Persist hologram panel open state to localStorage"},{"date":"2026-03-15","ts":1773565913000,"hash":"67456744","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add pose controller with joint rotations, redraw silhouette button"},{"date":"2026-03-15","ts":1773565594000,"hash":"e0f6bb34","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add joint position editor with X/Y offsets for all 17 joints"},{"date":"2026-03-15","ts":1773565349000,"hash":"939ca296","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Wire all debug toggles: bones, joints, debug colors, silhouette, grid"},{"date":"2026-03-15","ts":1773564587000,"hash":"69cfe801","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Wire debug toggles: silhouette, grid, organ colors"},{"date":"2026-03-15","ts":1773564414000,"hash":"8e764911","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add organs, anatomy section, debug organ colors"},{"date":"2026-03-15","ts":1773563788000,"hash":"dfcb6f03","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add bust/nipple controls: projection, spacing, drop, offsets, density"},{"date":"2026-03-15","ts":1773563651000,"hash":"195edc8a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add ear editing: spacing, size, X/Y/Z offset, density"},{"date":"2026-03-15","ts":1773563415000,"hash":"d634452a","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add upper torso/waist/hip Y offset and height sliders"},{"date":"2026-03-15","ts":1773563283000,"hash":"5205d2fc","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add particle editor: selection sphere, delete inside, undo"},{"date":"2026-03-15","ts":1773562795000,"hash":"85f2bb0c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix Kara not speaking: treat leftover text as speech when {say} is forgotten"},{"date":"2026-03-15","ts":1773562574000,"hash":"9a48b486","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix lip sync detection for new mouth Y positions"},{"date":"2026-03-15","ts":1773562296000,"hash":"6b0c31d6","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add Z offsets, hip controls, part densities, comprehensive controls"},{"date":"2026-03-15","ts":1773561406000,"hash":"e503fc1e","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add calf X offset, fix stray bifurcation particles"},{"date":"2026-03-15","ts":1773561220000,"hash":"b0b4bb02","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Widen all slider ranges to 5x, revert to simple direct values"},{"date":"2026-03-15","ts":1773560543000,"hash":"01e62464","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Cumulative save: Save All bakes values into base, sliders reset to center"},{"date":"2026-03-15","ts":1773560163000,"hash":"56263383","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add calf Y offset slider"},{"date":"2026-03-15","ts":1773559579000,"hash":"806a882d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add X/Y offset sliders for all body parts"},{"date":"2026-03-15","ts":1773559144000,"hash":"61f0e2d2","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Wire all settings sliders to renderer - comprehensive proportion system"},{"date":"2026-03-15","ts":1773558540000,"hash":"09b453da","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add comprehensive hologram settings panel with 12 collapsible sections"},{"date":"2026-03-14","ts":1773557332000,"hash":"9dda9f47","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix body proportions: mark morph states dirty on slider change"},{"date":"2026-03-14","ts":1773557064000,"hash":"49e4a925","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add body proportions section to hologram settings panel"},{"date":"2026-03-14","ts":1773555842000,"hash":"4b9b9260","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix TS error in settings panel"},{"date":"2026-03-14","ts":1773555725000,"hash":"93d7466c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add hologram settings panel with real-time sliders"},{"date":"2026-03-14","ts":1773555282000,"hash":"bb309ceb","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Double particle brightness: color 1.8x, alpha 0.75"},{"date":"2026-03-14","ts":1773554882000,"hash":"f1b193ef","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Clean silhouette: smoothed convex hull per Y-slice, single closed loop"},{"date":"2026-03-14","ts":1773554535000,"hash":"51f13fba","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix silhouette: trace per-body-part edges, proper arm/torso/leg routing"},{"date":"2026-03-14","ts":1773554098000,"hash":"1df69cb4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix silhouette to closed loop around full body outline"},{"date":"2026-03-14","ts":1773553474000,"hash":"8f41848b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add debug silhouette outline toggle with O key"},{"date":"2026-03-14","ts":1773553097000,"hash":"91a29038","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Increase particle brightness by 50%"},{"date":"2026-03-14","ts":1773552894000,"hash":"3dd229ce","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Disable aura glow plane behind hologram"},{"date":"2026-03-14","ts":1773552722000,"hash":"5cf39c8a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Hide bone lines and joint markers inside hologram"},{"date":"2026-03-14","ts":1773550586000,"hash":"ee8a24a4","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add silhouette contour lines, dim particles"},{"date":"2026-03-14","ts":1773549925000,"hash":"8ce9039f","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Dim particles: size 0.12, alpha 0.25, color 0.6x"},{"date":"2026-03-14","ts":1773548826000,"hash":"96fcfa24","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove depth dimming, double particle size for visibility"},{"date":"2026-03-14","ts":1773548641000,"hash":"be2d32e1","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Halve particles, add per-particle gradient glow, remove oversized halo"},{"date":"2026-03-14","ts":1773548054000,"hash":"c89c2e72","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Reduce glow halo from 2.5x to 1.5x for even brightness"},{"date":"2026-03-14","ts":1773539064000,"hash":"74978ab7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add free-roam WASD + mouse look camera controls to hologram viewer"},{"date":"2026-03-14","ts":1773535608000,"hash":"207478f9","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Disable hologram hair system - remove ponytail causing internal glow"},{"date":"2026-03-14","ts":1773525363000,"hash":"9426dc27","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Slim hologram body: compressed torso, narrower hips/waist, updated camera"},{"date":"2026-03-14","ts":1773523634000,"hash":"0c38078d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix hologram points JSON parsing - parse stringified JSON fields before emitting to frontend"},{"date":"2026-03-14","ts":1773522392000,"hash":"7f08dfcf","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"New hologram body: 2.0-unit height, spec-accurate proportions (29k particles), updated camera/grid"},{"date":"2026-03-14","ts":1773521297000,"hash":"d649afe8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Increase agent message history 50→100 for better context awareness"},{"date":"2026-03-14","ts":1773521128000,"hash":"79f4004a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Keep subconscious messages in agent history (agent should read its own coherence feedback), remove Security Bot filter"},{"date":"2026-03-14","ts":1773520936000,"hash":"c8252f79","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix Kara ignoring user messages: expand history 20→50, filter noise (SQL/Claude/Memory/SecurityBot/Subconscious), add CRITICAL user-priority autopilot rule"},{"date":"2026-03-14","ts":1773520338000,"hash":"9b633c3a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix missing commands in ALL_COMMAND_REGEX (toggle_debug, set_pose, avatar, look, ui); add look to hasDataCommands"},{"date":"2026-03-14","ts":1773519545000,"hash":"bfb57be1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Holo debug v2: 10-group debug colors (D key + window.__hologramDebug), default test avatar on empty panel"},{"date":"2026-03-14","ts":1773518590000,"hash":"3b66b29d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Remove hologram debug toggle (D key, {holo_debug} command, debug colors)"},{"date":"2026-03-14","ts":1773517485000,"hash":"10aeb393","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add {holo_debug on|off|toggle} chat command (selfmodOn gated, socket to HologramViewer debugModeRef)"},{"date":"2026-03-14","ts":1773516672000,"hash":"13a3b45b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Realistic skeleton proportions: shorten torso 31%, neck 33%, legs 50% height, debug colors; skip eslint in web build"},{"date":"2026-03-14","ts":1773516475000,"hash":"947af244","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Realistic skeleton proportions: shorten torso 31%, neck 33%, legs 50% height, debug colors per joint group"},{"date":"2026-03-14","ts":1773515644000,"hash":"041e5427","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Allow AI agents to self-activate autopilot via dormant check-in timer"},{"date":"2026-03-14","ts":1773478487000,"hash":"ec38e496","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Elliptical legs, hip bifurcation zone, Perlin noise displacement, exaggerated waist"},{"date":"2026-03-14","ts":1773478123000,"hash":"cdb5fc39","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Smooth continuous body: Catmull-Rom spline interpolation, connected limbs, soft bust falloff"},{"date":"2026-03-14","ts":1773477891000,"hash":"20ec31b7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add viseme mapper helper"},{"date":"2026-03-14","ts":1773476791000,"hash":"cc5fa737","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Rewrite hologram body: cross-section proportions, 14k particles, anatomically correct"},{"date":"2026-03-14","ts":1773475293000,"hash":"f9617ea7","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove scalp dots from body model, boost hair particle visibility"},{"date":"2026-03-14","ts":1773474936000,"hash":"74498132","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Stop hologram spinning, face forward"},{"date":"2026-03-14","ts":1773474700000,"hash":"95a0ffad","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Volumetric particle hair system, viseme lip sync pipeline"},{"date":"2026-03-13","ts":1773466551000,"hash":"7a2d18fd","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"IK refactor: remove cannon-es, FABRIK solver, fix arm FK rotation"},{"date":"2026-03-13","ts":1773460034000,"hash":"18a7e7dc","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix prettier errors in auraShader.ts and HologramViewer/index.tsx"},{"date":"2026-03-13","ts":1773459744000,"hash":"626c073b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"PPO v1: ppo_weights col + policy/buffer/shaders/aura + tests (49/49 pass)"},{"date":"2026-03-13","ts":1773459696000,"hash":"c210ab04","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"PPO v1: policy+buffer+aura deployed"},{"date":"2026-03-13","ts":1773454984000,"hash":"27cdd136","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Hologram morph targets: GA-evolved emotions, {avatar} command, smooth blending"},{"date":"2026-03-13","ts":1773446019000,"hash":"aacd2522","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add worktree plan MD [8aliqg]"},{"date":"2026-03-13","ts":1773445628000,"hash":"4ba36776","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":"1.8.6","title":"Vitest setup, Kara anti-repetition (watermark + fuzzy dedup), memory coherence subconscious, terminal agent v1.8.6"},{"date":"2026-03-13","ts":1773413175000,"hash":"0f94b408","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Wrap login page in Suspense boundary for useSearchParams"},{"date":"2026-03-13","ts":1773412975000,"hash":"451eafc8","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix prettier error in join page"},{"date":"2026-03-13","ts":1773412835000,"hash":"0ccd3576","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Complete P2 Tasks 3&4: invite links + private rooms, about page"},{"date":"2026-03-13","ts":1773411143000,"hash":"3ab56ae1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix prettier errors in chat page and WebBrowserPanel"},{"date":"2026-03-13","ts":1773411024000,"hash":"3426a474","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Task 4 complete: public chat replaced with about page"},{"date":"2026-03-13","ts":1773411019000,"hash":"fdbdfe3d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Task 4: Add untracked about page files"},{"date":"2026-03-13","ts":1773410830000,"hash":"d0cbe272","repo":"commslink2","author":"puppyprogrammer","project":"landing","label":"Landing","version":null,"title":"Task 4: Replace public chat with about page (features/CTA), home redirect for non-logged-in, About nav icon. No public chat button"},{"date":"2026-03-13","ts":1773410359000,"hash":"1b1399d5","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Darker purple site title [j4kqk7]"},{"date":"2026-03-13","ts":1773409711000,"hash":"7f10925e","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":null,"title":"Icons: grey #858585 (MUI unselected default, not purple)"},{"date":"2026-03-13","ts":1773409157000,"hash":"43bacd66","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Deploy purple icon color fix (page.tsx icons to #A020F0, matches logo)"},{"date":"2026-03-13","ts":1773409138000,"hash":"6491443b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Deploy #858585 icon color fix page.tsx rebuild"},{"date":"2026-03-13","ts":1773409129000,"hash":"87e4f206","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Deploy icon color fix #858585 page.tsx"},{"date":"2026-03-13","ts":1773409123000,"hash":"69abcdd5","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Deploy icon color fix #858585 page.tsx"},{"date":"2026-03-13","ts":1773408241000,"hash":"149736f5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Unify unselected icon color in room header to match sidebar grey (#858585)"},{"date":"2026-03-13","ts":1773408236000,"hash":"879b0674","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Unify unselected icon color in room header to match sidebar grey (#858585)"},{"date":"2026-03-13","ts":1773406539000,"hash":"2472e7bc","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Redesign logo/favicon: futuristic spaceship with purple flames"},{"date":"2026-03-13","ts":1773405617000,"hash":"71cc6519","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"AI Forum: per-room toggle, ForumPanel UI, schema/actions/handlers/posts/threads"},{"date":"2026-03-13","ts":1773402379000,"hash":"19b2a0bc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Thin site title font"},{"date":"2026-03-13","ts":1773398549000,"hash":"698c8e06","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Min autopilot interval to 6s"},{"date":"2026-03-13","ts":1773398496000,"hash":"f79bf930","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Raise min autopilot interval to 6s"},{"date":"2026-03-13","ts":1773397948000,"hash":"d40218cd","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix Kara repetition: agent dedup hash"},{"date":"2026-03-13","ts":1773397707000,"hash":"4187626e","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add message dedup hash cache for AI agents"},{"date":"2026-03-13","ts":1773395629000,"hash":"f31e8c90","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"feat: Hologram avatars (Three.js skeleton rigs + point clusters/physics with cannon-es, DB hologram_avatar model, actions/data/handlers CRUD, frontend HologramViewer/Editor with MUI sliders/presets, chat integration ViewInAr toggle/resizable panel/real-time sync)"},{"date":"2026-03-13","ts":1773395464000,"hash":"06239a27","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"feat: hologram avatars (Three.js skeleton+points physics)"},{"date":"2026-03-13","ts":1773393804000,"hash":"6e0134aa","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add tasks field to Edit Agent UI and API update_agent handler"},{"date":"2026-03-13","ts":1773393002000,"hash":"198fc866","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add task tracking system for AI agents: add_task, complete_task, update_task, remove_task"},{"date":"2026-03-13","ts":1773390689000,"hash":"150a99fc","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Inject project docs preamble into all Claude prompts via terminal agent"},{"date":"2026-03-13","ts":1773390361000,"hash":"3ffdf008","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix SCSS: @use must come before @import url (Kara's Orbitron change)"},{"date":"2026-03-13","ts":1773390097000,"hash":"98d95091","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Clamp autopilot minimum interval to 30s (was 5s, caused repeat spam)"},{"date":"2026-03-13","ts":1773389459000,"hash":"293fc513","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":"1.8.4","title":"Terminal agent v1.8.4: emit completion status to panel on finish (survives API restart)"},{"date":"2026-03-13","ts":1773389002000,"hash":"a7f48124","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Allow autopilot interval as low as 5s (min changed from 30s to 5s)"},{"date":"2026-03-13","ts":1773388349000,"hash":"68e8a84b","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Increase claude terminal panel history from 150 to 500 entries"},{"date":"2026-03-13","ts":1773388025000,"hash":"f4e2ab86","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Deploy Kara bug fixes: feedback loop and leak fix"},{"date":"2026-03-13","ts":1773386972000,"hash":"7d016885","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix prettier: single-line ResizeHandle props"},{"date":"2026-03-13","ts":1773386863000,"hash":"0e96238c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix prettier formatting for resizable panels"},{"date":"2026-03-13","ts":1773386668000,"hash":"8a5bd5a5","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Resizable side panels: drag left edge of terminal, watchlist, and web browser panels"},{"date":"2026-03-13","ts":1773385564000,"hash":"dea970a1","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Hide terminal/claude system messages from chat UI, keep for AI context"},{"date":"2026-03-12","ts":1773384690000,"hash":"87fc3eb6","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Deploy feedback loop fix and Kara bugged leak fix"},{"date":"2026-03-12","ts":1773384196000,"hash":"58c4d827","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Deploy chat handler fixes: feedback loop (135f5e1) and xai leak parse"},{"date":"2026-03-12","ts":1773380906000,"hash":"7b5ec7b7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":"1.8.2","title":"Terminal agent v1.8.2, colored system messages, spending bar EC2, Kara autopilot fix"},{"date":"2026-03-12","ts":1773380102000,"hash":"135f5e11","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix agent feedback loop: filter all [Kara %] system messages from context"},{"date":"2026-03-12","ts":1773372731000,"hash":"21e5a143","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":"1.7.5","title":"Terminal agent v1.7.5: fix Windows claude -p stdin piping, green tool-result styling, think-leak fix"},{"date":"2026-03-12","ts":1773300021000,"hash":"febfd8ea","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"feat: add watchlist_item prisma model + migration"},{"date":"2026-03-11","ts":1773297993000,"hash":"04b55ef7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"feat: full YouTube watchlist implementation"},{"date":"2026-03-11","ts":1773267270000,"hash":"1b41760c","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix agent auto-update downgrade: use semver comparison instead of inequality"},{"date":"2026-03-11","ts":1773266894000,"hash":"f3c83fd9","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":"1.6.8","title":"Terminal agent v1.6.8: fix /btw polling loop never reaching /copy"},{"date":"2026-03-11","ts":1773265965000,"hash":"d84a828f","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":"1.6.7","title":"Terminal agent v1.6.7: fix crash from async in setInterval, use setTimeout chains"},{"date":"2026-03-11","ts":1773265667000,"hash":"626ca4fd","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":"1.6.6","title":"Terminal agent v1.6.6: slower /btw polling and longer /copy wait"},{"date":"2026-03-11","ts":1773265249000,"hash":"e0134c91","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":"1.6.5","title":"Terminal agent v1.6.5: fix /btw timing with delays between clear and send"},{"date":"2026-03-11","ts":1773264605000,"hash":"82af500a","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":"1.6.4","title":"Terminal agent v1.6.4: clear input line before /btw and /copy commands"},{"date":"2026-03-11","ts":1773263710000,"hash":"cf1876a7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix think leak: text outside {say} logged as bug, never spoken"},{"date":"2026-03-11","ts":1773262874000,"hash":"8256a6c7","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add {set_max_loops N} command for AI agents to control thinking depth"},{"date":"2026-03-11","ts":1773262567000,"hash":"aff0009d","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add {continue} command with room settings toggle and max loops slider"},{"date":"2026-03-11","ts":1773261644000,"hash":"9a662c1d","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":"1.6.3","title":"Terminal agent v1.6.3: auto-update, /btw polling, {continue} command, credit packs"},{"date":"2026-03-11","ts":1773253340000,"hash":"9dbb72fa","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":null,"title":"Remove subscription tier, packs-only credits, say/think commands, terminal agent cleanup"},{"date":"2026-03-11","ts":1773231299000,"hash":"f61927b3","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Async Claude prompts, think leak fixes, credit system cleanup"},{"date":"2026-03-11","ts":1773229101000,"hash":"5dc3b71a","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":"1.5.0","title":"Terminal agent v1.5.0: skip-permissions, versioned downloads, Kara improvements"},{"date":"2026-03-11","ts":1773217800000,"hash":"19d596b2","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add spending bar, think/effort/audit commands, fix empty response spam"},{"date":"2026-03-10","ts":1773211944000,"hash":"72a4ef54","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Fix prettier formatting for RoomSettings 2-column layout"},{"date":"2026-03-10","ts":1773211620000,"hash":"c9db5a47","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"UI: 2-column layout for terminals and AI commands, delete button for offline machines"},{"date":"2026-03-10","ts":1773210489000,"hash":"72d6d04b","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add Token Budget toggle to Room Settings UI"},{"date":"2026-03-10","ts":1773210198000,"hash":"0a513e33","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Auto-detect stale machines on command timeout or disconnect"},{"date":"2026-03-10","ts":1773209207000,"hash":"b39ebdea","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add room membership persistence, kick/ban, last-room auto-rejoin, and AI moderation command"},{"date":"2026-03-10","ts":1773207826000,"hash":"ffcc646d","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Update deploy workflow: drop --no-cache for code-only changes"},{"date":"2026-03-10","ts":1773207611000,"hash":"776b2938","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix health check timestamp comparison — use MySQL-formatted string with 5s buffer"},{"date":"2026-03-10","ts":1773207438000,"hash":"382c3257","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix health check: remove duplicate message, filter by timestamp"},{"date":"2026-03-10","ts":1773207024000,"hash":"c56e2a19","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add post-deploy system announcements and Kara health check"},{"date":"2026-03-10","ts":1773206201000,"hash":"c01d3236","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Fix TS2339: add max_tokens to AgentLike type"},{"date":"2026-03-10","ts":1773206045000,"hash":"4aba5d75","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Add AI agent oversight policy to CLAUDE.md"},{"date":"2026-03-10","ts":1773205697000,"hash":"31f417c8","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add per-agent token budget with {set_tokens N} self-modification command"},{"date":"2026-03-10","ts":1773205220000,"hash":"4df58132","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Increase Grok max_tokens from 500 to 1500 to fix AI prompt truncation"},{"date":"2026-03-10","ts":1773204308000,"hash":"e9e26654","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":null,"title":"Add blind approval fallback: press 1 every 30s after 60s as last resort"},{"date":"2026-03-10","ts":1773203672000,"hash":"eedf0843","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":null,"title":"Add multi-layer approval detection for Claude Code permission prompts"},{"date":"2026-03-10","ts":1773201784000,"hash":"3570f0e8","repo":"commslink2","author":"puppyprogrammer","project":"terminal","label":"Terminal Agent","version":null,"title":"Fix auto-approval: proactive prompt detection instead of waiting for inactivity"},{"date":"2026-03-10","ts":1773201131000,"hash":"2b407a7a","repo":"commslink2","author":"puppyprogrammer","project":"chat","label":"CommsLink Chat","version":null,"title":"Add CLAUDE.md project overview and Kara agent instructions"},{"date":"2026-03-10","ts":1773200494000,"hash":"83dc6485","repo":"commslink2","author":"puppyprogrammer","project":"platform","label":"Platform","version":null,"title":"Remove .claude settings from repo — contains infrastructure details"}]}