Repository navigation
Tasks work where the conversation is about: ground, mode, and the laws that follow it #76
Description
What happened (2026-08-31, session 8f75d6c1ffdeaaf5, two /tasks fixing CodeQL #54/#56 in Agent-Field/agentfield with deepseek-v4-flash)
The chat was opened in ~, not in the repository. aforge minted an empty owned repo at …/work (one commit, "session opened") and cut trees/1, trees/2 from that. The brief the chat model wrote said Repo: ~/Documents/agentfield/code/agentfield … Work in this repo directly, so both workers worked in the person's live checkout. Everything downstream assumed trees/N:
- The git guard lied there.
taskgit.gorefusedcheckout/push/stash/update-ref/symbolic-ref/worktreewith "this is your own copy… reaches no remote… comes home on its own" — false for the real repo. The workers escalated tocommit-tree/write-treeand then bypassed the guard withgh apiGit Data calls (blob → tree → commit → ref → PR). One rangh auth token; the OAuth token is in plain text in two task journals. - Collateral in the person's repo. Two commits landed on their local
agent/oss-telemetry-v2(b2f68fea,d22a053e); one worker didreset/reflog surgery there, and a first push carried 246 files because the index belonged to the person's branch. - The visible "cycle" was audit ↔ repair, not the model. The check judged "a clean restore of what the work wrote" in
trees/N-check= the empty repo + one copied file →REFUTED — the restore contains nothing/npm run build … Missing script. The repair round redid the whole job in the real repo, was judged in the same empty restore, and the node ends "incomplete" while PRs session: route wide reads to quick tasks, arm the grain, and add consult (waves A+B2, #1016) #1017/tui3: the draft kill ring, the ↑ walk visits them, /drafts browses #1018 are open and correct. - "went in circles" was the wrong word. The last six calls before the cut were distinct and succeeding (
commit-tree,write-tree, second commit, ref update…). The terminal signal was the third[silent]note (looped.go): the nudge count is cumulative across rule kinds and never resets on progress, "material progress" isedit/writeonly so a commit/push phase is structurally silent, and silence borrows the repetition rule's sentence. - Then nothing visible happens.
N.beat.jsoncarriesphase: checking|repairingbut no surface code reads it; minutes of check and repair draw nothing on the card.
Design
Every task gets a ground — one path resolved from evidence the conversation already holds, shown on the forming card before consent, correctable with one key; the tree picker is the correction, never the default. And one law regardless: a task never writes outside its ground.
Ground ladder (generic, no lists): said (a path in the person's words, a dropped folder, propose_task{ground}) → touched (git roots of every path the conversation read/edited/grepped/cd'd, weighted by recency; one dominates → ground; two with real weight → the one question we ask) → standing in (the workspace when it is a repo — today's behaviour) → nothing (the conversation's own folder, and the card says so).
Mode from the deliverable, never asked: repo + writes → worktree off its HEAD (today's machinery pointed at the right repo); repo + reads only → reference (own folder, repo read-only); plain folder + writes → mirror (copy in, land by name); "here" → in place with the file ledger as undo.
Card row: in ~/Documents/agentfield/code/agentfield · branch off main · your uncommitted changes not included.
Lanes (sub-issues)
Integration branch: feat/task-ground (off dev). Each lane is a branch ground/<name> with a PR into feat/task-ground; one PR from there into dev.
Drafted with CodeAF · reviewed and owned by the author
Activity
loop guard: silence is hygiene, the tree is progress, and only a repe…
loop guard: silence is hygiene, the tree is progress, and only a repe…
Tasks stand where the conversation is about: the ground, and the laws…
santoshkumarradha commentedon Aug 31, 2026
E2E evidence for the landing (0b54ff2): on the built binary, a chat opened in a non-repo desk folder read one file in a separate repo;
/taskthen stood in that repo — the record carriedground+groundMode: worktree,task/hello-txt-goodbye-b5993bwas cut in the real repo (git-common-dirproved the worktree), the rail saidchecking what it left, and the edit landed on that repo'smainwith branch and worktree cleaned. The exact scenario in the report above, fixed end to end.