Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
481 commits
Select commit Hold shift + click to select a range
a8a82d3
Shell outputs: catch folder links made by the command, keep refusal o…
santoshkumarradha Oct 16, 2026
bbd22cd
Shell outputs: count siblings before the snapshot, refuse hard links …
santoshkumarradha Oct 16, 2026
3527131
Shell outputs: refuse all control and invalid-UTF-8 paths, state the …
santoshkumarradha Oct 16, 2026
79b7622
Keep an allow-listed copy of a program's ending data in its action log
santoshkumarradha Oct 16, 2026
55b7b42
Keep senior-dev's claim and check in the ending; reject null and malf…
santoshkumarradha Oct 16, 2026
69f6fb1
Hold the ending's cap to the file's bytes and reject half-empty facts
santoshkumarradha Oct 16, 2026
026f79b
Read an ending's hunt coverage by sec's own rules and never rewrite a…
santoshkumarradha Oct 16, 2026
44e1c5a
Say nothing_to_audit as a true-only fact in sec's no-change ending
santoshkumarradha Oct 16, 2026
f6be022
Join a program child host watcher before returning
santoshkumarradha Oct 16, 2026
f59eeb3
Bound the host watcher regression body handshake
santoshkumarradha Oct 16, 2026
cc63fe6
app: add bounded read-only teams overview pages
santoshkumarradha Oct 16, 2026
96d0180
Merge current app branch while retaining durable delayed team starts
santoshkumarradha Oct 16, 2026
a726014
Arm the missing-key crew fixture before its first open
santoshkumarradha Oct 16, 2026
e515d17
Carry a specialist's stages, actions and ending on the app task page
santoshkumarradha Oct 16, 2026
837b82f
Tie a program's ending and last stage to its current process; bound t…
santoshkumarradha Oct 16, 2026
271b156
Tie a program's lines to the launch that wrote them, never to a time
santoshkumarradha Oct 16, 2026
916f3f7
Read a program's current launch within a budget and page every action
santoshkumarradha Oct 16, 2026
f8d0934
Keep every ending fact and read-state promise on the program wire
santoshkumarradha Oct 16, 2026
ec82032
Bound program metadata reads and reject special files before opening …
santoshkumarradha Oct 16, 2026
450d221
Bound every program record read and carry no window from a stopped read
santoshkumarradha Oct 16, 2026
5063a9b
Size the program record cap to a whole hello so no record codeaf wrot…
santoshkumarradha Oct 16, 2026
b49fe55
State the program metadata budget honestly for escaped producer records
santoshkumarradha Oct 16, 2026
6871cac
Clear exited programs before waiting for their late receipts
santoshkumarradha Oct 16, 2026
ecf2a1d
Read the workspace checkout's status over the app wire, and state tha…
santoshkumarradha Oct 16, 2026
de04eb1
Blank required on every filter driver, drop cut rename records, and l…
santoshkumarradha Oct 16, 2026
b4b54e0
Count lines of tracked checkout entries from diff-index, never open u…
santoshkumarradha Oct 16, 2026
05f818a
Run checkout count and attribute commands at the repository root
santoshkumarradha Oct 16, 2026
5696789
Land a conversation's own task branch only on a bound, revalidated plan
santoshkumarradha Oct 16, 2026
efeb4dd
Serve branches.land.plan and branches.land, and run no unnamed progra…
santoshkumarradha Oct 16, 2026
b1d9ae7
Ask a land's repository root through its bounded, stripped reader
santoshkumarradha Oct 16, 2026
83c0fa6
Report the actual native-confirmed Land producer in checkout status
santoshkumarradha Oct 16, 2026
f0d5637
Keep each conversation's process history one bounded record per job
santoshkumarradha Oct 16, 2026
b7ba6e8
HELD: serve processes.page and processes.log on the app wire
santoshkumarradha Oct 16, 2026
e0e67e4
Bound every process history read and fold, and read only managed logs
santoshkumarradha Oct 16, 2026
4605f89
Say the process history's corrected bounds in the protocol and change…
santoshkumarradha Oct 16, 2026
702448b
Never answer a live process twice, rebuild only a broken head, cut pa…
santoshkumarradha Oct 16, 2026
05c0c0a
Count every service, live and saved process against one page's limit …
santoshkumarradha Oct 16, 2026
2734d1a
Refuse to page an engine that cannot, read no tail for a paged servic…
santoshkumarradha Oct 16, 2026
b82482a
Serialize the process admission test spy captures
santoshkumarradha Oct 16, 2026
968df7c
Wait for the stopped service event before testing removed output
santoshkumarradha Oct 16, 2026
af639aa
Start a task, a program or a memory line through typed idempotent act…
santoshkumarradha Oct 16, 2026
5cbc945
Prove session actions across a real restart and offer only what a far…
santoshkumarradha Oct 16, 2026
8831062
Report where a memory line holds and sync a new claims folder before …
santoshkumarradha Oct 16, 2026
78d9fd5
Hold the widened-reach words to the producer's source and state the d…
santoshkumarradha Oct 16, 2026
e62c496
State a memory line's scope only where the method fixes it and sync t…
santoshkumarradha Oct 16, 2026
d1eac66
Say what a project replay carries and that Windows claims a process c…
santoshkumarradha Oct 16, 2026
d13c2c7
Say a Windows folder sync makes nothing durable rather than that it d…
santoshkumarradha Oct 16, 2026
48da799
Review and locate one checkout status row by its root-relative path
santoshkumarradha Oct 16, 2026
6c6b8b2
Refuse a duplicate path as ambiguous, label deletions from the row, c…
santoshkumarradha Oct 16, 2026
f7ddaa5
Clear computed hunks and counts when a checkout diff fails after prod…
santoshkumarradha Oct 16, 2026
e2e4d47
Never offer the remaining file of a deleted checkout row for Open or …
santoshkumarradha Oct 16, 2026
c4574de
Serve a crew's and all crews' recorded process history, read by pinne…
santoshkumarradha Oct 16, 2026
db1dfee
Name only verified recorded files, bound the whole encoded crew reply…
santoshkumarradha Oct 16, 2026
1f3be5b
Restore only a failed crew page's progress, remove a failed first pag…
santoshkumarradha Oct 17, 2026
dc14445
Install the render notifier at construction, not on the first render
santoshkumarradha Oct 16, 2026
7fca42f
Record every paid image request as an attempt in the render ledger
santoshkumarradha Oct 16, 2026
7b80237
Carry media_attempt on the tool result occurrence to the app
santoshkumarradha Oct 16, 2026
060a456
Release an image attempt's context with a named cause
santoshkumarradha Oct 16, 2026
c952b6b
Document image attempts, their stop and media_attempt
santoshkumarradha Oct 16, 2026
6750557
Keep a saved harness's pictures working: no ledger means no record
santoshkumarradha Oct 16, 2026
c41dc91
Keep the render ledger open across a stop-work round
santoshkumarradha Oct 16, 2026
5b3da7b
Surface a failed re-read in an image cancel instead of an empty record
santoshkumarradha Oct 16, 2026
b541943
Keep a task note's opaque client id on the page, the event and the pe…
santoshkumarradha Oct 16, 2026
3f52aab
Match a sent note's read receipt by its client id, and share the mess…
santoshkumarradha Oct 16, 2026
90246ae
Reserve opaque note correlation on the actual spoken source
santoshkumarradha Oct 16, 2026
4c54d0d
Write a task note's client id onto its direction in the admission tha…
santoshkumarradha Oct 17, 2026
b846804
Cover a delivered brief with failed page metadata and restored note keys
santoshkumarradha Oct 17, 2026
e129944
Commit a person note's client id in the same SQLite transaction as th…
santoshkumarradha Oct 17, 2026
704d0e8
Cover exact note-key bounds on both durable stores and describe keyed…
santoshkumarradha Oct 17, 2026
ec11da9
Return a service's output page as a contiguous prefix and say when a …
santoshkumarradha Oct 17, 2026
0acc6e6
Document contiguous service output pages
santoshkumarradha Oct 17, 2026
fde448b
Keep an unkeyed task note unread until its identity is known
santoshkumarradha Oct 17, 2026
2bad420
Answer process actions from the holding registry, never rerun an unse…
santoshkumarradha Oct 17, 2026
7d46dab
Carry the stamped process doors across the engine wire
santoshkumarradha Oct 17, 2026
99225b2
Never report a committed render stopped
santoshkumarradha Oct 17, 2026
9e62a6e
Identify a process's managed log for an opener without granting a path
santoshkumarradha Oct 17, 2026
2823a4f
Serve processes.actions, processes.stop_all and processes.log_target …
santoshkumarradha Oct 17, 2026
62b5285
Refuse expired process actions and unverifiable legacy stops
santoshkumarradha Oct 17, 2026
a6e5435
Read scoped memory counts in a cancellable snapshot without legacy te…
santoshkumarradha Oct 17, 2026
d14c2bb
Expose live configured memory scope counts without opening closed con…
santoshkumarradha Oct 17, 2026
8936514
Keep unheld process endings unknown when stopping one agent
santoshkumarradha Oct 17, 2026
8f8c55f
feat(factory): port factory core and GitHub contracts to app v3
santoshkumarradha Oct 17, 2026
7d92556
feat(app): attach remote factories through typed stdio methods
santoshkumarradha Oct 17, 2026
8c6a72a
Serve a program's report only on the receipt of the launch that wrote it
santoshkumarradha Oct 16, 2026
70b71df
Keep oversized issued reports known while refusing their bytes
santoshkumarradha Oct 16, 2026
6b865d9
Merge remote-tracking branch 'origin/app/v3' into work/ui2-attachment…
santoshkumarradha Oct 17, 2026
fd69086
feat(factory): port CLI workers and session tools to app v3
santoshkumarradha Oct 17, 2026
4240413
fix(factory): preserve runner model pins and manual retrieval
santoshkumarradha Oct 17, 2026
73a13db
Merge remote-tracking branch 'origin/app/v3' into HEAD
santoshkumarradha Oct 17, 2026
09f6e1f
test(factory): verify live OpenRouter stage reaches proof approval
santoshkumarradha Oct 17, 2026
c6dc81c
Merge remote-tracking branch 'origin/app/v3' into work/factory-engine…
santoshkumarradha Oct 17, 2026
3c1d57a
Merge remote-tracking branch 'origin/app/v3' into work/factory-engine…
santoshkumarradha Oct 17, 2026
8f200f6
Add guarded typed factory job actions to app v3
santoshkumarradha Oct 17, 2026
cca93c9
Merge remote-tracking branch 'origin/app/v3' into work/factory-action…
santoshkumarradha Oct 17, 2026
92f6dcc
Limit human factory invites and keep failed joins unspent
santoshkumarradha Oct 17, 2026
bbe0f8f
Merge remote-tracking branch 'origin/app/v3' into work/factory-invite…
santoshkumarradha Oct 17, 2026
96da8f2
Make factory refusal test dial a closed listener deterministically
santoshkumarradha Oct 17, 2026
7efa3f3
Guard app registry updates and keep memory counting within the source…
santoshkumarradha Oct 17, 2026
78640f3
Set up local factories and enable their runner only on explicit request
santoshkumarradha Oct 17, 2026
96b1d53
Carry verified GitHub profiles across factory surfaces and preserve s…
santoshkumarradha Oct 17, 2026
2a28790
Avoid pipeline discovery fanout during GitHub factory setup
santoshkumarradha Oct 17, 2026
3b10186
Keep factory setup owner labels truthful across repository discovery
santoshkumarradha Oct 17, 2026
472faa6
Use unique credentials in factory action test fixtures
santoshkumarradha Oct 17, 2026
81b49d0
Require current GitHub credentials when resuming saved factory setup
santoshkumarradha Oct 17, 2026
afaa91d
Restore explicitly started local factories quietly across app restarts
santoshkumarradha Oct 17, 2026
241763f
Open pipeline pull requests with the signed-in caller GitHub credential
santoshkumarradha Oct 17, 2026
a3a0f1a
Add opt-in live acceptance for pipeline pull request ownership
santoshkumarradha Oct 17, 2026
ba2ca9f
Expose caller GitHub sign-in without private factory identity data
santoshkumarradha Oct 17, 2026
69a1273
Add caller-scoped factory sign-out and session revocation
santoshkumarradha Oct 17, 2026
5f8519d
Require verified GitHub attestation and explicit sign-out capability
santoshkumarradha Oct 17, 2026
64ac8d6
Add caller-scoped factory invite management and native clipboard deli…
santoshkumarradha Oct 17, 2026
ad3eeb3
Redact invitation metadata before labels are truncated
santoshkumarradha Oct 17, 2026
dc0f457
Add operator repository switches with serialized server updates
santoshkumarradha Oct 17, 2026
4b5ffe4
Negotiate POST for factory access-link checks and polls
santoshkumarradha Oct 17, 2026
24c8d6b
Expose caller-scoped pipeline pull requests over appwire
santoshkumarradha Oct 17, 2026
124ea81
Make runner capacity changes govern live and waiting execution
santoshkumarradha Oct 17, 2026
a309e35
feat(factory): add caller-scoped pipeline source and preview
santoshkumarradha Oct 17, 2026
87359ed
feat(factory): allow owners to change live runner capacity
santoshkumarradha Oct 17, 2026
e45342f
fix(factory): keep priority marks out of execution order
santoshkumarradha Oct 17, 2026
0c2c3db
test(factory): verify real worker registration and synchronize stream…
santoshkumarradha Oct 17, 2026
4c6403c
fix(factory): keep machine details private across reads and live events
santoshkumarradha Oct 17, 2026
437eed1
feat(factory): match explicit queue filter tokens without model calls
santoshkumarradha Oct 17, 2026
337d635
test(factory): verify proxy credentials through caller-private runner…
santoshkumarradha Oct 17, 2026
b80ec20
Preserve pipeline runtime fields and hold unsafe steps (#1846)
santoshkumarradha Oct 17, 2026
7d9f662
Confirm factory runtime support before accepting pipeline source (#1847)
santoshkumarradha Oct 17, 2026
3eadf13
Honor the saved one-model policy for every factory worker launch (#1848)
santoshkumarradha Oct 17, 2026
de27c9e
Preserve complete GitHub assignee facts in factory intake (#1849)
santoshkumarradha Oct 17, 2026
27363c9
Guard runtime pipeline changes with exact factory source attestation …
santoshkumarradha Oct 17, 2026
1e46249
Restore solo factory approval without assigning an owner (#1851)
santoshkumarradha Oct 17, 2026
d0c33af
Preview guarded runtime pipeline step edits (#1852)
santoshkumarradha Oct 17, 2026
734eb4c
Keep native factory startup quiet and restore its current local conne…
santoshkumarradha Oct 17, 2026
add52e3
Clear stale factory start evidence after issue edits (#1854)
santoshkumarradha Oct 17, 2026
e5d7ad5
Open live factory stage conversations in the app (#1855)
santoshkumarradha Oct 17, 2026
0dc6ad8
Start local factory reads and repository rules after explicit Run (#1…
santoshkumarradha Oct 17, 2026
a55c0a5
Resume approved factory plans at the gate and require fresh consent (…
santoshkumarradha Oct 17, 2026
f449f89
Show explicit factory priority marks without inferring from issue typ…
santoshkumarradha Oct 17, 2026
8f2b20a
Keep cold factory send-back feedback and resume the preceding step (#…
santoshkumarradha Oct 17, 2026
126ab9c
Make factory rule previews match intake decisions and explicit size l…
santoshkumarradha Oct 17, 2026
f616d71
Clarify runtime preview claims when clearing the last field (#1861)
santoshkumarradha Oct 17, 2026
2975ea5
fix(factory): withhold stage chat paths from job readers (#1863)
santoshkumarradha Oct 17, 2026
c5d4342
fix(factory): keep stage crew ownership and instructions truthful (#1…
santoshkumarradha Oct 17, 2026
d490c80
fix(factory): honor session memory and held-folder contracts (#1866)
santoshkumarradha Oct 17, 2026
0324d17
fix(factory): discover Homebrew gh from native app launches (#1867)
santoshkumarradha Oct 17, 2026
8c67f35
fix(factory): show sizes only from recorded evidence (#1864)
santoshkumarradha Oct 17, 2026
d1dd9ba
feat(factory): expose sourced read size separately from labels (#1865)
santoshkumarradha Oct 17, 2026
8a6efcd
Record the exact crew an automation was made in, unknown unless an ac…
santoshkumarradha Oct 17, 2026
710f8a7
Keep a crew stamp through retry, queue edits and older hosts, and sta…
santoshkumarradha Oct 17, 2026
6410d7f
Serve a crew's orders by the team they were recorded as made in, with…
santoshkumarradha Oct 17, 2026
edc4697
Prove the older-host mark refusal, drop a test race, and say plainly …
santoshkumarradha Oct 17, 2026
43c3881
Make creation context presence-based, check it at acceptance, keep it…
santoshkumarradha Oct 17, 2026
1d95f54
Downgrade an unprovable creation context to unknown instead of refusi…
santoshkumarradha Oct 17, 2026
1187e23
Make a turn unknown when a message with another creation context is s…
santoshkumarradha Oct 17, 2026
c68259b
Bind a crew's orders walk to a store revision, bound its bytes before…
santoshkumarradha Oct 17, 2026
a9143ec
Read a crew's orders within bounds on every selected field: project o…
santoshkumarradha Oct 17, 2026
3902736
Find the fixture's marker in any message of the request, stream its t…
santoshkumarradha Oct 17, 2026
b19fe89
Type a task note's outcome from its producer, and carry its key throu…
santoshkumarradha Oct 17, 2026
a5b78a2
Carry a task note's typed outcome across App.TaskAction without chang…
santoshkumarradha Oct 17, 2026
377ed1e
Answer a task note with the engine's typed outcome and never send it …
santoshkumarradha Oct 17, 2026
e263950
Type a failed commit and a post-dispatch panic as unknown, and prove …
santoshkumarradha Oct 17, 2026
6c6f3f2
Refuse a note's commit with SQLite's own commit hook, and ship no tes…
santoshkumarradha Oct 17, 2026
5b65409
Type a failed plan-store commit as unknown on every receipt road, a b…
santoshkumarradha Oct 17, 2026
db2ec39
Answer tasks.brief from its typed receipt, because the socket erases …
santoshkumarradha Oct 17, 2026
d51cdfb
Keep untyped note action failures unknown regardless of current welcome
santoshkumarradha Oct 17, 2026
c7da2c6
Document typed refusal authority without welcome-based certainty
santoshkumarradha Oct 17, 2026
44edfce
Add durable share_deliverable operation receipt and admission.
santoshkumarradha Oct 17, 2026
35e87b3
Bound and validate durable publication receipts before replay
santoshkumarradha Oct 17, 2026
917d3dc
Inspect explicitly shared files with bounded reads and exact ownership
santoshkumarradha Oct 17, 2026
8d333bd
Hold publication's own roads to the fifteen-decision ceiling
santoshkumarradha Oct 17, 2026
1bd855a
Persist the full immutable share plan before any append
santoshkumarradha Oct 17, 2026
53090b5
Freeze the share plan in claim-private durable bytes and bind rows to…
santoshkumarradha Oct 17, 2026
47a83d4
Publish shared files from the frozen plan under a typed shared origin
santoshkumarradha Oct 17, 2026
1c9d927
Prove the share publisher end to end and keep timeouts retryable
santoshkumarradha Oct 17, 2026
6afe703
Share a task branch's file through an owned snapshot that stays avail…
santoshkumarradha Oct 17, 2026
d2a9978
Carry shared files on the app wire as shared, never Made
santoshkumarradha Oct 17, 2026
1efad98
Prove a share never touches a genuine created row of the same file
santoshkumarradha Oct 17, 2026
2de2814
Close the M3 review's N2, N5, N10, N4 and N7 before the wire freeze
santoshkumarradha Oct 17, 2026
483cb59
Keep the legacy unkeyed note regression on the typed receipt matcher
santoshkumarradha Oct 17, 2026
a08c6cc
Merge current Factory app-v3 work with reviewed sharing and crew rece…
santoshkumarradha Oct 17, 2026
0d47638
app: carry guarded per-job step editing (#1869)
santoshkumarradha Oct 17, 2026
ea2febb
Merge remote-tracking branch 'origin/app/v3' into work/engine-reviewe…
santoshkumarradha Oct 17, 2026
e3dc7db
Carry a handed-over task row's program, ending and branch to the cold…
santoshkumarradha Oct 17, 2026
59659ff
Say that a stopped flag does not name who stopped the task
santoshkumarradha Oct 17, 2026
9a766d6
Exercise stopped job facts through their real kept-row producer
santoshkumarradha Oct 17, 2026
0e0c506
Read task notes through bounded opaque-id pages without hiding later …
santoshkumarradha Oct 17, 2026
beb8b58
Answer a held plan lock at once instead of waiting behind a writer
santoshkumarradha Oct 17, 2026
f5e0317
Refuse an overlong task id before it is copied into SQLite
santoshkumarradha Oct 17, 2026
9c59f6d
Align the note cursor error methods with gofmt
santoshkumarradha Oct 17, 2026
9ed62d1
Hand workers the fifty-first and two-hundred-first note from a paged …
santoshkumarradha Oct 17, 2026
d4ea1a7
Refuse a note the readers would refuse, and stop promising a way to c…
santoshkumarradha Oct 17, 2026
efa9c38
Check the same handle before the reopen in the note writer bound test
santoshkumarradha Oct 17, 2026
acd43f6
Say the note writer's parity is per note, and that a long plan name s…
santoshkumarradha Oct 17, 2026
413ad69
Scope the note author boundary test comment to its field
santoshkumarradha Oct 17, 2026
af1012d
Read a note's envelope for the inbox, so a long plan name holds nothing
santoshkumarradha Oct 17, 2026
a6072eb
Correct the envelope tests: seed the tasks, derive the walk bound, re…
santoshkumarradha Oct 17, 2026
440cf20
fix(factory): keep step edits before proof and landing (#1871)
santoshkumarradha Oct 17, 2026
c8085b3
fix(factory): keep manager session paths on workers (#1873)
santoshkumarradha Oct 18, 2026
00773ef
fix(factory): preserve step bounds and truthful thinking edits (#1872)
santoshkumarradha Oct 18, 2026
f5faa03
feat(factory): send waiting plans back for revision (#1874)
santoshkumarradha Oct 18, 2026
cba02da
Factory pipeline structural edit previews (#1875)
santoshkumarradha Oct 18, 2026
83447f2
Use current finished plan declarations for factory file counts (#1876)
santoshkumarradha Oct 18, 2026
c7cbcb7
fix: a reading the chat hands off can only look, and quick endings sa…
AbirAbbas Oct 19, 2026
70e33e1
fix(app): carry a reply on after the desktop engine is killed, and st…
AbirAbbas Oct 19, 2026
7268a26
Windows: run commands in Git Bash, and open SQLite stores on Windows …
AbirAbbas Oct 19, 2026
532cded
feat(appwire): skills.list and skills.set for the slash /skill command
santoshkumarradha Oct 20, 2026
7dff77b
fix(session): clean background exits land in context without waking t…
santoshkumarradha Oct 20, 2026
bee54e7
feat(appwire): slash wire methods (conv)
santoshkumarradha Oct 20, 2026
61908ad
feat(appwire): slash wire methods (misc)
santoshkumarradha Oct 20, 2026
b92c28d
feat(appwire): slash wire methods (effort)
santoshkumarradha Oct 20, 2026
e0c0c47
test(tui3): name the far skill-folder scan beside the line
santoshkumarradha Oct 20, 2026
51bcc9e
Merge slash engine lane: conv
santoshkumarradha Oct 20, 2026
504f59c
Merge slash engine lane: skills
santoshkumarradha Oct 20, 2026
eff69fb
Merge slash engine lane: misc
santoshkumarradha Oct 20, 2026
cb4ee1d
Merge slash engine lane: effort
santoshkumarradha Oct 20, 2026
1520cf8
Merge app/v3 (I29) into feat/slash-eng
santoshkumarradha Oct 20, 2026
631586c
test(e2e): the no-shelf sentence now lives in internal/skillpick
santoshkumarradha Oct 20, 2026
95b842a
style: gofmt tuiwords table
santoshkumarradha Oct 20, 2026
912de1f
feat(appwire): agents.run_harness runs a saved harness with the messa…
santoshkumarradha Oct 20, 2026
0e943b0
test(tui3): a start handed to submitting runs off the loop
santoshkumarradha Oct 20, 2026
c67da7a
fix(appwire): delete needs confirm and stops kept services; bounded h…
santoshkumarradha Oct 20, 2026
30ade03
Merge slash engine lane: harness
santoshkumarradha Oct 20, 2026
088ea65
Merge slash engine lane: fix
santoshkumarradha Oct 20, 2026
7490aea
fix(app): tool ends and history name the process their command became…
AbirAbbas Oct 20, 2026
ddeff9a
Merge remote-tracking branch 'origin/app/v3' into feat/slash-eng
santoshkumarradha Oct 20, 2026
4e6b499
perf(app): wave 1: idle engine sleeps, agents open lazily, files are …
santoshkumarradha Oct 20, 2026
58ab1e0
feat(app): crews.organize suggests crews from folders and one naming …
santoshkumarradha Oct 20, 2026
85c1161
fix(session): doorstep drains read the conversation folder under the …
santoshkumarradha Oct 20, 2026
f2541b1
feat(app): permission asks carry scopes; Always saves the chosen scop…
santoshkumarradha Oct 21, 2026
98c1f34
app: the map graph carries the brief's and each task's exact origin, …
santoshkumarradha Oct 21, 2026
f0b9fbb
session: origins live on the record, resolved on demand; entries stay…
santoshkumarradha Oct 21, 2026
2ac7e48
fix(app): replayed background jobs carry their command, times, exit c…
santoshkumarradha Oct 21, 2026
a716917
Factory: automate issue-to-PR work and maintain PRs through review (#…
ZeroPoint95 Oct 23, 2026
b5e7ef3
Merge origin/dev into app/v3
santoshkumarradha Oct 24, 2026
697120b
Merge remote-tracking branch 'origin/app/v3' into merge/dev-into-app-v3
santoshkumarradha Oct 24, 2026
2e83565
Merge origin/dev into app/v3 (second pass)
santoshkumarradha Oct 24, 2026
ca3f3a3
plandb and SQLite stores: open a database at its literal name
santoshkumarradha Oct 24, 2026
1e9b731
provider: restore observer refusal on tool loops, redirect policy for…
santoshkumarradha Oct 24, 2026
6be7d43
Merge fixes: refusal marking, credential guard in the locked writer, …
santoshkumarradha Oct 24, 2026
6aed356
session merge fixes: receipt marks, entry clone and cost, ledger fixt…
santoshkumarradha Oct 24, 2026
61cefbe
plandb commit gate follows the literal store URI; DisplayEntry guard …
santoshkumarradha Oct 24, 2026
147c434
docs(relay): define scoped clients slots and queue contract
santoshkumarradha Oct 24, 2026
0100c20
feat(relay): register and restrict scoped client devices
santoshkumarradha Oct 24, 2026
dbcc189
feat(relay): persist bounded expiring client slots
santoshkumarradha Oct 24, 2026
f31958e
feat(relay): queue signed client calls with durable atomic claims
santoshkumarradha Oct 24, 2026
97ef568
test(relay): share fabric HTTP conformance across Go relay modes
santoshkumarradha Oct 24, 2026
88c996b
relay/hosted: implement fabric client slots and queue
santoshkumarradha Oct 24, 2026
642fb39
relayconf: enable worker fabric conformance by default
santoshkumarradha Oct 24, 2026
6e85e84
changelog: scoped clients, slots, and the signed queue
santoshkumarradha Oct 25, 2026
743d9cb
docs: the hosted relay supports scoped clients
santoshkumarradha Oct 25, 2026
37d0291
relay: scoped clients, sealed slots and a signed queue, ported onto Raft
AbirAbbas Nov 13, 2026
258fcf5
Port #1928 onto dev
AbirAbbas Nov 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions docs/changes/unreleased/1928-scoped-client-relay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
kind: added
title: Scoped clients keep sealed slots and a signed queue
pr: 1928
surface: [remote, docs]
invalidates:
- "The relay manual said the hosted Worker does not support scoped clients. The Go relay and the hosted Worker both register a client device, store its sealed slots, and accept a signed queue."
- "A device on the relay was a full device. A full device can now register a scoped client that cannot read the directory, the blob store, or another client's slots and queue."
---

Registration happens before the certificate is released. The relay cannot read sealed slots or calls. An executor must verify the retained request proof before it runs one.
102 changes: 102 additions & 0 deletions docs/relay-clients.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Scoped clients, slots and queue

## Authentication and pairing

All routes use the existing `Codeaf-Identity`, `Codeaf-Cert`, `Codeaf-Time`
and `Codeaf-Sig` headers and `codeaf-req-v1` signing bytes (method, request
URI including query, request time, SHA-256 of the exact body). Identity namespaces
come exclusively from verified identity keys. Request skew is at most five minutes.
Errors are JSON `{"err":"code"}`. All replies include `Codeaf-Now` (Unix ms).
A store must be enabled. JSON bodies use UTF-8; sealed bytes use padded standard
base64. Unknown JSON fields and trailing JSON are rejected on fabric routes.

A full device pairs a client with `PUT /v1/clients/{device}` and body
`{"cert":<identity.Cert>,"methods":["method.name"],"name":"sealed name"}`.
The certificate must verify under the request's identity public key and name the
path device. The client generates its own Ed25519 key; the full device signs only
its public key with the existing certificate format. **Register before releasing
the certificate to the client**: legacy certificates carry no cryptographic scope.
The pairing grant contains only the certificate, identity public key and public
connection information; never cell keys, dedup secrets, identity private keys or
vault data. The relay accepts no grant or secret fields on this route.

Registration returns 204 and creates a directory device record with `kind: client`
and `methods`. At most 64 distinct method names, each 1–128 ASCII letters, digits,
underscore, dot or hyphen; an empty list is a read-only client. Repeat registration
returns 409 `exists`; scope changes require revocation and a new key. A full
existing device cannot be converted to a client. Old records without kind remain
full devices. `GET /v1/dir/list` by a full device includes the client records.
Clients cannot access directory, identity or blob-store routes (401 unauthorized),
including self-updates, approvals, leases and the vault. A client can read only its
own slots and append only its own queue. The method allowlist is checked at append;
the executing box must also check it before execution.

`POST /v1/dir/devices/{device}/revoke` is the existing full-device revoke.
A successful revoke deletes that client's slots, queue and sequence state. Its
certificate stays revoked across restarts; requests return 401 `revoked`.

## Slots

`PUT /v1/clients/{device}/slots/{name}` by any full device of the same identity
replaces one slot. Body: `{"sealed":"base64"}`. The receiver must be an active
client. Names are 1–128 ASCII letters, digits, underscore, dot or hyphen. Maximum
64 slots per client and 65536 decoded bytes per slot (nonempty).
Success: 204. Writers are responsible for sealing to the current client key and
publishing only chats whose lease they hold; the relay cannot inspect sealed data.

`GET /v1/clients/{device}/slots/{name}` by that client returns 200
`{"sealed":"base64","writer":"dev_…","at":1700000000000}`.
The relay sets writer and Unix-ms time. Slots expire at age 24 hours, including
across restart, and expired slots free capacity. Full devices cannot read slots.

## Queue

`POST /v1/clients/{device}/queue` by that client accepts
`{"number":1,"at":1700000000000,"method":"method.name","target":"any","sealed":"base64"}`.
Numbers start at 1 and increase by exactly one per client, even after ack or
expiry. Integers must fit signed 64 bits. `at` is Unix ms, no more than five
minutes in the future and strictly younger than 24 hours. Each nonempty sealed
entry is at most 4096 decoded bytes; at most 128 unacknowledged entries per
client. Target is `any` or an active registered full device id in this identity.
The signed HTTP request authenticates all fields. Success: 204. Invalid numbers
(replay or gap) return 409 `sequence`; stale timestamps return 400 `stale`.
Denied methods return 403 `method_denied`. Expired entries free capacity but
never reset numbering.

`GET /v1/clients/{device}/queue` by a full device returns 200 `{"entries":[]}`,
ordered by number, with fields above plus `signature`, `cert`, `identity`,
`request_time`, `request_uri`, and `body` (base64 exact original JSON bytes).
These preserve the original request proof for independent box verification.
Only entries targeted at the caller, unclaimed `any` entries, or `any` entries
claimed by the caller are listed. A list does not claim or change a chat lease.

`POST /v1/clients/{device}/queue/{number}/claim` by a full device atomically
claims an `any` entry; success 204, same claimer repeat 204, another claimer
409 `claimed`. A targeted entry is claimable only by its target. Claims persist
until ack or expiry; the relay never automatically reassigns work after a crash.
An executor must claim before running. This prevents competing boxes executing
the same entry; durable executor-side idempotency is still required after a crash.

`DELETE /v1/clients/{device}/queue/{number}` by the claim owner deletes the entry
and returns 204. Ack without owning the claim returns 409 `claimed`. Missing or
expired entries return 404 `not_found`. A box must recheck age, signature, method
scope, routing and any required biometric flag inside the sealed call, and log
execution. The relay cannot verify encrypted call contents or biometric evidence.

## Refusals, persistence and implementations

Malformed bodies, names, targets or empty sealed values: 400 `bad_request`.
Oversized HTTP bodies (maximum 96 KiB), decoded blobs or method lists: 413
`too_large`. Slot/queue capacity: 429 `full`. Unknown client/slot/entry: 404
`not_found`. Wrong role or identity: 401 `unauthorized`; revoked certificate:
401 `revoked`; request skew: 401 `skew`; replaced identity: 410 `rotated`;
deleted identity: 410 `gone`. Unsupported methods: 405. Internal storage failure:
500 `internal`. Nonempty bodies on bodyless routes: 400 `bad_request`.

Records, sequence watermarks, proof and claims survive relay restarts. Fabric
mutations and revocation serialize within a relay process. One running Go relay
owns a store directory, as with its in-memory directory revocation feed.
Expiry is evaluated on reads and writes with the relay clock. Identity retirement
erases fabric data with the existing directory and blobs.

The Go relay and the Worker implement this contract.
46 changes: 45 additions & 1 deletion internal/clusterstate/apply.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,9 @@ func Dependencies(c Command) []RecordKey {
if m.PutDevice != nil {
keys = append(keys, DeviceKey(m.PutDevice.ID))
}
if m.RegisterClient != nil {
keys = append(keys, DeviceKey(m.RegisterClient.Device), AuthorityKey(m.RegisterClient.Device))
}
if m.Revoke != nil {
keys = append(keys, DeviceKey(m.Revoke.Device))
}
Expand Down Expand Up @@ -412,6 +415,10 @@ func evaluateCommand(c Command, meta ApplicationMeta, read ReadRecord, paged boo
out.Result.Code = Revoked
return out, nil
}
if actor.Kind == "client" {
out.Result.Code = Unauthorized
return out, nil
}
// Worker incarnation and scope precede dedup so an old successful result
// cannot restart activity after a process replacement, expiry or revocation.
if auth.Worker != nil {
Expand Down Expand Up @@ -517,7 +524,7 @@ func evaluateCommand(c Command, meta ApplicationMeta, read ReadRecord, paged boo
if Decode(d, &seen) != nil {
return out, ErrDependency
}
if !seen.Revoked {
if !seen.Revoked && seen.Kind != "client" {
seen.LastSeen = out.Now
put(DeviceKey(c.Change.DeviceSeen.Device), seen)
}
Expand Down Expand Up @@ -741,9 +748,43 @@ func applyMutation(c Command, now int64, identity IdentityRec, rows map[RecordKe
return OK
case m.PutDevice != nil:
v := m.PutDevice
if v.Device.Kind != "" || len(v.Device.Methods) > 0 {
return BadRequest
}
old, had := device(v.ID)
put(DeviceKey(v.ID), Stamped(old, had, v.Device, now))
return OK
case m.RegisterClient != nil:
v := m.RegisterClient
if !validClientDeviceID(v.Device) || len(v.Name) > MaxClientName || len(v.Methods) > MaxClientMethods {
return BadRequest
}
seen := map[string]bool{}
for _, method := range v.Methods {
if !validFabricName(method) || seen[method] {
return BadRequest
}
seen[method] = true
}
if _, had := device(v.Device); had || rows[AuthorityKey(v.Device)] != nil || v.Device == c.Actor {
return Exists
}
if PersonalCertificate(identity, v.Device, v.Cert) != nil {
return BadRequest
}
var methods []string
if len(v.Methods) > 0 {
methods = append([]string(nil), v.Methods...)
}
put(DeviceKey(v.Device), Device{
V: 1,
Kind: "client",
Methods: methods,
Name: v.Name,
AddedBy: identity.Identity,
Created: now,
})
return OK
case m.Revoke != nil:
v := m.Revoke
old, had := device(v.Device)
Expand Down Expand Up @@ -843,6 +884,9 @@ func applyMutation(c Command, now int64, identity IdentityRec, rows map[RecordKe
if old.Revoked {
return Revoked
}
if old.Kind == "client" || v.Record.Kind != "" || len(v.Record.Methods) > 0 {
return BadRequest
}
public, e := JoinCertificate(identity, request, v.Cert)
if e != nil || validGrant(v.Grant) == false {
return BadRequest
Expand Down
3 changes: 3 additions & 0 deletions internal/clusterstate/effects.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,9 @@ func applyEffect(c Command, now int64, rows map[RecordKey][]byte, put func(Recor
if d.Revoked {
return Revoked
}
if d.Kind == "client" {
return Unauthorized
}
if Decode(rows[AuthorityKey(r.Device)], &auth) != nil || !auth.ValidRole() || auth.Cluster != c.Cluster || !auth.Personal && auth.Worker == nil {
return Unauthorized
}
Expand Down
3 changes: 3 additions & 0 deletions internal/clusterstate/liveness.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ func renewHolds(c Command, now int64, rows map[RecordKey][]byte, put func(Record
if actor.Revoked {
return Revoked
}
if actor.Kind == "client" {
return Unauthorized
}
if auth.Worker != nil {
var identity IdentityRec
if Decode(rows[IdentityKey()], &identity) != nil {
Expand Down
2 changes: 1 addition & 1 deletion internal/clusterstate/personal_host.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func personalAllowed(cluster, actor, certificate string, read ReadRecord) (Code,
}
if raw != nil {
var d Device
if Decode(raw, &d) != nil || d.Revoked {
if Decode(raw, &d) != nil || d.Revoked || d.Kind == "client" {
return Unauthorized, nil
}
}
Expand Down
6 changes: 6 additions & 0 deletions internal/clusterstate/records.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,12 @@ type Device struct {
// Codeaf-Chat-Notes.
Outbox []Note `json:"outbox,omitempty"`
Took []string `json:"took,omitempty"`

// Kind is "" for a full device and "client" for a scoped client that may
// only read its slots and append to its call queue. Methods lists the queue
// methods a scoped client may invoke.
Kind string `json:"kind,omitempty"`
Methods []string `json:"methods,omitempty"`
}

// Note is one message waiting in a device's outbox for whichever computer
Expand Down
1 change: 1 addition & 0 deletions internal/clusterstate/rules.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ func RevokeOf(target Device, caller, targetID string) (Device, error) {
// relay-owned fields are never taken from the client: Revoked and LastSeen stay
// as stored, and Created is the time of the first write.
func Stamped(old Device, had bool, d Device, now int64) Device {
d.Kind, d.Methods = old.Kind, old.Methods
d.Revoked, d.LastSeen, d.Created = old.Revoked, old.LastSeen, old.Created
if !had {
d.Created = now
Expand Down
10 changes: 10 additions & 0 deletions internal/clusterstate/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ type Mutation struct {
Release *ReleaseCell `json:"release,omitempty"`
Archive *CellID `json:"archive,omitempty"`
PutDevice *PutDevice `json:"put_device,omitempty"`
RegisterClient *ClientRegistration `json:"register_client,omitempty"`
Revoke *DeviceID `json:"revoke,omitempty"`
SetVault *VaultCAS `json:"set_vault,omitempty"`
AdvanceTime *AdvanceTime `json:"advance_time,omitempty"`
Expand Down Expand Up @@ -143,6 +144,15 @@ type PutDevice struct {
Device Device `json:"device"`
}

// ClientRegistration records a scoped client device and its allowed queue
// methods in the replicated directory. Only a full device may submit it.
type ClientRegistration struct {
Device string `json:"device"`
Cert string `json:"cert"`
Name string `json:"name,omitempty"`
Methods []string `json:"methods,omitempty"`
}

type VaultCAS struct {
Old string `json:"old"`
New string `json:"new"`
Expand Down
Loading
Loading