Why: worktree feature branches occasionally spawned child branches
(e.g. backend feature/cross-session-reading-1-gcb7f79d) outside the
task-start gate; collaboration.md conditionally allows stacked branches
but the Dev entry never said so, leaving stacking as an automation
blind spot with ad-hoc sha-embedded names.
Evidence: collaboration.md common-baseline section states the stacking
exception verbatim; historical numbered branches are all already merged
into main (origin/main..branch empty); precheck READY at R0=7d45719869.
Impact: AGENTS.md only. Default stays single-level branches from
origin/main with sibling branches for batch subtasks; stacking requires
recording the parent task/PR in the card, child naming without embedded
SHAs, parent-before-child merge order, and a sync back onto latest main
with PR base retargeted before merge (branch protection enforces this).
Refs: task card feature-branch-hierarchy-clause
Why: branches merged into main had left their task cards open; backfill status and archive to prevent bookkeeping debt.
Evidence: feature-chat-process-split-r1.md(PR#79) — merges verified via git log --merges against origin/main.
Impact: .task/*.md moved to .task/archive/ with status backfilled; no code or submodule change.
Refs: task.sh close (card-autoclose-r1)
Why: branches merged into main had left their task cards open; backfill status and archive to prevent bookkeeping debt.
Evidence: feature-file-preview-proposal.md(PR#77) — merges verified via git log --merges against origin/main.
Impact: .task/*.md moved to .task/archive/ with status backfilled; no code or submodule change.
Refs: task.sh close (card-autoclose-r1)
Why: branches merged into main had left their task cards open; backfill status and archive to prevent bookkeeping debt.
Evidence: fix-task-finish-close-followups.md(PR#75) — merges verified via git log --merges against origin/main.
Impact: .task/*.md moved to .task/archive/ with status backfilled; no code or submodule change.
Refs: task.sh close (card-autoclose-r1)
Why: PR #73 merged a branch whose worktree carried stale submodule
pointers, regressing modules/{backend,documents,frontend,ui} on main to
pre-#71 commits; documents also advanced with the file-preview proposal
(PR #23).
Evidence: submodule status now matches each module's main tip
(backend 239cf76, documents 5882448+, frontend fb219e0, ui efa6c69,
core fd44179 unchanged); make test combo verification green.
Impact: composed checkout sees the merged chat-order and proposal work
again; no source changes in this repo beyond pointers and the task card.
Refs: task feature/file-preview-proposal.
Why: cmd_finish ran git submodule deinit --all, but submodule.<name>.url entries live in the shared .git/config — finishing any task silently marked every other checkout and worktree uninitialized (observed twice on 2026-09-30: main checkout uninit=12 after each finish; a parallel session hit it minutes before this fix landed). The deinit serves no purpose: worktree removal with gitlinks is refused regardless, so cleanup already goes through rm -rf + prune. Also aligns AGENTS.md with observed hook behavior (post-merge fires on ff-only pulls too, and its inline close cannot see cards merged remotely until they are pulled), and ignores the ZCode-generated .zcodeignore that tripped the BUSY gate in every session.
Evidence: bash -n clean; abandon-path smoke of the patched script — start + FORCE_ABANDON=1 finish of a throwaway branch left shared submodule url config at 12 entries (pre-fix: 0), main checkout submodule status uninit=0, smoke worktree and branch fully recycled; the smoke close also backfilled a parallel session card left open (gitea-access-facts) via a card-close branch, proving the fallback path.
Impact: scripts/task.sh cmd_finish only (removes one line, updates comment), AGENTS.md card-close paragraph, .gitignore one entry. No product or gitlink change; make test not applicable (repo-level tooling/docs only). web_base default fix intentionally withdrawn from this PR — landed via parallel PR #73.
Refs: .task/fix-task-finish-close-followups.md
Why: the origin/main merge recorded a stale ui pointer (c7564791); this
branch verifies against efa6c69 (ui main), which carries the icons the
merged frontend needs.
Evidence: git submodule status shows checkout efa6c69 (ui origin/main);
frontend tsc -b exit 0 and vitest 33/33 against it.
Impact: gitlink update only.
Refs: feature/chat-process-split-r1
Why: branches merged into main had left their task cards open; backfill status and archive to prevent bookkeeping debt.
Evidence: feature-gitea-access-facts.md(PR#73) — merges verified via git log --merges against origin/main.
Impact: .task/*.md moved to .task/archive/ with status backfilled; no code or submodule change.
Refs: task.sh close (card-autoclose-r1)
Why: frontend 6483757 fixes the tsc breakage left by the main merge and
ports artifact events onto the items stream.
Evidence: tsc -b exit 0; vitest 33/33.
Impact: gitlink update only.
Refs: feature/chat-process-split-r1
Why: card must carry result and verification state before review.
Evidence: targeted behavior checks recorded in the card; bash -n passed.
Impact: documentation only.
Refs: feature-gitea-access-facts
Why: feature/chat-order-artifact-files merged via PR #71 but its task card stayed un-archived because the status line was hand-written as already-complete, which short-circuits the autoclose scan; backfill the main-record PR link and archive to prevent bookkeeping debt.
Evidence: .task/feature-chat-order-artifact-files.md moved to .task/archive/ with 任务主记录=PR #71 (merge bb1bf06) and the standard closure section; merge verified in origin/main.
Impact: .task bookkeeping only; no code or submodule change.
Refs: task.sh close (card-autoclose-r1)
Why: the TASK_CARD_WEB_BASE default in scripts/task.sh still pointed at
git-panel.u1680832.nyat.app:30319, which now fails the TLS handshake
(curl exit 35), breaking card-close PR links and API calls; agents also
kept rediscovering hosts and credential locations from scratch each
session.
Evidence: curl https://git-panel...:30319/api/v1/version -> exit 35; curl
https://git-home...:30319/api/v1/version with token from ~/.secrets/gitea
-> {"version":"1.27.3"}; ssh -p 31411 git@git-ssh... -> 'Hi there,
weichen!' with key ~/.ssh/home_gitea (ED25519, fingerprint
SHA256:GYXaOXIMeloQ1fKSfdJ/ndgPQzs/Ix7Hk62ekfkfQ20, key name GMKtec).
Impact: task.sh default web base now resolves to the live host; AGENTS.md
gains a Gitea access-facts section recording hosts plus credential
locations only (no secret values, per baseline hard boundary 2). Follow-up
PRs propagate the same section to the other project repos.
Refs: task card feature-gitea-access-facts
Why: task-sync requires a clean tree; both submodule branches now carry
merges of their respective mains (backend 9e694c0, frontend 765789f).
Evidence: git submodule status shows the new SHAs; backend go test ./...
ok after its merge; frontend vitest 32/32 after its merge.
Impact: gitlink update only.
Refs: feature/chat-process-split-r1