peertable 0.4.29 → 0.4.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/room/client.mjs +4 -1
- package/skill/SKILL.md +6 -3
- package/skill/scripts/set-mission.sh +107 -0
- package/skill/scripts/setup.sh +1 -0
- package/skill/scripts/upgrade-team-assets.sh +1 -0
- package/skill/templates/done.sh +62 -6
- package/skill/templates/independence-refresh.sh +23 -0
- package/skill/templates/member-standalone.md +12 -0
- package/skill/templates/member.md +17 -5
- package/skill/templates/parent.md +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "peertable",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.31",
|
|
4
4
|
"description": "A round table of peer agents. No orchestrator at the head. Turn Claude Code, Codex, and Grok sessions into a team of equal, long-lived peers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
package/room/client.mjs
CHANGED
|
@@ -13,7 +13,7 @@ import { findModelsDoc, resolveSeatIdentity } from '../skill/scripts/resolve-sea
|
|
|
13
13
|
|
|
14
14
|
// client.mjs 側のハードコード版数。package.json の version と一致していることを
|
|
15
15
|
// diagnostics の version_consistency が見る(2 つの版数源の drift 検出。決定45)
|
|
16
|
-
const MCP_VERSION = '0.4.
|
|
16
|
+
const MCP_VERSION = '0.4.31'
|
|
17
17
|
const PKG_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
18
18
|
|
|
19
19
|
const USAGE = `usage:
|
|
@@ -351,6 +351,7 @@ async function runDiagnostics(asJson) {
|
|
|
351
351
|
'scripts/ensure-room-mcp.mjs',
|
|
352
352
|
'scripts/leave-seat.sh',
|
|
353
353
|
'scripts/change-seat.sh',
|
|
354
|
+
'scripts/set-mission.sh',
|
|
354
355
|
'scripts/post-message.mjs',
|
|
355
356
|
// effort 専用の互換入口。change-seat.sh へ委譲するので、どちらが欠けても席設定変更が死ぬ
|
|
356
357
|
'scripts/change-effort.sh',
|
|
@@ -363,6 +364,8 @@ async function runDiagnostics(asJson) {
|
|
|
363
364
|
'scripts/archive-room-log.py',
|
|
364
365
|
'templates/gen-plan.mjs',
|
|
365
366
|
'templates/done.sh',
|
|
367
|
+
'templates/independence-refresh.sh',
|
|
368
|
+
'templates/parent.md',
|
|
366
369
|
'templates/charter.md',
|
|
367
370
|
'templates/member.md',
|
|
368
371
|
'templates/member-standalone.md',
|
package/skill/SKILL.md
CHANGED
|
@@ -74,6 +74,7 @@ script は内部で Aiterm の公開 `claude_agent` / `codex_agent` / `grok_agen
|
|
|
74
74
|
6.5 **席の稼働状態ブリッジ(setup.sh が自動で起こす)**: 手順3の scaffold が `ensure-bridge.sh <project> seat-status` で起こすので、**AI が手で叩く段は無い**。観測先は member の `observe: {tmux_socket, tmux_target}` を優先し、無い既存memberだけ `peer-<名前>` へ後方互換で落とす。socket は明示env → aiterm POSIX既定 → 検証済み`/tmp/aiterm-*.sock`1本 → 既定パスの順で解決し、bashからは`tmux-socket.mjs`を呼ぶ。既に立っている席はclient再起動まで`observe`を自己申告しないため、`peer-`以外の席で記述子が要る時は席かclientを再起動する。WSLではbridgeが読む**WSL側**の版が正で、Windows側だけの更新では直らない。
|
|
75
75
|
6.7 **model / effort変更(本人要請→親実行)**: 本人は希望と理由を自然文で親だけへDMする。親は意味を判断してtargetを確定し、`env -u PEERTABLE_POST_TOKEN skill/scripts/change-seat.sh <project> <member> [--model <model>] [--effort <effort>] [--parent <name>] [--reason <text>]`を実行する。定型文への言い直し、完全一致の再送、本人DMの機械検査は行わない。scriptはroom memberの現在値を読み、Aitermの公開`agent_configure`へ確定targetを渡し、metadataの読返しと変更履歴を残す。targetはlive catalogで検証し、変更後の記録に失敗した場合も成功へ丸めない。
|
|
76
76
|
- 同じvendor内のmodel / effort変更はAitermが同一sessionと会話contextを保って行う。vendor変更だけは再起動を伴うため、本人はrole・工程正本・roomログから再着任する
|
|
77
|
+
6.8 **mission 更新(席が自分で実行)**: 工程が変わったら席が `env -u PEERTABLE_POST_TOKEN skill/scripts/set-mission.sh <project> <name> <text>` を打つ。`POST /members` で chip を更新し、`[mission] <name>: <text>` を全員へ1行出す。席は再起動しない。親は代行しない。`change-seat.sh` に mission を足さない。
|
|
77
78
|
|
|
78
79
|
7. **親の着卓**(このセッション): `scripts/parent-join.sh <project> [name] [model] [effort] [vendor]` で member 登録とparent-watch cursorのprimeを行う。**`effort` は任意のまま据え置く**——席は `launch-seat.sh` が `--effort` で実際に設定するので「渡した値=実挙動」だが、親は既に走っているセッションで自分の effort を機械的に知る経路が無く、推測して載せると画面が嘘をつく。続けて、ClaudeとGrokはMonitor、Codexはyieldしたbackground tool taskとして**親宛DM番犬**を1世代だけ張る(形は下記「親の operating notes」の番犬仕様)。通常席用wakeup-bridgeに親を載せない。broadcastのkickoffは廃止済み。以後の post も API 直(同 notes)
|
|
79
80
|
8. **起動確認**: room の members に全員いる / 最初の claim が room に流れる(Lattice 併用モードはそれが Lattice へ到達している=`lattice todo status --json` の active に出ることも確認する。単独モードは room の claim 宣言だけが到達の証拠)/ Web UI で観測できる、をチェックして報告する
|
|
@@ -177,7 +178,8 @@ witness をどう生成するかは**対象 project 側の作法に従う**(La
|
|
|
177
178
|
witness と `independence compile` が揃ってから `lattice run intake` を実行する。
|
|
178
179
|
remaining A(まだ done でない ready / blocked)を同じ witness に含める。
|
|
179
180
|
現在の ready だけを compile すると、次の frontier の `todo start` が
|
|
180
|
-
`INDEPENDENCE_UNVERIFIED`
|
|
181
|
+
`INDEPENDENCE_UNVERIFIED` になる。stale なら席が compile し直す。親は compile しない。
|
|
182
|
+
`coverage=missing` / `stale` のままではleaseを受けず、
|
|
181
183
|
canonical共有木での作業と隔離runを混同しない。
|
|
182
184
|
- **task 単位の push はできない。** git の push は連続した history の先頭までを送る操作であり、
|
|
183
185
|
途中の特定 commit だけを選んで送ることはできない(実測・結論: nagi, 2026-08-11)。ある task の
|
|
@@ -228,8 +230,9 @@ witness をどう生成するかは**対象 project 側の作法に従う**(La
|
|
|
228
230
|
|
|
229
231
|
- Lattice 書込には actor 環境変数 3 点が必須
|
|
230
232
|
- `--parallel-frontier` が要るのは、**ready が複数あって誰も着手していない frontier の最初の start だけ**(無いと `PARALLEL_DISPATCH_REQUIRED / parallel_frontier_requires_declaration` で弾かれる)。ready が1件だけ、または既に誰かが着手している frontier へ後から乗る場合は素の `start` でよい。フラグが効くのは**取る task が `next_ready` に居る時だけ**で、他人が着手済みの task へ付けると `PARALLEL_DISPATCH_INVALID / parallel_frontier_not_applicable` になる——「フラグが使えない」ではなく「**その task はもう空いていない**」の意味である。記録があるのに対象工程が未宣言・失効なら `todo start` は `INDEPENDENCE_UNVERIFIED` で拒否する(Lattice ADR 0182)。記録が無い plan の start は従来どおり助言だけ
|
|
231
|
-
- **`done.sh` は feat SHA が `origin/main`
|
|
232
|
-
- **independence compile は remaining A を含める。** 現在の ready だけを compile すると、次の frontier の start が拒否される。`next_ready` が witness に無い compile 自体も `INDEPENDENCE_READY_UNDECLARED`
|
|
233
|
+
- **`done.sh` は feat SHA が `origin/main` の祖先でなければ canonical main へ merge して push する。** 親は着地しない。続けて remaining の independence を compile してから戻る。lattice run receipt の未着地は別軸で、警告のまま
|
|
234
|
+
- **independence compile は remaining A を含める。** 現在の ready だけを compile すると、次の frontier の start が拒否される。`next_ready` が witness に無い compile 自体も `INDEPENDENCE_READY_UNDECLARED` で拒否する。stale なら席が `.team/scripts/independence-refresh.sh` を打つ。親は compile しない
|
|
235
|
+
- **mission が古くても親は書き換えない。** 工程が変わったら席が `set-mission.sh` を自分で打つ。チップと `[mission]` の1行が正本で、席の再起動はしない
|
|
233
236
|
- 同時書込は `STORE_WRITE_CONFLICT` 等で明示的に負ける。1〜2 秒待って再実行すれば通る(正常系)
|
|
234
237
|
- evidence は記述子 JSON。記述子ファイル自体も repo 内相対パスに置く(repo 外絶対パスは INVALID_ARGUMENTS)。`.team/scripts/done.sh` が正規経路。証跡の置き場は **`evidence/<plan_key>/<task_id>.md`**——task_id は campaign を跨いで再利用されるので、平置きにすると前の campaign の監査証跡を上書きで消す(2026-08-08 実測)
|
|
235
238
|
- **外部ペイン(決定53)は Lattice 0.50.0 以降が要る。** それ以前の Lattice に `external_pane` 入りの `project.json` を差すと、identity 検証が完全一致キーで落ちて `lattice todo status` ごと死ぬ(`PROJECT_IDENTITY_INVALID / identity_schema_invalid`・0.49.0 で実測)。工程正本が読めなくなる=卓が止まるので、Lattice が古い環境では Lattice 併用 setup を走らせない
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# 席の mission を更新する。再起動しない。
|
|
3
|
+
# usage: set-mission.sh <project_dir> <member> <text>
|
|
4
|
+
#
|
|
5
|
+
# chip(POST /members の mission 欄)と、他席へ届く `[mission] <name>: <text>` の1行が正本。
|
|
6
|
+
# 起動時の PEERTABLE_MISSION env は書き換えない。change-seat.sh には載せない。
|
|
7
|
+
set -eu
|
|
8
|
+
|
|
9
|
+
unset PEERTABLE_POST_TOKEN
|
|
10
|
+
script_dir=$(cd "$(dirname "$0")" && pwd -P)
|
|
11
|
+
credential_helper="${PEERTABLE_CREDENTIAL_HELPER:-$script_dir/seat-credential.mjs}"
|
|
12
|
+
|
|
13
|
+
proj="${1:-}"; name="${2:-}"
|
|
14
|
+
shift 2 2>/dev/null || true
|
|
15
|
+
text="${*:-}"
|
|
16
|
+
[ -n "$proj" ] && [ -n "$name" ] && [ -n "$text" ] || {
|
|
17
|
+
echo "SET_MISSION_ARGS_INVALID: usage: set-mission.sh <project_dir> <member> <text>" >&2
|
|
18
|
+
exit 2
|
|
19
|
+
}
|
|
20
|
+
case "$name" in
|
|
21
|
+
*[!A-Za-z0-9._-]*) echo "SET_MISSION_ARGS_INVALID: member名に使えない文字がある" >&2; exit 2 ;;
|
|
22
|
+
esac
|
|
23
|
+
|
|
24
|
+
state="$proj/.team/setup-state.json"
|
|
25
|
+
[ -f "$state" ] || { echo "SET_MISSION_STATE_MISSING: $state" >&2; exit 1; }
|
|
26
|
+
read -r room url <<EOF
|
|
27
|
+
$(node -e 'const fs=require("fs"); const d=JSON.parse(fs.readFileSync(process.argv[1],"utf8")); if(!d.room||!d.server_url) process.exit(1); process.stdout.write(d.room+" "+d.server_url+"\n")' "$state")
|
|
28
|
+
EOF
|
|
29
|
+
|
|
30
|
+
members=$(curl -sf "$url/api/$room/members") || {
|
|
31
|
+
echo "SET_MISSION_ROOM_UNREACHABLE: membersを読めない" >&2; exit 1
|
|
32
|
+
}
|
|
33
|
+
printf '%s' "$members" | node -e '
|
|
34
|
+
const fs=require("fs");
|
|
35
|
+
const name=process.argv[1];
|
|
36
|
+
let members;
|
|
37
|
+
try { members=JSON.parse(fs.readFileSync(0,"utf8")).members||[] } catch { process.exit(2) }
|
|
38
|
+
process.exit(members.some(m => m && m.name===name) ? 0 : 1)
|
|
39
|
+
' "$name" || {
|
|
40
|
+
echo "SET_MISSION_MEMBER_MISSING: ${name} が room に居ない" >&2
|
|
41
|
+
exit 1
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
credential_file=$(env -u PEERTABLE_POST_TOKEN node "$credential_helper" path "$proj" "$room" "$name") || {
|
|
45
|
+
echo "SET_MISSION_CREDENTIAL_MISSING: ${name} のroom credentialを特定できない" >&2; exit 1
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
payload=$(node -e 'process.stdout.write(JSON.stringify({name:process.argv[1],mission:process.argv[2]})+"\n")' "$name" "$text")
|
|
49
|
+
env -u PEERTABLE_POST_TOKEN node "$credential_helper" request "$credential_file" POST \
|
|
50
|
+
"$url/api/$room/members" "$payload" >/dev/null || {
|
|
51
|
+
echo "SET_MISSION_METADATA_FAILED: ${name} の mission を room へ書けない" >&2; exit 1
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
members_after=$(curl -sf "$url/api/$room/members") || {
|
|
55
|
+
echo "SET_MISSION_CHANGED_BUT_UNVERIFIED: mission を書いたが members を読めない" >&2; exit 1
|
|
56
|
+
}
|
|
57
|
+
printf '%s' "$members_after" | node -e '
|
|
58
|
+
const fs=require("fs");
|
|
59
|
+
const name=process.argv[1];
|
|
60
|
+
const want=process.argv[2];
|
|
61
|
+
let members;
|
|
62
|
+
try { members=JSON.parse(fs.readFileSync(0,"utf8")).members||[] } catch { process.exit(2) }
|
|
63
|
+
const m=members.find(x => x && x.name===name) || {};
|
|
64
|
+
process.exit(m.mission===want ? 0 : 1)
|
|
65
|
+
' "$name" "$text" || {
|
|
66
|
+
echo "SET_MISSION_CHANGED_BUT_UNVERIFIED: members の mission が指定文と一致しない" >&2
|
|
67
|
+
exit 1
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
body="[mission] ${name}: ${text}"
|
|
71
|
+
history=$(node "$script_dir/post-message.mjs" "$name" "all" "$body")
|
|
72
|
+
history_response=$(env -u PEERTABLE_POST_TOKEN node "$credential_helper" request "$credential_file" POST \
|
|
73
|
+
"$url/api/$room/messages" "$history") || {
|
|
74
|
+
echo "SET_MISSION_CHANGED_BUT_ANNOUNCE_FAILED: chip は更新済み、[mission] の投稿に失敗" >&2
|
|
75
|
+
exit 1
|
|
76
|
+
}
|
|
77
|
+
history_seq=$(printf '%s' "$history_response" | node -e '
|
|
78
|
+
const fs=require("fs");
|
|
79
|
+
let seq;
|
|
80
|
+
try { seq=JSON.parse(fs.readFileSync(0,"utf8")).seq } catch { process.exit(1) }
|
|
81
|
+
if(!Number.isInteger(seq)) process.exit(1);
|
|
82
|
+
process.stdout.write(String(seq)+"\n");
|
|
83
|
+
') || {
|
|
84
|
+
echo "SET_MISSION_CHANGED_BUT_ANNOUNCE_FAILED: chip は更新済み、[mission] POST 応答の seq を読めない" >&2
|
|
85
|
+
exit 1
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
messages_after=$(env -u PEERTABLE_POST_TOKEN node "$credential_helper" request "$credential_file" GET \
|
|
89
|
+
"$url/api/$room/messages") || {
|
|
90
|
+
echo "SET_MISSION_CHANGED_BUT_ANNOUNCE_FAILED: chip は更新済み、room 履歴を読み返せない" >&2
|
|
91
|
+
exit 1
|
|
92
|
+
}
|
|
93
|
+
printf '%s' "$messages_after" | node -e '
|
|
94
|
+
const fs=require("fs");
|
|
95
|
+
const seq=process.argv[1];
|
|
96
|
+
const name=process.argv[2];
|
|
97
|
+
const body=process.argv[3];
|
|
98
|
+
let messages;
|
|
99
|
+
try { messages=JSON.parse(fs.readFileSync(0,"utf8")).messages||[] } catch { process.exit(1) }
|
|
100
|
+
const matched=messages.find(m => String(m.seq)===seq);
|
|
101
|
+
process.exit(matched && matched.from===name && matched.to==="all" && matched.body===body ? 0 : 1)
|
|
102
|
+
' "$history_seq" "$name" "$body" || {
|
|
103
|
+
echo "SET_MISSION_CHANGED_BUT_ANNOUNCE_FAILED: chip は更新済み、[mission] の読返しが一致しない" >&2
|
|
104
|
+
exit 1
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
echo "SET_MISSION_OK: ${name} mission=${text}"
|
package/skill/scripts/setup.sh
CHANGED
|
@@ -117,6 +117,7 @@ else
|
|
|
117
117
|
fi
|
|
118
118
|
sed -e "s|{{PLAN_KEY}}|$plan|g" -e "s|{{CLAIM_SCOPE}}|$scope|g" "$tpl/member.md" > "$tdir/roles/member.md"
|
|
119
119
|
cp "$tpl/done.sh" "$tdir/scripts/done.sh" && chmod +x "$tdir/scripts/done.sh"
|
|
120
|
+
cp "$tpl/independence-refresh.sh" "$tdir/scripts/independence-refresh.sh" && chmod +x "$tdir/scripts/independence-refresh.sh"
|
|
120
121
|
fi
|
|
121
122
|
# room MCP 定義は project root の .mcp.json が正(channels は --mcp-config を解決しない。決定44)
|
|
122
123
|
added_root_mcp=false
|
|
@@ -161,6 +161,7 @@ function main() {
|
|
|
161
161
|
? [
|
|
162
162
|
['.team/roles/member.md', 'skill/templates/member.md', 0o644],
|
|
163
163
|
['.team/scripts/done.sh', 'skill/templates/done.sh', 0o755],
|
|
164
|
+
['.team/scripts/independence-refresh.sh', 'skill/templates/independence-refresh.sh', 0o755],
|
|
164
165
|
]
|
|
165
166
|
: [['.team/roles/member.md', 'skill/templates/member-standalone.md', 0o644]]
|
|
166
167
|
const definitions = [...common, ...modeSpecific]
|
package/skill/templates/done.sh
CHANGED
|
@@ -35,7 +35,8 @@ usage: done.sh <task_id> [--plan <plan_key>] [--evidence-from <隔離worktreeの
|
|
|
35
35
|
evidence/<plan>/<task>.md を commit 済みにして done.sh <task_id> を実行する。
|
|
36
36
|
wrapper が証跡から記述子を生成し、lattice todo doneで同じ本文を最終試験結果として canonical store へ記録する。
|
|
37
37
|
pull run の worktree で作業した場合だけ --evidence-from に同じrepoの絶対pathを渡す。
|
|
38
|
-
この script は監査担当が打つ。feat SHA が origin/main
|
|
38
|
+
この script は監査担当が打つ。feat SHA が origin/main の祖先でなければ、
|
|
39
|
+
この script が canonical main へ merge して push する。親は着地しない。
|
|
39
40
|
accept は intake 席が todo done の後に打つ(engine 正順)。
|
|
40
41
|
未accept と lattice run receipt の未着地は警告だけで、done を止めない。
|
|
41
42
|
USAGE
|
|
@@ -242,7 +243,7 @@ case "$task_status" in
|
|
|
242
243
|
esac
|
|
243
244
|
|
|
244
245
|
# feat SHA が origin/main の祖先になるまで todo done を打たない。
|
|
245
|
-
#
|
|
246
|
+
# 未着地ならこの script が canonical main へ載せて push する。親は呼ばない。
|
|
246
247
|
# --evidence-from があるときは隔離 worktree の HEAD を feat とする。
|
|
247
248
|
feat_dir="."
|
|
248
249
|
if [ -n "$evidence_from" ]; then
|
|
@@ -260,10 +261,35 @@ if ! git rev-parse --verify --quiet origin/main >/dev/null; then
|
|
|
260
261
|
echo "ERROR: LANDING_ORIGIN_MISSING: origin/main が無い。done は打たない" >&2
|
|
261
262
|
exit 1
|
|
262
263
|
fi
|
|
263
|
-
|
|
264
|
-
echo "ERROR:
|
|
264
|
+
current_branch=$(git rev-parse --abbrev-ref HEAD) || {
|
|
265
|
+
echo "ERROR: LANDING_HEAD_UNRESOLVED: canonical の branch を読めない" >&2
|
|
266
|
+
exit 1
|
|
267
|
+
}
|
|
268
|
+
if [ "$current_branch" != main ]; then
|
|
269
|
+
echo "ERROR: LANDING_NOT_ON_MAIN_BRANCH: canonical HEAD が main ではない(${current_branch})。done は打たない" >&2
|
|
265
270
|
exit 1
|
|
266
271
|
fi
|
|
272
|
+
if ! git merge-base --is-ancestor "$feat_sha" origin/main; then
|
|
273
|
+
if [ "$(git rev-parse HEAD)" != "$feat_sha" ]; then
|
|
274
|
+
if ! git merge --no-edit -m "着地: ${t} feat=${feat_sha}" "$feat_sha"; then
|
|
275
|
+
echo "ERROR: LANDING_MERGE_FAILED: ${feat_sha} を main へ merge できない。done は打たない" >&2
|
|
276
|
+
exit 1
|
|
277
|
+
fi
|
|
278
|
+
fi
|
|
279
|
+
if ! git push -q origin main; then
|
|
280
|
+
echo "ERROR: LANDING_PUSH_FAILED: origin/main へ push できない。done は打たない" >&2
|
|
281
|
+
exit 1
|
|
282
|
+
fi
|
|
283
|
+
if ! git fetch -q origin; then
|
|
284
|
+
echo "ERROR: LANDING_FETCH_FAILED: 着地後の origin を fetch できない。done は打たない" >&2
|
|
285
|
+
exit 1
|
|
286
|
+
fi
|
|
287
|
+
if ! git merge-base --is-ancestor "$feat_sha" origin/main; then
|
|
288
|
+
echo "ERROR: LANDING_NOT_ON_MAIN: ${feat_sha} を origin/main へ載せられなかった。done は打たない" >&2
|
|
289
|
+
exit 1
|
|
290
|
+
fi
|
|
291
|
+
echo "着地: ${feat_sha} を origin/main の祖先にした" >&2
|
|
292
|
+
fi
|
|
267
293
|
|
|
268
294
|
# **done と accept は別軸。** engine は todo done の後にだけ accept できる。
|
|
269
295
|
# 監査担当が done.sh で閉じ、intake 席が accept する。未 accept を done の拒否条件にすると循環する。
|
|
@@ -386,12 +412,42 @@ task_status=$(task_field status 2>&1) || {
|
|
|
386
412
|
exit 1
|
|
387
413
|
}
|
|
388
414
|
|
|
389
|
-
#
|
|
415
|
+
# remaining の並列記録をこの場で更新する。親は compile しない。
|
|
416
|
+
# 次の工程の start / intake より前に終わるので、記録書き換え中の hold を作らない。
|
|
417
|
+
witness=".lattice/todo/witness/${plan}.json"
|
|
418
|
+
if [ -f "$witness" ]; then
|
|
419
|
+
compile_out=""
|
|
420
|
+
compile_rc=0
|
|
421
|
+
compile_out=$("$done_gate_cli" todo independence compile --plan "$plan" --input "$witness" 2>&1) || compile_rc=$?
|
|
422
|
+
printf '%s\n' "$compile_out"
|
|
423
|
+
if [ "$compile_rc" != 0 ]; then
|
|
424
|
+
echo "ERROR: INDEPENDENCE_COMPILE_FAILED: remaining の並列記録を更新できない。次の工程を始めるな" >&2
|
|
425
|
+
exit 1
|
|
426
|
+
fi
|
|
427
|
+
independence_ref=".lattice/todo/plans/${plan}/v1/independence.json"
|
|
428
|
+
git add -- "$witness"
|
|
429
|
+
[ -f "$independence_ref" ] && git add -- "$independence_ref"
|
|
430
|
+
if ! git diff --cached --quiet -- "$witness" "$independence_ref" 2>/dev/null; then
|
|
431
|
+
compile_msg=$(mktemp "${TMPDIR:-/tmp}/peertable-independence.XXXXXX")
|
|
432
|
+
printf 'Lattice independence を再 compile する plan=%s\n' "$plan" > "$compile_msg"
|
|
433
|
+
if ! git commit -q -F "$compile_msg" -- "$witness" "$independence_ref"; then
|
|
434
|
+
rm -f "$compile_msg"
|
|
435
|
+
echo "ERROR: INDEPENDENCE_COMPILE_FAILED: 更新した並列記録を commit できない。次の工程を始めるな" >&2
|
|
436
|
+
exit 1
|
|
437
|
+
fi
|
|
438
|
+
rm -f "$compile_msg"
|
|
439
|
+
fi
|
|
440
|
+
fi
|
|
441
|
+
|
|
442
|
+
# feat 着地と store / independence の commit を origin へ載せる。親は push しない。
|
|
390
443
|
upstream_ref=$(git rev-parse --abbrev-ref --symbolic-full-name '@{u}' 2>/dev/null || true)
|
|
391
444
|
if [ -n "$upstream_ref" ]; then
|
|
392
445
|
unpushed=$(git rev-list --count "${upstream_ref}..HEAD" 2>/dev/null || true)
|
|
393
446
|
if [ -n "$unpushed" ] && [ "$unpushed" != 0 ]; then
|
|
394
|
-
|
|
447
|
+
if ! git push -q origin HEAD; then
|
|
448
|
+
echo "ERROR: LANDING_PUSH_FAILED: 未push ${unpushed}本を origin へ載せられない" >&2
|
|
449
|
+
exit 1
|
|
450
|
+
fi
|
|
395
451
|
fi
|
|
396
452
|
fi
|
|
397
453
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# remaining の並列記録を、今の HEAD で compile し直す。親は呼ばない。
|
|
3
|
+
# usage: independence-refresh.sh <plan_key>
|
|
4
|
+
set -e
|
|
5
|
+
plan="${1:-${PEERTABLE_PLAN:-}}"
|
|
6
|
+
[ -n "$plan" ] || {
|
|
7
|
+
echo "usage: independence-refresh.sh <plan_key>" >&2
|
|
8
|
+
exit 2
|
|
9
|
+
}
|
|
10
|
+
witness=".lattice/todo/witness/${plan}.json"
|
|
11
|
+
[ -f "$witness" ] || {
|
|
12
|
+
echo "ERROR: witness が無い: ${witness}。remaining A を witness に書いてから compile する" >&2
|
|
13
|
+
exit 1
|
|
14
|
+
}
|
|
15
|
+
lattice_cli="${LATTICE_CLI:-lattice}"
|
|
16
|
+
compile_out=""
|
|
17
|
+
compile_rc=0
|
|
18
|
+
compile_out=$("$lattice_cli" todo independence compile --plan "$plan" --input "$witness" 2>&1) || compile_rc=$?
|
|
19
|
+
printf '%s\n' "$compile_out"
|
|
20
|
+
[ "$compile_rc" -eq 0 ] || {
|
|
21
|
+
echo "ERROR: INDEPENDENCE_COMPILE_FAILED: 自分で witness を直して再実行する。親は呼ばない" >&2
|
|
22
|
+
exit 1
|
|
23
|
+
}
|
|
@@ -34,6 +34,18 @@
|
|
|
34
34
|
しない。席が再起動された場合は、下の再着任手順でrole・`.team/tasks.md`・roomログから現在地を
|
|
35
35
|
取り直す。
|
|
36
36
|
|
|
37
|
+
## 工程が変わった時の mission
|
|
38
|
+
|
|
39
|
+
着席時の mission は起動スナップショットである。議題の塊が次へ進んだら、自分で更新する。
|
|
40
|
+
親に依頼しない。席は再起動しない。
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
env -u PEERTABLE_POST_TOKEN "$(npm root -g)/peertable/skill/scripts/set-mission.sh" . "$PEERTABLE_MEMBER" "<新しい使命>"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
room の member 欄(チップ)と `[mission] <名前>: <使命>` の全員宛1行が正本になる。
|
|
47
|
+
起動時の `PEERTABLE_MISSION` env は古いままでよい。
|
|
48
|
+
|
|
37
49
|
## 再着任(context が要約されたら)
|
|
38
50
|
|
|
39
51
|
自分の context が要約された(=会話の前半が手元に無い)と気づいたら、実装を続ける前に `.team/roles/member.md` と `.team/CLAUDE.md` を読み直して着任し直し、room へ `[再着任] <名前>` を一行投稿する。進行中 claim の状態は自分の記憶でなく**工程正本で取り直す**——この卓の工程正本は room の宣言だけなので、`read_log` で自分の claim・他人の claim・完了報告を全部照合する(機械に問い合わせる先は無い)。記憶と正本が食い違ったら、正本を正として食い違いを room で報告する。
|
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
|
|
22
22
|
1. `lattice todo status --json` で ready なタスクを見る。{{CLAIM_SCOPE}}
|
|
23
23
|
2. 憲章の手順で `post(to: "all", message: "[claim] <タスク>")` を一度だけ送る。**この `[claim]` が唯一の着手通知である。別の `[工程着手]` や自動着手通知は送らない。** `[claim]` は独立した1発言で出し、完了報告や他タスクの話と同じ発言に畳まない
|
|
24
|
-
3. `lattice todo start --plan {{PLAN_KEY}} --task <id>` で着手を記録する。**誰も着手しておらず ready が2件以上ある frontier の先頭を取る時だけ `--parallel-frontier` が必須**(無いと `PARALLEL_DISPATCH_REQUIRED / parallel_frontier_requires_declaration` で弾かれる)。ready が1件だけ、または既に誰かが着手している frontier へ後から乗る時は素の start でよい。**`INDEPENDENCE_UNVERIFIED` で落ちたら実装に入らない。**
|
|
24
|
+
3. `lattice todo start --plan {{PLAN_KEY}} --task <id>` で着手を記録する。**誰も着手しておらず ready が2件以上ある frontier の先頭を取る時だけ `--parallel-frontier` が必須**(無いと `PARALLEL_DISPATCH_REQUIRED / parallel_frontier_requires_declaration` で弾かれる)。ready が1件だけ、または既に誰かが着手している frontier へ後から乗る時は素の start でよい。**`INDEPENDENCE_UNVERIFIED` で落ちたら実装に入らない。** 記録があるのにこの工程が未宣言・失効なので、親を待たない。canonical の cwd で `.team/scripts/independence-refresh.sh {{PLAN_KEY}}` を打ち、remaining A が witness に無ければ自分で足してから再 compile し、もう一度 `todo start` する
|
|
25
25
|
4. 実装し、自ら必要な試験と自己監査を行う。工程を次に進めてよい水準まで自分の責任で完成させる。着手後に先行工程由来の不具合が判明しても、先行工程をreopenせず、前担当者へ戻さず、修正工程も追加しない。現在の工程を成立させる修正として自ら直し、最終試験結果へ含める。誰かに用事がある時はその相手へDMし、誰に聞けばよいか分からない時は `post(to: "all")` で聞く
|
|
26
26
|
5. 証跡ファイル `evidence/{{PLAN_KEY}}/<task_id>.md` に、最終的な試験内容と試験結果を含めて「何を作り、どう確認したか」を書き、変更ファイルと証跡だけをcommitする
|
|
27
27
|
6. その証跡と同じ最終試験内容・結果を監査担当へ渡す。作業者自身は `.team/scripts/done.sh` や `lattice todo done` を実行しない
|
|
28
28
|
7. 監査担当として結果を受け取った場合は、提出された試験内容と試験結果が元PLAN・工程正本・受入条件に照らして妥当か判断する。試験を再実行せず、個人の思想や計画外の改善を完了条件へ加えない
|
|
29
|
-
8. 妥当なら監査担当が `.team/scripts/done.sh <task_id> --plan <plan_key>`
|
|
29
|
+
8. 妥当なら監査担当が `.team/scripts/done.sh <task_id> --plan <plan_key>` で工程をクローズする。未着地の feat は `done.sh` が canonical main へ merge して push する。親へ着地を依頼しない。`done.sh` は証跡と同じ本文を Lattice の `test_result` へ記録し、remaining の並列記録も更新してから戻る。done を読返してから `post(to: "all", message: "次の工程に着手してください")` とだけ指示し、具体的な次工程は指示しない
|
|
30
30
|
9. 不合格なら、現在モデルでの修正機会は1回だけとする。再び不合格になったら親へmodel変更を依頼し、`Luna → Terra → Sol`の順で一段昇格する。自分で席設定を変えない
|
|
31
31
|
10. 作業者は監査担当によるクローズを確認し、工程正本から次のreadyを選ぶ
|
|
32
32
|
11. **claimできるToDoが無いなら仕事を発明しない(決定68)。** 依頼されていない監査・他席への状況照会・正典の自主レビューを暇つぶしに始めない。縮退の打診が来たらWIP棚卸しを正直に返す
|
|
@@ -38,6 +38,18 @@
|
|
|
38
38
|
完全一致の再送は不要で、変更targetは親が判断する。自分でCLI設定を変えたり、broadcastで依頼したり
|
|
39
39
|
しない。席が再起動された場合は、下の再着任手順でrole・工程正本・roomログから現在地を取り直す。
|
|
40
40
|
|
|
41
|
+
## 工程が変わった時の mission
|
|
42
|
+
|
|
43
|
+
着席時の mission は起動スナップショットである。campaign / plan が次のフェーズへ進んだら、
|
|
44
|
+
自分で更新する。親に依頼しない。席は再起動しない。
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
env -u PEERTABLE_POST_TOKEN "$(npm root -g)/peertable/skill/scripts/set-mission.sh" . "$PEERTABLE_MEMBER" "<新しい使命>"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
room の member 欄(チップ)と `[mission] <名前>: <使命>` の全員宛1行が正本になる。
|
|
51
|
+
起動時の `PEERTABLE_MISSION` env は古いままでよい。
|
|
52
|
+
|
|
41
53
|
## Lattice の実行層へ自分の着手を載せる(pull 型・載っている卓だけ)
|
|
42
54
|
|
|
43
55
|
**仕事は降ってこない。** 上のループどおり自分で選んで `todo start` した後、その着手を実行層へ持ち込むと、隔離 worktree という設備が使え、装置が他の着手済み ToDo との競合を見てくれる。**持ち込みは許可申請ではない**——装置は通す/通さないを決めるのではなく、競合した時だけ「留まれ」と言う。載っていない卓ではこの節は静かに眠る。
|
|
@@ -73,7 +85,7 @@ lattice run intake --run .lattice/runs/<run-id> --task <id>
|
|
|
73
85
|
空のまま**である。作った席が他の席の仕事を決めたことにはならない。
|
|
74
86
|
|
|
75
87
|
1. **`todo start` を先に済ませてから intake する。** 装置は Todo 正本の start event へ束縛するので、start していない task は intake できない。**逆順にしない。**
|
|
76
|
-
2. **`intervention.state` を読む。** `none` なら worktree
|
|
88
|
+
2. **`intervention.state` を読む。** `none` なら worktree を使ってそのまま進める。`hold` の理由が `record_stale` または `artifact_binding_mismatch`(並列記録の失効・再 compile との交差)なら、親へ退席も待ちも出さない。未受理 intake を解放し、canonical で `.team/scripts/independence-refresh.sh {{PLAN_KEY}}` を通してから intake を打ち直す。**他の着手済み task と同じ書き込み資源でぶつかった hold** だけが退席対象である。その場合、新しく起きた席または次工程を探した席で既存WIPが無ければ、競合理由と未着手を room へ一度記録し、未受理 intake を解放して `leave-seat.sh` で直ちに退席する。既存WIPがある席だけは工程正本へhandoffを残してから畳む。**hold を無視して進めず、競合解除 poll のために席を温存しない。**
|
|
77
89
|
3. **worktree を受け取ったら、自分の pid を装置へ渡す(attach)。** これをしないと、装置は競合時に「留まれ」と言うことはできても、実際に止めることができない(協調 hold のまま)。
|
|
78
90
|
```
|
|
79
91
|
lattice run intake attach --run <ref> --task <id> --input <file>
|
|
@@ -106,8 +118,8 @@ lattice run intake --run .lattice/runs/<run-id> --task <id>
|
|
|
106
118
|
**worktree に commit した証跡は canonical から読める**(複製は要らない)。
|
|
107
119
|
装置が worktree の base→HEAD を独立に観測して受理する。
|
|
108
120
|
最後の landing-only 呼び出しは、accept 済み receipt が canonical default branch へ未着地なら
|
|
109
|
-
`未着地 N本`を出す。これは lattice run receipt の軸で、feat SHA
|
|
110
|
-
|
|
121
|
+
`未着地 N本`を出す。これは lattice run receipt の軸で、feat SHA を `done.sh` が origin/main
|
|
122
|
+
へ載せる着地とは別である。receipt 側は警告だけで処理は止めない。
|
|
111
123
|
|
|
112
124
|
**成果の正本はあなたの commit ではなく、Lattice が撮った observed diff である。** 受理されるのはその観測であって、commit そのものではない。
|
|
113
125
|
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
|
|
21
21
|
- 着卓(member 登録)と席数制御(決定68の運用側: ready+active実装ToDo数に合わせて起こす/畳む)
|
|
22
22
|
- 作業者から監査担当への最終試験結果提出と、監査担当による工程クローズが正本へ記録されたことの観測
|
|
23
|
-
-
|
|
24
|
-
-
|
|
23
|
+
- 着地と independence compile は席の仕事である。親は代行しない
|
|
24
|
+
- mission の更新は席の仕事である。親は代行しない
|
|
25
25
|
- 承認 gate・オーナーとの接点、裁定依頼の運搬(自分で判断せずオーナー宛の議題として運ぶ)
|
|
26
26
|
- model / effort 変更依頼への対応(本人の自然文を親が判断し、確定したtargetだけを
|
|
27
27
|
`change-seat.sh`へ渡す。定型文への言い直しや完全一致の再送は求めない)
|