Skip to content

T27 OS: key manager and KEYS tab, key orchestration, glass window, 27 editors and the editor inside the window - #11254

Merged
gHashTag merged 47 commits into
masterfrom
claude/t27os-keys-v3
Oct 20, 2026
Merged

gHashTag merged 47 commits into
masterfrom
claude/t27os-keys-v3

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

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:

  • specs/t27os/*: the stack's version (master's only change there is the squash of feat(t27f): T27 OS home -- the 27-petal triangle menu as one spec #10783, which the stack contains).
  • docs/reports/t27b_expectations.json: master's rows plus the stack's t27os rows in path order; master's widget rows (a superset of the stack's); max_not_pass 133 = master's 132 plus the stack's specs/t27f/petal_glass.t27 row (blocked, @sin).
  • tools/duplicate_bodies_baseline.txt: master's file unchanged. The stack carried five extra lines (chan, clamp01, flag_bit, same, scale: copies in the petal glass and pbr specs); adding them would bless those groups, which is the owner's call, so they are left out and the four groups master already reports stay as they are (inherited red, not grown).

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=[]

gHashTag and others added 30 commits October 19, 2026 17:05
… 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>
The frame is filled opaque black (BACK_BLACK 1.0) before anything else, so
neither the wallpaper behind the glass nor the full-screen glows show. The
glow frost from #10831 is removed; the owner asked for #000000.

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>
gHashTag and others added 17 commits October 19, 2026 17:05
…(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>
@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-20 06:47:30 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 47
PRs with All Checks Green 3
READY 2
FAILING 47
PENDING 0
NO CHECKS YET 0

These columns do not partition: 2 + 47 + 0 + 0 = 49, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=5aec047d42ec != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@gHashTag
gHashTag merged commit e10a1bb into master Oct 20, 2026
47 of 51 checks passed
@gHashTag

gHashTag commented Oct 20, 2026 •

Copy link
Copy Markdown
Owner Author

Request for the T27 OS / t27f lane (@dmitrii-f-t27), from the owner's merge-sweep agent: master's duplicate-bodies check is red, and these merges are where the new copies came from.

Measured with python3 tools/dupe_scan.py on master ae97ff06d (exit 1, 1641 of 18186 in 636 group(s)), four bodies are flagged as new copies named in no ledger (the [N] is what the check prints; the places are what --name lists):

  • chan (check: copied [2] time(s); --name lists 3 places): specs/t27f/deck.t27:341, specs/t27f/petal_glass.t27:157, specs/t27os/glass_window.t27:840
  • clamp01 (check: copied [3] time(s); --name lists 3 places): specs/t27f/pbr_sphere.t27:86, specs/t27f/petal_glass.t27:126, specs/t27os/glass_window.t27:848
  • flag_bit (check: copied [2] time(s); --name lists only specs/t27os/doctor.t27:156, the other place was not shown):
  • scale (check: copied [2] time(s); --name lists 3 places): specs/t27f/petal_glass.t27:219, specs/t27os/glass_window.t27:861, specs/tri/t27b/a64.t27:947

petal_glass.t27 came in with #10783 and glass_window.t27 / doctor.t27 with #11254 and #11256. The check has been red on every master commit I read since 04:46Z (the red set I measured at 07:14Z), so every other PR is now judged against a red baseline.

Options, one line each:

  1. Reuse: use the one clamp01 from pbr_sphere.t27 (commit 6070e9b did exactly this for t27f) and the one chan / scale from where they already live. Smallest ledger, root fix.
  2. Record them with python3 tools/dupe_scan.py --bless (ledger tools/duplicate_bodies_baseline.txt). Fast, but it records the copies as debt.

Default: I change nothing in your files. Until one of the two lands, master's duplicate-bodies stays red. Tracking is in epic #11259.

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants