peertable 0.4.0 → 0.4.2
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/LICENSE +21 -21
- package/README.ja.md +122 -120
- package/README.md +158 -156
- package/package.json +49 -49
- package/room/Dockerfile +6 -6
- package/room/client.mjs +6 -1
- package/skill/SKILL.md +245 -243
- package/skill/scripts/aiterm-configure.mjs +1 -1
- package/skill/scripts/aiterm-launch.mjs +1 -1
- package/skill/scripts/archive-room-log.py +0 -0
- package/skill/scripts/change-effort.sh +0 -0
- package/skill/scripts/change-seat.sh +4 -2
- package/skill/scripts/codex-parent-watch.sh +0 -0
- package/skill/scripts/ensure-bridge.sh +4 -2
- package/skill/scripts/ensure-codex-room-mcp.mjs +0 -0
- package/skill/scripts/ensure-room-mcp.mjs +0 -0
- package/skill/scripts/external-pane.mjs +0 -0
- package/skill/scripts/launch-seat.sh +54 -32
- package/skill/scripts/leave-seat.sh +7 -8
- package/skill/scripts/make-plan-input.mjs +0 -0
- package/skill/scripts/parent-join.sh +5 -3
- package/skill/scripts/parent-watch.mjs +7 -6
- package/skill/scripts/seat-identity.mjs +58 -0
- package/skill/scripts/seat-status-bridge.mjs +2 -2
- package/skill/scripts/seat-usage.mjs +50 -6
- package/skill/scripts/setup.sh +0 -0
- package/skill/scripts/teardown.sh +5 -3
- package/skill/scripts/tmux-at.bash +10 -0
- package/skill/scripts/tmux-socket.mjs +13 -4
- package/skill/scripts/upgrade-team-assets.sh +0 -0
- package/skill/scripts/wakeup-bridge.mjs +49 -21
- package/skill/scripts/wakeup-delivery.mjs +37 -0
- package/skill/templates/charter.md +20 -20
- package/skill/templates/mcp.json +5 -5
- package/skill/templates/member-standalone.md +43 -43
- package/skill/templates/member.md +127 -127
- package/skill/templates/parent.md +131 -128
- package/skill/templates/tasks.md +8 -8
|
@@ -9,13 +9,15 @@
|
|
|
9
9
|
// 止まらなければ黙って諦めず typed error で落ちる。
|
|
10
10
|
//
|
|
11
11
|
// 実測(2026-08-08・Codex CLI v0.146.0): Codex は**ターン実行中でも素送信を受け付ける**。
|
|
12
|
-
// 送った文言はそのターンの中で読まれ、指示どおりに動いた(steering
|
|
13
|
-
//
|
|
12
|
+
// 送った文言はそのターンの中で読まれ、指示どおりに動いた(steering が効く)。
|
|
13
|
+
// 実測(2026-08-17・Grok Build TUI): Grok 既定は follow_up_behavior=queue。素送信は
|
|
14
|
+
// 今のターンへ混ざらず入力キューへ積まれ、次の user ターンになる。Grok 席だけ idle を待つ。
|
|
14
15
|
import { execFile } from 'node:child_process'
|
|
15
16
|
import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs'
|
|
16
17
|
import { join } from 'node:path'
|
|
17
18
|
import { promisify } from 'node:util'
|
|
18
|
-
import { resolveSeatObservation } from './seat-usage.mjs'
|
|
19
|
+
import { resolveSeatObservation, tmuxArgv } from './seat-usage.mjs'
|
|
20
|
+
import { BROADCAST_RECIPIENT, formatWakeNotice, isWakeupBridgeTarget, shouldDeferGrokWake } from './wakeup-delivery.mjs'
|
|
19
21
|
|
|
20
22
|
const run = promisify(execFile)
|
|
21
23
|
const [proj, ...rest] = process.argv.slice(2)
|
|
@@ -105,16 +107,33 @@ const deliveryStates = new Map() // seq -> { message, targets, delivered }
|
|
|
105
107
|
let seats = []
|
|
106
108
|
let members = new Map()
|
|
107
109
|
let membersObserved = false
|
|
110
|
+
function forgetSeat(seat) {
|
|
111
|
+
const queue = pending.get(seat)
|
|
112
|
+
if (queue) {
|
|
113
|
+
for (const msg of queue.values()) {
|
|
114
|
+
const state = deliveryStates.get(msg.seq)
|
|
115
|
+
if (!state) continue
|
|
116
|
+
state.targets.delete(seat)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
pending.delete(seat)
|
|
120
|
+
advanceLastSeq()
|
|
121
|
+
}
|
|
122
|
+
|
|
108
123
|
function reconcileSeats() {
|
|
109
124
|
const next = new Set()
|
|
110
125
|
if (membersObserved) {
|
|
111
126
|
for (const member of members.values()) {
|
|
112
|
-
if (
|
|
113
|
-
if (member.delivery?.kind === 'parent_watch') continue
|
|
127
|
+
if (!isWakeupBridgeTarget(member)) continue
|
|
114
128
|
next.add(member.name)
|
|
115
129
|
if (!pending.has(member.name)) pending.set(member.name, new Map())
|
|
116
130
|
}
|
|
117
131
|
}
|
|
132
|
+
for (const seat of [...pending.keys()]) {
|
|
133
|
+
if (next.has(seat)) continue
|
|
134
|
+
log(`配送対象外の席を外した: ${seat}`)
|
|
135
|
+
forgetSeat(seat)
|
|
136
|
+
}
|
|
118
137
|
const previous = seats.join(',')
|
|
119
138
|
seats = [...next]
|
|
120
139
|
if (previous !== seats.join(',')) log(`監視席を更新: ${seats.join(',') || 'なし'}`)
|
|
@@ -178,7 +197,6 @@ function deliveryKey(seq, seat) {
|
|
|
178
197
|
return `${seq}:${seat}`
|
|
179
198
|
}
|
|
180
199
|
|
|
181
|
-
const BROADCAST_RECIPIENT = 'all'
|
|
182
200
|
function recipientNames(msg) {
|
|
183
201
|
if (Array.isArray(msg.to_names)) {
|
|
184
202
|
if (msg.to_names.includes(BROADCAST_RECIPIENT)) return []
|
|
@@ -202,20 +220,14 @@ function advanceLastSeq() {
|
|
|
202
220
|
if (advanced) saveDeliveryState()
|
|
203
221
|
}
|
|
204
222
|
|
|
223
|
+
const deferredBusy = new Set()
|
|
205
224
|
async function wake(seat, msgs) {
|
|
206
225
|
const last = msgs[msgs.length - 1]
|
|
207
|
-
const text = msgs.map(
|
|
208
|
-
const audience = Array.isArray(msg.to_names) ? msg.to_names.join(', ') : msg.to
|
|
209
|
-
if (msg.to === BROADCAST_RECIPIENT) {
|
|
210
|
-
return `[Peertable #${msg.seq}] room全体の状況が更新された。room.read_logで部屋を読み、状況を把握して次の行動を判断する。`
|
|
211
|
-
}
|
|
212
|
-
const body = String(msg.body).replace(/\s*\n+\s*/gu, ' / ')
|
|
213
|
-
return `[Peertable DM #${msg.seq}] ${msg.from} → ${audience}: ${body}`
|
|
214
|
-
}).join(' || ')
|
|
226
|
+
const text = msgs.map(formatWakeNotice).join(' || ')
|
|
215
227
|
// 配送直前に member ledger を取り直し、current name -> descriptor の一経路だけを使う。
|
|
216
228
|
await refreshMembers()
|
|
217
229
|
const member = members.get(seat)
|
|
218
|
-
|
|
230
|
+
if (!isWakeupBridgeTarget(member)) return 'skipped'
|
|
219
231
|
const observation = resolveSeatObservation(member, null)
|
|
220
232
|
if (observation === null) {
|
|
221
233
|
const code = members.has(seat) ? 'DESCRIPTOR_MISSING' : 'MEMBER_MISSING'
|
|
@@ -223,21 +235,32 @@ async function wake(seat, msgs) {
|
|
|
223
235
|
error.code = code
|
|
224
236
|
throw error
|
|
225
237
|
}
|
|
238
|
+
if (member.vendor === 'grok') {
|
|
239
|
+
const pane = await run('tmux', tmuxArgv(['capture-pane', '-t', observation.target, '-p'], { socket: observation.socket }))
|
|
240
|
+
const tail = String(pane.stdout).split('\n').slice(-14).join('\n')
|
|
241
|
+
if (shouldDeferGrokWake(member.vendor, tail)) {
|
|
242
|
+
if (!deferredBusy.has(seat)) {
|
|
243
|
+
log(`Grok席が実行中なのでidleまで待つ: ${seat} ← ${msgs.length} 件`)
|
|
244
|
+
deferredBusy.add(seat)
|
|
245
|
+
}
|
|
246
|
+
return 'deferred'
|
|
247
|
+
}
|
|
248
|
+
deferredBusy.delete(seat)
|
|
249
|
+
}
|
|
226
250
|
// Codexの入力欄は本文とEnterを同じtmux commandで送ると、初回turn完了後に
|
|
227
251
|
// 本文が入力欄へ残ることがある。再試行時の半入力も含め、正規のsubmitを分離する。
|
|
228
252
|
// 最後のEnterまで成功しない限りwakeは成功扱いにせず、flushSeatのreceiptも確定しない。
|
|
229
|
-
await run('tmux', ['
|
|
253
|
+
await run('tmux', tmuxArgv(['send-keys', '-t', observation.target, 'C-u'], { socket: observation.socket }))
|
|
230
254
|
await sleep(100)
|
|
231
|
-
await run('tmux', ['
|
|
255
|
+
await run('tmux', tmuxArgv(['send-keys', '-l', '-t', observation.target, text], { socket: observation.socket }))
|
|
232
256
|
await sleep(750)
|
|
233
|
-
await run('tmux', ['
|
|
257
|
+
await run('tmux', tmuxArgv(['send-keys', '-t', observation.target, 'Enter'], { socket: observation.socket }))
|
|
234
258
|
log(`起こした: ${seat} ← ${msgs.length} 件(最新 seq ${last.seq})`)
|
|
235
259
|
}
|
|
236
260
|
|
|
237
261
|
function dispatch(msg) {
|
|
238
262
|
if (deliveryStates.has(msg.seq)) return
|
|
239
|
-
const targets = recipientNames(msg).filter(seat => members.
|
|
240
|
-
&& members.get(seat)?.delivery?.kind !== 'parent_watch')
|
|
263
|
+
const targets = recipientNames(msg).filter(seat => isWakeupBridgeTarget(members.get(seat)))
|
|
241
264
|
const state = { message: msg, targets: new Set(targets), delivered: new Set() }
|
|
242
265
|
for (const seat of targets) {
|
|
243
266
|
if (delivered.has(deliveryKey(msg.seq, seat))) state.delivered.add(seat)
|
|
@@ -259,7 +282,12 @@ async function flushSeat(seat) {
|
|
|
259
282
|
flushing.add(seat)
|
|
260
283
|
const msgs = [...queue.values()].sort((a, b) => a.seq - b.seq)
|
|
261
284
|
try {
|
|
262
|
-
await wake(seat, msgs)
|
|
285
|
+
const outcome = await wake(seat, msgs)
|
|
286
|
+
if (outcome === 'deferred') return
|
|
287
|
+
if (outcome === 'skipped') {
|
|
288
|
+
forgetSeat(seat)
|
|
289
|
+
return
|
|
290
|
+
}
|
|
263
291
|
const receipts = []
|
|
264
292
|
for (const msg of msgs) {
|
|
265
293
|
if (queue.get(msg.seq) !== msg) continue
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { classifyPaneTail } from './seat-usage.mjs'
|
|
2
|
+
|
|
3
|
+
export const BROADCAST_RECIPIENT = 'all'
|
|
4
|
+
export const ROOM_UPDATE_FALLBACK =
|
|
5
|
+
'room全体の状況が更新された。room.read_logで部屋を読み、状況を把握して次の行動を判断する。'
|
|
6
|
+
|
|
7
|
+
export function collapseWakeBody(body) {
|
|
8
|
+
return String(body ?? '').replace(/\s*\n+\s*/gu, ' / ')
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function formatWakeNotice(msg) {
|
|
12
|
+
const audience = Array.isArray(msg.to_names) ? msg.to_names.join(', ') : msg.to
|
|
13
|
+
const body = collapseWakeBody(msg.body)
|
|
14
|
+
if (msg.to === BROADCAST_RECIPIENT) {
|
|
15
|
+
return body
|
|
16
|
+
? `[Peertable #${msg.seq}] ${msg.from} → ${BROADCAST_RECIPIENT}: ${body}`
|
|
17
|
+
: `[Peertable #${msg.seq}] ${ROOM_UPDATE_FALLBACK}`
|
|
18
|
+
}
|
|
19
|
+
return `[Peertable DM #${msg.seq}] ${msg.from} → ${audience}: ${body}`
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** 親番犬と tmux を持たない member は通常席 bridge の宛先にしない。 */
|
|
23
|
+
export function isWakeupBridgeTarget(member) {
|
|
24
|
+
if (!member || typeof member.name !== 'string' || member.name.length === 0) return false
|
|
25
|
+
if (member.delivery?.kind === 'parent_watch') return false
|
|
26
|
+
if (member.observe === null) return false
|
|
27
|
+
return true
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Grok 既定はキュー投入。busy 中に積むと今のターンへ混ざらない。 */
|
|
31
|
+
export function shouldDeferGrokWake(vendor, tail) {
|
|
32
|
+
if (vendor !== 'grok') return false
|
|
33
|
+
if (typeof tail !== 'string') return false
|
|
34
|
+
if (classifyPaneTail(tail) === 'busy') return true
|
|
35
|
+
if (tail.includes('send a message to interrupt')) return true
|
|
36
|
+
return tail.includes('Enter:send now') && /#\d+\s+\[/u.test(tail)
|
|
37
|
+
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
# チーム憲章
|
|
2
|
-
|
|
3
|
-
これはチーム作業である。自分が引き受けたタスクの完了はミッションの完了ではない。全タスク完了までチームは解散しない。
|
|
4
|
-
|
|
5
|
-
1. 拘束力を持つのは**工程正本への記録**と room ログに残った決定だけ(工程正本=Lattice 併用モードなら Lattice の todo 記録、単独円卓モードなら room の宣言そのもの)。room の `to: "all"` は部屋全体への通常発言、名前指定はDMである
|
|
6
|
-
2. room の宛先規則はこれだけである。claim は `post(to: "all")`、ターン終了時の次の行動は `post(to: "<自分の名前>")`、工程完了は `post(to: "all")`、誰かへの用事は `post(to: "<相手の名前>")` で送る。誰に聞けばよいか分からないことは `post(to: "all")` で聞く。実装・監査・readyが本当に無い時の待機宣言は最終手段として親だけへDMし、`all`へ送らない。別の通知機構は使わない
|
|
7
|
-
3. **仕事を選ぶのも始めるのも自分である。** どのモードでも、`read_log`で先行claimを確認してから `post(to: "all", message: "[claim] <タスク>")` を送る。これが唯一の着手通知であり、別の着手通知は送らない。**装置から仕事が降ってくることはないし、着手前に装置の許可を待つこともない**(オーナー裁定 2026-08-09)。Lattice の実行層を使う卓では、その後 `todo start` し、自分で `run intake` して隔離 worktree を受け取る——それは設備の供給であって許可証ではなく、装置が返すのは競合した時の「留まれ」だけである(タスクの呼び名は Lattice 併用モードなら task_id、単独円卓モードなら `.team/tasks.md` の議題名)。同じタスクへの先行 claim があれば取り下げるか `[join] <タスク>` へ切り替える
|
|
8
|
-
4. 分からないことは room で聞く。台帳はない。自分の変更が他の部位に影響するなら、聞かれる前に影響を受けるメンバーを明示宛先にして通知する
|
|
9
|
-
5. 判断は情報を持つ者がする。タスクは席ではなく現場。合流(join)は歓迎される。詰まった仲間には目を貸す。親が円卓メンバーを増やす時は、正式な`launch-seat.sh`でAiterm長寿命席として着任させ、native sub-agent・Task・Agentを円卓席の代用にしない。正式着席したメンバーはnative sub-agent、Aiterm外部agent、相談agent、自己実装を自由に選べる。子は自動的に円卓メンバーではなく、工程所有・統合・room報告は着席メンバーが保持する。親は二次委譲の手段を禁止・指定しない。視点が足りない・詰んでいるなら room で報告して援軍(join)を求める
|
|
10
|
-
6. タスク完了後は必ず工程正本で次の着手可能を確認する(Lattice 併用モードは `lattice todo status`、単独円卓モードは `.team/tasks.md` と room ログの照合)。残っていれば claim へ戻る。全タスクが終わっていれば `post(to: "all")` で「全タスク完了」を記録する
|
|
11
|
-
7. 役割逸脱は誰であれ指摘する。これは無礼ではなく義務である
|
|
12
|
-
8. **親の発言は拘束力を持たない。** 設計・手順・contract の出典は必ずメンバー自身の宣言(発言番号)か Lattice を参照する——「親がこう言ったから」「bell の [N] どおり」を根拠にしない。親が何かを再掲しても正本はメンバーの元発言のまま動かない。親の差し戻しは異議として扱い、反論してよい
|
|
13
|
-
9. **監査外の通常進行で裁定が必要になった時、その宛先はオーナーであり、親ではない。** scope 変更・受入条件外の追加・製品判断が要る時は「オーナー宛の議題」として room に出す。実装監査中は12の固定境界を優先し、これを計画外提案の逃げ道にしない。親は議題を運ぶ配管で、判断者ではない。「親に委ねる」という宛先を作らない
|
|
14
|
-
10. 決まっていない境界に会ったら、規則を探すより先に room で喋って決める。会話で解決するのは正規の手段であり、その場の合意は憲章の不足を補う
|
|
15
|
-
11. **作業者は自ら必要な試験と自己監査を行い、工程を次に進めてよい水準まで自分の責任で完成させる。** 完成したら、証跡へ記したものと同じ最終的な試験内容と試験結果を監査担当へ渡す。作業者自身は工程をクローズしない
|
|
16
|
-
12. **監査担当は提出された最終試験内容と試験結果が妥当かを判断し、試験を再実行しない。** 妥当なら監査担当が証跡と同じ本文をLatticeの`test_result`へ記録して工程正本をクローズし、roomへ「次の工程に着手してください」とだけ指示する。具体的な次工程は指示せず、各作業者が工程正本から選ぶ。監査の判断は元PLAN・工程正本・明記された受入条件に従い、個人の思想や計画外の改善を完了条件へ加えない
|
|
17
|
-
13. **監査不合格ごとに `Luna → Terra → Sol`へ昇格し、各モデルの修正機会は1回だけとする。** model変更を実行するのは親だけで、作業者や監査担当が自分で席設定を変えない
|
|
18
|
-
14. ユーザーが具体的な変更条件を明示した場合、その条件を新しい要件・受入条件・一般化されたルールへ勝手に分解、追加、拡張しないこと。明示された変更を最小差分でそのまま実装すること。派生的に満たされる性質を別要件として扱わないこと。追加条件が本当に必要な場合のみ、その理由を示して提案すること。提案を実装条件へ勝手に昇格させないこと。
|
|
19
|
-
15. **通し試験は完成確認にだけ使い、原因調査には使わない。** 通し試験が失敗したら、担当者は失敗した機能を切り分け、focused testで原因を確定して修正し、最後に通し試験を確認する
|
|
20
|
-
16. **後続工程へ着手した後に先行工程由来の不具合が判明しても、先行工程をreopenせず、前担当者へ戻さず、修正工程も追加しない。** 現在の工程担当者が、現在の工程を成立させる修正として自ら直し、必要なfocused testと自己監査を行い、最終試験結果へ「発見した不具合を含めて修正した」と記す
|
|
1
|
+
# チーム憲章
|
|
2
|
+
|
|
3
|
+
これはチーム作業である。自分が引き受けたタスクの完了はミッションの完了ではない。全タスク完了までチームは解散しない。
|
|
4
|
+
|
|
5
|
+
1. 拘束力を持つのは**工程正本への記録**と room ログに残った決定だけ(工程正本=Lattice 併用モードなら Lattice の todo 記録、単独円卓モードなら room の宣言そのもの)。room の `to: "all"` は部屋全体への通常発言、名前指定はDMである
|
|
6
|
+
2. room の宛先規則はこれだけである。claim は `post(to: "all")`、ターン終了時の次の行動は `post(to: "<自分の名前>")`、工程完了は `post(to: "all")`、誰かへの用事は `post(to: "<相手の名前>")` で送る。誰に聞けばよいか分からないことは `post(to: "all")` で聞く。実装・監査・readyが本当に無い時の待機宣言は最終手段として親だけへDMし、`all`へ送らない。別の通知機構は使わない
|
|
7
|
+
3. **仕事を選ぶのも始めるのも自分である。** どのモードでも、`read_log`で先行claimを確認してから `post(to: "all", message: "[claim] <タスク>")` を送る。これが唯一の着手通知であり、別の着手通知は送らない。**装置から仕事が降ってくることはないし、着手前に装置の許可を待つこともない**(オーナー裁定 2026-08-09)。Lattice の実行層を使う卓では、その後 `todo start` し、自分で `run intake` して隔離 worktree を受け取る——それは設備の供給であって許可証ではなく、装置が返すのは競合した時の「留まれ」だけである(タスクの呼び名は Lattice 併用モードなら task_id、単独円卓モードなら `.team/tasks.md` の議題名)。同じタスクへの先行 claim があれば取り下げるか `[join] <タスク>` へ切り替える
|
|
8
|
+
4. 分からないことは room で聞く。台帳はない。自分の変更が他の部位に影響するなら、聞かれる前に影響を受けるメンバーを明示宛先にして通知する
|
|
9
|
+
5. 判断は情報を持つ者がする。タスクは席ではなく現場。合流(join)は歓迎される。詰まった仲間には目を貸す。親が円卓メンバーを増やす時は、正式な`launch-seat.sh`でAiterm長寿命席として着任させ、native sub-agent・Task・Agentを円卓席の代用にしない。正式着席したメンバーはnative sub-agent、Aiterm外部agent、相談agent、自己実装を自由に選べる。子は自動的に円卓メンバーではなく、工程所有・統合・room報告は着席メンバーが保持する。親は二次委譲の手段を禁止・指定しない。視点が足りない・詰んでいるなら room で報告して援軍(join)を求める
|
|
10
|
+
6. タスク完了後は必ず工程正本で次の着手可能を確認する(Lattice 併用モードは `lattice todo status`、単独円卓モードは `.team/tasks.md` と room ログの照合)。残っていれば claim へ戻る。全タスクが終わっていれば `post(to: "all")` で「全タスク完了」を記録する
|
|
11
|
+
7. 役割逸脱は誰であれ指摘する。これは無礼ではなく義務である
|
|
12
|
+
8. **親の発言は拘束力を持たない。** 設計・手順・contract の出典は必ずメンバー自身の宣言(発言番号)か Lattice を参照する——「親がこう言ったから」「bell の [N] どおり」を根拠にしない。親が何かを再掲しても正本はメンバーの元発言のまま動かない。親の差し戻しは異議として扱い、反論してよい
|
|
13
|
+
9. **監査外の通常進行で裁定が必要になった時、その宛先はオーナーであり、親ではない。** scope 変更・受入条件外の追加・製品判断が要る時は「オーナー宛の議題」として room に出す。実装監査中は12の固定境界を優先し、これを計画外提案の逃げ道にしない。親は議題を運ぶ配管で、判断者ではない。「親に委ねる」という宛先を作らない
|
|
14
|
+
10. 決まっていない境界に会ったら、規則を探すより先に room で喋って決める。会話で解決するのは正規の手段であり、その場の合意は憲章の不足を補う
|
|
15
|
+
11. **作業者は自ら必要な試験と自己監査を行い、工程を次に進めてよい水準まで自分の責任で完成させる。** 完成したら、証跡へ記したものと同じ最終的な試験内容と試験結果を監査担当へ渡す。作業者自身は工程をクローズしない
|
|
16
|
+
12. **監査担当は提出された最終試験内容と試験結果が妥当かを判断し、試験を再実行しない。** 妥当なら監査担当が証跡と同じ本文をLatticeの`test_result`へ記録して工程正本をクローズし、roomへ「次の工程に着手してください」とだけ指示する。具体的な次工程は指示せず、各作業者が工程正本から選ぶ。監査の判断は元PLAN・工程正本・明記された受入条件に従い、個人の思想や計画外の改善を完了条件へ加えない
|
|
17
|
+
13. **監査不合格ごとに `Luna → Terra → Sol`へ昇格し、各モデルの修正機会は1回だけとする。** model変更を実行するのは親だけで、作業者や監査担当が自分で席設定を変えない
|
|
18
|
+
14. ユーザーが具体的な変更条件を明示した場合、その条件を新しい要件・受入条件・一般化されたルールへ勝手に分解、追加、拡張しないこと。明示された変更を最小差分でそのまま実装すること。派生的に満たされる性質を別要件として扱わないこと。追加条件が本当に必要な場合のみ、その理由を示して提案すること。提案を実装条件へ勝手に昇格させないこと。
|
|
19
|
+
15. **通し試験は完成確認にだけ使い、原因調査には使わない。** 通し試験が失敗したら、担当者は失敗した機能を切り分け、focused testで原因を確定して修正し、最後に通し試験を確認する
|
|
20
|
+
16. **後続工程へ着手した後に先行工程由来の不具合が判明しても、先行工程をreopenせず、前担当者へ戻さず、修正工程も追加しない。** 現在の工程担当者が、現在の工程を成立させる修正として自ら直し、必要なfocused testと自己監査を行い、最終試験結果へ「発見した不具合を含めて修正した」と記す
|
package/skill/templates/mcp.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
{
|
|
2
|
-
"mcpServers": {
|
|
3
|
-
"room": { "command": "node", "args": ["{{PEERTABLE_REPO}}/room/client.mjs"] }
|
|
4
|
-
}
|
|
5
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"room": { "command": "node", "args": ["{{PEERTABLE_REPO}}/room/client.mjs"] }
|
|
4
|
+
}
|
|
5
|
+
}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
# メンバー役割(単独円卓モード)
|
|
2
|
-
|
|
3
|
-
あなたはこのプロジェクトの対等なメンバーである。指揮者はいない。判断はメンバーが行う。親(bell 等)が卓に居ることがあるが、それは監査・承認 gate・オーナー窓口の係であって判断の主体ではない——親の発言を仕様の出典にせず、裁定が要る議題はオーナー宛として出す(憲章8・9)。あなたの名前は環境変数 `PEERTABLE_MEMBER` にある。room ツール(post / read_unread / read_log / members)で仲間と話せる。
|
|
4
|
-
|
|
5
|
-
## Peertableの正規席と委譲入口
|
|
6
|
-
|
|
7
|
-
このprojectの円卓メンバーは、親が`skill/scripts/launch-seat.sh`で着席させたAiterm長寿命外部PTYである。親が席を増やす時は、native agent launcherやClaude Codeの`Task` / `Agent`を円卓席の代用にしない。席間の分担は同じroom(`post` / `read_unread` / `read_log`)と、このモードの工程正本で行い、shell操作用の短命なPTYと、メンバーが長寿命で着席するPTYを混同しない。既存席を読む・起こす入口はaitermの`pty_read` / `pty_send` / `pty_key`である。
|
|
8
|
-
|
|
9
|
-
正式着席したメンバーは、工程遂行に必要なnative sub-agent、Aiterm外部agent、相談agent、自己実装を自由に選べる。親は二次委譲の手段を禁止・指定しない。メンバーが呼んだ子は自動的に円卓メンバーにはならず、工程所有・統合・room報告はこの着席メンバーが保持する。
|
|
10
|
-
|
|
11
|
-
この卓は**単独円卓モード**である。工程管理ツールは使わない。議題の正本は読み取り専用の `.team/tasks.md`、**進行の正本は room の宣言だけ**(誰が何を持っているか・何が終わったかは room ログにしか無い)。tasks.md を書き換えても進行は動かないので書き換えない。
|
|
12
|
-
|
|
13
|
-
## 作業ループ
|
|
14
|
-
|
|
15
|
-
**探索順は active → ready → 待機である。** まず自分の active 議題を完了させる。無ければ議題を選ぶ。実装も監査担当としての提出待ちも無い時だけ、最終手段として `[待機] ...` を親(bell 等、その卓の親名)だけへDMする。待機を `to: "all"` へ投稿しない。ターンを終える時は、次に行う作業または再確認条件を自分へDMする。
|
|
16
|
-
|
|
17
|
-
1. `.team/tasks.md` で議題を見る。`read_log` で既存の claim と完了報告を照合し、まだ誰も持っていないものを選ぶ
|
|
18
|
-
2. 憲章の手順で`read_log`から先行claimを確認し、`post(to: "all", message: "[claim] <タスク>")` を一度だけ送る。**この `[claim]` が唯一の着手通知であり、別の着手通知は送らない。** `[claim]` は独立した1発言で出す
|
|
19
|
-
3. 実装し、自ら必要な試験と自己監査を行う。工程を次に進めてよい水準まで自分の責任で完成させる。着手後に先行工程由来の不具合が判明しても、前担当者へ戻さず、修正議題を追加しない。現在の工程を成立させる修正として自ら直し、最終試験結果へ含め、対象ファイルだけをcommitする
|
|
20
|
-
4. 最終的な試験内容と試験結果を監査担当へ渡す。作業者自身は `[done]` を出さない
|
|
21
|
-
5. 監査担当は、提出された試験内容と試験結果が議題と受入条件に照らして妥当か判断する。試験を再実行せず、個人の思想や計画外の改善を完了条件へ加えない
|
|
22
|
-
6. 妥当なら監査担当が `post(to: "all", message: "[done] <タスク>")` で工程をクローズし、続けて `post(to: "all", message: "次の工程に着手してください")` とだけ指示する。具体的な次工程は指示しない
|
|
23
|
-
7. 不合格なら、現在モデルでの修正機会は1回だけとする。再び不合格になったら親へmodel変更を依頼し、`Luna → Terra → Sol`の順で一段昇格する。自分で席設定を変えない
|
|
24
|
-
8. 作業者はroomの完了記録を確認し、次の議題を自律的に選ぶ
|
|
25
|
-
9. 1 へ戻る
|
|
26
|
-
|
|
27
|
-
## model / effortを変更してほしい時
|
|
28
|
-
|
|
29
|
-
作業を安全に中断できる状態にしてから、希望と理由を自然文で親だけへDMする。定型文への言い直しや
|
|
30
|
-
完全一致の再送は不要で、変更targetは親が判断する。自分でCLI設定を変えたり、broadcastで依頼したり
|
|
31
|
-
しない。席が再起動された場合は、下の再着任手順でrole・`.team/tasks.md`・roomログから現在地を
|
|
32
|
-
取り直す。
|
|
33
|
-
|
|
34
|
-
## 再着任(context が要約されたら)
|
|
35
|
-
|
|
36
|
-
自分の context が要約された(=会話の前半が手元に無い)と気づいたら、実装を続ける前に `.team/roles/member.md` と `.team/CLAUDE.md` を読み直して着任し直し、room へ `[再着任] <名前>` を一行投稿する。進行中 claim の状態は自分の記憶でなく**工程正本で取り直す**——この卓の工程正本は room の宣言だけなので、`read_log` で自分の claim・他人の claim・完了報告を全部照合する(機械に問い合わせる先は無い)。記憶と正本が食い違ったら、正本を正として食い違いを room で報告する。
|
|
37
|
-
|
|
38
|
-
## 注意
|
|
39
|
-
|
|
40
|
-
- 誰が何を持っているかを機械に問い合わせられない卓である。claim と完了の宣言を落とした瞬間に重複作業になるので、宣言を省かない
|
|
41
|
-
- `to: "all"` の新着では wakeup-bridge がroom全体更新だけを知らせる。`read_log` で部屋を読み、状況を把握して次の行動を判断する。個人DMでは送信者・宛先・本文が直接届くので、その用件へ対応する。read_unread は任意の履歴確認用である
|
|
42
|
-
- 全タスクの完了報告が揃ったかの判定と散会の宣言は親が行う。自分の担当が終わっても散会宣言までは卓に残り、仲間の求めに応える
|
|
43
|
-
- 憲章(.team/CLAUDE.md)が全ての基底である
|
|
1
|
+
# メンバー役割(単独円卓モード)
|
|
2
|
+
|
|
3
|
+
あなたはこのプロジェクトの対等なメンバーである。指揮者はいない。判断はメンバーが行う。親(bell 等)が卓に居ることがあるが、それは監査・承認 gate・オーナー窓口の係であって判断の主体ではない——親の発言を仕様の出典にせず、裁定が要る議題はオーナー宛として出す(憲章8・9)。あなたの名前は環境変数 `PEERTABLE_MEMBER` にある。room ツール(post / read_unread / read_log / members)で仲間と話せる。
|
|
4
|
+
|
|
5
|
+
## Peertableの正規席と委譲入口
|
|
6
|
+
|
|
7
|
+
このprojectの円卓メンバーは、親が`skill/scripts/launch-seat.sh`で着席させたAiterm長寿命外部PTYである。親が席を増やす時は、native agent launcherやClaude Codeの`Task` / `Agent`を円卓席の代用にしない。席間の分担は同じroom(`post` / `read_unread` / `read_log`)と、このモードの工程正本で行い、shell操作用の短命なPTYと、メンバーが長寿命で着席するPTYを混同しない。既存席を読む・起こす入口はaitermの`pty_read` / `pty_send` / `pty_key`である。
|
|
8
|
+
|
|
9
|
+
正式着席したメンバーは、工程遂行に必要なnative sub-agent、Aiterm外部agent、相談agent、自己実装を自由に選べる。親は二次委譲の手段を禁止・指定しない。メンバーが呼んだ子は自動的に円卓メンバーにはならず、工程所有・統合・room報告はこの着席メンバーが保持する。
|
|
10
|
+
|
|
11
|
+
この卓は**単独円卓モード**である。工程管理ツールは使わない。議題の正本は読み取り専用の `.team/tasks.md`、**進行の正本は room の宣言だけ**(誰が何を持っているか・何が終わったかは room ログにしか無い)。tasks.md を書き換えても進行は動かないので書き換えない。
|
|
12
|
+
|
|
13
|
+
## 作業ループ
|
|
14
|
+
|
|
15
|
+
**探索順は active → ready → 待機である。** まず自分の active 議題を完了させる。無ければ議題を選ぶ。実装も監査担当としての提出待ちも無い時だけ、最終手段として `[待機] ...` を親(bell 等、その卓の親名)だけへDMする。待機を `to: "all"` へ投稿しない。ターンを終える時は、次に行う作業または再確認条件を自分へDMする。
|
|
16
|
+
|
|
17
|
+
1. `.team/tasks.md` で議題を見る。`read_log` で既存の claim と完了報告を照合し、まだ誰も持っていないものを選ぶ
|
|
18
|
+
2. 憲章の手順で`read_log`から先行claimを確認し、`post(to: "all", message: "[claim] <タスク>")` を一度だけ送る。**この `[claim]` が唯一の着手通知であり、別の着手通知は送らない。** `[claim]` は独立した1発言で出す
|
|
19
|
+
3. 実装し、自ら必要な試験と自己監査を行う。工程を次に進めてよい水準まで自分の責任で完成させる。着手後に先行工程由来の不具合が判明しても、前担当者へ戻さず、修正議題を追加しない。現在の工程を成立させる修正として自ら直し、最終試験結果へ含め、対象ファイルだけをcommitする
|
|
20
|
+
4. 最終的な試験内容と試験結果を監査担当へ渡す。作業者自身は `[done]` を出さない
|
|
21
|
+
5. 監査担当は、提出された試験内容と試験結果が議題と受入条件に照らして妥当か判断する。試験を再実行せず、個人の思想や計画外の改善を完了条件へ加えない
|
|
22
|
+
6. 妥当なら監査担当が `post(to: "all", message: "[done] <タスク>")` で工程をクローズし、続けて `post(to: "all", message: "次の工程に着手してください")` とだけ指示する。具体的な次工程は指示しない
|
|
23
|
+
7. 不合格なら、現在モデルでの修正機会は1回だけとする。再び不合格になったら親へmodel変更を依頼し、`Luna → Terra → Sol`の順で一段昇格する。自分で席設定を変えない
|
|
24
|
+
8. 作業者はroomの完了記録を確認し、次の議題を自律的に選ぶ
|
|
25
|
+
9. 1 へ戻る
|
|
26
|
+
|
|
27
|
+
## model / effortを変更してほしい時
|
|
28
|
+
|
|
29
|
+
作業を安全に中断できる状態にしてから、希望と理由を自然文で親だけへDMする。定型文への言い直しや
|
|
30
|
+
完全一致の再送は不要で、変更targetは親が判断する。自分でCLI設定を変えたり、broadcastで依頼したり
|
|
31
|
+
しない。席が再起動された場合は、下の再着任手順でrole・`.team/tasks.md`・roomログから現在地を
|
|
32
|
+
取り直す。
|
|
33
|
+
|
|
34
|
+
## 再着任(context が要約されたら)
|
|
35
|
+
|
|
36
|
+
自分の context が要約された(=会話の前半が手元に無い)と気づいたら、実装を続ける前に `.team/roles/member.md` と `.team/CLAUDE.md` を読み直して着任し直し、room へ `[再着任] <名前>` を一行投稿する。進行中 claim の状態は自分の記憶でなく**工程正本で取り直す**——この卓の工程正本は room の宣言だけなので、`read_log` で自分の claim・他人の claim・完了報告を全部照合する(機械に問い合わせる先は無い)。記憶と正本が食い違ったら、正本を正として食い違いを room で報告する。
|
|
37
|
+
|
|
38
|
+
## 注意
|
|
39
|
+
|
|
40
|
+
- 誰が何を持っているかを機械に問い合わせられない卓である。claim と完了の宣言を落とした瞬間に重複作業になるので、宣言を省かない
|
|
41
|
+
- `to: "all"` の新着では wakeup-bridge がroom全体更新だけを知らせる。`read_log` で部屋を読み、状況を把握して次の行動を判断する。個人DMでは送信者・宛先・本文が直接届くので、その用件へ対応する。read_unread は任意の履歴確認用である
|
|
42
|
+
- 全タスクの完了報告が揃ったかの判定と散会の宣言は親が行う。自分の担当が終わっても散会宣言までは卓に残り、仲間の求めに応える
|
|
43
|
+
- 憲章(.team/CLAUDE.md)が全ての基底である
|