73 Commits
Author SHA1 Message Date
weichen 955a32de2b Merge pull request 'Audit follow-ups: pin-regression gate and subagent Writable preflight (M5)' (#695) from feature/audit-followups-pin-gate-m5 into main
ci / svc-realcombo (push) Successful in 2m42s
ci / test (push) Successful in 8m55s
ci / test-pg (push) Successful in 12m19s
2026-10-22 08:43:16 +00:00
weichen 2f37df890a Merge authoritative main into the task branch
ci / svc-realcombo (pull_request) Successful in 3m2s
ci / test (pull_request) Successful in 8m48s
ci / test-pg (pull_request) Successful in 12m23s
Why: include the current integration baseline before merge.

Evidence: fetched origin/main=9a80897c.

Impact: integrate upstream changes without rewriting task history.

Refs: task-sync
2026-10-22 08:30:20 +00:00
weichen 9a80897cb7 Merge pull request 'Close the merged test port governance card' (#696) from feature/card-close-20261022-080552Z into main
ci / svc-realcombo (push) Successful in 3m0s
ci / test (push) Successful in 9m4s
ci / test-pg (push) Successful in 12m51s
2026-10-22 08:20:56 +00:00
weichen 68219746be Retrigger CI after the flaky material-ack timeout
ci / svc-realcombo (pull_request) Successful in 2m44s
ci / test (pull_request) Successful in 9m20s
ci / test-pg (pull_request) Successful in 14m14s
Why: the CI test-pg timeout on TestMaterialAckAttachmentOnlyDoesNot-
CallParentModel is environmental (the product never sets a Writable
write-set, so the M5 preflight cannot trigger there; the same commit
and test pass locally in 0.05s against real PG/Redis).
Evidence: verify-materialack.json exit=0.
Impact: task metadata only.
Refs: PR #695
2026-10-22 08:15:01 +00:00
weichen 058d5b3f9c Close 1 merged task card(s) and archive them
ci / svc-realcombo (pull_request) Successful in 3m15s
ci / test (pull_request) Successful in 9m58s
ci / test-pg (pull_request) Successful in 14m16s
Why: branches merged into their immediate or root target had left their task cards open; backfill status and archive to prevent bookkeeping debt.
Evidence: fix-svc-test-port-governance.md(PR#694 into main) — merges verified via git log --merges plus Gitea API squash lookup against each card's origin target.
Impact: .task/*.md moved to .task/archive/ with status backfilled; no code or submodule change.
Refs: task.sh close (card-autoclose-r1)
2026-10-22 08:05:52 +00:00
weichen 67ffd7c89e Fold-close the task card before merge
ci / svc-realcombo (pull_request) Successful in 3m1s
ci / test-pg (pull_request) Failing after 3m47s
ci / test (pull_request) Successful in 9m32s
Why: close the task card inside its own PR so landing it needs no post-merge backfill or separate close PR.
Evidence: .task/feature-audit-followups-pin-gate-m5.md -> .task/archive/feature-audit-followups-pin-gate-m5.md; status 已完成(合入前闭合); PR #695 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/695.
Impact: task metadata only; the card is archived within PR #695 and lands with its merge commit.
Refs: task.sh close --self
2026-10-22 08:05:13 +00:00
weichen 1dbd15add0 Record the backend tip push and retrigger CI
ci / svc-realcombo (pull_request) Successful in 2m41s
ci / test (pull_request) Successful in 8m41s
ci / test-pg (pull_request) Successful in 11m53s
Why: the first CI run failed at checkout because the backend merge tip
a75783f existed only locally; it is now pushed.
Evidence: remote ref updated on Agent-System-Backend.
Impact: task metadata only.
Refs: PR #695
2026-10-22 07:52:41 +00:00
weichen 88f03f500e Record the followups review approval in the task card
ci / test (pull_request) Failing after 3s
ci / svc-realcombo (pull_request) Failing after 3s
ci / test-pg (pull_request) Failing after 3s
Why: independent review approved the pin gate and M5 fix.
Evidence: review receipt /tmp/agent-stack-b2/reviewf-run.json.
Impact: task metadata + review report.
Refs: PR #695
2026-10-22 07:51:48 +00:00
agent-exec-transport 36cc7f443b agent-exec transport 8515f314ceb985a1c630e7e8db3b8b0f/3af7c5319e38 2026-10-22 07:51:02 +00:00
weichen a2b4cf73a3 Record the merged baseline and the pre-existing governance failure
ci / test (pull_request) Failing after 3s
ci / test-pg (pull_request) Failing after 3s
ci / svc-realcombo (pull_request) Failing after 3s
Why: the branch now carries authoritative main (backend role-policy and
scratch-session work, frontend/ui pin advances); the only combination
failure is the environment-dependent svc test that reproduces on clean
main.
Evidence: verify-f-pins9.json exit=0; verify-f-rest.json exit=0;
verify-f-combo.json shows the single pre-existing failure.
Impact: task metadata only.
Refs: feature/audit-followups-pin-gate-m5
2026-10-22 07:33:47 +00:00
weichen 37e194871f Merge pull request 'Use dynamic ports in the two remaining hardcoded test bindings' (#694) from fix/svc-test-port-governance into main
ci / svc-realcombo (push) Successful in 3m0s
ci / test (push) Successful in 9m7s
ci / test-pg (push) Successful in 12m51s
2026-10-22 07:31:31 +00:00
weichen a874ee600a Merge authoritative main into the task branch
Why: include the current integration baseline before verification.

Evidence: fetched origin/main=d65195bd.

Impact: integrate upstream changes without rewriting task history.

Refs: task-sync
2026-10-22 07:25:28 +00:00
weichen b2f8c04b15 Repin modules/backend to the merged followups tip
Why: backend adopts upstream main (role-policy/HITL fixes) and the
parallel scratch-session work while keeping the M5 nested pin, so the
followups composition stays current with main.
Evidence: integration transport (gitlinkb7-run.json); pins checks and
combination targets re-run below.
Impact: one component gitlink.
Refs: feature/audit-followups-pin-gate-m5
2026-10-22 07:18:08 +00:00
weichen 679c483d00 Record the sync checkpoint
ci / svc-realcombo (pull_request) Successful in 3m19s
ci / test (pull_request) Successful in 9m27s
ci / test-pg (pull_request) Successful in 12m37s
Why: bind the task validation checkpoint to the integration baseline.

Evidence: SELF recursive component checks; sync_base=d65195bd41317e480c5a0cfa5133b0ad98a48d4b; before_record=a1e0c85c0400ce300a847da276e70d520f842844.

Impact: task metadata only.

Refs: .task/fix-svc-test-port-governance.md
2026-10-22 07:17:59 +00:00
weichen a1e0c85c04 Merge authoritative main into the task branch
Why: include the current integration baseline before verification.

Evidence: fetched origin/main=d65195bd41317e480c5a0cfa5133b0ad98a48d4b.

Impact: integrate upstream changes without rewriting task history.

Refs: task-sync
2026-10-22 07:17:09 +00:00
weichen 17ba4eab35 Record the followups verification results in the task card
ci / svc-realcombo (pull_request) Successful in 3m6s
ci / test-pg (pull_request) Failing after 3m39s
ci / test (pull_request) Successful in 10m4s
Why: pins checks green with the new gate; all other combination targets
pass; the single governance failure reproduces on clean main.
Evidence: verify-followups-{pins5,rest}.json exit=0; main reproduction
captured in-session.
Impact: task metadata only.
Refs: feature/audit-followups-pin-gate-m5
2026-10-22 07:09:14 +00:00
weichen d65195bd41 Merge pull request 'Deliver isolated no-project scratch sessions across Backend, Frontend and UI' (#691) from feature/scratch-session-general-agent into main
ci / svc-realcombo (push) Successful in 3m13s
ci / test (push) Successful in 9m30s
ci / test-pg (push) Successful in 15m22s
2026-10-22 07:08:47 +00:00
weichen a23a212015 Repin modules/backend to the nested-squad followups tip
Why: backend's nested agent-squad advances with its nested agent-native
M5 bump, keeping every container consistent with the Dev-level pins.
Evidence: integration transport (gitlinkb3b-run.json); pins checks and
full make test re-run below.
Impact: one component gitlink.
Refs: feature/audit-followups-pin-gate-m5
2026-10-22 06:52:30 +00:00
weichen a39b4f795c Advance squad and backend pins for the followups
Why: the squad container carries its nested agent-native M5 bump; the
backend container is already at its repaired tip in this history.
Evidence: integration transport (gitlinks3-run.json); pins checks and
full make test re-run below.
Impact: one component gitlink.
Refs: feature/audit-followups-pin-gate-m5
2026-10-22 06:47:42 +00:00
weichenandCursor d2dbd9dfdf Bump Backend to the PostgreSQL role policy and HITL test fixes
ci / svc-realcombo (pull_request) Successful in 3m7s
ci / test (pull_request) Successful in 9m43s
ci / test-pg (pull_request) Successful in 15m30s
Why: Dev composite test-pg failed on the role_permissions upsert from
Backend#240 and a racy HITL test; Backend#246 fixes both.

Evidence: Backend#246 CI GATE on 8cd4dd0; PostgreSQL verified by this
PR's test-pg job.

Impact: modules/backend 7bcbbdb.

Refs: Agent-System-Backend#246, Agent-System-Dev#691;
agent-exec receipt u6d-run (cursor, success)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 06:43:47 +00:00
weichen ecfa244c0a Repin modules/backend to the nested-M5 tip
Why: the backend branch advanced past its nested agent-native bump so
the composed chain carries the M5 preflight end to end.
Evidence: integration transport success (gitlinkb2h-run.json); pins
checks and full make test re-run below.
Impact: one component gitlink.
Refs: feature/audit-followups-pin-gate-m5
2026-10-22 06:34:08 +00:00
agent-exec-transport f1866903c5 agent-exec transport 461e582a25c2763a6ac100e94490eddd/c9ee6bdfd3a5
ci / svc-realcombo (pull_request) Successful in 3m7s
ci / test (pull_request) Successful in 8m36s
ci / test-pg (pull_request) Successful in 13m37s
2026-10-22 06:29:13 +00:00
weichen cb767f6035 Advance native, squad and backend pins for the followups
Why: native carries the M5 subagent preflight fix; backend adopts its
branch tip that merges upstream main (scratch sessions) on top of the
batch-2 line.
Evidence: integration transport success (gitlinkf5-run.json); nested
native pins follow in the next commit; pins checks re-run below.
Impact: two component gitlinks.
Refs: feature/audit-followups-pin-gate-m5
2026-10-22 06:25:14 +00:00
weichen 5130babad4 Fold-close the task card before merge
ci / test-pg (pull_request) Failing after 3m0s
ci / svc-realcombo (pull_request) Successful in 3m18s
ci / test (pull_request) Successful in 9m17s
Why: close the task card inside its own PR so landing it needs no post-merge backfill or separate close PR.
Evidence: .task/feature-scratch-session-general-agent.md -> .task/archive/feature-scratch-session-general-agent.md; status 已完成(合入前闭合); PR #691 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/691.
Impact: task metadata only; the card is archived within PR #691 and lands with its merge commit.
Refs: task.sh close --self
2026-10-22 06:22:02 +00:00
weichen f217a2bce6 Record the sync checkpoint
Why: bind the task validation checkpoint to the integration baseline.

Evidence: SELF recursive component checks; sync_base=33d6ef69212595c680a744549986c19bb6acd6c3; before_record=1970dccb7c8c11fb69ad739ae1338e97ca4ac0a6.

Impact: task metadata only.

Refs: .task/feature-scratch-session-general-agent.md
2026-10-22 06:21:57 +00:00
weichen 1970dccb7c Merge authoritative main into the task branch
Why: include the current integration baseline before verification.

Evidence: fetched origin/main=33d6ef69212595c680a744549986c19bb6acd6c3.

Impact: integrate upstream changes without rewriting task history.

Refs: task-sync
2026-10-22 06:21:09 +00:00
weichenandCursor 52093614fa Record the composite test run after the Frontend contracts fix
Why: make test reran after the Frontend bump; the only failure is
test_svc, whose fixed port 127.0.0.1:18794 is held by an unrelated
local python3 http.server, not by this change.
Evidence: make evidence receipt (SELF, exit 2) on b672792f.
Impact: Task card only; CI in its isolated container is authoritative.
Refs: Agent-System-Dev#691

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 06:21:05 +00:00
weichen 80e5e4559c Record the task card for fix-svc-test-port-governance
Why: establish the authorized task workspace and its initial baseline.

Evidence: preserved precheck receipt in .task/fix-svc-test-port-governance.md; R0=33d6ef69212595c680a744549986c19bb6acd6c3.

Impact: task metadata only; the feature workspace starts at 33d6ef6921.

Refs: .task/fix-svc-test-port-governance.md
2026-10-22 06:18:16 +00:00
weichen ba1d3b2b81 Add the pin-regression gate to pins checks and the PR gate
Why: PR #682 merged a stale branch that reset five component pins to
pre-batch values, silently dropping the batch-1 composition on main.
Evidence: materialized byte-exact from the reviewed transport
(gatemat-run.json); regression/forward/same/skip/missing-object cases
(verify-pingate.json); make test-governance and test-pins re-run below.
Impact: new check script wired into check-pins and task-pr-check;
PIN_REGRESSION_SKIP=1 documents deliberate downgrades.
Refs: feature/audit-followups-pin-gate-m5
2026-10-22 06:16:13 +00:00
weichen 3080c0f4af Bump the agent-native pin to the M5 subagent fix
Why: land the review-M5 preflight fix (delegate_task under a Writable
write-set is now rejected like exec/MCP/host tools).
Evidence: transport success (gitlinkm5c-run.json); native unit tests
green (verify-m5.json); gate/pins checks re-run with the pin bump.
Impact: one component gitlink.
Refs: feature/audit-followups-pin-gate-m5
2026-10-22 06:14:23 +00:00
weichenandCursor b672792f77 Bump Frontend to keep the scratch flag out of generated contracts
Why: Frontend#124 moves Conversation.scratch into a local view type so
make contracts (Core is authoritative) no longer breaks tsc.

Evidence: Frontend#124 CI GATE on 6e611c5.

Impact: modules/frontend 279b2d0.

Refs: Agent-System-Frontend#124, Agent-System-Dev#691;
agent-exec receipt u6c-run (cursor, success)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 06:14:20 +00:00
weichen 33d6ef6921 Merge pull request 'Close the merged pin-advance task card' (#692) from feature/card-close-20261022-055959Z into main
ci / svc-realcombo (push) Successful in 2m54s
ci / test (push) Successful in 8m45s
ci / test-pg (push) Successful in 13m1s
2026-10-22 06:13:49 +00:00
weichenandCursor 5eee6fec51 Record the composite test and the contracts regeneration finding
Why: make test passed on aa77f201, but make contracts regenerates the
frontend contracts from Core and drops Conversation.scratch, which would
fail tsc in make build; Frontend#124 moves the flag to a local view type.
Evidence: make evidence receipt (SELF) on aa77f201.
Impact: Task card only.
Refs: Agent-System-Dev#691, Agent-System-Frontend#124

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 06:07:35 +00:00
weichen a600d7abf0 Close 1 merged task card(s) and archive them
ci / svc-realcombo (pull_request) Successful in 3m13s
ci / test (pull_request) Successful in 9m40s
ci / test-pg (pull_request) Successful in 12m59s
Why: branches merged into their immediate or root target had left their task cards open; backfill status and archive to prevent bookkeeping debt.
Evidence: fix-rdm-pin-advance-latest.md(PR#690 into main) — merges verified via git log --merges plus Gitea API squash lookup against each card's origin target.
Impact: .task/*.md moved to .task/archive/ with status backfilled; no code or submodule change.
Refs: task.sh close (card-autoclose-r1)
2026-10-22 05:59:59 +00:00
weichen 6d35f911fe Record the followups task card (pin gate + M5)
Why: carry authorization and unit plan for the audit follow-ups:
pin-regression gate and native subagent Writable preflight (M5).
Evidence: card only; no code change.
Impact: task metadata only.
Refs: feature/audit-followups-pin-gate-m5
2026-10-22 05:59:51 +00:00
weichen 7778fdcee7 Merge pull request 'Advance the RDM pin to the current mainline head' (#690) from fix/rdm-pin-advance-latest into main
ci / svc-realcombo (push) Successful in 2m54s
ci / test (push) Successful in 9m37s
ci / test-pg (push) Successful in 14m2s
2026-10-22 05:49:16 +00:00
weichen aa77f20184 Record the sync checkpoint
Why: bind the task validation checkpoint to the integration baseline.

Evidence: SELF recursive component checks; sync_base=b7636742fc9ea937e6030123afc608fd294861bf; before_record=1dee480dff7203aff3bd6b57661645fe0b890bce.

Impact: task metadata only.

Refs: .task/feature-scratch-session-general-agent.md
2026-10-22 05:49:12 +00:00
weichen 1dee480dff Merge authoritative main into the task branch
Why: include the current integration baseline before verification.

Evidence: fetched origin/main=b7636742fc9ea937e6030123afc608fd294861bf.

Impact: integrate upstream changes without rewriting task history.

Refs: task-sync
2026-10-22 05:48:30 +00:00
weichenandCursor ddc5bf9285 Align component pins with the merged batch-2 and scratch session Backend
Why: Dev main (#689) pins Backend to the batch-2 branch commit and newer
deps; Backend main fd69932 (Backend#245) now contains both batch-2 and
the scratch session work (Backend#241).

Evidence: Backend#245 CI GATE on 443e7af; deps match Dev main pins.

Impact: modules/backend fd69932; deps/agent-{command,intent,native,squad}
equal Dev main.

Refs: Agent-System-Backend#245, Agent-System-Dev#689, #691;
agent-exec receipt u6b-run (cursor, success)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 05:48:15 +00:00
weichen 8b39017068 Record the sync checkpoint
ci / svc-realcombo (pull_request) Successful in 3m5s
ci / test (pull_request) Successful in 9m56s
ci / test-pg (pull_request) Successful in 13m58s
Why: bind the task validation checkpoint to the integration baseline.

Evidence: SELF recursive component checks; sync_base=b7636742fc9ea937e6030123afc608fd294861bf; before_record=d8fcc0d6f6d854fda7a92ddfdcda7d0bb8c5304a.

Impact: task metadata only.

Refs: .task/fix-rdm-pin-advance-latest.md
2026-10-22 05:34:32 +00:00
weichen d8fcc0d6f6 Merge authoritative main into the task branch
Why: include the current integration baseline before verification.

Evidence: fetched origin/main=b7636742fc9ea937e6030123afc608fd294861bf.

Impact: integrate upstream changes without rewriting task history.

Refs: task-sync
2026-10-22 05:33:46 +00:00
weichen b7636742fc Merge pull request 'Agent stack audit remediation batch 2 (U8, U9, U11)' (#689) from feature/agent-stack-audit-remediation-b2 into main
ci / svc-realcombo (push) Successful in 3m21s
ci / test (push) Successful in 9m43s
ci / test-pg (push) Successful in 14m54s
2026-10-22 05:31:19 +00:00
weichenandCursor 7c97dee7c2 Record the blocked composite test on the scratch session card
ci / svc-realcombo (pull_request) Failing after 1m38s
ci / test-pg (pull_request) Failing after 3m34s
ci / test (pull_request) Failing after 7m2s
Why: make test fails at test-pins because Backend main already pins the
agent-stack batch-1 deps that Dev main has not adopted yet.
Evidence: make evidence receipt (SELF, exit 2) on 36a1d408.
Impact: Task card only; waiting for Dev #689 per queue #518.
Refs: Agent-System-Dev#691, #689, #518

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 05:26:38 +00:00
weichen 36a1d4084e Record the sync checkpoint
ci / svc-realcombo (pull_request) Failing after 1m46s
ci / test-pg (pull_request) Failing after 3m53s
ci / test (pull_request) Failing after 7m2s
Why: bind the task validation checkpoint to the integration baseline.

Evidence: SELF recursive component checks; sync_base=1de7c28c2122609dd9b6435881696492bd052a34; before_record=635459316dbd4e4a5134f4e409bed72a5dd02730.

Impact: task metadata only.

Refs: .task/feature-scratch-session-general-agent.md
2026-10-22 05:18:42 +00:00
agent-exec-transport 032d8bb6b9 agent-exec transport 6600a116a8bc2802ee7eb4eff5bbc6d7/e9bec44bf54b
ci / svc-realcombo (pull_request) Successful in 2m57s
ci / test (pull_request) Successful in 9m45s
ci / test-pg (pull_request) Successful in 13m41s
2026-10-22 05:17:55 +00:00
weichen 635459316d Merge authoritative main into the task branch
Why: include the current integration baseline before verification.

Evidence: fetched origin/main=1de7c28c2122609dd9b6435881696492bd052a34.

Impact: integrate upstream changes without rewriting task history.

Refs: task-sync
2026-10-22 05:17:46 +00:00
weichenandCursor 63ff64dd7a Bump Backend, Frontend and UI to the merged scratch session work
Why: Accounts without project.create get isolated no-project
conversations; the three component PRs are merged.

Evidence: component CI on each merged PR head (GATE): Backend#241
2424f8e, Frontend#123 b02ff83, UI#60 db5129c; composite make test is
recorded on the task card.

Impact: modules/backend 029917e, modules/frontend ec1ced3,
modules/ui df1c3ed.

Refs: Agent-System-Backend#241, Agent-System-Frontend#123,
Agent-System-UI#60; agent-exec receipt u6-run (cursor, success)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 05:17:25 +00:00
weichen f2969664ef Merge authoritative main into the task branch
ci / svc-realcombo (pull_request) Successful in 3m21s
ci / test (pull_request) Successful in 9m13s
ci / test-pg (pull_request) Successful in 14m31s
Why: include the current integration baseline before merge.

Evidence: fetched origin/main=1de7c28c.

Impact: integrate upstream changes without rewriting task history.

Refs: task-sync
2026-10-22 05:15:53 +00:00
weichen 87db22a3f7 Record the task card for fix-rdm-pin-advance-latest
Why: establish the authorized task workspace and its initial baseline.

Evidence: preserved precheck receipt in .task/fix-rdm-pin-advance-latest.md; R0=1de7c28c2122609dd9b6435881696492bd052a34.

Impact: task metadata only; the feature workspace starts at 1de7c28c21.

Refs: .task/fix-rdm-pin-advance-latest.md
2026-10-22 05:10:36 +00:00
weichen c325d85fb6 Fold-close the task card before merge
ci / svc-realcombo (pull_request) Successful in 2m40s
ci / test (pull_request) Successful in 9m4s
ci / test-pg (pull_request) Successful in 11m59s
Why: close the task card inside its own PR so landing it needs no post-merge backfill or separate close PR.
Evidence: .task/feature-agent-stack-audit-remediation-b2.md -> .task/archive/feature-agent-stack-audit-remediation-b2.md; status 已完成(合入前闭合); PR #689 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/689.
Impact: task metadata only; the card is archived within PR #689 and lands with its merge commit.
Refs: task.sh close --self
2026-10-22 05:03:17 +00:00
weichen 6b191579df Record the batch-2 review approval in the task card
ci / svc-realcombo (pull_request) Successful in 3m8s
ci / test (pull_request) Successful in 9m16s
ci / test-pg (pull_request) Successful in 11m46s
Why: independent review approved batch 2 (0 blockers, 0 majors, 5
minor follow-up notes); report committed; receipt SHAs annotated to
the final lineage per review minor 4.
Evidence: review receipt /tmp/agent-stack-b2/review-run.json
(pi-glm, success).
Impact: task metadata + review report.
Refs: PR #689
2026-10-22 04:51:05 +00:00
agent-exec-transport 8f742c7824 agent-exec transport 23992e9206bf4a03822a8516d4c78f97/e7eb0eda78ed 2026-10-22 04:50:27 +00:00
weichen ea099a5fbf Record batch-2 completion and the green combination run
ci / svc-realcombo (pull_request) Successful in 3m18s
ci / test (pull_request) Successful in 8m56s
ci / test-pg (pull_request) Successful in 11m59s
Why: all batch-2 units implemented, repaired and verified; full make
test green on the final pinned combination.
Evidence: verify-combo.json exit=0; component branches pushed
(native cff6935, squad 9edb6ba, backend 9b40595).
Impact: task metadata only.
Refs: feature/agent-stack-audit-remediation-b2
2026-10-22 04:32:50 +00:00
weichen 0b46569d85 Repin modules/backend to the nested-squad tip
Why: the backend branch tip 9b40595 additionally pins the nested
agent-squad (and its nested native) so the composed chain carries the
batch-2 event fields end to end.
Evidence: integration transport success (gitlinkb-run.json); full
make test re-run follows on this branch.
Impact: one component gitlink.
Refs: feature/agent-stack-audit-remediation-b2
2026-10-22 04:25:08 +00:00
weichen a0b8d12b43 Advance native, squad and backend pins to the batch-2 tips
Why: land U8, U9 and U11 across agent-native (cff6935), agent-squad
(9edb6ba) and modules/backend (race-repair tip) per the approved plan.
Evidence: per-unit SELF receipts under /tmp/agent-stack-b2 (all
exit=0); full make test re-run follows on this branch.
Impact: three component gitlinks.
Refs: docs/superpowers/plans/2026-10-21-agent-stack-audit-remediation-plan.md
2026-10-22 04:20:45 +00:00
weichenandCursor db37c59a32 Record review-fix attempts for scratch session gates
Why: Independent reviews blocked on project-context, bus-level rdm
gates and remaining project-only UI surfaces; each attempt must be
traceable, including the authorized UI-repo expansion.

Evidence: receipts under /tmp/scratch-session-20261022 (SELF).
Impact: Task card only.
Refs: Backend#241 Frontend#123 UI#60
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 04:04:17 +00:00
weichen ef75fd7f25 Record batch-2 unit receipts so far
Why: per-unit audit trail for U8/U9/U11a/U11b/U11c including the
fail-stop redispatches and the frame-order repair.
Evidence: per-unit SELF receipts under /tmp/agent-stack-b2.
Impact: task metadata only.
Refs: feature/agent-stack-audit-remediation-b2
2026-10-22 04:00:34 +00:00
weichenandCursor 5f1d6f8e15 Record scratch session implementation attempts on the task card
Why: Every implementation attempt and its reconciliation must be traceable.
Evidence: receipts under /tmp/scratch-session-20261022 (SELF).
Impact: Task card only.
Refs: .task/feature-scratch-session-general-agent.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 03:22:37 +00:00
weichen 1de7c28c21 Merge pull request 'Close the merged admit task card' (#688) from feature/card-close-20261022-022827Z into main
ci / svc-realcombo (push) Successful in 2m29s
ci / test (push) Successful in 8m41s
ci / test-pg (push) Successful in 12m2s
2026-10-22 02:40:55 +00:00
weichen 3b267dbe4d Close 1 merged task card(s) and archive them
ci / svc-realcombo (pull_request) Successful in 2m48s
ci / test (pull_request) Successful in 9m33s
ci / test-pg (pull_request) Successful in 12m5s
Why: branches merged into their immediate or root target had left their task cards open; backfill status and archive to prevent bookkeeping debt.
Evidence: fix-agent-exec-admit-authoritative-base.md(PR#687 into main) — merges verified via git log --merges plus Gitea API squash lookup against each card's origin target.
Impact: .task/*.md moved to .task/archive/ with status backfilled; no code or submodule change.
Refs: task.sh close (card-autoclose-r1)
2026-10-22 02:28:27 +00:00
weichen dae463b75d Merge pull request 'Record the admit baseline-recognition outcome' (#687) from fix/agent-exec-admit-authoritative-base into main
ci / svc-realcombo (push) Successful in 2m19s
ci / test (push) Successful in 8m45s
ci / test-pg (push) Successful in 12m6s
2026-10-22 02:23:20 +00:00
weichen fb38fd65f8 Record the sync checkpoint
ci / svc-realcombo (pull_request) Successful in 2m30s
ci / test (pull_request) Successful in 8m33s
ci / test-pg (pull_request) Successful in 11m32s
Why: bind the task validation checkpoint to the integration baseline.

Evidence: SELF recursive component checks; sync_base=a4311c6341c318d4bbf1563b3973358326086794; before_record=f20043be5a13e53240d39557291cf19eecc84098.

Impact: task metadata only.

Refs: .task/fix-agent-exec-admit-authoritative-base.md
2026-10-22 02:10:49 +00:00
weichen f20043be5a Merge authoritative main into the task branch
Why: include the current integration baseline before verification.

Evidence: fetched origin/main=a4311c6341c318d4bbf1563b3973358326086794.

Impact: integrate upstream changes without rewriting task history.

Refs: task-sync
2026-10-22 02:10:05 +00:00
weichen e465b7c18f Record the admit baseline-recognition outcome on the Dev task card
ci / svc-realcombo (pull_request) Successful in 2m25s
ci / test (pull_request) Successful in 8m31s
ci / test-pg (pull_request) Successful in 9m28s
Why: this Dev branch carries only the task record; the change itself landed in
Development-Manager PR #32. Without the outcome written down the card would sit
unmerged with no explanation of why.

Evidence: Development-Manager main 2c2e372, CI green, independent review PASS;
its effect measured on RDM (65 staged paths down to 5 needing transport) and on
Dev (90-commit sync admitted with no transport).

Impact: task card only.

Refs: Development-Manager PR #32, RDM PR #460, Dev PR #682, Dev PR #684
2026-10-22 01:55:37 +00:00
weichenandCursor 4cb94bd8d7 Record scratch-session goal and delivery endpoint on the task card
Why: Align the task card with the approved design before implementation units.
Evidence: Design approved 2026-10-22; task-start R0=a4311c63.
Impact: .task card metadata only.
Refs: docs/superpowers/specs/2026-10-22-scratch-session-general-agent-design.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 01:44:53 +00:00
weichenandCursor 49a22059c9 Add scratch session general-agent design and plan
Why: Record the approved design for isolated no-project conversations.
Evidence: Design sections 1-4 approved 2026-10-22; task-start R0=a4311c63.
Impact: Docs only under docs/superpowers/{specs,plans}.
Refs: docs/superpowers/specs/2026-10-22-scratch-session-general-agent-design.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-22 01:43:42 +00:00
weichen 795444c4c0 Record the task card for feature-scratch-session-general-agent
Why: establish the authorized task workspace and its initial baseline.

Evidence: preserved precheck receipt in .task/feature-scratch-session-general-agent.md; R0=a4311c6341c318d4bbf1563b3973358326086794.

Impact: task metadata only; the feature workspace starts at a4311c6341.

Refs: .task/feature-scratch-session-general-agent.md
2026-10-22 01:43:32 +00:00
weichen a4311c6341 Merge pull request 'Close the merged pin-advance task card' (#686) from feature/card-close-20261022-012859Z into main
ci / svc-realcombo (push) Successful in 2m33s
ci / test (push) Successful in 8m18s
ci / test-pg (push) Successful in 11m35s
2026-10-22 01:41:02 +00:00
weichen 6db7d37888 Close 1 merged task card(s) and archive them
ci / svc-realcombo (pull_request) Successful in 2m26s
ci / test (pull_request) Successful in 8m9s
ci / test-pg (pull_request) Successful in 11m8s
Why: branches merged into their immediate or root target had left their task cards open; backfill status and archive to prevent bookkeeping debt.
Evidence: fix-pal-component-delivery-pins.md(PR#682 into main) — merges verified via git log --merges plus Gitea API squash lookup against each card's origin target.
Impact: .task/*.md moved to .task/archive/ with status backfilled; no code or submodule change.
Refs: task.sh close (card-autoclose-r1)
2026-10-22 01:28:59 +00:00
weichen 5f09af2d58 Fill in the batch-2 card and record the pin restoration
Why: carry authorization, the discovered composition regression
(#682 reset batch-1 pins) and its restoration, plus the wave plan.
Evidence: restoration transport success (pinrestore-run.json).
Impact: task metadata only.
Refs: feature/agent-stack-audit-remediation-b2
2026-10-22 01:17:56 +00:00
weichen 646a219116 Restore the batch-1 component pins lost to the parallel pin merge
Why: PR #682 (f23f5bb0) merged a stale branch whose tree carried
pre-batch component pins, silently reverting the batch-1 composition
on main; batch 2 (U8/U9/U11) is defined on top of batch 1.
Evidence: restoration transport success (pinrestore-run.json); batch-1
tips pushed on all five component origins.
Impact: five component gitlinks restored to the audited batch-1 tips.
Refs: feature/agent-stack-audit-remediation-b2
2026-10-22 01:16:57 +00:00
weichen 387723b1a4 Record the task card for feature-agent-stack-audit-remediation-b2
Why: establish the authorized task workspace and its initial baseline.

Evidence: preserved precheck receipt in .task/feature-agent-stack-audit-remediation-b2.md; R0=f23f5bb01a8b96ab90686d3a1b07791d7f473de2.

Impact: task metadata only; the feature workspace starts at f23f5bb01a.

Refs: .task/feature-agent-stack-audit-remediation-b2.md
2026-10-22 01:10:03 +00:00
weichen 27d546f0fb Record the task card for fix-agent-exec-admit-authoritative-base
Why: establish the authorized task workspace and its initial baseline.

Evidence: preserved precheck receipt in .task/fix-agent-exec-admit-authoritative-base.md; R0=096b74b4775e81cfb2864f98cae2e9fc9d9c1a44.

Impact: task metadata only; the feature workspace starts at 096b74b477.

Refs: .task/fix-agent-exec-admit-authoritative-base.md
2026-10-21 11:41:20 +00:00
26 changed files with 1667 additions and 21 deletions
@@ -0,0 +1,175 @@
# feature/agent-stack-audit-remediation-b2 任务卡
任务主记录:PR #689 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/689;状态:已完成(合入前闭合);owner:weichen
## 基线与授权
- 权威仓:ssh://git@192.168.3.2:2222/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= f23f5bb01a8b96ab90686d3a1b07791d7f473de2
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-agent-stack-audit-remediation-b2(worktree);分支:feature/agent-stack-audit-remediation-b2
- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false
- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=22ed04d7fb30ca7299bbf8795c7dad867b9800c85f55b57619a717c3e7b762ed;triage_receipt=/tmp/triage-remediation-b2-1792631272.json;receipt_sha256=5c213b38ad4980f21fa92d0a83234460188fe5cc4fabe847f78bc20dd872e438
- 授权与交付终点:用户已批准按方案实施第二批(U8、U9、U11:持久化遗漏、并发限额、完成事件与工具结果一致性)。范围内连续推进至组件提交、Backend 嵌套 gitlink 与 Dev 组合指针更新、组合验证、独立 Review、PR/CI/合入。未授权:部署/迁移/发布、功能增量 A1-A4、A2A(F16)、第一批评审 5 条 minor 跟进项。
- 前置修复(已含):并行 PR #682(f23f5bb0)将五个组件 pin 回退到批次一之前,组合层面丢失批次一;已在 b2 分支以 pin-restore 单元恢复(646a2191),批次二基于恢复后的批次一 tip 构建。
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
- 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收
- 当前阶段:需求拆解;当前增量:I1(待定义)
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
## 目标与非目标
**目标**:按方案修复 F11/F12/F14:U8 SQLite 完整保存 Mailbox/Handoffs/Board 且错误可见(终态/manifest/checkpoint flush 不发伪成功);U9 Claim 原子校验 agent 与 runtime 双重在途上限;U11 工具事件跨 native→squad→backend 保留 CallID、真实错误/状态(拆 U11a/U11b/U11c)。
**非目标**:A1-A4;A2A;第一批 5 条 minor 跟进;通用幂等平台;部署/迁移/发布。
## Agent 实施收据
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|---|
| pin-restore | Dev 五组件 pin 恢复批次一 tip | digest /tmp/agent-stack-b1/pin-restore-b2.json | implementation | [cursor,…] | 1 | cursor | success | 646a2191 | 否 | /tmp/agent-stack-b1/pinrestore-run.json |
| u11a | native: exec/、runtime/、adapters/native 事件字段 | digest /tmp/agent-stack-b2/u11a-run.json | implementation | [cursor,…] | 1 | cursor | success | native cff6935 | 否 | /tmp/agent-stack-b2/u11a-run.json |
| u8(首次) | squad: sqlite 持久化+错误可见 | digest /tmp/agent-stack-b2/u8-run.json | implementation | [pi,codex](cursor/agy 禁用) | 1 | pi | failed-unknown(终态记录不可解码,现场保留) | 无 | 否 | /tmp/agent-stack-b2/u8-run.json |
| u8(重派) | 同上 | digest /tmp/agent-stack-b2/u8b-run.json | implementation | [pi,codex] | 1 | pi | success | squad aa81b50→7d0630a | 否 | /tmp/agent-stack-b2/u8b-run.json |
| u9(首次) | squad: adapters/sqlite/queue 双重上限 | digest /tmp/agent-stack-b2/u9-run.json | implementation | [pi,codex] | 1 | pi | failed-unknown(同上模式,现场保留) | 无 | 否 | /tmp/agent-stack-b2/u9-run.json |
| u9(重派) | 同上 | digest /tmp/agent-stack-b2/u9b-run.json | implementation | [pi,codex] | 1 | pi | success | squad 25397e3 | 否 | /tmp/agent-stack-b2/u9b-run.json |
| u11b | squad: port/bridge/taps 事件字段 | digest /tmp/agent-stack-b2/u11b-run.json | implementation | [pi,codex] | 1 | pi | success | squad 676a1ed | 否 | /tmp/agent-stack-b2/u11b-run.json |
| u11b-repair | squad: 探针帧序保持 | digest /tmp/agent-stack-b2/u11br-run.json | repair | [pi,codex] | 1 | pi | success | squad 9edb6ba | 否 | /tmp/agent-stack-b2/u11br-run.json |
| u11c | backend: squad_runner/hostbridge 事件保真 | digest /tmp/agent-stack-b2/u11c-run.json | implementation | [pi,codex] | 1 | pi | success | backend fc0a050 | 否 | /tmp/agent-stack-b2/u11c-run.json |
| u11c-repair | backend: -race 数据竞争修复(runToolCtx 写 vs 回调读) | digest /tmp/agent-stack-b2/u11cr-run.json | repair | [pi,codex] | 1 | pi | success | backend 7b8a34d | 否 | /tmp/agent-stack-b2/u11cr-run.json |
| gitlink-integration(含 backend 微修正) | Dev 顶层 native/squad/backend 指针 | host 集成 | implementation | [cursor,…] | success×2 | cursor | success | a0b8d12b / 0b46569d | 否 | /tmp/agent-stack-b2/gitlink-run2.json、gitlinkb-run.json |
| 组合验证 | 全量 make test @ 0b46569d | host | host | — | — | host | PASS(exit=0) | — | — | /tmp/agent-stack-b2/verify-combo.json |
| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — |
## 关联方向与规划
- 适用状态:待核对(无适用规划时说明原因)
- 主记录路径/版本:待核对(路径按仓库根目录定位,归档后不变;只引用唯一正文)
- 对应里程碑:待核对
## 需求分析
| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |
|---|---|---|---|---|---|---|
| R1 | 待填写 | 待评估 | 待定 | 待定义 | 待确认 | 待评审 |
## 方案与计划
- 方案引用:待填写(含对象版本)
- 实施计划引用:待填写(含增量与需求 ID)
- 测试计划引用:待填写(含需求 ID 与验收条件)
## 阶段记录
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|---|---|---|---|---|---|
| 需求拆解 | 待定 | 待执行 | — | — | — |
| 需求评估 | 待定 | 待执行 | — | — | — |
| 需求表确认 | 待定 | 待执行 | — | — | — |
| 方案设计 | 待定 | 待执行 | — | — | — |
| 实施计划 | 待定 | 待执行 | — | — | — |
| 实施与自检 | 待定 | 待执行 | — | — | — |
| 正式测试与验收 | 待定 | 待执行 | — | — | — |
| 代码 Review | 待定 | 待执行 | — | — | — |
| 合入 | 待定 | 待执行 | — | — | — |
| 合入核验与收口 | 待定 | 待执行 | — | — | — |
## 探索试验与迭代
| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 授权/决策依据 | 结果 | 变更影响 | 需重审补测 |
|---|---|---|---|---|---|---|---|
| 待定义 | — | — | — | 待核对 | NOT_RUN | 待评估 | 待评估 |
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | f23f5bb01a8b96ab90686d3a1b07791d7f473de2 | f23f5bb01a8b96ab90686d3a1b07791d7f473de2 | 2026-10-22T01:10:02Z |
## 证据(Evidence)
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|---|---|---|---|---|---|
## 交付调度
- 调度状态:未入队;调度记录:无
- entry_id:无;attempt_id:无;窗口执行者:无
- 固定候选:无(base/head、组件与相关配置引用实际尝试)
- 调度依据:policy/delivery.md#合入调度
- 固定后证据:源码外 RECEIPT;实际结果后按授权原样导入和闭合
## 结果与验证
- 结果:
- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
- 影响与剩余项:
## 规划进展与下一步
- 本次推进/剩余:待核对(依据实际成果更新适用方案/规划)
- 首选下一任务:待核对(无适用规划、已完成或受阻时如实说明,不虚构任务)
- 推荐依据:待填写
- 前置条件/待确认:待核对
- 预期产物/验收条件:待定义
- 重复任务核对:待核对(已有/在途任务、PR 与规划记录)
- 启动授权:未授权(建议不自动启动新任务,仍须明确授权)
## 合入与清理
- Review 记录:独立 CLI 评审单元 agent-stack-b2-independent-review(pi-glm attempt1 success,收据 /tmp/agent-stack-b2/review-run.json);结论 APPROVE(0 blocker / 0 major / 5 minor 非阻塞跟进项);报告 .task/reviews/2026-10-22-agent-stack-b2-independent-review.md;被审对象 0b46569d 组合 vs main。收据表 SHA 追注:u8 最终提交 cf83d30、u9 最终提交 12a53b0(transport 重建,与收据候选逐字节同树,评审 Minor 4)。
- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测)
- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果)
- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验)
- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-22T01:09:09.476561+00:00",
"command": "make precheck",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev",
"before_head": "f23f5bb01a8b96ab90686d3a1b07791d7f473de2",
"after_head": "f23f5bb01a8b96ab90686d3a1b07791d7f473de2",
"branch": "main",
"target_branch": "main",
"target_head": "f23f5bb01a8b96ab90686d3a1b07791d7f473de2",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
"make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev'",
"[repo] branch=main head=f23f5bb01a",
"[remote] origin/main=f23f5bb01a ahead=0 behind=0",
"[tree] clean submodules_drift=0 uninit=0",
"[worktrees] linked=4",
"[recycle] merged un-recycled branches: fix/ci-rdm-pin-materialization fix/pal-component-delivery-pins",
"[cards] 已合入未闭合任务卡:fix-pal-component-delivery-pins.md——make task-close 回填归档(主检出运行)",
"[initiatives] local cards (not authoritative): none",
"[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)",
"[facts] policy/facts.md 6 条事实均在有效期内",
"[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md",
"[R0] f23f5bb01a(完整:f23f5bb01a8b96ab90686d3a1b07791d7f473de2)",
"[worktree] before-sync: recursive component checks passed",
"[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev'"
],
"output_sha256": "92b6ee8eb18090df21e7b5fba9872453244ae0349806e7d9d194bf66af398aed",
"receipt_sha256": "69f512cfc922c4cedbec5995a9a1253b475bb7aefc3dfea83cb2f2b186b1a8e8",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/69f512cfc922c4cedbec5995a9a1253b475bb7aefc3dfea83cb2f2b186b1a8e8.json"
}
```
## 闭合记录(合入前折叠)
- 本卡在 PR #689(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/689)合入前闭合并归档,随该 PR 一同合入。
- 该 PR 的合并提交即本任务的落地记录。
- 合入后无需回填,也无需单独的闭合 PR。
@@ -0,0 +1,162 @@
# feature/audit-followups-pin-gate-m5 任务卡
任务主记录:PR #695 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/695;状态:已完成(合入前闭合);owner:weichen
## 基线与授权
- 权威仓:ssh://git@192.168.3.2:2222/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= b7636742fc9ea937e6030123afc608fd294861bf
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-audit-followups-pin-gate-m5(worktree);分支:feature/audit-followups-pin-gate-m5
- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false
- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=d2608b7436d1c2d773c607a79568c57cfaa2c32cebf35d1a0cabda9562a543c1;triage_receipt=/tmp/triage-followups-1792647600.json;receipt_sha256=01837cb87f83d50c255ee460dfa8e28ade7ed600624bea7d0c083b7653c8a5dd
- 授权与交付终点:<本次允许的动作与终点;未授权事项写明>
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
- 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收
- 当前阶段:需求拆解;当前增量:I1(待定义)
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
## 目标与非目标
<预期结果、受影响入口/模块/契约;明确不做什么。>
## Agent 实施收据
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|---|
| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — |
## 关联方向与规划
- 适用状态:待核对(无适用规划时说明原因)
- 主记录路径/版本:待核对(路径按仓库根目录定位,归档后不变;只引用唯一正文)
- 对应里程碑:待核对
## 需求分析
| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |
|---|---|---|---|---|---|---|
| R1 | 待填写 | 待评估 | 待定 | 待定义 | 待确认 | 待评审 |
## 方案与计划
- 方案引用:待填写(含对象版本)
- 实施计划引用:待填写(含增量与需求 ID)
- 测试计划引用:待填写(含需求 ID 与验收条件)
## 阶段记录
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|---|---|---|---|---|---|
| 需求拆解 | 待定 | 待执行 | — | — | — |
| 需求评估 | 待定 | 待执行 | — | — | — |
| 需求表确认 | 待定 | 待执行 | — | — | — |
| 方案设计 | 待定 | 待执行 | — | — | — |
| 实施计划 | 待定 | 待执行 | — | — | — |
| 实施与自检 | 待定 | 待执行 | — | — | — |
| 正式测试与验收 | 待定 | 待执行 | — | — | — |
| 代码 Review | 待定 | 待执行 | — | — | — |
| 合入 | 待定 | 待执行 | — | — | — |
| 合入核验与收口 | 待定 | 待执行 | — | — | — |
## 探索试验与迭代
| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 授权/决策依据 | 结果 | 变更影响 | 需重审补测 |
|---|---|---|---|---|---|---|---|
| 待定义 | — | — | — | 待核对 | NOT_RUN | 待评估 | 待评估 |
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | b7636742fc9ea937e6030123afc608fd294861bf | b7636742fc9ea937e6030123afc608fd294861bf | 2026-10-22T05:41:15Z |
## 证据(Evidence)
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|---|---|---|---|---|---|
## 交付调度
- 调度状态:未入队;调度记录:无
- entry_id:无;attempt_id:无;窗口执行者:无
- 固定候选:无(base/head、组件与相关配置引用实际尝试)
- 调度依据:policy/delivery.md#合入调度
- 固定后证据:源码外 RECEIPT;实际结果后按授权原样导入和闭合
## 结果与验证
- 结果:
- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
- 影响与剩余项:
## 规划进展与下一步
- 本次推进/剩余:待核对(依据实际成果更新适用方案/规划)
- 首选下一任务:待核对(无适用规划、已完成或受阻时如实说明,不虚构任务)
- 推荐依据:待填写
- 前置条件/待确认:待核对
- 预期产物/验收条件:待定义
- 重复任务核对:待核对(已有/在途任务、PR 与规划记录)
- 启动授权:未授权(建议不自动启动新任务,仍须明确授权)
## 合入与清理
- CI 记录:首轮 CI Checkout 失败——backend 合并 tip a75783f 未推送远端;已补推,本提交重触发 CI。
- CI 记录:88f03f50/67ffd7c9 两轮 CI——首轮 Checkout 失败(backend tip a75783f 未推送,已补推);次轮 test-pg 的 TestMaterialAckAttachmentOnlyDoesNotCallParentModel 超时:产品代码从不设置 Workspace.Writable(M5 预检不可能触发),本地同提交复现 PASS(0.051s,真实 PG/Redis,verify-materialack.json),判定为并行功能新测试的 CI 环境超时 flake;后续提交重触发 CI。
- Review 记录:独立 CLI 评审单元 audit-followups-independent-review(收据 /tmp/agent-stack-b2/reviewf-run.json);结论 APPROVE;报告 .task/reviews/2026-10-22-audit-followups-independent-review.md;被审对象合并基线 vs main
- 合并基线:分支已合并 origin/main(含并行 backend 角色策略/scrarch-session 工作与 frontend/ui pin 前进);modules/backend 组合 pin = a75783f(含 7bcbbdb 与 M5 嵌套指针)。
- 已知既有失败:make test-governance 中 test_svc.SvcDbRecoveryTests.test_addr_change_keeps_database_and_auth 在干净 main(b7636742)同样失败(环境依赖),与本分支无关;CI 环境为最终裁决。其余组合目标(boundaries/pins/libs/core/backend/frontend/ui/agentcmd)全部 PASS(verify-followups-rest.json exit=0)
- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测)
- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果)
- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验)
- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-22T05:40:13.195742+00:00",
"command": "make precheck",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev",
"before_head": "b7636742fc9ea937e6030123afc608fd294861bf",
"after_head": "b7636742fc9ea937e6030123afc608fd294861bf",
"branch": "main",
"target_branch": "main",
"target_head": "b7636742fc9ea937e6030123afc608fd294861bf",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
"make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev'",
"[repo] branch=main head=b7636742fc",
"[remote] origin/main=b7636742fc ahead=0 behind=0",
"[tree] clean submodules_drift=0 uninit=0",
"[worktrees] linked=5",
"[initiatives] local cards (not authoritative): none",
"[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)",
"[facts] policy/facts.md 6 条事实均在有效期内",
"[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md",
"[R0] b7636742fc(完整:b7636742fc9ea937e6030123afc608fd294861bf)",
"[worktree] before-sync: recursive component checks passed",
"[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev'"
],
"output_sha256": "750b4668efa152b0a18152e950ab40051a737f940cf5e108e6adc79324dea82a",
"receipt_sha256": "e2cd793c34846aafbd4c3dd5a77d8bc08fb51323ded1082b212c91e78074bad7",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/e2cd793c34846aafbd4c3dd5a77d8bc08fb51323ded1082b212c91e78074bad7.json"
}
```
## 闭合记录(合入前折叠)
- 本卡在 PR #695(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/695)合入前闭合并归档,随该 PR 一同合入。
- 该 PR 的合并提交即本任务的落地记录。
- 合入后无需回填,也无需单独的闭合 PR。
@@ -0,0 +1,300 @@
# feature/scratch-session-general-agent 任务卡
任务主记录:PR #691 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/691;状态:已完成(合入前闭合);owner:weichen
## 基线与授权
- 权威仓:ssh://git@192.168.3.2:2222/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= a4311c6341c318d4bbf1563b3973358326086794
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-scratch-session-general-agent(worktree);分支:feature/scratch-session-general-agent
- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false
- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=617539e611dec18b73e0f60c7581ac55246864a96411c38c56fb31dcf561d276;triage_receipt=/tmp/scratch-triage.json;receipt_sha256=1d6484b995d8c51764e91dfeb6ae605e2e3f5ccbf19e07c016f58abe5502d953
- 授权与交付终点:按已批准设计实现无项目对话(scratch);Backend/Frontend/Dev pin 经 PR 合入;未授权:改写历史、分支保护、发布版本、配额/升级成真项目
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
- 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收
- 当前阶段:需求拆解;当前增量:I1(待定义)
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
## 目标与非目标
- 目标:所有启用账号可创建彼此隔离的 scratch 会话;侧栏「无项目对话」;固有能力不可配置;拒绝知识树/文档树等项目专属能力。
- 非目标:升级成真项目、协作分享、配额/TTL、nullable project_id。
- 规格:docs/superpowers/specs/2026-10-22-scratch-session-general-agent-design.md
- 计划:docs/superpowers/plans/2026-10-22-scratch-session-general-agent-plan.md
## Agent 实施收据
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|---|
| backend-scratch-session-create-u1 | Backend internal/store/{scratch,projects}.go、internal/server/{server,project_lifecycle,scratch_session}.go + tests | Backend AGENT-EXECUTION.md digest 22fcb8ac | implementation | 按配置 | 1(fresh_session) | pi MiniMax-M3 | success | apply 16538f1..096e96e → 规范提交 3b4a7af(tree 不变) | never | /tmp/scratch-session-20261022/u1-run.json |
| backend-scratch-session-gates-u2 | Backend store/server/runmgr/app 门禁 + tests | 同上 | implementation | 按配置 | 1(fresh_session) | pi MiniMax-M3 | success | apply 3b4a7af..7bd3e51 → 规范提交 613c068(tree 不变) | never | /tmp/scratch-session-20261022/u2-run.json |
| frontend-scratch-session-sidebar-u3 | Frontend src/{contracts,api,store}.ts、TaskSidebar.tsx、tests | Frontend AGENT-EXECUTION.md | implementation | 按配置 | 1 | cursor | failed-unknown(CLI HTTP/2 keepalive 超时);对账:仅只读命令与 npm ci 下载、隔离区零跟踪改动 → 全新重派 | 无 | never | /tmp/scratch-session-20261022/u3-run.json |
| 同上(重派 2) | 同上 | 同上 | implementation | 按配置 | 1 | cursor | failed-unknown(无有效终态记录;worker 报 src/store.test.ts 旧规则测试在范围外);对账:改动仅在隔离区;扩围 src/store.test.ts(已批准设计内的旧规则测试)→ 单元 u3b | 无 | never | /tmp/scratch-session-20261022/u3-run2.json |
| frontend-scratch-session-sidebar-u3b | 同上 + src/store.test.ts | 同上 | implementation | 按配置 | 1 | cursor | failed-unknown(CLI Connection stalled,验证已通过、终态前断线);对账:只读/npm ci/vitest/tsc、/tmp 临时配置已删 → 全新重派 | 无 | never | /tmp/scratch-session-20261022/u3-run3.json |
| backend-scratch-flag-u2b | Backend server 会话响应 scratch 标记 + store.ScratchProjectIDs + tests | Backend AGENT-EXECUTION.md | implementation | 按配置 | 1(fresh_session) | pi | success | apply → 规范提交 f3f70a7(tree 不变) | never | /tmp/scratch-session-20261022/u2b-run.json |
| 同上 u3b(重派 4) | 同上 | 同上 | implementation | 按配置 | 1 | cursor | failed-unknown(最终消息含两份有效终态记录:后台 npm ci 完成通知后重复输出);对账:改动仅在隔离区,外部仅 npm ci 下载 → 单元 u3c 增加“前台执行、仅一份终态记录”约束后全新重派 | 无 | never | /tmp/scratch-session-20261022/u3-run4.json |
| frontend-scratch-session-sidebar-u3c | 同 u3b | 同上 | implementation | 按配置 | 1(fresh_session) | cursor | success | apply 18fc958..62b7442 → 规范提交 1d7f2a3(tree 不变) | never | /tmp/scratch-session-20261022/u3-run5.json |
| backend-scratch-context-and-bus-gates-u2c | Backend ProjectContext 门禁 + Bus.SetHostProjectGuard + scratch fail-closed + tests | Backend AGENT-EXECUTION.md | implementation | 按配置 | 1(fresh_session) | pi | success | apply → 规范提交 2fc6e7e(tree 不变) | never | /tmp/scratch-session-20261022/u2c-run.json |
| backend-scratch-failclosed-both-ways-u2d | Backend confirmedScratchProject 双向 fail-closed + tests | 同上 | implementation | 按配置 | 1(fresh_session) | pi | success | apply → 规范提交 b704ba9(tree 不变) | never | /tmp/scratch-session-20261022/u2d-run.json |
| frontend-scratch-hide-project-surfaces-u3d | Frontend Conversation/Workbench/ConversationWork 隐藏项目专属面 | Frontend AGENT-EXECUTION.md | implementation | 按配置 | 1 | cursor | scope-expansion(UI ActivityCardView 必须检查 callbacks.onArchive);人工授权扩围到 UI 仓 | 无 | never | /tmp/scratch-session-20261022/u3d-run.json |
| frontend-scratch-hide-project-surfaces-u3e | 同 u3d(UI 侧另单元处理;本单元只断言回调) | 同上 | implementation | 按配置 | 1(fresh_session) | cursor | success | apply → 规范提交 b02ff83(tree 不变) | never | /tmp/scratch-session-20261022/u3e-run.json |
| ui-activity-card-archive-optional-u5 | UI ActivityCardView 仅在有 onArchive 时渲染留档按钮 + tests | UI AGENT-EXECUTION.md | implementation | 按配置 | 1(fresh_session) | cursor | success | apply → 规范提交 db5129c(tree 不变) | never | /tmp/scratch-session-20261022/u5-run.json |
## 关联方向与规划
- 适用状态:待核对(无适用规划时说明原因)
- 主记录路径/版本:待核对(路径按仓库根目录定位,归档后不变;只引用唯一正文)
- 对应里程碑:待核对
## 需求分析
| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |
|---|---|---|---|---|---|---|
| R1 | 待填写 | 待评估 | 待定 | 待定义 | 待确认 | 待评审 |
## 方案与计划
- 方案引用:待填写(含对象版本)
- 实施计划引用:待填写(含增量与需求 ID)
- 测试计划引用:待填写(含需求 ID 与验收条件)
## 阶段记录
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|---|---|---|---|---|---|
| 需求拆解 | 待定 | 待执行 | — | — | — |
| 需求评估 | 待定 | 待执行 | — | — | — |
| 需求表确认 | 待定 | 待执行 | — | — | — |
| 方案设计 | 待定 | 待执行 | — | — | — |
| 实施计划 | 待定 | 待执行 | — | — | — |
| 实施与自检 | 待定 | 待执行 | — | — | — |
| 正式测试与验收 | 待定 | 待执行 | — | — | — |
| 代码 Review | 待定 | 待执行 | — | — | — |
| 合入 | 待定 | 待执行 | — | — | — |
| 合入核验与收口 | 待定 | 待执行 | — | — | — |
## 探索试验与迭代
| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 授权/决策依据 | 结果 | 变更影响 | 需重审补测 |
|---|---|---|---|---|---|---|---|
| 待定义 | — | — | — | 待核对 | NOT_RUN | 待评估 | 待评估 |
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | a4311c6341c318d4bbf1563b3973358326086794 | a4311c6341c318d4bbf1563b3973358326086794 | 2026-10-22T01:43:32Z |
## 证据(Evidence)
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|---|---|---|---|---|---|
## 交付调度
- 调度状态:未入队;调度记录:无
- entry_id:无;attempt_id:无;窗口执行者:无
- 固定候选:无(base/head、组件与相关配置引用实际尝试)
- 调度依据:policy/delivery.md#合入调度
- 固定后证据:源码外 RECEIPT;实际结果后按授权原样导入和闭合
## 结果与验证
- 结果:
- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
- 影响与剩余项:
## 规划进展与下一步
- 本次推进/剩余:待核对(依据实际成果更新适用方案/规划)
- 首选下一任务:待核对(无适用规划、已完成或受阻时如实说明,不虚构任务)
- 推荐依据:待填写
- 前置条件/待确认:待核对
- 预期产物/验收条件:待定义
- 重复任务核对:待核对(已有/在途任务、PR 与规划记录)
- 启动授权:未授权(建议不自动启动新任务,仍须明确授权)
## 合入与清理
- Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据)
- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测)
- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果)
- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验)
- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-22T01:41:26.489856+00:00",
"command": "make precheck",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev",
"before_head": "a4311c6341c318d4bbf1563b3973358326086794",
"after_head": "a4311c6341c318d4bbf1563b3973358326086794",
"branch": "main",
"target_branch": "main",
"target_head": "a4311c6341c318d4bbf1563b3973358326086794",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
"make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev'",
"[repo] branch=main head=a4311c6341",
"[remote] origin/main=a4311c6341 ahead=0 behind=0",
"[tree] clean submodules_drift=0 uninit=0",
"[worktrees] linked=6",
"[recycle] merged un-recycled branches: feature/card-close-20261022-012859Z fix/ci-rdm-pin-materialization fix/pal-component-delivery-pins",
"[initiatives] local cards (not authoritative): none",
"[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)",
"[facts] policy/facts.md 6 条事实均在有效期内",
"[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md",
"[R0] a4311c6341(完整:a4311c6341c318d4bbf1563b3973358326086794)",
"[worktree] before-sync: recursive component checks passed",
"[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev'"
],
"output_sha256": "5dc418ef2935ca343c4d18b9a8b9408c31d0870061bf48a0cd20d1efeb574159",
"receipt_sha256": "59b8a99e07c11121e009221f6700874c9650c4f057f494394d05d5e47eec3f95",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/59b8a99e07c11121e009221f6700874c9650c4f057f494394d05d5e47eec3f95.json"
}
```
| 同步(记录前对象) | 1de7c28c2122609dd9b6435881696492bd052a34 | 635459316dbd4e4a5134f4e409bed72a5dd02730 | 2026-10-22T05:18:42Z |
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-22T05:18:47.691228+00:00",
"command": "make test",
"exit_code": 2,
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-scratch-session-general-agent",
"before_head": "36a1d4084e8bb7aaea6f04e29fb4d3492f4f0db3",
"after_head": "36a1d4084e8bb7aaea6f04e29fb4d3492f4f0db3",
"branch": "feature/scratch-session-general-agent",
"target_branch": "main",
"target_head": "1de7c28c2122609dd9b6435881696492bd052a34",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
"warn: deps/agent-native deps/development-manager is bd3a7de57a3a, Dev is 2c2e37255807",
"ok deps/agent-native error-code-system",
"ok deps/agent-native logging-system",
"ok deps/agent-squad agent-intent",
"ok deps/agent-squad agent-native",
"warn: deps/agent-squad deps/development-guidelines is 2688fd2be6a5, Dev is a15db5085585",
"warn: deps/agent-squad deps/development-manager is bd3a7de57a3a, Dev is 2c2e37255807",
"ok deps/agent-squad error-code-system",
"ok deps/agent-squad logging-system",
"warn: deps/agent-intent deps/development-guidelines is 2688fd2be6a5, Dev is a15db5085585",
"warn: deps/agent-intent deps/development-manager is bd3a7de57a3a, Dev is 2c2e37255807",
"ok deps/agent-intent error-code-system",
"ok deps/agent-intent logging-system",
"make[1]: *** [Makefile:209: test-pins] Error 1",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-scratch-session-general-agent'"
],
"output_sha256": "2d377eb17fd54185095a73449eb657b742e645e180e1d52202cdd168114fe7e7",
"receipt_sha256": "21c7a8c6a8ffc79adb81ed7e90b6c50d4f1aaaa941de12c2a4cd64e8b47e4aa8",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/21c7a8c6a8ffc79adb81ed7e90b6c50d4f1aaaa941de12c2a4cd64e8b47e4aa8.json"
}
```
| 同步(记录前对象) | b7636742fc9ea937e6030123afc608fd294861bf | 1dee480dff7203aff3bd6b57661645fe0b890bce | 2026-10-22T05:49:12Z |
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-22T05:49:16.822650+00:00",
"command": "make test",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-scratch-session-general-agent",
"before_head": "aa77f20184ace3302480642aef5d412819792da8",
"after_head": "aa77f20184ace3302480642aef5d412819792da8",
"branch": "feature/scratch-session-general-agent",
"target_branch": "main",
"target_head": "b7636742fc9ea937e6030123afc608fd294861bf",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "7a447319f8c4fdedb68da2ef8c0fc740d86697df8f8af7650980c77a56befa7b",
"output_tail": [
"added 162 packages in 945ms",
"",
" RUN v4.1.11 /home/weichen/projects/Agent-System-Dev-wt-feature-scratch-session-general-agent/modules/ui",
"",
"",
" Test Files 19 passed (19)",
" Tests 188 passed (188)",
" Start at 05:56:58",
" Duration 1.68s (transform 1.31s, setup 0ms, import 3.38s, tests 3.68s, environment 6.91s)",
"",
"knip unused exports 61 <= 61",
"cd deps/agent-command && go vet ./... && go test -count=1 ./...",
"ok \tagent-command\t0.002s",
"ok \tagent-command/conformance\t0.002s",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-scratch-session-general-agent'"
],
"output_sha256": "4fee33a7ba3812f667660d6c2b49348ae902983cdfebd6a5f3f13bedb4611f0b",
"receipt_sha256": "1331f3cff5d6a225efa50af64c5e1301faee72c380b995ea08b4a1a7beff79da",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/1331f3cff5d6a225efa50af64c5e1301faee72c380b995ea08b4a1a7beff79da.json"
}
```
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-22T06:14:22.167417+00:00",
"command": "make test",
"exit_code": 2,
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-scratch-session-general-agent",
"before_head": "b672792f77f612d563720bff99a55ff5aa721242",
"after_head": "b672792f77f612d563720bff99a55ff5aa721242",
"branch": "feature/scratch-session-general-agent",
"target_branch": "main",
"target_head": "33d6ef69212595c680a744549986c19bb6acd6c3",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
" File \"/home/weichen/projects/Agent-System-Dev-wt-feature-scratch-session-general-agent/tests/test_svc.py\", line 227, in svc",
" self.assertEqual(proc.returncode, 0, proc.stdout)",
" ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",
"AssertionError: 1 != 0 : \u001b[1;33m[svc]\u001b[0m [dev] 跳过 manifest 迁移:需 python3 与 scripts/svc_manifest.py",
"\u001b[1;34m[svc]\u001b[0m [dev] 无 pidfile——没有由本脚本启动的实例",
"\u001b[1;31m[svc]\u001b[0m [dev] 端口被占用(非本服务):LISTEN 0 4096 127.0.0.1:18794 0.0.0.0:* users:((\"python3\",pid=1444356,fd=3)) ",
"\u001b[1;31m[svc]\u001b[0m 处理:停掉该进程,或换端口(--port / --addr)",
"",
"",
"----------------------------------------------------------------------",
"Ran 539 tests in 373.148s",
"",
"FAILED (failures=1, skipped=18)",
"make[1]: *** [Makefile:232: test-governance] Error 1",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-scratch-session-general-agent'"
],
"output_sha256": "572e274146ea0cd7b0f87865cf16c8be406ca4eda51bca7ef8469be6812ddec9",
"receipt_sha256": "d2b9cb21e0ab4dcf1d4b03bc939dd9f8bcd94faadff03b19acacad81b5465848",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/d2b9cb21e0ab4dcf1d4b03bc939dd9f8bcd94faadff03b19acacad81b5465848.json"
}
```
| 同步(记录前对象) | 33d6ef69212595c680a744549986c19bb6acd6c3 | 1970dccb7c8c11fb69ad739ae1338e97ca4ac0a6 | 2026-10-22T06:21:57Z |
## 闭合记录(合入前折叠)
- 本卡在 PR #691(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/691)合入前闭合并归档,随该 PR 一同合入。
- 该 PR 的合并提交即本任务的落地记录。
- 合入后无需回填,也无需单独的闭合 PR。
@@ -0,0 +1,113 @@
# fix/agent-exec-admit-authoritative-base 任务卡
任务主记录:PR #687 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/687(merge dae463b75d);状态:已完成(回填);owner:weichen
- 权威仓:ssh://git@192.168.3.2:2222/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 096b74b4775e81cfb2864f98cae2e9fc9d9c1a44
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-fix-agent-exec-admit-authoritative-base(worktree);分支:fix/agent-exec-admit-authoritative-base
- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false
- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=53b249b6af5952312ae8cbd129492dfedd05b47b55a2ea4c0b708cdbe01728e1;triage_receipt=/tmp/admit-triage.json;receipt_sha256=c91b7a1b57bcea0246668f8a95408c90649aeba18106b7cd8d673987d3fe7735
- 授权与交付终点:<本次允许的动作与终点;未授权事项写明>
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
## 目标与非目标
<预期结果、受影响入口/模块/契约;明确不做什么。>
## Agent 实施收据
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|---|
| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — |
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 096b74b4775e81cfb2864f98cae2e9fc9d9c1a44 | 096b74b4775e81cfb2864f98cae2e9fc9d9c1a44 | 2026-10-21T11:41:20Z |
## 证据(Evidence)
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|---|---|---|---|---|---|
## 结果与验证
- 结果:
- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
- 影响与剩余项:
## 合入与清理
- Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据)
- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测)
- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果)
- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验)
- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-21T11:40:23.532845+00:00",
"command": "make precheck",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev",
"before_head": "096b74b4775e81cfb2864f98cae2e9fc9d9c1a44",
"after_head": "096b74b4775e81cfb2864f98cae2e9fc9d9c1a44",
"branch": "main",
"target_branch": "main",
"target_head": "096b74b4775e81cfb2864f98cae2e9fc9d9c1a44",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
"make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev'",
"[repo] branch=main head=096b74b477",
"[remote] origin/main=096b74b477 ahead=0 behind=0",
"[tree] clean submodules_drift=0 uninit=0",
"[worktrees] linked=3",
"[recycle] merged un-recycled branches: feature/card-close-20261021-085838Z",
"[initiatives] local cards (not authoritative): none",
"[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)",
"[facts] policy/facts.md 6 条事实均在有效期内",
"[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md",
"[R0] 096b74b477(完整:096b74b4775e81cfb2864f98cae2e9fc9d9c1a44)",
"[worktree] before-sync: recursive component checks passed",
"[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev'"
],
"output_sha256": "db26462a59dade7e8fba673f4a4f9470146c139eb8373c8d853f3c53980d0e26",
"receipt_sha256": "50098830e02af3cde918585689d25dcef3f5a58bcba16bc97ba9952a817d23ef",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/50098830e02af3cde918585689d25dcef3f5a58bcba16bc97ba9952a817d23ef.json"
}
```
## 结果与验证
- 结果:**交付发生在 Development-Manager 仓**,本分支仅承载 Dev 侧的任务记录。`admission.Admit` 新增「权威基线内容认可」:暂存路径若与权威基线**逐字节相同**则无需 transport 记录,其余路径仍走原有判定。
- Development-Manager PR #32 → `2c2e37255807ce94c945759925d6361e72977807`,CI 双作业绿,独立 Review 终判 PASS。核实:blob 比对(mode+hash)、stage 与路径集过滤;基线 ref 不可解析 / `ls-tree` 失败 / 路径不在基线 / 暂存删除**全部 fail-closed**;`covers` 的九条判定**一条未删未弱化**;未新增豁免路径与配置项。
- 测试:`internal/agentexec/admission` 全绿,既有 12 项拒绝用例**零删除**全部保留,新增 7 项正反例与 4 项 history 用例。
- 已知无关失败:`TestKeyRefusesSymlinkAndWrongMode`(history)与 `TestParseTerminalFixtures`(receipt)在 `origin/main` 上同样失败(环境相关),已在干净的 main worktree 上复现确认。
- 实际效果验证:RDM 合并的 65 个暂存路径由「全部被拒」降为「仅 5 个需 transport」;Dev 的 90 提交同步与 RDM 的空合并提交均以 `admit: ok` 通过,全程无 transport 妥协。
## 关联
- 实际交付:Development-Manager PR #32
- 本变更解锁的下游:RDM PR #460、Dev PR #682、Dev PR #684
| 同步(记录前对象) | a4311c6341c318d4bbf1563b3973358326086794 | f20043be5a13e53240d39557291cf19eecc84098 | 2026-10-22T02:10:49Z |
## 闭合记录(card-autoclose 回填)
- 依据:merge dae463b75d66e09133dc8914158951b7e98e707f(PR #687)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Merge pull request 'Record the admit baseline-recognition outcome' (#687) from fix/agent-exec-admit-authoritative-base into main
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -1,6 +1,6 @@
# fix/pal-component-delivery-pins 任务卡
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
任务主记录:PR #682 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/682(merge f23f5bb01a);状态:已完成(回填);owner:weichen
- 权威仓:ssh://git@192.168.3.2:2222/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= a496ea0f0249b2b412354677ef97612ccd692d25
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-fix-pal-component-delivery-pins(worktree);分支:fix/pal-component-delivery-pins
@@ -200,3 +200,9 @@ CI 物化修复**已生效**:三个 pin 全部通过 fail-loud 断言并各自
```
| 同步(记录前对象) | ccb6dfaa9cdf7e69eb15d7df024dee55f37b8df1 | 2af80d6a24bcde0a6da1f091acdb25c7e1e9a1f4 | 2026-10-21T13:32:30Z |
| 同步(记录前对象) | a736d5a420370cff052bd946f6d6397d4c354547 | e8dbbe001ae12048217c0a763ab7699d183f5b1f | 2026-10-21T13:57:35Z |
## 闭合记录(card-autoclose 回填)
- 依据:merge f23f5bb01a8b96ab90686d3a1b07791d7f473de2(PR #682)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Merge pull request 'Advance the RDM artifact pin so the delivered lifecycle work actually ships' (#682) from fix/pal-component-delivery-pins into main
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -0,0 +1,98 @@
# fix/rdm-pin-advance-latest 任务卡
任务主记录:PR #690 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/690(merge 7778fdcee7);状态:已完成(回填);owner:weichen
- 权威仓:ssh://git@192.168.3.2:2222/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 1de7c28c2122609dd9b6435881696492bd052a34
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-fix-rdm-pin-advance-latest(worktree);分支:fix/rdm-pin-advance-latest
- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false
- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=2b6ce5d7821107020f4c49b973eeb7759b7c0469b0d5545016599930cd4de63c;triage_receipt=/tmp/pin-latest-triage.json;receipt_sha256=5373f2511b49f1989039e4b2ad8e500f78880a2f9ee3e759a1bf1f282abb95ef
- 授权与交付终点:<本次允许的动作与终点;未授权事项写明>
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
## 目标与非目标
<预期结果、受影响入口/模块/契约;明确不做什么。>
## Agent 实施收据
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|---|
| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — |
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 1de7c28c2122609dd9b6435881696492bd052a34 | 1de7c28c2122609dd9b6435881696492bd052a34 | 2026-10-22T05:10:35Z |
## 证据(Evidence)
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|---|---|---|---|---|---|
## 结果与验证
- 结果:
- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
- 影响与剩余项:
## 合入与清理
- Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据)
- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测)
- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果)
- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验)
- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-22T05:09:36.202048+00:00",
"command": "make precheck",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev",
"before_head": "1de7c28c2122609dd9b6435881696492bd052a34",
"after_head": "1de7c28c2122609dd9b6435881696492bd052a34",
"branch": "main",
"target_branch": "main",
"target_head": "1de7c28c2122609dd9b6435881696492bd052a34",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
"make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev'",
"[repo] branch=main head=1de7c28c21",
"[remote] origin/main=1de7c28c21 ahead=0 behind=0",
"[tree] clean submodules_drift=0 uninit=0",
"[worktrees] linked=5",
"[initiatives] local cards (not authoritative): none",
"[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)",
"[facts] policy/facts.md 6 条事实均在有效期内",
"[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md",
"[R0] 1de7c28c21(完整:1de7c28c2122609dd9b6435881696492bd052a34)",
"[worktree] before-sync: recursive component checks passed",
"[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev'"
],
"output_sha256": "080b984995a553f9f8caa00556b826ba0fedd5dcdb562bec80a7422267ec9b3a",
"receipt_sha256": "a0b34b104e28c9da74270c410d6b3b43d7a4d59980c24e47ce59ff4b0ae37464",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/a0b34b104e28c9da74270c410d6b3b43d7a4d59980c24e47ce59ff4b0ae37464.json"
}
```
| 同步(记录前对象) | b7636742fc9ea937e6030123afc608fd294861bf | d8fcc0d6f6d854fda7a92ddfdcda7d0bb8c5304a | 2026-10-22T05:34:32Z |
## 闭合记录(card-autoclose 回填)
- 依据:merge 7778fdcee77505642997d4320c4036855dfcbac1(PR #690)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Merge pull request 'Advance the RDM pin to the current mainline head' (#690) from fix/rdm-pin-advance-latest into main
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -0,0 +1,99 @@
# fix/svc-test-port-governance 任务卡
任务主记录:PR #694 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/694(merge 37e194871f);状态:已完成(回填);owner:weichen
- 权威仓:ssh://git@192.168.3.2:2222/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 33d6ef69212595c680a744549986c19bb6acd6c3
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-fix-svc-test-port-governance(worktree);分支:fix/svc-test-port-governance
- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false
- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=bb1fb490ff22f2cc7a7edfe11e0400569bf98c4e879d5527493186aa75429f31;triage_receipt=/tmp/port2-triage2.json;receipt_sha256=a8e49e2792cd069b95e4db5bc7f7d492d164ff84c21ef1001c3bbaf3de7ba364
- 授权与交付终点:<本次允许的动作与终点;未授权事项写明>
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
## 目标与非目标
<预期结果、受影响入口/模块/契约;明确不做什么。>
## Agent 实施收据
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|---|
| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — |
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 33d6ef69212595c680a744549986c19bb6acd6c3 | 33d6ef69212595c680a744549986c19bb6acd6c3 | 2026-10-22T06:18:16Z |
## 证据(Evidence)
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|---|---|---|---|---|---|
## 结果与验证
- 结果:
- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
- 影响与剩余项:
## 合入与清理
- Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据)
- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测)
- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果)
- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验)
- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-22T06:17:27.856549+00:00",
"command": "make precheck",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev",
"before_head": "33d6ef69212595c680a744549986c19bb6acd6c3",
"after_head": "33d6ef69212595c680a744549986c19bb6acd6c3",
"branch": "main",
"target_branch": "main",
"target_head": "33d6ef69212595c680a744549986c19bb6acd6c3",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
"make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev'",
"[repo] branch=main head=33d6ef6921",
"[remote] origin/main=33d6ef6921 ahead=0 behind=0",
"[tree] clean submodules_drift=0 uninit=0",
"[worktrees] linked=6",
"[recycle] merged un-recycled branches: fix/rdm-pin-advance-latest",
"[initiatives] local cards (not authoritative): none",
"[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)",
"[facts] policy/facts.md 6 条事实均在有效期内",
"[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md",
"[R0] 33d6ef6921(完整:33d6ef69212595c680a744549986c19bb6acd6c3)",
"[worktree] before-sync: recursive component checks passed",
"[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev'"
],
"output_sha256": "bae6a238774330d77e016166c60b79b796a22ec8cbdfed58574a18058fce3679",
"receipt_sha256": "74d9784c1101c6a196fe3571ae41323a102a8d97a92fe15bc3270d00a7a71b7d",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/74d9784c1101c6a196fe3571ae41323a102a8d97a92fe15bc3270d00a7a71b7d.json"
}
```
| 同步(记录前对象) | d65195bd41317e480c5a0cfa5133b0ad98a48d4b | a1e0c85c0400ce300a847da276e70d520f842844 | 2026-10-22T07:17:59Z |
## 闭合记录(card-autoclose 回填)
- 依据:merge 37e194871f4ce8f60c7678b64402bec3541fcbd1(PR #694)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
- 合并主题:Merge pull request 'Use dynamic ports in the two remaining hardcoded test bindings' (#694) from fix/svc-test-port-governance into main
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
@@ -0,0 +1,121 @@
# 独立代码 Review:feature/agent-stack-audit-remediation-b2(U8 / U9 / U11a-c)
- 单元:agent-stack-b2-independent-review
- 评审对象:Dev 仓 `f23f5bb0...ea099a5f`(本 checkout 无 origin remote,`f23f5bb0` = R0/#682 合并点,即分支切出时 main 的 tip;`git merge-base` 确认为唯一基线)跨 pin 组件:
- deps/agent-native `2fc66be..cff6935`
- deps/agent-squad `c7121bd..9edb6ba`
- modules/backend `f084d10..9b40595`
- Dev 级:`.task/feature-agent-stack-audit-remediation-b2.md` + 五个 gitlink
- 方法:逐 diff 静态评审(spec / 回归 / 范围 / 测试四个透镜)+ 局部聚焦测试;产出 findings only,不改代码。
- pin-restore 认定:`646a2191` 恢复批次一 tip(command `fe7987d`、intent `765a7e7`、native `ac91b84`、squad `0f1daa8`、backend `b614180`),批次二增量基于其上。native 范围内 `afbb567`/`5c0d2d8`、squad 范围内 `aa15a5d..0f1daa8`、backend 范围内 `f084d10..b614180` 均为已合入批次一(#685)的恢复,按 packet 预定视为 intended,不做重复评审。
- 评审环境限制(诚实出口):本 worktree 仅材料化了 Dev 级组件;`modules/backend/deps/*`、`deps/agent-native/deps/*`、`deps/agent-squad/deps/*` 及 `adapters/{sqlite,native}` 子模块目录为空,且本单元禁止 submodule 操作,因此 backend 与上述包无法本地编译执行。相关验证以卡片记录的组合 `make test`(0b46569d 组合 PASS,exit=0)为执行证据,本地未跑部分标 NOT_RUN。
## Findings
### Blocker
无。
### Major
无。
### Minor
1. **`modules/backend/internal/runtime/squad_events.go:80`(onEvent 持锁发射)**:`squadEventLog.onEvent` 在 `l.mu` 临界区内调用 `l.rc.Emit(...)`(text_delta/tool start/end/usage 各分支)。锁内做 I/O 意味着慢 sink 会串行化所有后续帧并延迟收口 `toolParts()`。当前 sink 均为同步非阻塞,且「发射与部件同临界区」保证到达序一致(注释已说明),故不阻塞;建议后续把 Emit 摘要构造移出临界区或注明 sink 契约。属可维护性耦合,非正确性缺陷。
2. **`modules/backend/internal/runtime/llm_direct.go:755-763`(queued 在锁外读写,隐式不变量)**:`tool_execution_start` 分支 `len(st.queued)` 读取与 `takeQueued` 变更均未持 `toolMu`,仅 `inflight` 插入加锁(`:764-766`);`takeInflight` 注释要求「调用方须持有 toolMu」,`takeQueued` 无对应要求。安全性当前成立:native `serializeHostCallbacks` 串行化全部 OnEvent,且只有 onEvent 触碰 `queued`——但该不变量是隐式的,7b8a34d 的加锁改造未把它写进注释。此代码为批次一/既有(不在本 diff 修改行内),-race 全包绿;记一致性提示,不阻塞。
3. **`deps/agent-squad/squad/engine.go:998-1013`(gcFinish)/ `squad/review.go:329-343`(runReviewDriver):落盘失败后内存态与结果不一致**:终态 save 失败时函数返回 `RunFailed`,但内存 `st.Meta.Status` 仍是刚写入的 `"completed"`。结果对象主导后续流程,且 save 失败通常伴随存储故障,实际影响小;建议失败分支回写内存状态或在注释中说明取舍。
4. **任务卡收据 SHA 与最终 lineage 不一致(追溯性小疵)**:卡片实施收据表引用 `aa81b50/7d0630a`(u8)与 `25397e3`(u9),这三个提交不在 `9edb6ba` 的祖先链上。核对 `git diff aa81b50 cf83d30` 与 `git diff 25397e3 12a53b0` 均为空——即最终提交与收据候选逐字节相同,只是 transport 提交被重建。内容无偏差,建议收据表补注最终 SHA。
5. **`deps/agent-squad/adapters/sqlite/queue.go:256`(并发 claim 下的瞬时错误暴露)**:容量预读失败直接 `return error`;WAL + busy_timeout(5000)(`adapters/sqlite/db.go:20`)下高强度并发 claim 理论上可出现 SQLITE_BUSY 上抛为一次 Claim 失败。按 U9「读失败=拒绝、绝不静默放行」的语义这是正确取舍,调用方已有重试语义(runtime 轮询),仅记录为行为注记。
### Notes(不构成缺陷)
1. **pin restore 核对无误**:`646a2191` 恢复的五个 gitlink 与批次一 tip 一致;`a0b8d12b`/`0b46569d` 仅推进 native/squad/backend 至批次二 tip;Dev 级 diff = 任务卡 + 5 gitlink,无其他文件(`git diff f23f5bb0...HEAD --stat` 共 6 文件)。
2. **收据候选与最终提交同树**:见 Minor 4,无内容偏差。
3. U8 的 `migrate()` 在每次 Save/Load 都执行(PRAGMA table_info + 版本读),频度低(每次运行态保存一次),开销可接受。
4. U11c `noteRecovered`(`squad_events.go:126-131`)以「同名工具再次发起或成功」作为失败恢复启发式,注释已声明「失败部件仍留在过程部件里」;并行同名工具下极端顺序可能提前清除失败标记,仅影响收尾兜底文案,不影响部件与事件的真实状态。
## 分单元评审(spec 透镜:是否挡住 finding 的触发)
### U8 — SQLite 持久化 Mailbox/Handoffs/Board + 身份安全解码 + 错误可见
- 触发(F11):SQLite 运行重启丢失 mailbox/handoffs/board;相同 JSON 文本列互相覆盖;checkpoint/终态保存失败被吞、照发完成事件。
- 挡住触发:
- 持久化:`adapters/sqlite/runstore.go:159-176`(`runStateColumnsOf` 含 mailbox/handoffs/board)+ `:178-198`(SaveRun INSERT 三列,ON CONFLICT 同步更新);schema v2 增量迁移 `runstore.go:28`、`:60-77`、`:104-124`(ALTER TABLE 补列,旧行读 NULL→空默认,并发迁移复核)。
- 身份安全解码:`runstore.go:212-262` LoadRun 改为按列位置 Scan + 具名解码切片(`dec.col` 逐列报错),废除 `map[string]any` 文本键——同文本两列不再互相覆盖;`runstore.go:252` NULL/空串跳过。
- 错误可见:checkpoint flush 幂等化 `squad/runstore.go:146-149`、`:198-202`(flushOnce,出口与 defer 兜底只报一次);`squad/workflow.go:58-83` 出口 flush 失败经 `persistenceFailure` 折算可区分失败且幂等(`:1148-1152` 去重);`workflow.go:996-1005`(finalize 终态 save 失败→RunFailed,EvRunCompleted 不再发出)、`:1006-1012`(manifest 写失败同);边界快照失败带标记 `workflow.go:185-188`;engine 侧 `engine.go:976-985`(manualPass)、`:1001-1016`(cancelRun 可见但保持取消语义)、`groupchat.go:342-348`、`review.go:329-335`。失败经外层 `finalizeEvent`(`engine.go:1479-1491`)落到 `EvRunFailed`,完成事件严格晚于成功落盘。
- FileStore 侧 steering 持久化对称:`squad/runstate.go:100-103`(persist 写 steering.json)+ `loadRunState` 的 `st.loadSteering()`。
- 结论:覆盖全部三个触发面,无缺口。
### U9 — Claim 原子执行 agent + runtime 双重在途上限,无静默计数错误放行
- 触发(F12):仅按 agent 计数,同一 runtime 多 agent 可超 runtime 上限;计数错误被 `_=` 吞掉、静默放行。
- 挡住触发:`adapters/sqlite/queue.go:197-203` `claimSQL` 单条条件 UPDATE 同时内嵌两个守卫计数(agent 上限 + runtime 总量:`t.runtime_id=?` 或 agent 绑定该 runtime),SQLite 单语句原子性 + 写锁使并发 claim 无法越过任一上限;`:248-258` 预读失败显式 `return error`(拒绝而非放行);`:229-234` 旧的双 cap 取 min 预检保留为 only-skip 优化,UPDATE 内重数(RowsAffected==0 落空则尝试下一候选,`:266-270`);守卫计数读失败即语句失败(测试直接 DROP TABLE agent 验证)。计数口径无重复计数(OR 单行只计一次)、无遗漏(本 runtime 已租的 t.runtime_id 任务计入)。
- 结论:触发被原子守卫挡住,无静默放行路径。
### U11a — exec.ProcessEvent 携带 CallID/Status/ErrorReason(含 cancel/deny)
- 触发(F14 源侧):过程事件无身份与真实结局,消费方按工具名配对、cancel/error 一律显示成功。
- 挡住触发:
- 字段落地:`deps/agent-native/exec/backend.go:59-64`(`call_id/status/error_reason` 全 omitempty);`runtime/loop.go:46-51`(runtime.Event 同名字段)。
- 发射填充:`runtime/loop.go:715-719` `emitCancelledTool`(跳过的调用也发 start+end,Status=canceled);`:722-730` `emitToolEnd` 统一投影,error/denied/canceled 附 ErrorReason;`:838` deny→`denied`;`:844-847`、`:855-858` BeforeTool/commitToolIntent 失败→`error`;`:884-893` 执行后 `ctx.Err()` 优先于工具自报结局(取消不得报 ok)、`res.IsError`→`error`,否则 `ok`。
- 版本兼容:新字段 omitempty,legacy 事件字节不变(`exec/process_event_fidelity_test.go` TestProcessEventLegacyOmitempty 断言)。
- 结论:三类触发(配对、cancel 伪 ok、error 伪 ok)均在发射点挡住。
### U11b — squad port/bridge/taps 透传字段 + 帧到达序保持
- 触发(F14 squad 侧):事件端口丢 CallID/Status/ErrorReason;探针路径把并发工具帧按调用重排。
- 挡住触发:
- 端口:`squad/port.go:78-92`(ProcessEvent 三字段 + omitempty + ToolStatus* 常量域);`squad/progress.go:145-160` `processEventData` 三键非空才输出(legacy 投影字节不变,测试钉住);调用点 `squad/workflow.go:432`、`squad/leader.go:36`。
- 桥:`adapters/native/register.go:188-206` 一帧一回调同步转发;`:269-306` 反射按字段名探测(native 未跟进字段时零值透传、跟进后免改即生效,`optionalStringField` 带嵌套歧义防护 `:299-311`)。
- 帧序(repair `9edb6ba`):`register.go:314-337` eventTap 以 `mu` 串行扇出——「一帧→全部下游」为整体,杜绝「组合根侧 sink 已收帧、请求侧被后帧抢先」造成的两侧顺序分叉;fanoutWindow 测试把该窗口钉成确定性失败(`register_event_test.go:316-373`)。
- 结论:字段透传与到达序两个触发均被挡住,且有 legacy passthrough 用例。
### U11c — backend squad_runner/hostbridge 按 CallID 配对、真实 Status/ErrorReason 映射、共享工件态上锁
- 触发(F14 backend 侧):CallID 用工具名顶替、Status 硬编码 ok、并行回调共享工件表竞态。
- 挡住触发:
- 配对:`modules/backend/internal/runtime/squad_events.go:16-22` `toolEventID`(CallID 优先,legacy 回退工具名保持展示不变);`:96-105` start/end 以 `pending[id]` 配对。
- 状态映射:`:31-53` `toolEventOutcome`——非空 Status 原样透传(ok/error/denied/canceled 不新增不改写);空 Status 且无 ErrorReason → legacy "ok"+Detail(字节一致);空 Status 但有 ErrorReason → error(有失败信号不报 ok);非 ok 摘要取 ErrorReason 原文。
- 收尾一致性:`:133-137` 未恢复失败记录、`:163-176` finalReply 只在宿主兜底「已完成。」时替换为如实失败行,模型文本不代写。
- 工件表:`internal/runtime/hostbridge.go:29-48` artifactList 加 `mu` + `snapshot()` 拷贝,`squad_runner.go` 终局改用 `produced.snapshot()`。
- -race 修复(`7b8a34d`):`llm_direct.go:603-610` writeSlot 把工具 goroutine 对槽位的回写全部收进 toolMu;`:636-655` slotFor 空 ID 改为认领未认领槽位(claimed 标志,防并行直调撞槽);`:786-799` onEvent 在锁内快照槽位字段后再组装部件/发事件(解锁后读即竞态——原失败模式已消除)。
- 结论:配对、状态映射、并发三面均在触发点修复;legacy 空字段行为逐字节保留(`squad_events.go:36-39` + TestSquadEventsLegacyFramesUnchanged)。
## 回归透镜
- legacy 空字段行为:native(omitempty,`exec/backend.go:59-64`)、squad port(`port.go:78-92` + `progress.go:150-154` 三键全空输出与旧投影逐字节一致,测试 `squad/process_event_test.go:129-152`)、backend(`toolEventOutcome` 空 Status+空 ErrorReason → 旧 "ok"+Detail(160),`toolEventID` 空回退工具名)——三层 legacy 路径均有字节一致断言。
- 旧 schema 升级:v1 库(无新列、无版本表)→ 建表/补列/记版本,行数据不丢;`runstore_test.go:425-513` 用真实 legacy DDL+行数据验证(含升级后写入协作态、旧列不被 clobber)。
- 既有语义保留:U9 租约 5 分钟、reclaim、`RowsAffected==0` 换下一候选;U8 async/on_exit 出口语义保留(对照测试 `checkpoint_test.go:318-338`);U11c 的 usage 转发、text/reasoning delta、`textIdx` 行为不变;`eventTap` 仍为同步回调(不排队不缓存)。
- 取消语义:`cancelRun`(`engine.go:1001-1016`)保存失败仅补可见错误与 `out.Error`,仍返回 RunCancelled——不改变取消本身的结局。
## 范围透镜
- Dev 级:仅任务卡 + 5 gitlink,与声明一致。
- native `cff6935`:7 文件全部落在 U11a 声明面(exec/、runtime/loop.go、adapters/native 转换 + 测试);其余范围 diff 均属批次一恢复提交。
- squad `cf83d30/12a53b0/676a1ed/9edb6ba`:文件均在 U8/U9/U11b 声明面;`deps/agent-intent`/`deps/agent-native` gitlink 指向批次一恢复 tip(`cdd51c8`),无越界。
- backend `f8e9e9f..9b40595`:4 提交均为 U11c + repair + pin;大 diff 中的 intentgate/route/server/cmdbus 等改动全部来自 `f084d10..b614180` 的批次一恢复,与卡片「pin-restore 预期」一致。
- 未发现超出声明单元的代码变更。
## 测试透镜(是否断言触发/并发/故障注入而非 happy path)
- U9:`queue_test.go` 覆盖双上限交叉(runtime 跨 agent `:72`、agent 跨 runtime `:119`)、12 worker 真并发不越界 `:144`、释放后重取 `:207`、计数失败三态(库不可读/agent 表缺失/守卫计数直击 `:248-329`,后者直接执行 claimSQL 验证语句级失败且任务保持 queued)。
- U8:`runstore_test.go` 往返 `:64`、同文条目不坍缩 `:385`、legacy 升级 `:425`、跨重启协作态 `:514`、save 失败 3 mode × 2 fault 矩阵 `:686`(断言无 run_completed + "persistence failure" 可见);`checkpoint_test.go:248/279` 三档 flush/终态失败注入(faultStore),并断言事件序最后一枚终态事件必为 run_failed、交付物文件仍在(业务动作不回滚);`:318` 对照组防「压根没写」空过。
- U11a:`loop_event_fidelity_test.go` 同名工具异 CallID `:27`、error/denied/canceled 状态 `:95/:122/:164`、批量取消跳过帧必为 canceled 非 ok `:243`。
- U11b:`register_event_test.go` legacy 透传 `:27`、反射探测 `:55`、并发身份保持 `:236`、到达序(桥与 tap 双 sink 单序,fanoutWindow 确定性复现竞态窗口 `:306/:373`)。
- U11c:`squad_events_test.go` CallID 配对 `:74`、真实状态 `:108`、legacy 不变 `:167`、64 路并发回调零丢失/零重复 `:206`、并发共享工件表 `:267`、收尾文本与工具结局一致 `:300`。
- 测试质量总体:故障注入为真实注入(faultStore/faultingStore/DROP TABLE/关库),并发用例为真 goroutine,且普遍带 legacy 对照组——满足「断言触发而非 happy path」。
## 本地聚焦测试(GOWORK=off,逐条一行)
- `deps/agent-native`:`go test ./exec/ ./runtime/session/ ./runtime/tools/` → ok(3 包全绿,tools 11.4s)。
- `deps/agent-native`:`go test ./runtime/` 与 `./adapters/native/` → NOT_RUN(缺嵌套 deps/error-code-system 材料,本单元禁止 submodule 操作;见卡片组合验证)。
- `deps/agent-squad`:`go test ./squad/ ./adapters/sqlite/ ./adapters/native/` → NOT_RUN(同上,嵌套 deps 未材料化;见卡片组合验证)。
- `modules/backend`:`go build ./internal/runtime/` → NOT_RUN(backend 自身嵌套 deps 为空目录,无法解析 replace;执行证据取卡片记录的组合 `make test` @ 组合验证 PASS(exit=0))。
- 说明:组合验证收据(卡片:全量 make test @ 0b46569d)覆盖上述 NOT_RUN 包在精确 pin 上的执行;本评审的独立复核以静态逐行为主。
## 结论
五个声明单元(U8、U9、U11a、U11b、U11c)及两处修复(帧序、-race)均在触发点完成修复,legacy/升级兼容有测试钉住,范围与声明一致,无 blocker/major;5 条 minor 均为非阻塞的一致性/追溯性提示,可作为后续独立增量。
REVIEW VERDICT: APPROVE
@@ -0,0 +1,72 @@
# Independent Code Review — feature/audit-followups-pin-gate-m5
- Reviewer: independent CLI review session (audit-followups-independent-review unit; fresh session, not the implementer)
- Date: 2026-10-22
- Review object: this checkout @ `a2b4cf73` (branch tip `feature/audit-followups-pin-gate-m5`, detached HEAD) versus `origin/main`. No `origin/*` refs exist in this sandbox, so the diff was taken against the merged authoritative main tip `d65195bd` (PR #691 merge, second parent of `a874ee60` "Merge authoritative main into the task branch"); `merge-base(d65195bd, HEAD) = d65195bd`, so `git diff d65195bd...HEAD` ≡ `git diff origin/main...HEAD`.
- Scope claims under review:
1. Dev: new `scripts/check_pin_regression.sh` wired into `scripts/check-pins.sh` and `scripts/task_pr_check.py`; tests `tests/test_check_pins.py` (+1 case) and `tests/test_check_pin_regression.py` (new, 13 cases). Motivating incident: PR #682 (stale branch silently resetting component pins over main).
2. `deps/agent-native` `cff69355` → `f2fb9ffa` (review-M5 fix: Writable preflight rejects subagent delegation).
3. Gitlink-only pin advances in `deps/agent-squad` `9edb6ba8` → `b6d87638` (nested native `f2fb9ffa`) and `modules/backend` `7bcbbdb3` → `a75783fd` (merged upstream `7bcbbdb` line + parallel work `443e7af`; nested native `f2fb9ffa`).
- Method: read-only review of `git diff d65195bd...HEAD` (9 files, +479/−4) plus per-submodule commit/tree diffs; focused checks run where this worktree permits (see Verification runs). No code was changed; the only write is this report.
## Findings
### Blockers
None.
### Major
- **MA1 — The CI leg of the pin-regression gate is a structural no-op; all enforcement rests on local full-clone runs.** All three CI checkout jobs fetch a raw object id shallowly and detach (`.gitea/workflows/ci.yaml:152,336,661` — `git fetch --depth=1 origin <sha>` then `checkout -q --detach FETCH_HEAD`), which writes only `FETCH_HEAD` and never creates `refs/remotes/origin/main` (empirically confirmed in a scratch repo: after a raw-SHA shallow fetch, `git rev-parse --verify origin/main^{commit}` fails). `check_pin_regression.sh:24-27` treats an unresolvable `origin/main` as "warn + exit 0" (documented shallow-checkout escape). Consequently `task_pr_check.py ci` (ci.yaml:162) and the CI `make test` → `test-pins` leg can never fail a PR on pin regression — the exact incident shape #682 (a stale branch merged through CI) would again pass CI today. Mitigation: the delivery policy mandates a local PR check before acceptance/merge, and in a full clone (`make task-pr-check local`) the gate does enforce (verified below). Not blocking — the change is a strict improvement and the local leg is the mandated enforcement point — but the gate's stated purpose ("gitlink 相对 origin/main 不得倒退" as a PR gate) is not achieved in CI. Recommendation: in the reviewed checkout step, additionally fetch the base ref (e.g. `git fetch --depth=1 origin "refs/heads/${GITHUB_BASE_REF}:refs/remotes/origin/main"`) so `pin_regression_problems()` verifies real ancestry at gate time; the submodule materialization already produces full child clones, so the per-component `merge-base --is-ancestor` checks would then work offline.
### Minor
- **MI1 — Gitlink removals relative to `origin/main` pass silently.** The gate iterates only HEAD's gitlinks (`check_pin_regression.sh:71-72,95`); a component dropped from the Dev tree (present on base, absent in HEAD) is never compared, and `check-pins.sh` likewise only checks the containers it iterates (a container dropping one of its `deps/*` links is equally invisible). Not the #682 shape (reset, not removal), and "new pin not on base" is an intentional pass (line 74-76), but silent composition shrinkage is adjacent to the incident class this gate exists for. Suggest a follow-up that diffs the base/HEAD gitlink path sets in both directions.
- **MI2 — `pin_regression_problems()` runs the gate with no subprocess timeout** (`scripts/task_pr_check.py:222-224`). `ensure_commit`'s `git fetch` (`check_pin_regression.sh:48-54`) can hang on a black-holed connection and would stall the PR check until the runner/job timeout. Low practical likelihood (unchanged pins short-circuit at line 73 before any fetch; CI submodules are full clones), but a `timeout=` on the `subprocess.run` would bound it.
- **MI3 — Unreachable-but-confusing fail mode if a CI submodule lacks the old pin.** If `ensure_commit` ever needed to fetch in CI, the component remotes persist only the public URL (credentials live solely inside the checkout step's per-command env), so the fetch fails and the gate fails closed ("missing locally and could not be fetched", lines 80-86) — correct direction, but the PR author sees an unfetchable-pin error whose real cause is credentials/absence. With full submodule clones this should never trigger; noting for diagnosis only.
### Notes
- **N1 — Preflight placement is consistent with the sibling F02 checks; "zero side effects" holds for the meaningful claims.** The new check (`deps/agent-native/adapters/native/backend.go:228-230`) sits inside the existing `len(writable) > 0 && profile == exec.ToolProfileWorkspace` block (line 216) before any registry/session/model work. Workdir preparation above it (`MkdirAll`, `INSTRUCTIONS.md`/`TASK.md` writes) predates rejection — identical to the pre-existing exec/MCP/host rejections, and `TestContractWritableRejectsSubagentInPreflight` asserts the substantive zero-side-effect properties: no stream call, no factory call, no deliverable file, no `.agentx` session state.
- **N2 — `pin regression ok` (line 100) prints even when `PIN_REGRESSION_SKIP=1` downgraded failures to warns.** Exit status is the contract (0 with warns), and the warns are loud on stderr; cosmetic only.
- **N3 — Pre-existing gofmt deviation in `adapters/native/backend.go`** (struct-literal alignment around `runtime.NewAgentSession`, ~line 447). The file at the base pin `cff69355` fails `gofmt -l` identically; the changed hunk (212-230) is clean. Out of scope for this fix.
- **N4 — Pre-existing stderr noise `fatal: not a tree object` when a container directory exists but is uninitialized.** Reproduced as `git -C deps/agent-intent ls-tree <sha>` from an empty dir discovering the parent Dev repo (process substitution in `check-pins.sh:68`); pre-dates this branch and does not change its exit status. In this sandbox only `modules/backend`, `deps/agent-native`, `deps/agent-squad` are materialized.
- **N5 — Go tests NOT_RUN in this workspace (environment, not code).** `deps/agent-native/go.mod:10,12` replace `error-code-system`/`logging-system` with nested checkouts that are not materialized here, and the pinned commit objects (`a3ee67bb`, `49b5d8be`) are absent from every local object store (Dev, native, squad, backend); network access is forbidden for this unit, so the modules cannot be completed. `GOWORK=off go test ./adapters/native/...` therefore fails at module setup, not in code. Fallbacks applied: both changed files parse (`gofmt -e`) and were line-reviewed; the author-recorded evidence (`verify-m5.json` / `verify-m5-host.json` exit=0, quoted in commit `f2fb9ffa`) is uncorroborated in this session and treated as author-claimed.
- **N6 — Composition coherence verified (lens 3).** Nested pins agree at every level: native `f2fb9ffa` (Dev `deps/agent-native` = squad `deps/agent-native` = backend `deps/agent-native`), squad `b6d87638` (Dev = backend), intent `765a7e71` (Dev `deps/agent-intent` = native = squad = backend), core `0cf03446` (Dev `modules/core` = backend `deps/agent-system-core`), command `fe7987dc`, document-renderer `3f259990`, error-code-system `a3ee67bb`, logging-system `49b5d8be`; guidelines/manager deltas (`2688fd2`/`67784f43`/`bd3a7de5` vs Dev `a15db508`/`2c2e3725`) are warn-only by design (`check-pins.sh:57-62`). `bash scripts/check-pins.sh` exits 0 ("pins ok") in this worktree.
## Spec lens (1) — gate catches the incident shape; M5 preflight is exact
- Gate trigger: HEAD pin not a descendant of the base pin fails — stale reset (`test_pr682_stale_branch_carrying_old_pin_fails`) and diverged/rebased pins (`test_diverged_pin_fails`) both exit 1 with `moves BACKWARD` + `PR #682` guidance; forward move, same pin, base-pin-absent (`new, not on origin/main`), unresolvable `origin/main`, and `PIN_REGRESSION_SKIP=1` downgrade all exit 0. `task_pr_check.py ci` wiring hard-fails (`PR_CHECK_FAILED`) on regression and passes with the skip env (`test_task_pr_check_ci_hard_fails_on_regression`, `test_task_pr_check_ci_skip_env_passes`). All 19 Python tests pass in this workspace (Verification runs).
- M5 preflight: the rejection condition is exactly non-empty Writable ∧ workspace profile ∧ delegation enabled (`backend.go:216,228-229`). Delegation exists iff `b.opts.Subagent != nil` (`runtime/subagent/subagent.go:62-71` no-ops on nil factory; `delegate_task` is registered only in the workspace branch, `backend.go:265`), and Writable reaches `Execute` only via `withWritable(ctx, req.Workspace.Writable)` (`adapters/native/contract.go:66`) — the reasoning profile has no registry at all. Empty-Writable delegation is covered by `TestContractSubagentWithoutWritableStillDelegates` (delegate_task declared, factory invoked with the request fields). Side-effect escape confirmed closed: `tools.ApplyWriteAllowlist` runs before `subagent.Register`, so `delegate_task` never inherited the write-set — rejecting the combination is the right call, and `run_tool_script` cannot reach it either (it only invokes registered tools and bans re-dispatch).
## Regressions lens (2)
- `check-pins.sh` behavior when `origin/main` is absent: unchanged — live run exits 0 with "pins ok", the gate only warns (`check_pin_regression.sh:24-27`). The appended call is `|| fail=1` (check-pins.sh:67), so any gate crash also fails closed.
- `task_pr_check` callers: no signature/behavior changes to existing functions (`PIN_REGRESSION` const and `pin_regression_problems()` are additive; `cmd_local`/`cmd_ci` append/inject problems only). `scripts/test_affected.py:61-62` and `scripts/task.sh:699` import unaffected names. Remote-failure `Stop` paths still precede the gate (fail-closed elsewhere). `make task-pr-check` runs from the repo root, matching the gate's cwd→toplevel resolution.
- Delegation flows without Writable: backend `a75783fd` and squad `b6d87638` contain zero `Writable`/`ContractRequest` usage in non-test Go code (grepped) — no live composition flow can trip the new rejection; the preflight only fires for contract requests that declare both.
## Scope lens (3)
Dev diff touches exactly the declared files plus the task card (`.task/**`, host domain): `scripts/check-pins.sh` (+2), `scripts/check_pin_regression.sh` (new, 100 lines), `scripts/task_pr_check.py` (+17/−1 docstring+gate), `tests/test_check_pins.py` (+17), `tests/test_check_pin_regression.py` (new, 187 lines). Submodule ranges are integration-only as declared: native = 1 commit (`f2fb9ff` "Reject subagent delegation under a Writable write-set", parent `cff6935`, no other content); squad = 1 gitlink-only commit (`b6d8763`, `diff-tree` = `deps/agent-native` only); backend = 3 commits (`3ab7cd7` and `92c2b4e` gitlink-only pins; `a75783f` = merge of `7bcbbdb` into the pin line; tree delta vs `7bcbbdb3` is exactly the two nested gitlinks; contains both `7bcbbdb` and `443e7af`). Nothing rides along outside the declared fixes.
## Tests lens (4)
New tests assert the trigger conditions, not just exit codes: exact rejection reason string, no stream/factory invocations, no deliverable/session files (native); `moves BACKWARD` / `PR #682` / `PIN_REGRESSION_SKIP=1` message substrings, `ok <path>` / `pin regression ok` / warn lines, and `[verdict] PR_CHECK_FAILED` / `PR_CHECK_OK` plumbing (Dev). `test_check_pins.py` additionally proves the gate is actually wired inside `check-pins.sh` (copies both scripts into the fixture). Offline discipline is good: temp-dir repos, hermetic env, `GIT_CONFIG_NOSYSTEM=1`, env vars scrubbed in setUp, local bare remotes for the fetch paths.
## Verification runs (this session, foreground)
| Check | Result |
|---|---|
| `git diff --stat d65195bd...HEAD` | 9 files, +479/−4 — matches declared scope |
| `bash scripts/check-pins.sh` | exit 0, "pins ok"; gate warn-only (no origin/main); guidelines warns only |
| `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest tests.test_check_pin_regression tests.test_check_pins -v` | 19/19 OK (0.796s) |
| `cd deps/agent-native && GOWORK=off go test -count=1 ./adapters/native/...` | NOT_RUN — module setup fails on unmaterialized replace targets (`go.mod:10,12`); objects absent everywhere; network forbidden (see N5) |
| `gofmt -e` on both changed native files | parse OK; `gofmt -l` deviation pre-existing (N3) |
| Raw-SHA shallow fetch → `origin/main` resolvability experiment | does NOT resolve (basis of MA1) |
| `make test` | intentionally NOT run per unit packet (known pre-existing `test_svc.SvcDbRecoveryTests.test_addr_change_keeps_database_and_auth` governance failure on clean main `b7636742`, recorded on the task card; CI is the final arbiter) |
## Verdict
The pin-regression gate correctly detects the #682 backward-pin shape (and diverged pins) while passing forward/same/new-pin moves and degrading safely without `origin/main` or via the owner-reviewed skip; the M5 preflight rejects exactly the unenforceable Writable+delegation combination with zero behavioral fallout for empty-Writable or non-contract flows; composition pins advance cleanly with no source riding along; the new tests assert real trigger conditions. The one substantive weakness (MA1 — CI leg cannot enforce due to the shallow raw-SHA checkout) is an enforcement-depth gap on a strictly-improving change whose mandated local enforcement point works; MI1–MI3 are bounded follow-ups.
REVIEW VERDICT: APPROVE
@@ -0,0 +1,61 @@
# 无项目对话(Scratch Session)实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 任意启用账号可创建彼此隔离的通用智能体会话;无 `project.create` 也能用;不得接入知识树/文档树等项目专属功能。
**Architecture:** 每个无项目对话 = 带 `settings.host.kind = "scratch"` 的私有空壳 `Project` + 恰好一条 `Conversation`。新建走专用 API(不要求 `project.create`)。列表/侧栏把 scratch 从真项目切换器剔除,归入虚拟分类「无项目对话」。服务端对 scratch 统一 fail-closed 拒绝 RDM/知识发布/成员等。
**Tech Stack:** Go Backend(store/server/authz)、TypeScript Frontend(store/TaskSidebar)、现有 SQLite projects 表 `settings` JSON。
**Spec:** [docs/superpowers/specs/2026-10-22-scratch-session-general-agent-design.md](../specs/2026-10-22-scratch-session-general-agent-design.md)
**实施执行:** agent-per-unit(配置:AGENT-EXECUTION.md);`fallback_to_host: never`。
## Global Constraints
- 固有能力不可做成 `role_permissions` 行。
- ListProjects 前后端一致过滤 scratch。
- RDM 未部署时也须宿主侧拒绝,不能只藏 UI。
- 最小充分:不做升级、协作、配额、nullable project_id。
## Review Focus
- 无 `project.create` 的创建路径与真项目门禁是否拆开
- scratch 上项目专属能力是否服务端 fail-closed
- 侧栏是否把 scratch 与真项目分开
## 文件映射
| 区域 | 路径 |
|------|------|
| 标记 helper | Backend store 或 core 小 helper |
| 创建 API | `modules/backend/internal/server/server.go` |
| 列表过滤 / 1:1 | `modules/backend/internal/store/projects.go`、server createConversation |
| 门禁 | `project_lifecycle.go`、cmdbus/RDM、knowledge、跨读 |
| 前端 API/store/侧栏 | `api.ts`、`store.ts`、`TaskSidebar.tsx` |
## Tasks
### U1 — Backend 创建与固有授权
- [ ] 实现 `IsScratchProject`;`POST /api/scratch-sessions`
- [ ] ListProjects 排除 scratch;禁止 POST /api/projects 伪造 scratch;scratch 下禁止二开会话
- [ ] 角色 catalog 不暴露可配置 scratch 动作
- [ ] 单测覆盖无/有 project.create、禁用账号、伪造、1:1
### U2 — Backend 项目专属 fail-closed
- [ ] `rejectIfScratch` 挂到 projectWork/成员/RDM/knowledge/X1/跨读
- [ ] 允许消息/附件/改名置顶归档/级联删除
- [ ] 单测正负例
### U3 — Frontend
- [ ] `createScratchSession`;sidebarMode;去掉无项目时自动「默认项目」
- [ ] TaskSidebar「无项目对话」分类与隐藏项目专属入口
- [ ] 前端测试
### U4 — 验证收口
- [ ] 最小相关测试通过;task-sync / PR / CI / 独立 Review
@@ -0,0 +1,108 @@
# 无项目对话(Scratch Session)设计
- 状态:**已批准**(对话设计第 1–4 节,2026-10-22)。
- 日期:2026-10-22;作者:host(设计整理);来源等级:SELF。
- 配套计划:[实施计划](../plans/2026-10-22-scratch-session-general-agent-plan.md)。
## 1. 目标与非目标
**目标**
- 任意**启用账号**可创建「无项目对话」,当作通用智能体使用(多轮对话)。
- 无 `project.create`(角色「项目访问」)的用户也能完成该路径,不被「默认项目」创建 403 卡住。
- 各无项目对话彼此**独立**:不共享文档、上下文、知识等。
- **不得**接入知识树、文档树、成员、RDM 等项目专属功能。
**非目标(本轮)**
- scratch → 真项目升级 / 事后绑定 RDM
- 分享、协作、邀请进空壳项目
- 配额、TTL、自动清理
- 将 `conversations.project_id` 改为可空等大 schema 重构
## 2. 已锁定决策
| 项 | 决策 |
|---|---|
| 数据模型 | 方案 A:每个无项目对话 = 一个轻量私有空壳 `Project` + 恰好一条 `Conversation` |
| UI | 侧栏虚拟分类「无项目对话」下列会话;**不**进入真项目切换器 |
| 谁可建 | 所有启用账号(有无 `project.create` 均可) |
| 权限 | **固有能力**,不进角色矩阵,**不可被管理员修改**;与可配置的 `project.create` 完全分离 |
## 3. 数据模型与权限
### 3.1 空壳项目约定
- 仍用现有 `projects` 表;`settings` 写入稳定标记:`host.kind = "scratch"`(解析仅经统一 helper,例如 `IsScratchProject`)。
- 每个无项目对话 = **一个 scratch 项目 + 恰好一条会话**(创建时原子写入;禁止在 scratch 下再建第二会话)。
- 项目 `owner` = 当前账号;不建成员、不共享、不邀请。
- 会话默认 `crossPrivate = true`。
### 3.2 权限
| 动作 | 门禁 |
|------|------|
| `POST /api/projects` 创建真项目 | 仍要 `project.create`(不变) |
| 创建无项目对话 | 启用账号即可;**不是**角色可配置动作 |
| scratch 上读写会话/发消息 | 仅 owner |
| scratch 升成真项目 / 绑 RDM | 本轮不做(明确拒绝) |
角色 catalog、`PUT .../permissions`、角色编辑 UI **不得**出现或改写「无项目对话」能力。关掉 `project.create` 不影响 scratch 创建。
### 3.3 专用创建 API
`POST /api/scratch-sessions` → `{ project, conversation }`
- 内部:插 scratch 项目 → 建唯一会话 → **不**触发 RDM provision。
- **禁止**经 `POST /api/projects` 伪造 scratch 标记。
### 3.4 列表语义
- 真项目列表 / 侧栏项目切换器:**过滤掉** scratch。
- 「无项目对话」分类:按会话列出(标题来自会话名)。
## 4. 服务端门禁(禁用项目专属能力)
判定:`IsScratchProject(p)` ≡ `settings.host.kind == "scratch"`。
**一律拒绝(scratch 上)**
- RDM 绑定 / provision;`rdm.*` 命令对 scratch 的 projectId → 403/400
- 知识树 / 文档树 / 法规树 / 驾驶舱 / 模板实例化
- 成员、职责、项目权限矩阵、项目归档协作
- 因「拥有 scratch」而授予 `project.create` 联动能力
- Project Context(X1)注入(视为未启用,走普通通用智能体组装)
- 跨会话读:scratch 会话不可被对端读出,也不可读其他会话
- 在已有 scratch 下再建会话
- 普通创建项目接口伪装 scratch
**允许(通用智能体最小集)**
- 本会话消息、附件(仅挂本 scratch,不进知识发布)
- 会话改名 / 置顶 / 归档 / 删除(删除可级联删空壳项目)
- 普通 LLM 对话;显式 `@knowledge` 对 scratch **关闭**
实现:集中 `rejectIfScratch` / `requireNonScratch`,挂在项目工作、RDM 分发、knowledge、成员 API;不能只藏 UI。
## 5. 前端信息架构
- 项目切换器:真项目列表 + 虚拟项「无项目对话」。
- 选中「无项目对话」:列出本人所有 scratch 会话;「+ 新建对话」调用 scratch API。
- 打开 scratch 会话时:隐藏项目设置、模板生成、依赖当前真项目的 RDM 入口。
- `createTask`:无真项目时**不再**自动 `createProject('默认项目')`;无建项权或用户在无项目对话视图时走 scratch API。
- 无建项权用户主路径:登录 → 默认落在「无项目对话」→ 可直接新建/继续对话。
## 6. 验收标准
1. 无建项权账号可进入「无项目对话」并完成多轮通用对话,不因默认项目 403。
2. 有建项权账号同样可建无项目对话;真项目创建仍只认 `project.create`。
3. 同一用户两个 scratch 会话互不共享附件知识库、上下文条目、跨会话读取。
4. scratch 上 RDM/知识树/文档树/成员/项目设置类能力服务端拒绝;UI 无入口。
5. 角色权限 UI / API 不能出现或改写该能力。
6. scratch 不出现在项目切换器。
7. 无法在已有 scratch 项目下再建第二条会话。
## 7. 最小验证
- Backend:创建门禁、RDM/knowledge 拒绝、ListProjects 过滤、1:1 约束单测。
- Frontend:侧栏分组、无建项权主路径、scratch 视图隐藏项目入口的测试。
+2
View File
@@ -64,6 +64,8 @@ for container in "${containers[@]}"; do
done < <(git -C "$container" ls-tree "$commit" deps/)
done
bash "$root/scripts/check_pin_regression.sh" || fail=1
if [ "$fail" -ne 0 ]; then
exit 1
fi
+100
View File
@@ -0,0 +1,100 @@
#!/usr/bin/env bash
# 组合指针不倒退:HEAD 中每个 gitlink(deps/*、modules/*)相对 origin/main
# 只能前进——新 pin 必须以 origin/main 的旧 pin 为祖先。事故原型:PR #682
# 合入了过期分支,其树把五个组件 pin 重置回批次前的值,静默丢掉了 main 上
# batch-1 的组合。
#
# ┌─ 逃生口(须 owner Review)──────────────────────────────────────────────┐
# │ PIN_REGRESSION_SKIP=1 声明这是一次有意的降级:失败改为醒目的 warn 并 │
# │ 退出 0。只用于经组件 owner 审阅的刻意回退,PR │
# │ 描述须写明原因;不得用来绕过过期分支。 │
# └─────────────────────────────────────────────────────────────────────────┘
#
# 其他开关:
# PIN_REGRESSION_NO_FETCH=1 旧 pin 在子仓本地缺失时不尝试 fetch(测试/离线用)。
#
# 在当前工作目录所属仓库的顶层运行。origin/main 本地不可解析(浅检出)时只告警、退出 0。
set -euo pipefail
root=$(git rev-parse --show-toplevel)
cd "$root"
base=origin/main
skip=${PIN_REGRESSION_SKIP:-0}
if ! git rev-parse --verify -q "$base^{commit}" >/dev/null; then
echo "warn: $base is not resolvable locally; pin regression check skipped" >&2
exit 0
fi
fail=0
declare -A main_pins=()
while read -r mode _typ sha path; do
[ "$mode" = "160000" ] || continue
main_pins["$path"]=$sha
done < <(git ls-tree -r "$base")
# 子仓须是独立检出的仓库;未初始化时 git -C 会落到 Dev 自身。
own_repo() {
local path="$1" top
top=$(git -C "$path" rev-parse --show-toplevel 2>/dev/null) || return 1
[ "$top" = "$root/$path" ]
}
has_commit() {
git -C "$1" cat-file -e "$2^{commit}" 2>/dev/null
}
ensure_commit() {
local path="$1" sha="$2"
has_commit "$path" "$sha" && return 0
[ "${PIN_REGRESSION_NO_FETCH:-0}" = "1" ] && return 1
git -C "$path" fetch -q origin "$sha" >/dev/null 2>&1 || true
has_commit "$path" "$sha"
}
regress() {
if [ "$skip" = "1" ]; then
echo "warn: PIN_REGRESSION_SKIP=1 — $* (deliberate downgrade; requires owner review)" >&2
else
echo "pin: $*" >&2
fail=1
fi
}
while read -r mode _typ new path; do
[ "$mode" = "160000" ] || continue
old=${main_pins["$path"]:-}
if [ -z "$old" ]; then
echo "ok $path (new, not on $base)"
continue
fi
if [ "$old" = "$new" ]; then
echo "ok $path"
continue
fi
if ! own_repo "$path"; then
regress "$path is not checked out; cannot verify ${new:0:12} descends from $base ${old:0:12}"
continue
fi
if ! ensure_commit "$path" "$old"; then
regress "$path $base pin $old is missing locally and could not be fetched; cannot verify no regression"
continue
fi
if ! ensure_commit "$path" "$new"; then
regress "$path HEAD pin $new is missing locally and could not be fetched; cannot verify no regression"
continue
fi
if git -C "$path" merge-base --is-ancestor "$old" "$new"; then
echo "ok $path (forward ${old:0:12}..${new:0:12})"
continue
fi
regress "$path moves BACKWARD: $base is ${old:0:12}, HEAD is ${new:0:12} (not a descendant)." \
"This is the PR #682 pattern (a stale branch resetting pins over main): merge $base and re-pin," \
"or set PIN_REGRESSION_SKIP=1 for an owner-reviewed deliberate downgrade"
done < <(git ls-tree -r HEAD)
if [ "$fail" -ne 0 ]; then
exit 1
fi
echo "pin regression ok"
+16 -1
View File
@@ -13,6 +13,8 @@
不联网、不需要 token;非 pull_request 事件跳过(退出 0)。
期望目标:child → immediate_target;其余(initiative / standalone / 无卡)→ root_target(无卡即 main)。
local 与 ci 均运行 check_pin_regression.sh(gitlink 相对 origin/main 不得倒退);非零即拒绝,
PIN_REGRESSION_SKIP=1 由该脚本降级为告警(有意降级须 owner Review)。
退出码:0 通过;1 门禁拒绝(PR_CHECK_FAILED);2 用法;6 远端无法核验(REMOTE_UNVERIFIED,fail closed)。
仅使用标准库,复用 task_triage 的 Gitea 客户端与 token 读取。token 不打印、不写入任何产物。
@@ -33,6 +35,7 @@ EXIT_USAGE = 2
PRE_MERGE_CLOSED = "已完成(合入前闭合)"
CHILD_COLUMNS = ("子任务分支", "必需", "状态", "PR")
DONE_STATES = ("已合入", "已延期")
PIN_REGRESSION = Path(__file__).resolve().parent / "check_pin_regression.sh"
def sh(*args):
@@ -216,6 +219,17 @@ def final_problems(api, slug, token, branch, meta, text):
return problems
def pin_regression_problems():
proc = subprocess.run(["bash", str(PIN_REGRESSION)], capture_output=True, text=True,
encoding="utf-8", errors="replace")
for line in (proc.stdout + proc.stderr).splitlines():
print(f"[pin-regression] {line}")
if proc.returncode != 0:
return [f"pin regression gate failed (exit {proc.returncode}): a gitlink moves backward against "
"origin/main or cannot be verified; PIN_REGRESSION_SKIP=1 only for owner-reviewed downgrades"]
return []
def verdict(problems, kind, base, head):
if problems:
for problem in problems:
@@ -264,6 +278,7 @@ def cmd_local(args):
problems.append(f"parent initiative {expected} has no open PR into {meta['root_target']}")
if args.final and kind == "initiative":
problems.extend(final_problems(api, slug, token, branch, meta, text))
problems.extend(pin_regression_problems())
return verdict(problems, kind, expected, head)
@@ -281,7 +296,7 @@ def cmd_ci(_args):
if base != expected:
raise Stop(EXIT_FAILED, f"PR base {base!r} differs from expected {expected!r} "
f"for {meta['kind']} branch {head}")
return verdict([], meta["kind"], base, head)
return verdict(pin_regression_problems(), meta["kind"], base, head)
def main(argv=None):
+6 -5
View File
@@ -1,11 +1,12 @@
# RDM 制品钉扎。三行都是 40 位 hex。升级走 PR,不在 CI 里执行候选文件。
# sha:生命周期套件的目标版本(6-pin 布局)。
# prev_sha:来回部署身份稳定性测试的起点。选取受两条硬约束——与 sha 的 pins 布局一致,
# 且两者之间无跨 schema 迁移(scripts/svc.sh 的 schema 兼容闸会在停旧服务前拒绝不兼容切换)——
# 而非追求版本跨度。取 sha 在 RDM 主线上的第一父提交(交付合入前的 main);代价是 prev 与 sha
# 仅隔一次合并,版本跨度小,往返部署覆盖的版本距离有限。
# 且两者之间无跨 schema 迁移(scripts/svc.sh 的 schema 兼容闸会在停旧服务前拒绝不兼容切换)。
# 取上一个已钉住的 sha:同为 6-pin 布局,与 sha 之间无 schema/迁移变更,在 RDM 主线上与 sha
# 相距 59 个提交,往返部署覆盖的版本跨度大于仅隔一次合并的相邻提交。
# legacy_sha:承载「无身份」语义(没有 version --json),必然早于 6-pin 布局。
# 三者的 pins 布局可能不同;CI 按每个 pin 自身的 gitlink 清单物化并逐个断言,不要求布局统一。
sha=bc8db886606e88201e7f7210a1357d22dc84124b
prev_sha=59b3624325fe132ef92ccee83dd9ddc6c3fcc521
# 来回切换的 schema 兼容不由钉扎保证,由真实生命周期套件检验。
sha=ee8c2cdf4a0ed88cdc4037f4b43501e1eebc4c5b
prev_sha=bc8db886606e88201e7f7210a1357d22dc84124b
legacy_sha=72bb1fec79d64c2af5e49416640712320816c3b4
+187
View File
@@ -0,0 +1,187 @@
"""check_pin_regression.sh:gitlink 相对 origin/main 只能前进(PR #682 事故形态)。
全部离线:临时目录内的普通 Git 仓库充当子仓,origin 只指向本地 bare 仓库。
"""
import os
import shutil
import subprocess
import sys
import tempfile
import unittest
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
SCRIPT = ROOT / "scripts" / "check_pin_regression.sh"
PR_CHECK = ROOT / "scripts" / "task_pr_check.py"
COMP = "deps/comp"
class PinRegressionTests(unittest.TestCase):
def setUp(self):
self.tmp = Path(tempfile.mkdtemp())
self.addCleanup(shutil.rmtree, self.tmp, ignore_errors=True)
cfg = self.tmp / "gitconfig"
cfg.write_text("")
self.env = dict(
os.environ,
GIT_CONFIG_GLOBAL=str(cfg),
GIT_CONFIG_NOSYSTEM="1",
GIT_AUTHOR_NAME="t",
GIT_AUTHOR_EMAIL="t@example.invalid",
GIT_COMMITTER_NAME="t",
GIT_COMMITTER_EMAIL="t@example.invalid",
)
for key in ("PIN_REGRESSION_SKIP", "PIN_REGRESSION_NO_FETCH"):
self.env.pop(key, None)
self.dev = self.tmp / "dev"
self.dev.mkdir()
self.git(self.dev, "init", "-q")
# 子仓:A ← B,另有从 A 分叉的 C。
self.comp = self.dev / COMP
self.comp.mkdir(parents=True)
self.git(self.comp, "init", "-q")
self.a = self.commit(self.comp, "a")
self.b = self.commit(self.comp, "b")
self.git(self.comp, "checkout", "-q", "-b", "side", self.a)
self.c = self.commit(self.comp, "c")
def git(self, cwd, *args):
return subprocess.run(
["git", *args], cwd=cwd, env=self.env, check=True, capture_output=True, text=True
).stdout.strip()
def commit(self, repo, text):
(repo / "f").write_text(text)
self.git(repo, "add", "f")
self.git(repo, "commit", "-qm", text)
return self.git(repo, "rev-parse", "HEAD")
def pin(self, sha, path=COMP):
self.git(self.dev, "update-index", "--add", "--cacheinfo", f"160000,{sha},{path}")
self.git(self.dev, "commit", "-qm", f"pin {path} {sha[:7]}")
return self.git(self.dev, "rev-parse", "HEAD")
def compose(self, main_pin, head_pin):
"""origin/main 钉 main_pin,HEAD(PR 分支)钉 head_pin。"""
main = self.pin(main_pin)
self.git(self.dev, "update-ref", "refs/remotes/origin/main", main)
if head_pin != main_pin:
self.pin(head_pin)
def run_check(self, **extra):
return subprocess.run(
["bash", str(SCRIPT)], cwd=self.dev, env=self.env | extra, capture_output=True, text=True
)
def test_same_pin_passes(self):
self.compose(self.a, self.a)
res = self.run_check()
self.assertEqual(res.returncode, 0, res.stderr)
self.assertIn(f"ok {COMP}\n", res.stdout)
self.assertIn("pin regression ok", res.stdout)
def test_forward_pin_passes(self):
self.compose(self.a, self.b)
res = self.run_check()
self.assertEqual(res.returncode, 0, res.stderr)
self.assertIn(f"ok {COMP} (forward", res.stdout)
def test_pr682_stale_branch_carrying_old_pin_fails(self):
self.compose(self.b, self.a)
res = self.run_check()
self.assertEqual(res.returncode, 1, res.stdout)
self.assertIn(f"pin: {COMP} moves BACKWARD", res.stderr)
self.assertIn("PR #682", res.stderr)
self.assertIn("PIN_REGRESSION_SKIP=1", res.stderr)
self.assertNotIn("pin regression ok", res.stdout)
def test_diverged_pin_fails(self):
self.compose(self.b, self.c)
res = self.run_check()
self.assertEqual(res.returncode, 1, res.stdout)
self.assertIn(f"pin: {COMP} moves BACKWARD", res.stderr)
def test_skip_env_downgrades_to_warning(self):
self.compose(self.b, self.a)
res = self.run_check(PIN_REGRESSION_SKIP="1")
self.assertEqual(res.returncode, 0, res.stderr)
self.assertIn("warn: PIN_REGRESSION_SKIP=1", res.stderr)
self.assertIn("requires owner review", res.stderr)
def test_missing_origin_main_warns_and_passes(self):
self.pin(self.a)
res = self.run_check()
self.assertEqual(res.returncode, 0, res.stderr)
self.assertIn("warn: origin/main is not resolvable locally", res.stderr)
def test_new_component_not_on_main_passes(self):
self.compose(self.a, self.a)
other = self.dev / "deps" / "other"
other.mkdir()
self.git(other, "init", "-q")
self.pin(self.commit(other, "o"), "deps/other")
res = self.run_check()
self.assertEqual(res.returncode, 0, res.stderr)
self.assertIn("ok deps/other (new, not on origin/main)", res.stdout)
def test_missing_old_object_with_fetch_disabled_fails(self):
self.compose("1" * 40, self.a)
res = self.run_check(PIN_REGRESSION_NO_FETCH="1")
self.assertEqual(res.returncode, 1, res.stdout)
self.assertIn(f"pin: {COMP} origin/main pin {'1' * 40} is missing locally", res.stderr)
def test_missing_old_object_unfetchable_from_local_origin_fails(self):
bare = self.tmp / "comp-origin.git"
self.git(self.tmp, "init", "-q", "--bare", str(bare))
self.git(self.comp, "remote", "add", "origin", str(bare))
self.compose("2" * 40, self.a)
res = self.run_check()
self.assertEqual(res.returncode, 1, res.stdout)
self.assertIn("could not be fetched", res.stderr)
def test_missing_old_object_is_fetched_from_local_origin(self):
upstream = self.tmp / "upstream"
self.git(self.tmp, "clone", "-q", str(self.comp), str(upstream))
newer = self.commit(upstream, "z")
bare = self.tmp / "comp-origin.git"
self.git(self.tmp, "clone", "-q", "--bare", str(upstream), str(bare))
self.git(self.comp, "remote", "add", "origin", str(bare))
self.compose(newer, self.b)
res = self.run_check()
self.assertEqual(res.returncode, 1, res.stdout)
self.assertNotIn("could not be fetched", res.stderr)
self.assertIn(f"pin: {COMP} moves BACKWARD", res.stderr)
self.git(self.comp, "cat-file", "-e", f"{newer}^{{commit}}")
def test_uninitialized_component_cannot_be_verified(self):
self.compose(self.b, self.a)
shutil.rmtree(self.comp)
self.comp.mkdir()
res = self.run_check()
self.assertEqual(res.returncode, 1, res.stdout)
self.assertIn(f"pin: {COMP} is not checked out", res.stderr)
def run_pr_check_ci(self, **extra):
env = self.env | {"GITHUB_EVENT_NAME": "pull_request", "GITHUB_BASE_REF": "main",
"GITHUB_HEAD_REF": "feature/stale", "TASK_TARGET_BRANCH": "main"} | extra
return subprocess.run([sys.executable, str(PR_CHECK), "ci"], cwd=self.dev, env=env,
capture_output=True, text=True, timeout=60)
def test_task_pr_check_ci_hard_fails_on_regression(self):
self.compose(self.b, self.a)
res = self.run_pr_check_ci()
self.assertEqual(res.returncode, 1, res.stdout + res.stderr)
self.assertIn(f"[pin-regression] pin: {COMP} moves BACKWARD", res.stdout)
self.assertIn("[pr-check] FAIL pin regression gate failed", res.stdout)
self.assertIn("[verdict] PR_CHECK_FAILED", res.stdout)
def test_task_pr_check_ci_skip_env_passes(self):
self.compose(self.b, self.a)
res = self.run_pr_check_ci(PIN_REGRESSION_SKIP="1")
self.assertEqual(res.returncode, 0, res.stdout + res.stderr)
self.assertIn("[pin-regression] warn: PIN_REGRESSION_SKIP=1", res.stdout)
self.assertIn("[verdict] PR_CHECK_OK", res.stdout)
if __name__ == "__main__":
unittest.main()
+17
View File
@@ -8,6 +8,7 @@ from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
SCRIPT = ROOT / "scripts" / "check-pins.sh"
REGRESSION = ROOT / "scripts" / "check_pin_regression.sh"
CONTAINERS = ("modules/backend", "deps/agent-native", "deps/agent-squad", "deps/agent-intent")
@@ -29,6 +30,7 @@ class CheckPinsTests(unittest.TestCase):
self.dev = self.tmp / "dev"
(self.dev / "scripts").mkdir(parents=True)
shutil.copy(SCRIPT, self.dev / "scripts" / "check-pins.sh")
shutil.copy(REGRESSION, self.dev / "scripts" / "check_pin_regression.sh")
self.git(self.dev, "init", "-q")
def git(self, cwd, *args):
@@ -112,6 +114,21 @@ class CheckPinsTests(unittest.TestCase):
self.assertEqual(res.returncode, 1)
self.assertIn("has no Dev pin", res.stderr)
def test_pin_regression_against_origin_main_fails(self):
old, new = self.repo("deps/error-code-system", "e1", "e2")
self.build({"error-code-system": old}, {"deps/error-code-system": old})
self.git(self.dev, "commit", "-qm", "pr")
stale = self.git(self.dev, "rev-parse", "HEAD")
self.link(self.dev, "deps/error-code-system", new)
self.git(self.dev, "commit", "-qm", "main")
self.git(self.dev, "update-ref", "refs/remotes/origin/main", "HEAD")
self.git(self.dev, "reset", "-q", stale)
res = self.run_pins()
self.assertEqual(res.returncode, 1, res.stderr)
self.assertIn("ok modules/backend error-code-system", res.stdout)
self.assertIn("pin: deps/error-code-system moves BACKWARD", res.stderr)
self.assertNotIn("pins ok", res.stdout)
if __name__ == "__main__":
unittest.main()
+9 -6
View File
@@ -349,18 +349,21 @@ class SvcDbRecoveryTests(unittest.TestCase):
self.register_pg("pg1", 18892, password="addr-pw-3")
dsn = "postgresql://agent:addr-pw-3@127.0.0.1:18892/agent"
d = self.runtime("dev")
self.seed_agent("dev", 18793,
"--addr 127.0.0.1:18793 --data %s --plugins %s --auth auto"
% (d / "data", d / "plugins"),
with socket.socket() as reservation:
reservation.bind(("127.0.0.1", 0))
port = reservation.getsockname()[1]
self.seed_agent("dev", port,
"--addr 127.0.0.1:%d --data %s --plugins %s --auth auto"
% (port, d / "data", d / "plugins"),
extra_rows=[("dbref", "pg1/agent"), ("db", "pg")])
self.clear_serve_record()
self.svc("dev", "restart", "--addr", "127.0.0.1:18794")
self.svc("dev", "restart", "--addr", "127.0.0.1:%d" % port)
record = self.serve_record()
self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn, record)
self.assertIn("--auth auto", record)
self.assertEqual(self.kv("dev", "dbref"), "pg1/agent")
self.assertEqual(self.kv("dev", "addr"), "127.0.0.1:18794")
self.assertIn("--addr 127.0.0.1:18794", self.kv("dev", "exec"))
self.assertEqual(self.kv("dev", "addr"), "127.0.0.1:%d" % port)
self.assertIn("--addr 127.0.0.1:%d" % port, self.kv("dev", "exec"))
self.assertEqual(self.kv("dev", "db"), "pg")
# ---- 4. 外部直连与配置文件来源:后续无参数启动仍恢复 ----
+7 -1
View File
@@ -10,11 +10,15 @@ import os
import shutil
import sqlite3
import subprocess
import sys
import tempfile
import time
import unittest
from pathlib import Path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _port_alloc import free_test_port # noqa: E402
SOURCE = Path(__file__).resolve().parents[1]
SVC_SCRIPT = SOURCE / "scripts" / "svc.sh"
@@ -67,7 +71,9 @@ class SvcAgentBackupTests(unittest.TestCase):
self.assertEqual(proc.returncode, 0, proc.stdout)
return proc
def register_agent(self, name="t1", port=8899):
def register_agent(self, name="t1", port=None):
if port is None:
port = free_test_port()
d = self.root / "runtime" / name
(d / "data").mkdir(parents=True, exist_ok=True)
(d / "svc.env").write_text(