Repository navigation
Tickets in other repos: one fleet, one log and one graph across sibling repos - #108
Conversation
…ge git Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ckout's own HEAD is read where it is DEVTEAM_HOME is refused loudly, never followed, when it is no checkout, has no project settings, or is a repo link's checkout (even one with a stray settings.md); so is another repo's copy of the kit run with DEVTEAM_HOME, and a kit whose project folder holds tickets/ and no settings.md (a sibling's own copy). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…links.local.json; a wrong origin is refused Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…er of tickets only, unowned-files per repo Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…act head; its footprint is judged by home's committed lines Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ne has no checkout of it Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…rktrees, seeded from that repo's settings Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… absolute path; sessions listed by repo name Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ere; plan and chore PRs stay home's check-pr fetches the sibling's main as well as home's, and refuses when either fetch fails. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e method and forge; gate and act lines in home's log name the repo merge fetches the ticket repo's main as well as home's first, and refuses when either fetch fails. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…never use the object routers Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…nst its own remote; every repo listed Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ked out read-only beside it Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…name their repo Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…its end-to-end ticket last; repo links through the owner Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…: read on that repo's main Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Conflicts: kitRel (PR 1's comment, PR 2's projectRoot), fetchMain (PR 1 skips a home with no origin; PR 2 still fetches the ticket repo's main), cmdAct (PR 1's registry-attest check before PR 2's act --repo field), HELP (both link lines plus link land), and the test file (both new blocks kept). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…oved it (entry_hash on the approved act); lookups by a user's word go through ownEntry Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…d stories Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…into multi-repo-2 Conflicts kept PR 2's code and took PR 1's wording: comments, messages and test names lose their spec and review codes; components on repo links still land (PR 2 lifts the this-release refusal); quality.md keeps PR 2's merge-in-the-ticket's-repo paragraph and PR 1's url-link acts paragraph (checked by merge only, a process check within the supervisor's own class). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…as one token each, as PR 1's link text is: a hand edit on main can't start a line of the prompt Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… it: skipped with no origin, refused when the fetch fails (a measure reading, a sibling worker's start); fleet status makes a failed sibling fetch a blocker Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ion): init --github --repo and its template go, and fleet status no longer warns of a missing workflow; check-pr --repo [--path] stays as a command; README, quality.md, supervisor.md and the spec say merge is where the checks are enforced Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…en-issue, PR and review codes, as PR 1's did: they name documents an adopting project doesn't have Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…t (its main by default); none, and no failure, without its checkout Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…hand-reverts expire them, goal-readiness keyed to registry_precondition Conflicts: fetchMain (PR 1 clears linkChangedCache; PR 2 still fetches the ticket repo's main), link land (an owner-approved repo link is carried as before; a url link only when its acts lead from main's entry), goal set's usage (both --link and --registry-precondition), the act schema (prior_hash nullable, plus repo), quality.md (PR 2's merge-per-repo paragraph, then PR 1's), supervisor.md (PR 1's link land text, with PR 2's repo-link steps). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…epo project's base repo exactly as before repo links (gh repo set-default, else the only remote); a repo link's calls keep -R; the spec says so Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…md and a sibling's README.md (or one file at two refs) never share a cached Commits list Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…'s: its gates and DEVTEAM_MAIN, never home's, and each gate line names the repo; home's are unchanged Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…nit and help (a sibling's stray copy, with or without tickets/, no longer runs as a phantom home): "no docs/devteam/project/settings.md here: run init to adopt devteam in this repo, or run home's kit with DEVTEAM_HOME=<home>"; README step 2 says the kit goes into home only Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…on has merged, in whatever repo each is (a third repo's main fetched first; one this machine can't read or fetch fails closed: "cannot confirm <dep> is merged: …"); observe-metrics raises merged-out-of-order (severity 3) for a ticket that reached its main before a dependency Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…inside the tick's network budget, before the probes), so status, metrics and the dashboard read every repo's main as its origin has it now; a failed fetch is a repo-unreachable finding naming the link (redacted), never a crash, until a later tick's fetch succeeds; supervisor.md's tick step 1 runs it before status Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…belongs to (a sibling ticket's, which home's git worktree remove can't) and prunes that repo's worktree list, so a worktree deleted by hand leaves no entry holding ticket/<id> checked out and a reopened ticket's worker starts again; refused before the merge and phase done unless --force; supervisor.md's post-merge cleanup uses it Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…rs/plans/2026-11-04-other-repos.md), with repo-relative paths Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
# Conflicts: # README.md # test/kit.test.mjs
…ation; a "no" approves nothing ownerAnswer, which merge uses for owner-settings and kit-file approvals, checked only that a question was answered, not what the owner said: a PR changing gates or governance merged citing an answer of "no". Found reviewing #108, where it lands a repo link the owner refused. goal-change already held this rule (goalChangeProblem); merge now does too. A review approves by its verified result and a secrets question by what was posted, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adversarial review (upstream loop), at 187eb78: CHANGESThe reviewer ran every finding on Node 18.20.4 against throwaway fixtures (home plus two siblings, local bare origins, forge git). Six of the PR's targeted multi-repo tests and five home-regression tests pass. Blockers
Should-fix
Nits
What held
Merging is the upstream loop's call: it needs 1 (by merging main in) and 2 fixed, CI green, and our local runs. |
…answer's question showed link add|set|rm on a repo link now asks a question that carries the full settings diff it covers: every owner-kind links entry settings.md here would land differently from main, this change included, as "main has / would be" lines plus the entries as JSON. --approved logs one act per entry of that bundle, with entry_hash (the entry that lands) and prior_hash (main's), the registry-edit hashing PR 1 uses. merge --approved now requires every owner-kind links entry the PR changes to have an act of that answer naming the link with the landing entry_hash and main's prior_hash; any other is refused by name. A bundle's acts count as one landing for the one-answer-one-act rule. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…finds a merge no merge act made
The worker/planner policy file is per session (run/agent/<name>-claude.json),
and deniedFor adds, for every push rule naming main, the same rule naming
the main branch of the repo the session works in (a sibling on trunk gets
git push*trunk*). The owner's rules stay as written.
metrics raises merged-without-merge (high, sev 3) for a ticket that reads
merged with no merge-word act, and for a first-parent merge commit on any
readable repo's main whose branch head no merge act names. Only merges after
upgradeAt('merged-without-merge'): the commit time of the first commit on
home's main whose kit script added that token, so an existing project's
history raises nothing.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… outside home's tree detachedWorktree, for a repo link, makes its checkout in a mkdtemp holder under os.tmpdir() (devteam-<repo>-*, as secret post does) and removes the empty holder on exit. Merge's gate, ratchet-base and landing checkouts, and a sibling measure's, can no longer pass on home's node_modules, .tool-versions or lint/ts configs found by walking up. Home's stay under .worktrees/. Worker and review worktrees of a sibling stay under home's .worktrees/ (fleet status, strays, worker --remove and prompts find them there); README and the spec state the walk-up risk. Nothing is symlinked or copied between worktrees. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…psFails for single-repo projects
The finding reads a ticket only when its merge is at or after
upgradeAt('merged-out-of-order'): the commit time of the first commit on
home's main whose kit script names the finding. An existing project's old
out-of-order merges raise nothing; with no kit tracked on main, none do.
README and the spec now say that merge and check-pr refuse any ticket whose
depends_on hasn't merged, home's tickets included, which a single-repo
project sees too.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…OwnRepo Without DEVTEAM_HOME, a kit whose project folder has no settings.md still runs only init and help, except in the kit's own repo (a configured remote whose identity is sanctuarycomputer/devteam, KIT_UPSTREAM, also SETTINGS_DEFAULTS.upstream_repo), where status, whoami, validate and links run as they did before PR 2, over no tickets. Anything that writes is still refused there. kitsOwnRepo() and its registryProblems line are removed: the guard refuses every command it could run under in the kit's own repo (no settings.md, so no lines), so it was never reached. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Brings in #113 (ownerAnswer: an answer approves only the question's recommendation), so the owner's "no" adds no repo link: link --approved and merge --approved refuse it (new regression test). cmdMerge's already-merged early return (from main) now reads the ticket's repo (R, S.main_branch). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…red question's diff, acts are history only A hand-written act carrying the owner's approved_by could bind an unshown entry (re-review of #108). ownerLinkActFails now requires every changed owner-kind link entry to appear in the answered question's settings diff exactly (main's entry then, the entry that lands), and refuses if the question was changed after the owner answered (the log already refuses a supervisor setting question.context; this is the second wall). README: sibling gates need their own worktree_setup; merged-without-merge on siblings still merged by hand. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Merging for v0.20.1 (upstream loop).
|
Conflicts resolved keeping main's rules: ownerAnswer (matched, #113), question_hash (#116), owner_rules (#115), per-entry link binding and links in home only (#108), one-pass linkify (#107). Review fixes: - merge: each changed owner settings class needs its own settling; an owner_only class only by the owner's own answer in it (never chat) or their standing rule; --approved takes several answers. A ladder-class answer (monitor-change) never covers an owner_only key or a kit file. - merge: a decision is carried out once; settings acts name what settled them (answer, rule, decision or rung), and an act a merge logged is never a pending landing for a later merge. - monitors: name set last from the key, a name field refused; credentials in a monitor url refused (validate, check-pr/merge); userinfo and query never shown (status, alerts, observations, findings, dashboard, settings); 2xx only is up; state seeded from the log only when state.json is missing; a dead poll's lock is stale at once; no SNI for IP hosts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Components in other repos (PR 2 of 2). Stacked on #100; spec rev 2.4 §5, §6.2, §8, §9 (measure.link), §10, §12.
(What / Why / Migration: see pr2-release-notes.md.)
One-way doors
None. Every new field is optional (
gate.repo,act.repo,goal.measure.link,entry_hashon an approved link act); a project with no repo links writes none of them.G1: why a single-repo project runs what it ran before
The goldens in
test/fixtures/g1are untouched (git log multi-repo..HEAD -- test/fixtures/g1is empty). Hunk by hunk:git/gitOrDie/gitRun/gitBlobdefault cwd isHOME_CWD, which isundefinedin a home checkout: every existing call runs where it ran.commonDirfrom the script equals the cwd's,devteamDir,projectDirandrunDirkeep their formulas, andprojectRootisrepoRoot, soprojectRelandkitRelare unchanged. TheDEVTEAM_HOMEchecks run only whenDEVTEAM_HOMEis set. Without it, a kit whose project folder has nosettings.md(no initialised home lacks one) runs onlyinitandhelp, unless--project/DEVTEAM_PROJECTnames the project; in the kit's own repo (a remote issanctuarycomputer/devteam) its read-onlystatus,whoami,validateandlinksrun too, as before.cwdGit): in a home checkoutprocess.cwd()is the same checkout the old no-cwd call read.repo('home')ishomeFactsplus today's functions and caches (mainRef,resolveCommit,homeMergeShaFor= the oldmergeShaForbody viafindMergeSha,homeReleasedIn=v*).home, sofactsRepo,repoOfTicket(Id),repoOfTicketLinkreturn home andrepoReadable('home')is true;releaseOfgives no pattern (v*).checkTicket/checkPr/verdictHolds/coverageFails/registryFails/logRule/reviewRuletakerepo('home'), whosegit,mainRef,changedFilesare today's;headInreads the same HEAD in a home checkout.gateEnvaddsDEVTEAM_HOMEonly;DEVTEAM_MAINismainRoot.seedWorktree/detachedWorktreeuse home's settings and root.missingPins/pinsHintdefault tomainRoot.makeSession: home's worktree commands are today's (R.git=git,R.root=mainRoot); the prompt isPROMPTS[role]unchanged for home; the pane's env line gainsDEVTEAM_HOME(typed into the pane, printed by no golden).sessionOfaddsrepoName,readableand arepogetter; the handoff path for home isprojectRel's as before;handoffFor/handoffCommit/sessionSettledread throughrepo('home').merge:R = repo('home')for a home ticket, a plan or a chore; texts gain " in " only for another repo; the gate and act lines gainrepoonly for another repo; home resets exactly the caches it reset before.repo('home').gh: home's gh calls are exactly today's (no-R, sogh repo set-defaultstill applies). Only a sibling's calls carry-R <its repo>.fleet status: noreposkey, norepo/readableon a row, no new text line, no extra fetch or PR listing without repo links; the checklist gains lines only for repo links or an existingrun/links.local.json.unowned-files/line-emptyloop overhomeplus repo links (just home).whoamiprintshome=inside its#comment line (no golden).runMeasureCheck: home's fetch, cache reset, sha and worktree are today's; the check's env gainsDEVTEAM_HOME.fetchMain: home's half is PR 1's (the no-origin skip, refusing a failed fetch);fetchLinkMainruns only for another repo.makeSessionfetches home's main as before;fleet status's blockers start from the sibling fetch failures, an empty list without repo links.peek file: home'sgit logcall is the same (same cwd, the--refit was given, else none);repois passed only for a sibling file.Two single-repo behaviour changes are on purpose:
mergeandcheck-prrefuse a ticket whosedepends_onhasn't merged, home's tickets included: "depends on , which is not merged yet: merge it first". Before, a dependency only kept a ticket out ofready.merged-out-of-order(a ticket on main before its dependency) andmerged-without-merge(a merge no merge act made). Each reads merges at or after the commit on home's main whose kit first names it, so an existing project's history raises nothing.Outside a home checkout, two things change on purpose: with no
DEVTEAM_HOMEand a cwd in no git repo, home is the repo that holds the running kit (before,commonDirwas null and git-backed commands refused); with a cwd inside an unrelated git repo, home is the running kit's repo too (before, that unrelated repo was treated as home). Git reads go to home (HOME_CWD); only HEAD readers (cwdGit) see the cwd's checkout.No forge workflow
In line with #102 (the kit installs no forge workflow;
mergeruns the checks), this PR adds none for a sibling repo either: an earlier draft'sinit --github --repoand its two-checkout template are gone, and so isfleet status's missing-workflow warning.check-pr --repo <link> [--path <checkout>]stays as a command.Testing
Targeted tests only, per the speed rule; CI runs the full matrix. Every task's test was run red, then green, with G1 after each. Home regressions run locally:
devteam kit(43 subtests, before the last merge of #100), fleet park, fleet drain, the PR 1 merge/check-pr/registry/link tests. After merging #100's base again (upstream #98, #99, #101): G1, every PR 2 test and the touched PR 1 tests, 27/27.Cold review fixes
Fable and Opus reviewed this independently and cold. There were no blockers. They found seven majors, each reproduced and each fixed with a test that failed first:
merge(dry runs too) refuses a ticket while anydepends_onticket, in any repo, is unmerged. An unreadable dependency fails closed. A newmerged-out-of-orderfinding (severity 3) catches a merge done in the forge UI.observe-metricsfetches every readable repo link's main, four at a time inside the tick budget. A failed fetch becomesrepo-unreachable, with the remote redacted.worker <id> --remove [--force]removes a session worktree through its own repo and prunes that repo's worktree list. supervisor.md points to it.gate --allandgate <name>run in a sibling worktree under that repo's gates and env, and log itsrepo.-R, as before this change.settings.mdand noDEVTEAM_HOMErefuses everything butinitandhelp, so it can't run as a phantom home. The kit's own repo still runs its read-only views (see below).The reviews' minors are tracked for a follow-up PR.
Upstream review fixes
devteam-ae's review (at 187eb78) found two blockers and four should-fixes. Blocker 1 (an owner's "no" approving a link) is fixed on main by #113 and comes in with that merge. The rest, each with a regression test:
--approvedlogs an act per entry with itsentry_hashand main'sprior_hash.merge --approvedbinds every changed repo link entry to such an act of that answer and refuses any other by name.trunkfor a sibling). A newmerged-without-mergefinding catches a merge on any repo's main that no merge act made.node_modulesor configs. Worker and review worktrees stay under.worktrees/; README and spec state the risk.merged-out-of-ordercounts only merges after the upgrade.kitsOwnRepo()is gone, andstatus,whoami,validateandlinksrun there again.The review's nits (7–13) are tracked for the follow-up PR.
🤖 Generated with Claude Code