Skip to content

feat(t27f): T27 OS home -- the 27-petal triangle menu as one spec - #10783

Open
gHashTag wants to merge 38 commits into
masterfrom
feat/t27os-petal-menu
Open

gHashTag wants to merge 38 commits into
masterfrom
feat/t27os-petal-menu

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

Refs #10782 (milestone M1 of the T27 OS epic)

What

  • specs/t27f/petal_menu.t27 (new, module T27fPetalMenu) is the single home of the 27-petal 999 triangle menu that trios draws through QueenUILib. Its seven layers:
    • L1 geometry: 27 quads in milli-units of the 596x526 box.
    • L2 meaning: 3 realms of 9 petals (RAZUM outer, MATERIYA middle, DUKH inner), each ring clockwise from the bottom tip.
    • L3 look:
      • Idle fill is black at 0.22.
      • Hover is white.
      • An open petal takes its realm colour (gold, cyan, purple).
      • The outline is white, 1 px, with no realm labels.
    • L4 fit: 0.63 x min(w/596, h/526), centred.
    • L5 input: a division-free integer ray-cast hit test.
    • L6 state: home, a petal open, back.
    • L7 menu: a 3x3 card grid, empty in the MVP.
  • specs/t27f/frontend.t27 registers surface SF_PETAL_MENU (status none, maker none, so it is never claimed made) and intent I_OS_HOME.

Why

  • The source is Swift (trinity/apps/queen/QueenUI/Widgets/TriangleLogo.swift), ported from Zig.
  • Screen.screenForBlock holds 28 screens for 27 petals, so settings is unreachable, and its names disagree with TriangleLogo.worlds.
  • This spec becomes the one place for the rule. M2 replaces the hand tables with generated code.
  • The spec is integer-only on purpose, so it can lower to the AX7203 (M4-M6).

Verified (Railway lab, t27c release, zig 0.16.0)

  • test-report specs/t27f/petal_menu.t27: 10/10 pass, 0 vacuous (432 vertex asserts, 27 centroid hits, seam and hollow-centre cases, fills, tap/back over all 27 petals).
  • test-report specs/t27f/frontend.t27: 8/8 pass, 0 vacuous.
  • icarus-lowerable specs/t27f/petal_menu.t27: not_lowerable today, tracked as M4.

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-19 02:48:16 UTC

Summary

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

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

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=fad12492937a != 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 enabled auto-merge (squash) October 19, 2026 02:58
gHashTag and others added 15 commits October 19, 2026 17:05
- 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>
@gHashTag

Copy link
Copy Markdown
Owner Author

Base rebased onto master (seal currency: master resealed t27f_T27fFrontend.json again).

  • old tip: 8f67a31f19a093fbba70f7f067f550b786e1b4cd (before that: 0db6bdfee6454a58f64918e616ff808fdc9ae017)
  • new tip: 4c451b9cf16aad8afd9dd9083b386c72ae41df34

Stacked branches: git rebase --onto 4c451b9cf16aad8afd9dd9083b386c72ae41df34 <old-tip-you-were-on> <your-branch>. No further rebases of this base unless CI strictly requires one.

@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-19 10:13:03 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 49
PRs with All Checks Green 1
READY 1
FAILING 49
PENDING 0
NO CHECKS YET 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=2d301cdb4a58 != 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).

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant