Fetch with okra repo fetch <slug>; get the path with okra repo path <slug>. okra repo list prints hundreds of kilobytes; use path. A path in "Read it for" starts with the repo's directory name (opencode/…), so it never reads as a gent path.
| Slug | Branch | Sweep | Read it for | Compare with |
|---|---|---|---|---|
sst/opencode |
v2 (1549712761, 2026-10-01; checkout HEAD is dev) |
architecture, efficiency, ui | Theme tokens (owner, 2026-10-05: the ui sweep's reference for semantic color tokens and themes); Effect-native runner and codemode: opencode/packages/core/src/session/runner/step.ts, runner/llm.ts, session/inbox.ts; cache routing for children and forks: session/affinity.ts, session/model-request.ts (affinity headers, promptCacheKey); provider block: runner/publish-llm-event.ts (content-filter); per-model output: plugin/verbosity.ts; docked panes, dialogs, theme tokens, permission prompts (source only unless a binary is on PATH) |
packages/core/src/runtime/turn.ts, packages/core/src/runtime/agent-loop.ts, packages/extensions/src/openai.ts, packages/extensions/src/opencode.ts, apps/tui |
earendil-works/pi |
main (1.0; last read c10bfb0d7, Pass 29) |
architecture, efficiency, ui | pi/packages/agent/src/agent-loop.ts; provider retry and limit classes (pi/packages/ai/src/utils/retry.ts); MCP sign-in, paste redirect and copy (pi/packages/coding-agent/src/extensions/mcp/, pi/packages/mcp/src/oauth/); transcript deltas and Anthropic inline tool changes (pi/packages/ai/src/utils/transcript.ts, pi/packages/ai/src/api/anthropic-messages.ts); editor, pickers and sign-in screens (pi on PATH). Virtual models and the cache warmer are settled (owner decisions). |
packages/core/src/runtime/turn.ts, packages/core/src/runtime/provider.ts (retry), packages/extensions/src/mcp.ts, providers, apps/tui |
openai/codex |
default | architecture, ui | input_queue.rs, turn and tool orchestration; the ui sweep's reference for user and agent messages, contrast, and the agent view (owner, 2026-10-05: minimal and expressive): codex-rs/tui/src/ history cells, status indicator, and the insta snapshots under codex-rs/tui/src/snapshots/ |
packages/core/src/runtime/agent-loop.ts |
primeintellect-ai/prime-agent |
main (Rust port since 39bc99a, 2026-09-29) |
architecture | RLM host seam prime-agent/crates/pa-core/src/session_engine/rlm_host.rs (spawn, collect snapshot, progress notes); kernel prime-agent/crates/pa-core/src/kernel/; loop prime-agent/crates/pa-agent/src/agent_loop/run.rs; orphan reaping prime-agent/crates/pa-core/src/kernel/orphan_journal.rs, prime-agent/crates/pa-daemon/src/boot_reap.rs; Python side prime-agent/prime-agent-runtime/src/rlm/ |
packages/extensions/src/cell.ts, packages/extensions/src/delegate.ts, packages/extensions/src/exec-tools.ts, apps/tui/src/headless.ts |
exoharness/exo |
default | architecture | exo/exoharness/typescript/model-runtime/turn-loop.ts |
packages/core/src/runtime/turn.ts |
deepseek-ai/deepseek-harness |
default | architecture | deepseek-harness/packages/core/agent-loop/src/agent.ts |
packages/core/src/runtime/agent-loop.ts |
Claude Code (installed claude) |
installed release | ui | The ui sweep's first reference for the transcript (owner, 2026-10-05): a user message, an agent reply, a subagent, a queued message and a tool call each have their own look; finished tool work collapses to one summary line with detail on demand. Run with HOME under the scratch directory and no credentials; screens that need a model come from the owner's captures. |
apps/tui |
vercel-labs/fx |
default | ui | The ui sweep's reference for tool runs, thinking and the tree view (owner, 2026-10-05), and for input and layout; not for color: shell-like inline output that keeps scrollback, the input line, slash commands, streaming and tool-call rendering, the settle-then-capture pty tests (fx/tests/e2e); release binary by gh release download --repo vercel-labs/fx --pattern '*linux*' --dir <scratch>/fx |
apps/tui, packages/e2e/src/pty-fixture.ts |
UsefulSoftwareCo/executor |
default | architecture | MCP and tool sourcing: connection pool, catalog staleness, OAuth outside the SDK, tools.search ranking |
packages/extensions/src/mcp.ts |
pingdotgg/t3code |
main (0c811201, 2026-10-03; orchestration V2 since de343914) |
architecture, ui | Orchestration V2 over external agent CLIs: design t3code/docs/orchestration-v2/ (README, core-graph-and-data-model.md, feature-lifecycles.md, orchestrator-mcp-server.md), t3code/docs/internals/overview.md; decide/commit/outbox: t3code/apps/server/src/orchestration-v2/Orchestrator.ts (dispatchWithReceipt), EventSink.ts (commitCommand), EffectOutbox.ts, EffectWorker.ts, KeyedSerialExecutor.ts; adapter contract ProviderAdapter.ts; restart ProviderRuntimeRecoveryService.ts; child wake NotificationMailbox.ts; checkpoints and revert t3code/apps/server/src/vcs/GitVcsDriver.ts (capture, restore, diff), orchestration-v2/CheckpointRollbackService.ts, CheckpointRestoreSafety.ts; worktrees orchestration-v2/ThreadLaunchService.ts, t3code/apps/server/src/storageCleanup.ts; handoff budget orchestration-v2/ContextHandoffBudget.ts; inbox and lineage UI t3code/packages/client-runtime/src/state/threadInbox.ts, threadRelationships.ts |
packages/core/src/runtime/agent-loop.ts, packages/core/src/server/server.ts, packages/extensions/src/delegate.ts, packages/extensions/src/session-tools.ts, packages/extensions/src/btw.ts, packages/extensions/src/compaction.ts, apps/tui |
| Source | Sweep | Read it for |
|---|---|---|
| Cursor's harness notes (2026-09) | efficiency | cost per task by billing type, prompt and tool-schema trimming, cache layout, sparse line numbers, reasoning continuity; summarized in docs/architecture/efficiency.md |
-
Line counts across these repos compare different scopes (one file against gent's whole loop). Draw no size conclusion from them.
-
gent's step policy (
classifyStepinpackages/core/src/runtime/turn.ts, a pure function with a table test) already matches opencode v2: adopted. -
The queue-as-one-module shape (opencode
inbox.ts, codexinput_queue.rs) is adopted:packages/core/src/runtime/agent-loop.ts. -
fx's settle-then-capture pty method is adopted:
packages/e2e/src/pty-fixture.ts. -
The inspected prior-art paths do not persist gent's step-position and in-flight execution receipt contract. Pi 1.0 persists tool/prompt deltas and virtual-model state; those do not supply that contract. gent's exact mid-turn resume (in
packages/core/src/runtime/agent-loop.tsandpackages/core/src/runtime/turn.ts) is a capability the owner keeps or drops; a sweep does not decide it. -
The yield of every comparison so far was bugs found while reading gent with the prior art in mind, more than code removed.
-
Rejected from prior art: an LLM permission reviewer, a static tool table, a mutex event queue, unbounded steps, whole-log replay, text-blob compaction (
NORTH_STAR.md→ Rejected). -
Pi main 1.0 (
86dfceec4, Pass 27) replaces the historical pico comparison. gent already has kernel tool discovery, MCP calls and classifiers; a second tool-exposure vocabulary or codemode sandbox is not adopted. Physical routing/accounting and persisted prompt/tool deltas are capability gaps, with no measured saving claimed. -
Pi's warmer makes paid replay requests, bounded by lifetime, replay safety and expected savings. gent retains its one-hour root/five-minute child caches and cold-window handoff. Unconditional idle pings remain rejected; an opt-in warmer needs matched task cost and quality evidence.
-
A native image-model primitive has no current consumer. Pass28's full extension review and root's product-source search found no image-generation caller; existing image handling projects message/MCP content. Decided by small-interface-deep-implementation and subtract-before-you-add: keep image generation in an ordinary extension tool if requested, and add a kernel primitive only for a demonstrated need.
-
PI27-4 prompt/tool deltas (Pass 28,
~/.cache/architecture-loop/gent/pass28/efficiency.md): no core stable/changing agent-block split. Shipped extensions and real sessions keep the agent block byte-stable (saving 0). When an extension changes content mid-session, the existingnoticespath costs less than a split on every replayed capture (38.9–65.4% against 27.8–60%), with no core change. The extension guide now says so (EF28-1). Pi 1.0 native transcript deltas stay out of scope. -
PI27-1 virtual models, owner decision (Pass 28): gent keeps explicit model selection (
/model,agents[name],driverOverrides, RunSpec overrides). There is no core routing seam and no automatic or per-turn router. A later routing policy is an opt-in extension. It needs matched completed-task cost and quality evidence, and physical-model prices, limits, admission and accounting stay authoritative. Pass 29 rechecked Pic10bfb0d7(virtual-models.tsunchanged since Pass 27) and found no new evidence. Reopen only on an owner request or a paid matched measurement the owner authorizes. -
PI27-3 cache warming, owner decision (Pass 28): no warmer. gent keeps the Anthropic root 1-hour and child 5-minute cache lifetimes, the shared-block markers and the cold-window handoff. The loop sends no keep-alive. If the owner authorizes a paid matched measurement, the first candidate is streaming-only warming. Idle pings stay rejected. Pi's 0.15 idle probability and $0.05 threshold are Pi's policy, not gent evidence. Pass 29 rechecked Pi
c10bfb0d7(cache-warmer.tsunchanged since Pass 27) and found no new evidence. Pass 30 measured it (~/.cache/architecture-loop/gent/pass30/research-cache-ttl.md; Pi9fba660cf,cache-warmer.tsunchanged): on 87,440 recorded Claude Code requests the 1-hour lifetime costs least; 5-minute options cost 7–30% more and raise cold compaction from 3.7% to 26% of turn starts; a child streaming warmer would save 2.7–9.2% but needs a core replay verb. Owner decision (2026-10-03): keep the 1-hour root cache, no warmer, no mixed lifetime. -
Pi
c10bfb0d7(Pass 29,~/.cache/architecture-loop/gent/pass29/prior-pi1.md): Anthropic inline tool definitions (inline-tools-2026-09-15) do not reopen PI27-4. Changing extension content goes throughnotices; since Pass 30 hot extensions, the tool list follows the extensions on the next turn (see the catalog-pin row below). MCP CIMD client registration needs a hosted https client document, which gent does not have, so dynamic registration stays. gent's retry reads typed errors and the event shapes each driver names, never message text, so pi's text patterns are not adopted. -
opencode v2
1549712761(Pass 29,~/.cache/architecture-loop/gent/pass29/prior-opencode.md): 308 commits since the Pass 22 ref5c53cfc342. The step outcome, the inbox and the hook surface did not change shape, and the Settled rows above hold. Open from this comparison: a provider refusal handled as a block, not as an empty answer (P29-1); a cache group for spawned sessions (P29-2, EF24-Q1, measure first); text verbosity (P29-3: owner decided low, sent sinceec5157a19). Rejected: eager tool start (breaks binding-before-run, rule 6), native provider compaction (an opaque window tied to one endpoint, against rule 17; no measured saving), saved permission rules (rule 7). -
prime-agent is a Rust parity port of its TS product since
39bc99a(2026-09-29), so the TS paths earlier passes cite are gone. At Pass 29 (cf285dc) its loop is still pi's shape, it still has one model tool (ipython), and a child still reports by message;rlm.collectwith timeout 0 is the snapshotdelegate.listalready gives (A3 stays rejected). Not adopted, with no consumer: ACP,rlm.create_session, progress notes, the continual harness, the agent-message rate limit, and dropping the turn cap. Taken from it: process-group reaping after a host crash (P29-prime-1, -3) and a headless run that waits for its children (P29-prime-2). Report:~/.cache/architecture-loop/gent/pass29/prior-prime.md. -
Catalog pin for the cache lifetime (Pass 30 hot extensions, item 8 Option C;
~/.cache/architecture-loop/gent/pass30/apply-hot3.md, measurement test inpackages/extensions/tests/cell-surface.test.ts): rejected. The tool list is not fixed per session: an added, edited, disabled or removed extension reaches the next turn. Measured with the scripted model on a cell turn: the system text is 16,729 characters, its Host Tools section starts at 8,648; a body edit sends the same bytes (the request'sprofileRevisionnames only what the model sees, so it is no miss cause either); an added tool keeps a common prefix of 13,850 of 16,808 characters, a disabled extension 13,771 of 16,650, and the rest of the request is written to the cache once (about 1.9 × the history after the change point). The pin would hold back an edit for one agent's turns, against lean core (no mechanism for a rare, already visible cost) and one interaction model (an edit reaches the next turn); the@gent/cachefold names the cause (ExtensionsChanged) when it occurs. -
t3code
0c811201(Pass 30,~/.cache/architecture-loop/gent/pass30/prior-t3code.md): orchestration V2 is an event-sourced command processor over external agent CLIs (Codex, Claude Code, Cursor, ACP, OpenCode, Pi). It has a per-thread semaphore, one transaction for events, projections, receipt and outbox, and a worker pool for provider I/O. gent already has the overlap (durable idempotent commands, rule 5, cursor replay, children that wake the parent) in a stronger form: one actor mailbox per branch, and no lock-order or commit-publish races (t3code6108ef3d,5108c978). Not adopted, with no consumer because gent owns its loop and transcript: run attempts, steer by restart, capability flags, provider rollback and portable provider handoffs. Rejected:delegate_taskmode: wait(children wake, never block), retry by error text,completionWakepolicies. Open owner questions: worktrees for children (O1b),/btwmerge-back (O2), resume at a usage-limit reset (O3), gent as an ACP agent (O4). -
Per-turn workspace checkpoints, t3code O1 (Pass 30,
~/.cache/architecture-loop/gent/pass30/proposal-checkpoints.md,apply-checkpoints.md): closed.@gent/checkpoints(packages/extensions/src/checkpoints.ts) captures a turn's start at its firsttoolCallwith a side effect and its end atturnAfter, in a private bare store per work tree (opencode's separate git dir, no alternates and no copy of the user's index);/diff turn [n]reviews a turn's patch and/reverttakes the files, and on request the conversation throughSession.forkBranch, back to before a turn, with undo. Unlike opencode (it overwrites user edits) and t3code (it blocks every shared thread), a revert writes only the paths this session's lineage changed, refuses and names a path another writer also changed, and is refused only by a loop that runs in the same work tree. Not adopted: a per-step capture (opencodestep-finish), the prompt back in the composer (no client seam). -
opencode's models.dev catalog (
devc42ae0d56b, Pass 30,~/.cache/architecture-loop/gent/pass30/proposal-models-dev-catalog.md): adopted — models.dev fills one core catalog, a model's npm package and protocol pick its API class, a key env variable or a stored key activates a provider, and config adds or patches providers (packages/core/src/runtime/provider.ts). Not adopted: the bundled snapshot (owner decision: no snapshot in the binary), the five-minute full refetch (gent revalidates hourly with an ETag) and the file lock (SQLite serializes the writers ofmodel_catalog_snapshots). -
Tool image scaling (Pass 30,
~/.cache/architecture-loop/gent/pass30/apply-autoscale.md): an image past the store's limits is scaled to fit when it is saved, not refused. Read: pi200387122(pi/packages/coding-agent/src/utils/image-resize-core.ts,image-process.ts; claude-paint'slookreaches it through pi's read tool), codex550eb505(codex/codex-rs/utils/image/src/lib.rs,core/src/image_preparation.rs,core/src/context/image_resize_notice.rs), opencodedev907b3bc518(opencode/packages/core/src/image.ts,image/photon.ts), the Claude Code 2.1.289 binary, and the Anthropic and OpenAI vision guides (2026-10-04).Prior art Target Per provider or model Resampler Re-encode Original kept Scale told to the model Coordinates pi 2,000x2,000 and 4.5 MiB of base64 a per-model field with the same default on every model; once, as the image enters history Lanczos3 (photon WASM) PNG, then JPEG at 80, 85, 70, 55, 40; then each side x0.75 until it fits no [Image: original WxH, displayed at wxh. Multiply coordinates by S to map to original image.]one factor, original/display width codex 2,048 a side and 2,500 32-pixel patches ( high); 6,000 and 10,000 (original)per detail level and model; once, at the durable history boundary Triangle (Rust image)the source format (PNG; JPEG at 85; WebP lossless); GIF becomes PNG; no byte loop no a developer notice, Image N of M ... was resized from WxH to wxh pixels, behind a flag that is offnone opencode 2,000x2,000 and 5 MiB of base64 one config for every model; at read Lanczos3 (photon WASM, patched to load in a compiled binary) PNG, then JPEG at 80, 85, 70, 55, 40; then each side x0.75 no nothing none Claude Code 2,000x2,000, 5 MiB of base64, 3.75 MiB of bytes a per-model image_limits(1,568 on some models); at readBun.Imagedefault (Lanczos3)the source format; past the bytes, palette PNG, then JPEG at 80, 60, 40, 20, then 1,000 px JPEG at 20 no pi's line, beside a source line one factor, as pi Providers: Anthropic takes up to 8,000 px a side, but 2,000 at most when a request has more than 20 images, and 5 MB of base64 an image on Bedrock and Vertex (10 MB direct). Its server scales an image down to 1,568 px or 1,568 visual tokens (standard models), or 2,576 px or 4,784 tokens (Claude 4.7 and later), so a larger image costs only bytes and latency. OpenAI scales to 2,048 a side and 2,500 patches at
high. Decision, by cheap per task and lean core: one fixed profile at the save, not one per model. AToolImageis saved with no model in view, goes to every model the session switches to, and its bytes sit in the cached prefix. A fit per model at request time encodes again on every request or changes the prefix at a model switch; pi and codex scale once for the same reason. The profile is the one the prior art shares: 2,000 px a side (the many-image rule, and below the 2,576 the newer Claude models keep) and 3.75 MiB of bytes (5 MiB of base64). Adopted: Lanczos3. An image inside both limits is stored byte for byte, with no decode. A scaled image keeps its format where the platform encodes it (PNG, JPEG at 80, WebP at 80), and a GIF becomes a PNG of its first frame, as in codex and Claude Code. Past the bytes: JPEG at 80, 60, 40, 20 (Claude Code), then each side x0.75 (pi, opencode). Only bytes no codec decodes fail.ToolImagerecordsoriginalWidthandoriginalHeight, and the line beside the image names the original size and the factor in pi's words. The line reads stored fields only, so it stays the same bytes. The codec is Bun's ownBun.Image(as in Claude Code), behindGentPlatform. It decodes PNG, JPEG, GIF and WebP and works in the compiled binary with no file beside it; photon needs its WASM beside the binary or a patch. Not adopted: a per-model target (Claude Code's 1,568 loses detail on the newer models), palette PNG (one more candidate for a rare case), codex's patch budget (the provider applies it), a developer-role notice (a second message for each image). Counsel round 1 (same pass) added three rules. Metadata: of what an encode can carry,Bun.Imagekeeps only the ICC profile (it drops EXIF, XMP and comments), so a 1x1 JPEG with a 4 MiB profile stayed past the limit at every encode. Codex keeps an RGB profile and the EXIF block (utils/image/src/lib.rs), Claude Code keeps whatBun.Imagekeeps, and none of them bounds the profile's size. Adopted: a profile that an encode carries at more than a quarter of the byte limit is left out of that encode (the image then reads as sRGB), and an ordinary one stays. The size is measured in each encode, not in the source: a PNG deflates its profile, so counsel round 2 found a 4 MiB profile that took 4,107 bytes in a PNG source and 4 MiB in each JPEG encode; measured in the source, it took 16 encodes and shrank 1800x1800 pixels of noise to 843x843, and measured in each encode it takes 2 and keeps 1800x1800. Factors: pi's one factor, from the width, is wrong for a thin image (1x6000 stored as 1x2000 maps y by 3, not 1), so the line names one factor for each side when they differ at three decimals; three decimals keep a mapped point within one original pixel at a 2,000-pixel edge. Basis: pi applies the EXIF orientation before it measures (pi-mono1b34779,utils/exif-orientation.ts) but sends an image inside its limits as it is; codex copies the EXIF block. Adopted: every size is of the upright image, and a JPEG its orientation turns goes through the codec, so the stored raster is upright and no provider's EXIF handling matters. Cost: the ladder is 24 side bounds of 4 or 5 encodes (96 to 120), and the codec cannot stop an encode it has started; with the profile bound measured in each encode, an encode keeps at most a quarter of the limit for the profile, and JPEG at quality 20 fits 2,000 x 2,000 pixels of noise in under 0.8 MB, so the real codec fits every image at the first side bound in at most 5 encodes, and the smaller bounds stay as a guard. -
Images from cell results (Pass 30,
~/.cache/architecture-loop/gent/pass30/apply-cell-images.md): a tool image the cell shows reaches the model. Read: prime-agentc24ac22— no display hook; only an explicitattach_image(*paths)emits aapplication/vnd.prime-agent.attachment+jsonevent (prime-agent/skills/attach-image/src/attach_image/attach_image.py:196-260,crates/pa-core/src/kernel/shared.rs:57), turned into image blocks after the text (crates/pa-core/src/tools/ipython.rs:245-255,:440-442); an MCP image a cell's code gets is not forwarded (prime-agent-runtime/src/rlm/mcp.py:1143-1153); no count cap. Codex550eb505—execcode mode has an explicitimage(result.content[0])helper (codex-rs/code-mode-protocol/src/description.rs:20-21,code-mode-runtime/src/runtime/callbacks.rs:121-150);cua_repl/node_replare outside servers whose images come back as MCP image blocks (protocol/src/models.rs:2344-2425); no count cap. opencode907b3bc518— code mode moves every image a nested MCP call returns into the result's attachments, whatever the code does (packages/opencode/src/tool/code-mode.ts:84-114,:295-305); no count cap. Decision, by lean core and cheap per task: no helper and no automatic forward. The cell shows an image as it shows text — an object taggedToolImagein its value or aconsolecall's arguments — since a gentToolImageis already a typed reference the display can find without running cell code, and the helpers of prime-agent and Codex exist because their displays are text. Only shown images go, so an image an inner call returned stays out unless the code wants it (opencode's rule pays every screenshot). At most the newest 5 per cell result, the smallest request bound of a shipped API class and the request's drop step. The image goes through the native projection, from the stored result.
None open.