Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
3ad43c0
Import the two-machine pairing snapshot
ZeroPoint95 Oct 4, 2026
0d90667
Add tools/atlas: interactive terminal architecture explorer
ZeroPoint95 Oct 4, 2026
83a68c9
Remove accidentally committed linux binary cmd/codeaf/codeaf
ZeroPoint95 Oct 4, 2026
164accb
Ignore cmd/codeaf/codeaf, the output of go build in cmd/codeaf
ZeroPoint95 Oct 4, 2026
07638b2
Add codeaf atlas: the architecture map inside the binary
ZeroPoint95 Oct 4, 2026
88126ed
Merge the atlas implementation into the pairing work
ZeroPoint95 Oct 4, 2026
3f8e454
Integrate the pairing snapshot with upstream dev
ZeroPoint95 Oct 4, 2026
2cd0953
Add /atlas: the architecture map inside the chat
ZeroPoint95 Oct 4, 2026
4cebf8f
Write a device's own directory record when a pairing finishes
ZeroPoint95 Oct 4, 2026
3b33bfa
Remove the generated command binary after integration
ZeroPoint95 Oct 4, 2026
517fa1b
Give /atlas a fate at home
ZeroPoint95 Oct 4, 2026
a78b9d8
Remove tools/atlas and every reference to the TypeScript twin
ZeroPoint95 Oct 4, 2026
181075a
Name the atlas maps: a Map type, an ordered registry and pairing as i…
ZeroPoint95 Oct 4, 2026
c6c736d
Open the atlas by name: codeaf atlas [map], /atlas [map], a picker an…
ZeroPoint95 Oct 4, 2026
75ed4b7
Write the named maps into the manual and the unreleased changelog
ZeroPoint95 Oct 4, 2026
881ac77
Atlas: opaque boxes and panels, labels beside arrows, short map title
ZeroPoint95 Oct 4, 2026
b8da13f
Atlas picker: name as its own bold column, description dim
ZeroPoint95 Oct 4, 2026
eb4bbb7
e2e: find the chat process on macOS, which has no /proc
ZeroPoint95 Oct 4, 2026
5b41ee6
Say why a takeover failed; note how to cross-build for Linux with a c…
ZeroPoint95 Oct 4, 2026
e0ddabd
Merge cross-platform durability verification
ZeroPoint95 Oct 4, 2026
a1c152a
Relay: commit a frame's pointers as one group on a Mac, so a chat is …
ZeroPoint95 Oct 4, 2026
2308555
Name a taken chat's project for the machine it came from, not a folde…
ZeroPoint95 Oct 4, 2026
e835494
Fix the relay group-commit changelog entry's front matter
ZeroPoint95 Oct 4, 2026
d7df379
Bring the relay group-commit changelog entry inside the rules
ZeroPoint95 Oct 4, 2026
438f01f
pair: copy the code by drag and c, and /pair <code> --replace behind …
ZeroPoint95 Oct 4, 2026
6823079
TestPairByLinkEndToEnd: expect the asking computer's own OS, not linux
ZeroPoint95 Oct 4, 2026
4dc2ff1
Remove the GitHub workflows and ignore future ones
ZeroPoint95 Oct 4, 2026
9826119
Merge latest dev into the local Wormhole branch
ZeroPoint95 Oct 9, 2026
5240bb2
Merge Wormhole (zeropoint95/wormhole) onto dev
AbirAbbas Oct 21, 2026
a159917
cells: absent on Windows, on by default only on dev and staging, and …
AbirAbbas Oct 21, 2026
cfc6179
build: take furrow from its own repository, not a vendored engine/
AbirAbbas Oct 21, 2026
bc8f3e5
docs: reconcile the two-computer manual and consolidate its change entry
AbirAbbas Oct 21, 2026
47634cb
fix: draw atlas marks through the shared glyph vocabulary
AbirAbbas Oct 21, 2026
d41fc60
fix: fence self-hosted pairing mailboxes by generation
AbirAbbas Oct 21, 2026
dda5c37
test: isolate hosted relay tools from the caller home
AbirAbbas Oct 21, 2026
3fa2380
feat: bound hosted relay admission and stored frames globally
AbirAbbas Oct 21, 2026
19f4804
docs: rehearse a staging-first hosted relay deployment
AbirAbbas Oct 21, 2026
dac5af1
manual: a moved chat's stopped dev server is answered where the quest…
AbirAbbas Oct 21, 2026
157df0d
Keep working-tree secrets out of captures with a streaming scanner
AbirAbbas Oct 21, 2026
ab0ae25
Prove committed Git history moves intact and sealed between paired homes
AbirAbbas Oct 21, 2026
f049503
Keep unpaired homes quiet until a pairing completes or a code is offered
AbirAbbas Oct 21, 2026
d7a8bdb
Honor relay and cell off switches at the real doors
AbirAbbas Oct 21, 2026
cdec832
change entry: what leaves the machine, as the safety work made it true
AbirAbbas Oct 21, 2026
ff1e190
fix: condition continuation on the holder and fence shown
AbirAbbas Oct 21, 2026
a9a2ce5
fix: preserve unpublished turns and block stale local reopen
AbirAbbas Oct 21, 2026
b826a5c
fix: keep displaced windows view-only and open completed moves
AbirAbbas Oct 21, 2026
7143f59
fix: start relay work behind the first terminal frame
AbirAbbas Oct 21, 2026
bbce633
fix: publish the approving computer before granting a link
AbirAbbas Oct 21, 2026
5723357
fix: file moved copies under their origin and open their workspace
AbirAbbas Oct 21, 2026
6b24cd7
fix: explain device removal without an empty-list message
AbirAbbas Oct 21, 2026
cd03612
test: exercise online and offline continuation through the terminal
AbirAbbas Oct 21, 2026
5aa499c
fix(resident): seat work and housekeeping on the host
AbirAbbas Oct 21, 2026
3d09ad2
fix(engine): refuse hosts with a different resolved sync setting
AbirAbbas Oct 21, 2026
ecb2e77
fix(executor): restrict cell argument protection to cell workspaces
AbirAbbas Oct 21, 2026
8a48443
fix(memory): keep portable ledgers out of cells-off sessions
AbirAbbas Oct 21, 2026
c70460f
fix(pair): require a for terminal link approval
AbirAbbas Oct 21, 2026
f6cd9d9
fix(pair): keep self-hosted invitations on the chosen service
AbirAbbas Oct 21, 2026
a69be13
build: account for the measured Wormhole binary growth
AbirAbbas Oct 21, 2026
c76bc34
test(relay): bound local Worker load and count transport retries
AbirAbbas Oct 21, 2026
000c5cd
fix: derive new limit text from constants and trim trailing whitespace
AbirAbbas Oct 21, 2026
767a4fa
pair: answer --help where moving chats cannot run
AbirAbbas Oct 21, 2026
b7c1b82
Merge latest dev into abir/wormhole
AbirAbbas Oct 21, 2026
ffe5743
change entry: number it for #1888
AbirAbbas Oct 21, 2026
941836b
e2e: the pairing journey fails when a step fails, and reads a self-ho…
AbirAbbas Oct 21, 2026
70ba8e9
e2e: the pairing journey keeps the suggested name like a person would
AbirAbbas Oct 21, 2026
cb9c289
device pages keep the vocabulary law; a pairing key is not a colour
AbirAbbas Oct 21, 2026
2cb0da2
e2e: the journey looks for r remove on the other computer's row
AbirAbbas Oct 21, 2026
1b82479
fix(executor): probe the actual Linux jail helper and report reduced …
AbirAbbas Oct 22, 2026
07cb65e
test(cells): declare availability separately from real engine acceptance
AbirAbbas Oct 22, 2026
25253b2
fix(session): rebase moved-chat paths and tell the model where it landed
AbirAbbas Oct 22, 2026
5d82efe
fix(tui): keep the first message typed over an arrival card
AbirAbbas Oct 22, 2026
69b3e85
fix(pair): explain how a fresh home can approve a device
AbirAbbas Oct 22, 2026
3e96b75
e2e: the pairing journey stops the engines its homes started
AbirAbbas Oct 22, 2026
72e42d4
e2e: the journey's engine cleanup covers the fresh-install probe
AbirAbbas Oct 22, 2026
133a22f
session: moved-path mapping decodes through the one tool-argument door
AbirAbbas Oct 22, 2026
635b6e8
chat: new chats keep the host access their commands have on dev (C23)
AbirAbbas Oct 22, 2026
04df35c
manual: chats are not sandboxed, and /setup does not open the network
AbirAbbas Oct 22, 2026
f176e6a
keys: a certificate bundle is not a private key
AbirAbbas Oct 22, 2026
31dcfa8
exec: health checks and helpers drain output the way dev did
AbirAbbas Oct 22, 2026
4354436
session: a composer ! command counts as a change for the seal
AbirAbbas Oct 22, 2026
3b564d1
cell: nothing is deleted to save disk unless a person runs cell gc (C25)
AbirAbbas Oct 22, 2026
a9357fa
chat: existing chats keep their layout, and stable builds say how mov…
AbirAbbas Oct 22, 2026
a486dcd
cellstore: every seal screens the whole tree before it captures (C9)
AbirAbbas Oct 22, 2026
23c2906
sync: refuse to move a chat through a service that cannot condition a…
AbirAbbas Oct 22, 2026
9004205
home: a removed device is told so on home, once (C3)
AbirAbbas Oct 22, 2026
8ca2a3d
sync: turns the other computer had not uploaded can open as their own…
AbirAbbas Oct 22, 2026
ca55104
chat: moving chats is opt-in on every build (C26)
AbirAbbas Oct 22, 2026
13065e0
tests: opt in where moving chats is needed, and keep the gc budget ro…
AbirAbbas Oct 22, 2026
6e869a6
Merge dev into abir/wormhole
AbirAbbas Oct 22, 2026
debff17
tui3: register dev's completion-toast chord with the chord law
AbirAbbas Oct 22, 2026
716a21c
merge: one 'stop a task from the chat' section, and the rebuilt run r…
AbirAbbas Oct 22, 2026
321c2cd
Merge dev into abir/wormhole (automatic contextual memory)
AbirAbbas Oct 22, 2026
03c490c
store: the add half of a memory write is its own step, and the ledger…
AbirAbbas Oct 22, 2026
35ec934
Moving chats is on by default, and CODEAF_CELLS is gone (C27)
AbirAbbas Oct 23, 2026
dfada63
manual: moving chats is on by default
AbirAbbas Oct 23, 2026
d00c83e
fix: run native Windows commands in Git Bash
AbirAbbas Oct 23, 2026
0461965
changelog: number the Windows Git Bash entry for #1909
AbirAbbas Oct 23, 2026
8550f0f
Chats share one store per home, git-ignored output stays home, and se…
AbirAbbas Oct 23, 2026
500ce8d
manual: what stays home when a chat moves
AbirAbbas Oct 23, 2026
4e61b33
Merge dev into abir/wormhole (task tabs, model rotations, background …
AbirAbbas Oct 23, 2026
4627c61
Home never names a copy's folder before its reading finds it here
AbirAbbas Oct 23, 2026
9d9b2f7
A command never waits on a disk sync for its own record (C28)
AbirAbbas Oct 23, 2026
3b2c2c6
manual: what survives a crash or a power cut
AbirAbbas Oct 23, 2026
16970cb
cellstore: the wrap test declares the engine rather than asking the c…
AbirAbbas Oct 23, 2026
fc36148
Merge #1909 (Git Bash on native Windows) and bring moving chats to Wi…
AbirAbbas Oct 23, 2026
0eba223
Merge abir/wormhole-windows: moving chats on native Windows, with #19…
AbirAbbas Oct 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,13 @@ internal/manual/pages.pack.gz
.furrow/
bench/idle-surface/runs/
work/

# hosted relay dev install (wrangler, miniflare)
relay/hosted/node_modules
relay/hosted/.wrangler/

# External furrow profile measurements keep their build output inside this worktree.
.cargo-target/

# Native Windows test executables are local acceptance artifacts.
.wintest/
21 changes: 17 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,9 @@ embed: manual-pack-law

# ── the furrow that rides inside ────────────────────────────────────────────
#
# EVERY codeaf IS A codeaf WITH FURROW, so the build fetches furrow before it
# can produce one. This step downloads the release pinned in
# Unix builds carry furrow, so the build fetches it before producing codeaf.
# Windows embeds the native engine through the same artifact door.
# This step downloads the release pinned in
# internal/furrowbin/pin.json for whatever platform is being built for, checks
# it against the sha256 the pin names, keeps it in a gitignored third_party/
# cache, and stages it gzipped where go:embed picks it up. Six megabytes of
Expand All @@ -60,7 +61,7 @@ embed: manual-pack-law
# build that produced a codeaf without furrow inside it.
#
# On a machine with no network, point it at an artifact already on disk — the
# sha256 is checked either way, so this is an offline road and not a looser one:
# explicit artifact is a developer override; the normal fetch checks the pin:
#
# make furrow FURROW_ARTIFACT=~/.agentfield/bin/furrow
#
Expand All @@ -72,10 +73,22 @@ embed: manual-pack-law
FURROW_GOOS := $(shell go env GOOS)
FURROW_GOARCH := $(shell go env GOARCH)

# Normal builds fetch the pinned release. Explicit artifacts and external source
# checkouts are deliberate developer overrides, staged through the same door.
FURROW_SOURCE ?=
FURROW_SOURCE_TARGET = $(if $(CARGO_TARGET_DIR),$(CARGO_TARGET_DIR),$(FURROW_SOURCE)/target)

furrow:
ifneq ($(strip $(FURROW_SOURCE)),)
cd "$(FURROW_SOURCE)" && cargo build --release --locked -p furrow-cli
@env -u GOOS -u GOARCH go run ./internal/furrowbin/cmd/fetch \
-goos=$(FURROW_GOOS) -goarch=$(FURROW_GOARCH) \
-built "$(FURROW_SOURCE_TARGET)/release/furrow"
else
@env -u GOOS -u GOARCH go run ./internal/furrowbin/cmd/fetch \
-goos=$(FURROW_GOOS) -goarch=$(FURROW_GOARCH) \
$(if $(FURROW_ARTIFACT),-from "$(FURROW_ARTIFACT)")
$(if $(FURROW_ARTIFACT),-built "$(FURROW_ARTIFACT)")
endif

# The symbol table and DWARF are a third of the shipped binary and nothing at
# runtime reads them. Stripping costs symbolized panic traces, which is exactly
Expand Down
64 changes: 64 additions & 0 deletions PERF.md
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,35 @@ and its schema readers the ones sec brought — so the cost is pr-af's own code
and prompts and the tables that code carries. The budget rises by exactly that
cost, to 72,395,784.

It was reset a ninth time on 2026-10-21 for paired computers (Wormhole),
with the owner's approval to pay exactly the measured feature cost and keep
the existing byte headroom. Measured on linux/amd64 with Go 1.26.5, the packed
manuals and the stripped, trimmed flags of `make build`:

| source and embedded engine | bytes |
| --- | --- |
| `origin/dev` at `428baa65f`, its own pinned furrow v0.1.0 | 70,959,369 |
| Wormhole with that same v0.1.0 artifact | 74,219,785 |
| Wormhole with the furrow v0.2.0 candidate | 74,375,433 |
| Go code, corpora and Go metadata growth | 3,260,416 |
| embedded engine growth, including alignment | 155,648 |
| total feature cost | 3,416,064 |

The dev baseline was exported with `git archive origin/dev` and built with its
normal `make build`, which fetched its own pinned v0.1.0 artifact. The candidate
uses the supplied prebuilt v0.2.0 artifact through `FURROW_ARTIFACT`; no engine
was rebuilt. The gzipped engine grows from 3,613,636 to
3,767,522 bytes. Most of this bill is the Go integration:
cells and their executor, encrypted transfer and indexing, device pairing,
engine compatibility and the surface/manual doors. The engine keeps its fast
profile.

The budget rises from 72,395,784 by exactly 3,416,064, to
75,811,848. The linux/amd64 headroom remains
1,436,415 bytes, exactly what the dev baseline had.
These measurements account for this platform's cost; release measurements on
other platforms remain part of their own build checks.

## Adaptive run shutdown grace

`Agent.Close` cancels adaptive runs and their name calls, then gives all accepted
Expand Down Expand Up @@ -2965,6 +2994,41 @@ ordering guarantee, not a merge of caches written by separate processes.
Restart fixtures drain their owned scheduled writes before discarding process
memory. No timeout, response limit or request/retry budget changes.

## Local Worker conformance bounds

The local Worker proof runs tracks and suites sequentially and defaults to two
Go test cases at a time; watch cases run alone so the thousand-socket case has
the proxy to itself. Its test-only HTTP transport admits two requests at once,
releasing the request slot when an upgraded watch's headers arrive. The canonical
WebSocket dialler and the signed HTTP client share this same bound. The shared
policy is `relay/hosted/test/proxy-env.sh`; the canonical assertions and their
internal concurrency stay unchanged. Authorization cases keep the normal
mailbox lifetime. A separate four-second mailbox service runs the canonical
expiry case, and a third service remains capped at two mailboxes for RelayFull.
The runner refuses a skipped expiry case, so these fixtures preserve all the
original assertions under local proxy load.

The thousand-socket watch case uses an isolated local runtime with the same
limits. Its original cap, refusal and freed-place assertions all run. Stopping
that fixture after the watch suite prevents its bulk socket teardown from
stalling another identity's five-second dial on the shared development proxy.

Each local Wrangler gets a private package copy under the run's temporary state.
Only that copy's development proxy retries the exact transport exception
`Network connection lost.`, at most twice. It clones the request so each attempt
keeps the same body and signed headers. An application response, including a 500
with those words in its body, is never retried; EOF and other exceptions retain
their failures. Preparation refuses an unknown proxy structure. The production
Worker, installed dependencies and production clients are unchanged.

Each retry is reported at the proxy itself, before HTTP can turn the lost
connection into an indistinguishable 500. The proof table counts retries per
suite and prints the total including startup; the operator smoke checks print
their own counts. Tests exercise the actual pinned proxy with scripted fetches
and an immediate timer, covering request bytes, unchanged application responses,
exact retry exhaustion and refusal of an unknown runtime. The Go request-bound
fixture uses held channels and cancellation rather than sleeps.

## Navigation and first-message response

Home paints its last completed reading and refreshes the world, memory ledger,
Expand Down
2 changes: 1 addition & 1 deletion SIZE-BUDGET
Original file line number Diff line number Diff line change
@@ -1 +1 @@
72395784
75811848
25 changes: 25 additions & 0 deletions THIRD-PARTY-NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

This file covers every third-party Go module compiled into the codeaf binary, plus the two copied components carried in this repository's own tree. It ships beside the binaries in every release. Regenerate it with `go run ./cmd/codeaf-notices generate`.

The embedded furrow engine is a separate Apache-2.0 project from [Agent-Field/furrow](https://github.com/Agent-Field/furrow), copyright 2026 furrow contributors. Its source is maintained upstream; codeaf records its release and artifact hashes in `internal/furrowbin/pin.json`. See [furrow's licence](https://github.com/Agent-Field/furrow/blob/main/LICENSE). Explicit developer artifacts and `FURROW_SOURCE` checkouts replace that pinned engine. Native Windows builds omit it.

## charm.land/bubbletea/v2

- Version: v2.0.8
Expand Down Expand Up @@ -877,6 +879,29 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

## github.com/coder/websocket

- Version: v1.8.15
- Licence: not determined

### LICENSE.txt

```text
Copyright (c) 2025 Coder

Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
```

## github.com/dlclark/regexp2/v2

- Version: v2.5.2
Expand Down
1 change: 1 addition & 0 deletions cmd/codeaf-notices/notices.go
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,7 @@ func renderNotices(components []component) []byte {
var out bytes.Buffer
out.WriteString("# Third-party notices\n\n")
out.WriteString("This file covers every third-party Go module compiled into the codeaf binary, plus the two copied components carried in this repository's own tree. It ships beside the binaries in every release. Regenerate it with `go run ./cmd/codeaf-notices generate`.\n")
out.WriteString("\nThe embedded furrow engine is a separate Apache-2.0 project from [Agent-Field/furrow](https://github.com/Agent-Field/furrow), copyright 2026 furrow contributors. Its source is maintained upstream; codeaf records its release and artifact hashes in `internal/furrowbin/pin.json`. See [furrow's licence](https://github.com/Agent-Field/furrow/blob/main/LICENSE). Explicit developer artifacts and `FURROW_SOURCE` checkouts replace that pinned engine. Native Windows builds omit it.\n")
for _, component := range components {
fmt.Fprintf(&out, "\n## %s\n\n", component.Identifier)
// THE THREE FACTS ARE A LIST because consecutive plain lines are one
Expand Down
23 changes: 23 additions & 0 deletions cmd/codeaf/approvalrecord.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package main

import (
"context"

"github.com/Agent-Field/codeaf/internal/pair"
)

// withApprovalRecord moves the terminal's own-record write ahead of granting
// the request. The new device can read the grant immediately, before this
// terminal prints its receipt, so a write after approval was already too late.
func (d pairDoor) withApprovalRecord() pairDoor {
makeApprover, record := d.approver, d.ownRecord
d.approver = func(route pair.Mailbox) (pair.Approver, error) {
who, err := makeApprover(route)
if err == nil && record != nil {
who.BeforeApprove = func(ctx context.Context) error { return record(ctx, route) }
}
return who, err
}
d.ownRecord = nil
return d
}
Loading
Loading