Repository navigation
T27 OS: key manager and KEYS tab, key orchestration, glass window, 27 editors and the editor inside the window - #11254
Conversation
… menu fade in .t27 (Refs #10782) specs/t27f/petal_glass.t27 (module T27fPetalGlass) draws the T27 OS home as trios does: blackGlass tint 0.30, darkWash 0.42 gradient, three ambient blooms at 0.055, 0.5 px white 0.14 border; petals, fills, outline, hit test and state come from petal_menu.t27 by use, nothing copied. LogoAnimation is ported exactly (800-unit fly-in, phase 1 at 4.5/s, spring k 28 damping 0.86); the card menu fades in with g_wave_transition (10 frames). main prints 270 RGB24 frames of 960x540 for ffmpeg. Lab: 6/6 tests, 11498 runtime asserts (the anti-aliased distance agrees with the ray-cast hit test); rendered to a 9 s mp4 in 29 s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…0782) specs/t27os/glass_window.t27 is the T27 OS home as a real AppKit window: NSVisualEffectView frosted glass under a black 0.30 tint, the 27 petals from petal_menu.t27 with hover and the 800-unit fly-in, and the widget mode -- a tap opens the 3x3 card panel, the logo fades out, cards cascade in and light under the mouse, Esc / back control / tap outside go home. Full screen via the green button or F, scene aspect kept. Every system call is a t27b @extern import (#8946); t27b build --macho + ld -framework AppKit gives the binary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e scene (Refs #10782) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- top bar right of the traffic lights: logo icon (home), sidebar toggle (also the S key), back chevron; the back control no longer sits under the close/minimise/zoom buttons - sidebar mode: the logo shrinks into a 200 pt left sidebar and stays live (hover and tap switch the open petal), the menu panel fills the rest - realm header line is clipped to the panel's rounded top edge - Dock icon: the logo white on a black squircle, drawn at launch and set with setApplicationIconImage: -- no foreign .icns file - tests for the top-bar layout, the sidebar geometry and the icon centring Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hat workspace, menu shortcuts Rewrites specs/t27os/glass_window.t27 to the trios layout read from TriosTabView / QueenUI MainView: - 34 pt title bar: white template logo + TRINITY (home), fullscreen control, white 0.14 divider; text through CoreText lines coloured by the context. - home: the petal_menu-style logo at 0.63 of the area, trios tooltip pill (name + Cmd/Option/Ctrl+N) 30 pt above the hovered petal. - screen: 0.25 s opacity crossfade; 32 pt nav header with green "< TRINITY", centred world name and the refresh circle; 272 pt sidebar with New task and the queen card; 44 pt content header with the sidebar toggle; 3x3 cards in a readable column of at most 900 pt. - keys as QueenMenuShortcutPolicy: Cmd/Option/Control+1..9 open petals 0..26, Escape and Cmd+0 go home, Cmd+Shift+S collapses the sidebar. Drops the old panel, scrim and logo-to-sidebar morph. Silicon check on the Mac: home, Escape crossfade, Cmd+5 -> REVIEW, Cmd+Shift+S collapse. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…logo 20% smaller in full screen - The title-bar logo drops the clear-blend seams (read as a black outline) and is drawn in petal_menu's own style: idle fill, 0.5 pt white outline, 14 pt tall. - Frames render into a 4x bitmap (3840 x 2160) so full screen stays sharp. - In full screen (NSWindowStyleMaskFullScreen) the home logo is drawn at 0.8 of its windowed size; the hit test follows the same factor. New test covers the size, centring and mouse mapping. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The glass window now does what trios WindowManager + ChatWorkspaceLayout do: - a sidebar.right control left of fullscreen docks the window as the 400 pt panel on the right edge, full visible height, animated; again = restore; - below 760 pt the workspace is compact: no sidebar, an OPEN DASHBOARD bar over the cards; tapping it forces the dashboard, whose header gains the Close Dashboard control right of the toggle; - the narrow scene renders point for point into its own bitmap, cropped to the view; the home logo fits the panel width; - the 3 x 3 slots keep their wide-window shape instead of stretching down the narrow column; - clicks hit-test at the event's locationInWindow, not the frame-start mouse. New test: the_window_folds_into_the_trios_compact_panel_below_760. Built with t27b on the lab, linked and checked on the Mac. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Refs #10782) Full screen draws at native resolution on black glass (tint 0.86) instead of scaling the 960x540 stage; nav, sidebar, header and cards use 0.5 pt hairlines, muted system type and a 4 pt radius. New test full_screen_draws_point_for_point_on_black_glass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The logo draws as the Trinity S3AI mark: white petals cut by black lines, the centre left black; hover and open petals keep their realm colour. The nav header drops its duplicate TRINITY label; the back chevron sits on the sidebar text column. New test logo_is_the_brand_mark_and_title_says_trinity_once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ps (Refs #10782) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The navigation header is gone: the back chevron, the logo and TRINITY, the refresh arc, the dock and fullscreen controls share the title bar, and the workspace starts right under it. The world name is said once, in the content header. Cards are honeycomb cells; the brand mark has a large and a small variant (finer cut, centre hole kept). In full screen the logo sits on the chevron line and the glass tint drops to 0.55. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Full screen has no desktop behind the window for the behind-window blur, so the material went flat grey. The window now draws its own frost there: a black wash and three soft white glows (stacked discs). The screen is black and white only: the queen crown is white. New specs/t27os/layout.t27 (module T27osLayout) computes row placement: row_next, centre_top, baseline_for/cap_mid, snap, same_line. The title bar uses it: the back chevron and the logo share one icon height and centre line, the gaps chevron-logo-TRINITY are equal, and the text baseline puts the capitals on the same line. Thinner petal cuts on both logo sizes. Closes #10831 Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…paque in full screen The background fill stays pure black (R = G = B = 0) but is BACK_GLASS 0.60 in a window, so the behind-window blur shows through as frost with no grey or coloured wash; full screen has nothing behind to blur and stays opaque. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… restore plan specs/t27os/agents.t27 (new): the nine agents of the comb (Claude Code, Codex, Gemini, OpenCode, Queen in the centre, Crush, Cursor, Aider, Copilot), their launch commands, how each resumes (by id, by history, or unknown -> relaunch), the session state machine after herdr.dev (working, blocked, idle, done, plus stopped) and what a restart does with each saved session. Tests cover the transitions and the restore decisions. glass_window.t27: every cell draws its agent mark (vector, white only) and its name, scaled with the cell and left out where it would be unreadable. Host side not yet written: the terminal owner (spawn + pty), the on-disk session store and the state reader. Tests are unverified here: t27b test runs on arm64 only. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…task button The logo + TRINITY sit in the middle of the title bar as one group, the logo drawn 1.2x the row height; the back chevron keeps the left edge with a 40 pt hit box. The New task row is gone from the sidebar: tapping a honeycomb cell opens a task with that agent, lights the cell and lists it under AGENTS. Spec asserts updated; the t27b runner is arm64-only, so they are unverified here. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ew binary (Refs #10782) specs/t27os/hot_reload.t27 decides when to swap: the window polls its own executable's modification date twice a second, waits for two quiet checks (ld and then codesign each write the file), saves the open screen, task, sidebar and dashboard flags to NSUserDefaults under t27os.hot, and execs itself. The new process restores that state with no fade-in. Exec rather than a reloaded dylib because t27b has no call through a function pointer. Checked by hand: screen open with Gemini selected, relinked and re-signed with no relaunch, the window came back on the same screen with Gemini still selected. The spec's tests are not run here: the t27b runner is arm64-only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…10782) New specs/t27os/windows.t27 holds the window model: one session per agent, packed as one base-4 digit per agent in a u64 (0 = none, d = space d-1), state-to-dot-shape mapping (black and white, FR-006), and sidebar geometry (group_top / row_top / row_at). glass_window.t27 draws the three groups in the expanded sidebar, opens a session in the selected space on a honeycomb cell tap, selects the Queen, a space or an agent row on click, and saves space + where across hot reloads. Seed data: the space names and branches are fixed until the host side reads git worktrees; every session shows "stopped" because no agent process runs yet. No scrolling: more than 7 sessions in one space overflow the window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ript three (Refs #10782) The header label next to the logo and the NSWindow title now show "TRINITY S" U+00B3 "AI". Source stays ASCII (L3): t27b string literals do not decode \x escapes (a "\xC2\xB3" literal reached the object file as eight ASCII characters), so brand() writes the two UTF-8 bytes C2 B3 into a buffer that CFStringCreateWithBytes reads. A test pins the bytes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The line width was set once before the comb loop, and draw_agent_mark changes it, so cell 0 (Claude Code) was stroked at HAIR and every later cell at the previous agent mark's 0.12*s or 0.18*s width. The width is now set before each cell's stroke; cell_line and cell_edge hold the rule, and a test checks that every cell gets the same width and the same edge alpha for plain, hover and selected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a session (Refs #10782) - windows.t27: the one-session-per-agent `where` word becomes an ordered list of up to 7 sessions packed one byte each (agent, space); add, remove (compacting), per-space rows, chat numbering, selection fix-up after a close; two new tests. - glass_window.t27: "+" at the right end of the CHAT header adds a chat of the selected agent (Claude Code by default) in the current space; a second chat of the same agent reads "Claude Code 2"; a hovered AGENTS row trades its dot for an x that closes that chat. Sessions and the selected one survive hot reload (t27os.sessions, t27os.cur). - Checked on the running app: three chats opened with +, the middle one closed, the rest renumbered. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tions, GOD MODE (Refs #10782) specs/t27os/queen.t27 (new): the Queen's model of what the user is doing. - Every control pressed is packed into a u64 event (view, control, argument, unix second) and kept in a ring of the last eight. - From the sidebar she derives one suggestion: open a chat in an empty space, or select the first chat when none is selected. - GOD MODE runs that suggestion herself, only while her panel is open and after the user and she have both been still for 3 s. - Geometry and hit tests for the panel; seven tests. specs/t27os/glass_window.t27: - Cmd+J or the QUEEN row opens her 300 pt panel over any view: LOOKING AT (view, space, chat), SUGGESTION with Confirm / Dismiss, RECENT (newest first; filled dot = her action, ring = the user's, age in words). - GOD MODE box: empty = off, filled + bold border = on. Cmd+J, Escape, the box, or closing the panel stops it. - Panel open, GOD MODE and the ring persist across hot reload. Checked on the running app: the QUEEN row opened the panel, Confirm selected the chat, GOD MODE opened a Claude Code chat in two empty spaces by itself and logged both, the box stopped it. Cmd+J and Escape were not exercised (keys cannot reach a background window from the test harness). Spec tests were not run: the t27b test runner is arm64-only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rwise (Refs #10782) - queen.t27 records the one exception to FR-006 next to the black-and-white rule: a green edge glow (GLOW_R/G/B, defined only there) while GOD MODE is on. glow_on(god), glow_level (fade over about 1/3 s) and glow_alpha (12 strips over 34 pt, brightest at the edge), with a test. - glass_window.t27 draws the glow on top of every view and fades it each frame. The backdrop is now opaque black in a window too: the 0.60 glass let the blurred wallpaper read as a warm glow along the edges. Checked on the running app: GOD MODE on shows the green edges, off leaves them pure black. Spec tests not run (the t27b runner is arm64-only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- windows.t27: open-space bitmask (SPACES_SEED, new_space/add_space/ remove_space, drop_sessions_in, after_drop); session byte now 1+k*8+s; REPO_LINK_TEXT/REPO_URL/FOOT_H foot constants; tests for both. - queen.t27: C_NEW_SPACE, C_CLOSE_SPACE, C_REPO_LINK controls. - glass_window.t27: "+" on the SPACES label, hover x on space rows, black foot strip with the repo link (opens github.com/gHashTag/t27); spaces persist under t27os.spaces, sessions under t27os.sessions2; layout test corrected to five chat rows above the foot. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- queen.t27: FLAME_CORE/MID/BASE stops (bright cyan cone at the edge, vivid blue body, deep violet-blue base), 30 bands over 44 pt with a cubic falloff, flame_wave/flicker (3 s breathing plus tongues that travel along the bands, stronger at the outer tips), core_alpha for the blurred cone hairline; test rewritten for the flame. - glass_window.t27: draw_edge_glow colours each strip by flame_rgb and flicker on the frame count, then draws the cone hairline with a 22 pt blue CGContextSetShadowWithColor halo. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
doctor.t27 holds every decision: walk roots and depth, skipped names, agent roots, the per-repo checks, the flags (duplicate clone, agent copy, made several times, worktree, dirty, unpushed), keep reasons, row groups, the two-step remove/confirm click, auto-bind ranks and panel layout, with tests. glass_window.t27 does only the host plumbing: the paced directory walk and rescan, .git vanish check, NSTask jobs for git/du, the defaults-persisted slots and hidden list, the DOCTOR foot link and panel, and the move to the Trash after a per-row confirm. A repo with uncommitted changes or unpushed commits is never offered for removal. Desktop, Documents, Downloads, Dropbox and OrbStack are skipped: a stat on the iCloud-backed Desktop blocked the main thread for minutes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ty_client lands) Clicking a Claude Code (AGENT 0) row under AGENTS opens a terminal pane in the chat's content area: a cell grid of u32 codepoints from specs/t27os/vt.t27, drawn monospace, black and white, with a white block cursor that stays solid while typing and blinks when idle. - term_pane.t27: grid sizing from the content area, cell geometry, cursor blink, key-to-bytes (Return/Tab/Delete/Esc, arrows, Home/End, PgUp/PgDn, forward delete, ctrl letters, UTF-8), and the offline echo. 6 tests, 0 vacuous. - vt.t27: copied verbatim from the pty-server worktree (6066dfb) so this branch builds alone; identical add/add merges cleanly. - glass_window.t27: draw_term, key forwarding (every non-Cmd key goes to the pane), per-frame open/resize/read, and stand-ins term_connect/term_spawn/ term_keys/term_read/term_resize for specs/t27os/pty_client.t27. Until that lands they answer "not connected" and the pane echoes keys into the grid. cwd is the space's bound folder, home when unbound. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner request: the sidebar footer link text changes from I LOVE OPEN SOURCE to OPEN SOURCE T27. Same repository link, same style. The glass_window.t27 header line that describes the foot is updated, and the formerly vacuous foot test in windows.t27 now checks the words at runtime. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e PTY server (Refs #10782) Pure logic with run-time asserted tests: the four pane states from hooks and output quietness, the session manifest line and restore plan, the socket frame format and scrollback ring, and a minimal VT cell grid. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… the UI and restore after a server kill (Refs #10782) pty_server owns one PTY per pane, serves pty_proto frames on ~/.t27os/pty.sock, keeps a 64 KiB ring per pane, writes a record per pane under ~/.t27os/sessions and restores by the RESUME_* rules on start (a resume that dies at once relaunches fresh). Claude hooks drive pane_state; T27OS_HOOK / T27OS_CTL / T27OS_INSTALL modes cover the hook, a tiny client and the launchd plist. Needs @extern (t27b host boundary, 865b4ee). Decisions live in pty_logic.t27 with run-time tests. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…(Refs #10782) The terminal pane no longer runs a stub. Opening a Claude Code chat connects to ~/.t27os/pty.sock, lists the server's panes, reuses the k-th pane of that agent for the k-th chat (tp_pick_pane) or spawns one in the space's folder, attaches, sends keys with client_keys and polls client_read each frame, feeding the bytes to vt.t27. Without a server the pane says offline, echoes keys locally and retries every TP_RETRY frames. Checked on the Mac: a live claude renders in the window, typed text reaches it, and after quitting and reopening the app the same pane (same claude pid, same draft) is back. RESIZE is still a stub (t27#10902), so panes are 80x24. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…(Refs #10782) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…#10782) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…l + SIGWINCH) - pty_proto: TIOCSWINSZ, SIGWINCH, resize_ok, put_winsize, ws_pack/ws_cols/ws_rows (+ test). - pty_sys: sys_set_winsize binds __ioctl, the fixed-argument syscall stub that the variadic ioctl() wraps, so no variadic @extern is needed (t27#10902 stays open). - pty_logic: G_WINSZ keeps each pane's last size (two panes per word). - pty_server: OP_RESIZE sets the pty size and signals the pane's group; launch uses the stored size, 80x24 by default. - pty_client: client_resize. - term_pane / glass_window: grid caps 400x120 (48000 cells); the window sends RESIZE whenever the fitted grid changes, before the replay. Live on the Mac: widening the window took the pane's pty to 56x167 and claude's input box and status line to the full pane width. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Audit P0 items 2-4 for the T27 OS window (Refs #10782): - frame_gate.t27: fold the visible state into one key; skip the draw when unchanged (forced draw every 15 frames), wait 0.5 s for events once quiet for 30 frames and no pane is live. The clock enters the key only with the queen panel open, the cursor blink only with a pane open, the mouse only inside the scene. Idle CPU 25-55% -> 0.5-3%. - term_pane.t27: tp_settle/tp_size_due; vt_init + ring replay run once after the size has held for 6 frames instead of every drag frame. - glass_window.t27: setContentMinSize 480x320, accepts mouse-moved. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… reboots Owner bug 2026-10-19: after a reboot the open windows and history were gone and every Claude pane came back on the default model. - window_keep.t27 (new, 4 tests): the window folds screen, spaces, task, open pane, sidebar and flags into one key and writes it to the user defaults once it has held still for 15 frames; every launch restores it. Holding Option at launch is the explicit clean start. The frame stays under the AppKit autosave name. - session_store.t27: record v2 adds the model; v1 still parses. build_command/fresh_command pass --model on resume and relaunch; the last model in the Claude transcript catches /model switches. - pty_logic.t27 / pty_server.t27: the model comes from the SPAWN payload (T27OS_MODEL), the SessionStart hook and the transcript, is kept per pane and saved in the record. The launchd plist (T27OS_INSTALL=1) now carries PATH, LANG, TERM and a log path, so the server starts at login and restore_all resumes the panes by session id. Lab test-report: session_store 16/0, pty_logic 13/0, window_keep 4/0. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… master Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…els (M11) Every drawn frame rebuilt each label from scratch: a font lookup, an attribute dictionary, an attributed string and a CoreText line, then released it. Lines now live in a table keyed by style and text (text compared by content, so a renamed space never shows a stale line); the table empties at TC_CAP entries. Space names, branches and agent names in the sidebar are cut with an ellipsis by CTLineCreateTruncatedLine where they would reach the row's close x. Pure logic in specs/t27os/text_cache.t27 (lab test-report: 4 pass, 0 FAIL); glass_window built with t27b on the Railway lab, linked and run on the Mac. Refs #10782 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… router decisions (Refs #10782) Re-applies the keys work from PR 10972 onto the twice-rebased petal-menu base. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…lass copies (Refs #10782) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ops eval_hslm (Refs #10782) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…a-cloud profiles, key chain, in-pane failover decision (#11226) * t27os keys: tier map as pure data -- a default model and a model per tier for each claude profile (FR-001) The zai and anthropic-api profiles read their ANTHROPIC_MODEL, _SMALL_FAST_MODEL and _DEFAULT_HAIKU/SONNET/OPUS_MODEL values from one table (a tier left empty falls back to the default model, the Free Claude Code way) instead of a per-profile if-chain; zai now also sets the sonnet and opus tiers. Prior art: https://github.com/Alishahryar1/free-claude-code Updates #11224 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * t27os keys: openrouter and ollama-cloud claude profiles from the providers' own Anthropic-protocol pages (FR-002) Two more profiles behind zai and anthropic-api, each only once its provider's key is stored: OpenRouter (https://openrouter.ai/api, three Anthropic tier names, empty ANTHROPIC_API_KEY) and Ollama cloud (https://ollama.com, one cloud model for every tier, empty ANTHROPIC_API_KEY). The page of each is named in the spec. DeepSeek, Moonshot and MiniMax document the protocol too but need provider rows of their own, which the window and the server size by nine; left to a follow-up. Updates #11224 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * t27os keys: profile chain with numbered keys -- next_profile, key labels per number, rotation that skips the failed key (FR-003) next_profile(after, stored, bad) walks the profile list forward only; pick_profile is its start and behaves as before for the old two profiles. keychain_label_n names key 2 and 3 of a provider (key 1 keeps the old Keychain item), rotate_pick_except lets rotation skip the key that just failed. Updates #11224 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * t27os keys: pane failover decision -- screen line to failure class, respawn or give up, never a loop (FR-004) classify_line sorts a screen line (429, Insufficient balance, disabled Claude subscription, 401, 403) into a failure class by plain byte matching; fo_action says keep, respawn on the next profile, swap to the next key of the same provider, or give up; fo_bad adds the failed provider to this pane's bad mask; fo_why names the profile and the move with no key value. The chain is forward only and MAX_FAILOVERS caps the count, so a pane that fails on every profile ends in give up. Updates #11224 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * docs(t27os): key orchestration compared with Free Claude Code -- what T27 OS has, which spec function does it, what stays blocked (FR-005) One table of the Free Claude Code ideas against keys.t27, the pane failover step by step, the providers whose own pages were read (base URL, key variable, tier models, page), and the host work and the local router (#10902) that remain. No key value, no personal name, no home path. Updates #11224 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <claude@anthropic.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…ors, terminal editor opens inside the window (#11227) * feat(t27os): the window is matte black glass, full screen stays opaque #000000 (FR-001) Owner 2026-10-20: the window is matte black glass as in trios; where full screen cannot be transparent, keep #000000. backdrop_alpha(full) is 0.0 in a window (BACK_GLASS) so the NSVisualEffectView blur and the 0.30 layer tint show through, and 1.0 in full screen. draw_backdrop wipes the bitmap with BLEND_CLEAR when the fill is not opaque (so no old pixels stay) and `draw` no longer clears it twice. TINT_FULL is 1.0: the layer background is opaque black in full screen and nothing of the wallpaper shows. tint_alpha and tint_swap are the pure decisions behind the layer colour swap; the pins on TINT_FULL and BACK_GLASS and two new tests cover them. The header comment records that 2026-10-20 supersedes 2026-10-19 for a window. Updates #11223 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * feat(t27os): 27 external editors, Xcode through xed, and why an open failed (FR-003) The table named 9 editors; the bench Mac has Cursor, Xcode, Antigravity, Antigravity IDE and ZCode, and only Cursor and Xcode were known. It now names 27 (MAX_EDITORS 32 bounds the u32 mask): Antigravity, Antigravity IDE, ZCode, PyCharm, GoLand, CLion, RustRover, Rider, PhpStorm, Android Studio, VS Code Insiders, VSCodium, Kiro, Trae, Positron, BBEdit, TextMate, Fleet. Two ship no launcher (empty field). The strip is 3 chips of 88 pt (was 4 of 66, which overlapped "Antigravity IDE"). editors_host opens a bundle with the path access(2) found (open -a <path> <dir>), not a name rebuilt from the table into a 40-byte buffer, so a name with a space is one argv word and Antigravity cannot be taken for Antigravity IDE. Xcode: launch_pick prefers xed <dir> and falls back to open -a; the /usr/bin/xed shim every Mac has no longer makes Xcode look installed. open_in_editor returns an OPEN_* code (bad folder / not installed / could not start / unknown editor) and the OPEN IN strip prints the word after the last click that failed. exists() refuses a path that would be cut to its buffer. JetBrains Toolbox folders (edition suffix) are not looked up; noted in the header. Updates #11223 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * feat(t27os): T27 OS opens inside -- a terminal editor in a PTY pane, the Queen asks for it (FR-002, FR-004) Owner 2026-10-20: "T27OS opens inside!!". A terminal editor is a program a pane of the PTY server can run, so its screen is the window's own. editors.t27: TERM_NAMES (vim, nvim, hx, micro, nano in order of preference), term_pick over a found-mask, term_path_fits (dir_fits, at most a pane cwd, no single quote), editor_command (`<editor> '<path>'`) and editor_spawn_payload. The wire format is unchanged: the SPAWN of the shell cell (9) whose model field names the editor, the file or folder as the cwd -- pty_proto tests are untouched and green. pty_logic.t27: wants_editor, editor_spawn_ok, launch_command (an editor pane runs the editor, every other pane runs pane_command as before; a restored pane reopens the same path from its record). pty_server.t27: launch uses launch_command; OP_SPAWN refuses an editor request whose path would break the quoting. T27OS_CTL=spawn T27OS_AGENT=9 T27OS_MODEL=vim T27OS_CWD=<path> opens one from a script. editors_host.t27: term_mask (access(2) over the launcher dirs). pty_client.t27: client_spawn_editor. queen.t27: open_target(is_god, term_found, ext_found) -- inside whenever a terminal editor is there, for the user's Confirm and GOD MODE alike; without one GOD MODE does nothing and a confirmed suggestion falls back to a GUI editor. Header comments updated for the clear window glass. Not wired: the window shows one pane, the selected Claude Code chat's, so the call site that spawns the editor pane next to the chat and shows it is left (see the report on #11223). Updates #11223 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(t27os): the backdrop wipe and fill reach one point past the scene so a fractional edge keeps no old pixels (FR-001) A fractional scene edge is anti-aliased: a partly covered pixel would keep part of the last frame under the clear window glass. BACK_BLEED = 1.0 widens the BLEND_CLEAR wipe and the opaque full-screen fill by a point on every side; what lies outside the scene is never shown. Updates #11223 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(t27os): same_bytes accumulates the difference, so it is not a third copy of the early-exit compare (FR-003) tools/dupe_scan.py --like found editors.t27 same_bytes already written in igla/coder/tokenizer.t27 and tri/crypto/hex.t27. Neither is importable from t27os. The body is now the accumulate-the-difference form: the length check, then one loop that ORs the XOR of every byte pair into a u32, equal when it stays 0. Name, signature and every test are unchanged. Updates #11223 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <claude@anthropic.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…or view, the Queen's once-per-space suggestion (#11236) * feat(t27os): the OPEN IN strip leads with a "T27 OS" chip that spawns an editor pane (FR-002) editors.t27: strip_count / strip_chip / strip_label put CHIP_INSIDE first when a terminal editor was found (term_pick over editors_host term_mask) and the installed outside editors after it; the strip's hit test is unchanged. Also the pure decisions the editor view needs next: view_key, editor_view_stays, esc_twice. term_pane.t27: tp_pane_live, so a second click reuses the editor pane while the server lists it live. glass_window.t27: the strip draws the chips from strip_*, and a click on the first one spawns the editor pane (client_spawn_editor) on the folder the strip hands to the outside editors, via edit_open (reuse a live pane of the same space, else kill the old one and spawn). A failure shows its word in the strip. The pane is spawned and its id kept; showing it is the next commit. Updates #11223 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * feat(t27os): the editor pane shows in the terminal area in place of the chat's (FR-002) The strip's "T27 OS" chip now opens the editor it spawned. The terminal area keeps one grid; view_key picks what it shows -- the selected Claude Code chat's pane, or VIEW_EDITOR -- and the existing open, attach, resize, ring replay, read and key-routing code runs on that view unchanged: only the pane lookup differs (the editor's id instead of term_open). Escape twice within a second (esc_twice) closes the view, the first Escape still reaches the editor; the chip again, another chat or space, or leaving the chat screen closes it too (editor_view_stays). The pane keeps running in the server, and the chip reattaches it while the server lists it live. A dead editor pane (server restarted) drops back to the chat. Updates #11223 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * feat(t27os): the Queen offers "open this space in a terminal editor" and GOD MODE opens it once per space (FR-004) queen.t27: A_EDIT, offered by suggest_for last -- only when the older rules have nothing to do, a terminal editor is there and the space has not had it yet. edit_todo / edit_mark keep one done bit per space (0 .. 63), so GOD MODE acts once per space and never every GOD_WAIT seconds (a 200-tick test counts one act). C_QUEEN_EDITED reads as the Queen's own action with the space as its argument; IE_USER / IE_GOD say who asked. glass_window.t27: Confirm and GOD MODE set one request (iedit), and the strip's chip sets the same one; a single handler serves it through open_target (always inside) with edit_open on the space's folder, then the editor view of the previous commit shows it. The suggestion is only offered on the chat screen, where the view can show. Updates #11223 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <claude@anthropic.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…ged petal home (Updates #10782) specs/t27os from the stack; t27b ledger rows in path order, max_not_pass 133; duplicate-bodies baseline as the union of both sides. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Request for the T27 OS / t27f lane (@dmitrii-f-t27), from the owner's merge-sweep agent: master's Measured with
Options, one line each:
Default: I change nothing in your files. Until one of the two lands, master's 🤖 Generated with Claude Code |
Closes #11223
Closes #11224
The T27 OS stack on top of the petal home (#10783, merged): the key manager and KEYS tab (was PR 10977, closed when its base branch was deleted), the key orchestration decisions (#11224), the matte black glass window with an opaque #000000 full screen, 27 outside editors and the editor that opens inside the window, with the Queen's once-per-space suggestion in GOD MODE (#11223). Refs #10782.
Merge of master into the stack, resolved by hand:
Gates run on the merged tree with t27c, t27b and tri from master are listed below.
🤖 Generated with Claude Code
TEST specs/t27os/agents.t27 tests=[3] fail=[0] vacuous=[1]
TEST specs/t27os/doctor.t27 tests=[9] fail=[0] vacuous=[0]
TEST specs/t27os/editors.t27 tests=[26] fail=[0] vacuous=[0]
TEST specs/t27os/frame_gate.t27 tests=[4] fail=[0] vacuous=[0]
TEST specs/t27os/hot_reload.t27 tests=[2] fail=[0] vacuous=[0]
TEST specs/t27os/install.t27 tests=[16] fail=[0] vacuous=[0]
TEST specs/t27os/keys.t27 tests=[52] fail=[0] vacuous=[0]
TEST specs/t27os/layout.t27 tests=[4] fail=[0] vacuous=[1]
TEST specs/t27os/pane_state.t27 tests=[7] fail=[0] vacuous=[0]
TEST specs/t27os/pty_logic.t27 tests=[17] fail=[0] vacuous=[0]
TEST specs/t27os/pty_proto.t27 tests=[11] fail=[0] vacuous=[0]
TEST specs/t27os/queen.t27 tests=[12] fail=[0] vacuous=[0]
TEST specs/t27os/router.t27 tests=[7] fail=[0] vacuous=[0]
TEST specs/t27os/session_store.t27 tests=[16] fail=[0] vacuous=[0]
TEST specs/t27os/term_pane.t27 tests=[10] fail=[0] vacuous=[0]
TEST specs/t27os/text_cache.t27 tests=[4] fail=[0] vacuous=[0]
TEST specs/t27os/vt.t27 tests=[8] fail=[0] vacuous=[0]
TEST specs/t27os/window_keep.t27 tests=[4] fail=[0] vacuous=[0]
TEST specs/t27os/windows.t27 tests=[6] fail=[0] vacuous=[0]
t27b --check run on 25 specs
SEAL install :: all hashes MATCH
TYPES RATCHET: CLEAN
DUPE failing=4 extra-vs-master=[]