Skip to content

pm-dispatch(batch): a slot is a RUNNING subagent or card thread — waiting PRs occupy none; the round report counts running and un-landed separately; a soft ceiling of 5 accepted Tier H PRs awaiting a human - #27292

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-27117-batch-slot-definition
Oct 28, 2026

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #27117
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:把 pm-dispatch 的并发槽改成可数定义 —— 一槽 = 一个正在运行的子代理或卡线程,报告落地即释放;等人批、在合并队列、等 CI、等裁决的 PR 一律不占槽。轮报固定一行「在跑 N / batch · 待落地 PR M」。新增一条软顶:本席已验收、等人批的 Tier H PR 逾 5 就停派新的 Tier H 卡(S 级与非受管照常),轮报列积压,两周后复测。
  • 为什么改:席位把「在飞」读成在飞的卡数,四个 PR 只是在等人就停止派发;旧文本留了这个读法。本 PR 把「在飞」从 batch 行拿掉,给出四个不占槽的等待态,并让两个数字并排出现在每轮报告里,混淆一眼可见。
  • 风险与回滚:纯协议文本,四个文件行数不变(319 / 188 / 245 / 96),无脚本、无门禁、无标签;风险是席位把软顶当硬门或把两数写反;回滚 = revert 本 PR 一个 commit。
  • 先看:.claude/skills/pm-dispatch/SKILL.md L60(batch 行,324 B,表行 pin 341);references/execution-duties.md L20–21(指向唯一定义 + 新软顶行,付账删掉的是旧 L12 sub-issue 候选行);references/seat-lifecycle.md L70(两数行,付账删掉的是旧 L15 坐席默认行)。
  • 两分钟验证:pnpm check:pm-skill-ratchet —— 四个文件各印一行 headroom 0,SKILL.md 最宽表行仍印 341;grep -c 在飞 .claude/skills/pm-dispatch/SKILL.md 由 8 变 7(少的那一行就是 batch 行)。
  • 需要你做的:无,席位落地(Tier S:达档契约复核 PASS 后由席位入队)。

What changes

Four protocol files, every edit in place; no file gains or loses a line, no prose line exceeds 120 bytes, no re-wrap used as currency. Bytes are wc -c without the newline. Base 0d45c0e7, head 90502cd4.

File · line Before (B) After (B) What
SKILL.md L60, the batch row 202 324 (table-row pin 341; widest row unchanged at 341) A countable definition: one slot = one subagent (Agent, create_session) or card thread running now; the report landing releases it; the four waiting states (等人批 · 在合并队列 · 等 CI · 等裁决) occupy none; dev、复核、普查皆计,⛔ 只读不豁免 stays; the word 「在飞」 leaves the row; p0 is pointed at the priority:p0 row (p0 见 priority:p0 行), not restated.
references/dispatch-runbook.md L137 80 120 「卡线程交回即释放槽位,席位当即告知 coordinator;审核期开着不占槽,REWORK 补丁轮再占一槽。」 — the 「或其 PR 合入」 alternative is gone: hand-back releases the slot; the thread stays open through review occupying none; a REWORK patch round occupies one again.
references/execution-duties.md L21 → L20 120 118 「batch 等待不填槽,四态见 SKILL.md 该行;同批独立按文件面不相交判,⛔ 不按包或 check 名。」 — waiting points at the one definition; the 「封顶全部子代理」 half now lives in the batch row (dev、复核、普查皆计); 「不按包、不按 check 名」 is spelled 「不按包或 check 名」 to fit.
references/execution-duties.md L21 (new) — 120 「软顶:本席已验收等人批的 Tier H PR 逾 5 ⇒ 停派 Tier H,S/非受管照常,轮报列积压;两周复测。」 — the maintainer's item 4; a SOFT rule: no gate, no script, no label; its only reader is the round-report line below.
references/execution-duties.md L12 (deleted, pays the line above) 86 — 「已排队父单的 open sub-issue 自动是候选,pm:epic 父单的子树除外。」 — home: the same file L11 (sub-issue inherits the parent's first touch) and L41–42 (a derived sub-issue is dispatched directly, bypassing triage); .claude/agents/os-dev.md 基本规则 3 「归挂不散落 … sub-issue(自动进派发池)」; the epic exclusion lives in seat-lifecycle.md 〈Epic 子树车道〉 (label:pm:epic 即父子保留全集,域座位不取;其它 PM 候选获取跳过整棵子树).
references/seat-lifecycle.md L70 (new) — 111 「报告恒带一行「在跑 N / batch · 待落地 PR M」:N 只计运行中的槽,M 计四态等待的 PR。」 — placed right after the existing report-content line (old L70, untouched).
references/seat-lifecycle.md L15 (deleted, pays the line above) 120 — 「坐席从 batch 默认 3 起步;前任口径(串行、N、「不开新卡」)维护者对本会话重述才生效。」 — home: the batch row's default column (默认 3) and the same file's 收班 line (now L40) 「派发口径失效,简报 ⛔ 不列作继承裁决」, which is the same rule from the outgoing side.

The p0 clause is untouched: the priority:p0 row (SKILL.md L119) and execution-duties L24–26 as rewritten by PR #27266 stay byte-identical; the batch row only points at that row.

Tests

No package is touched (.claude/** only), so no build closure, no package test or typecheck, no changeset (skip-changeset declared at pr_create), and no ablation (protocol text, not tested behaviour). The gates are the test; see Verification.

Acceptance notes

  • PM mechanism hypothesis 5 (the expected gate list) is partly falsified: dispatch-gates --commands derives 20 families for this diff, not 7 — check:pm-half-states and check:pm-dispatch-gates are NOT derived (they are CI's), while 15 further families that read .claude/** are (closing-keyword parity, comment-mask corpus, governed queue guard self-test, harness-current self-test, doc-formula-expressions, agent-test-spelling, cross-package-test-inputs, doc-authoring, driver-memory-census, gitlink-declared, nul-bytes, pm-expected-skips, pm-governed-merges, refd-timer-probe, watch-hint-literal). All 20 were run; check:skill-frame-freshness is local-only and was run beyond the derivation.
  • Hypothesis 3 (replace L70's weakest clause instead of adding a line) was measured and does not fit: the fixed two-number line alone is 41 B, and every spelling that keeps 熔断命中项 and the 48h follow-up count lands at 126–142 B against the 120 B cap; so the line is new and paid as described above.
  • Hypothesis 1 held: the row rewrite lands at 324 B under the 341 B pin with the four states as four short nouns.
  • Observation, not filed (agent-read protocol text, outside the three filing classes; carrier: none): execution-duties.md 并行纪律 ③ 「兄弟卡落地后再合一次」 sits beside AGENTS.md §10 「after the PR is open, merge main only on a GitHub-reported conflict, a main-caused CI red or a queue removal」 and runbook L223–225's four-sentence warning that says the same as AGENTS.md; the two readings differ on whether a sibling landing by itself triggers a merge.
  • Observation, not filed (same class, carrier: none): SKILL.md L74 「队列空 + 无在飞 + 无待复核 + 决策箱无新答复 ⇒ 自退」 and L75 「分诊席与车道席常驻」 plus seat-lifecycle 〈停止条件与待命〉 「常设座位队列清空不等于退场」 read against each other; this PR leaves all three alone.
  • origin/main moved twice during this run (0d45c0e → abba2c4 → e9c88f7); the derivation reports none of the moved paths as an input of this card, and none of the new commits touch the four edited files (checked before pr_create).

Verification

All exits captured by redirecting first (cmd > log 2>&1; EXIT=$?), never after a pipe. Head 90502cd4.

Derived gates (20/20 run, 0 NOT-MEASURED, 0 UNRUN) and the five named families
pnpm check:pm-skill-ratchet :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:pm-governed-prose :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:skill-frame-freshness :: exit 0   (local-only; beyond the derivation)
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0
node scripts/pm/check-harness-current.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0   (first run exit 3 PREREQUISITE NOT MET; built formula+lint under the verify lock, re-ran)
pnpm check:agent-test-spelling :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-expected-skips :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:watch-hint-literal :: exit 0

✓ dispatch-gates --ran: 20 derived famil(ies) accounted for — 20 run, 0 NOT-MEASURED (a DERIVED zero — all 20 recorded an exit code and none of them is 3).
Ratchet verdict lines for the four files
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md: widest table row is 341 bytes (pin 341; headroom 0).
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md is 319 lines (ceiling 319; headroom 0).
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 245 lines (ceiling 245; headroom 0).
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/seat-lifecycle.md is 96 lines (ceiling 96; headroom 0).
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/execution-duties.md is 188 lines (ceiling 188; headroom 0).
✓ check-skill-id-lint: 104 file(s) clean (pattern /#[0-9]{3,}/g).
✓ check-governed-prose: 2 instruction surface(s) name all 13 registered governed surfaces that govern objectstack … and claim no others.
✓ check-skill-frame-sync: the one declared copy of the decision frame is internally coherent (.claude/skills/pm-dispatch/SKILL.md …)
✓ check-skill-frame-freshness: the decision frame in this tree is current with origin/main (fetched just now).
Verify lock (the one build, for the refused gate's prerequisite)
os-verify-lock: VERDICT command-exit 0 · held the lock 83s (1m23s) · waited 0s   (pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2; Tasks: 4 successful, 4 total)

Acceptance greps on head: sed -n 60p SKILL.md | grep -c 在飞 → 0 (file-wide line count 8 → 7, the control); sed -n 137p dispatch-runbook.md | grep -c 或 → 0; check:nul-bytes OK over 22042 files; no raw control bytes in the four files.


Generated by Claude Code

…ing PRs occupy none

- SKILL.md `batch:<n>` row: a countable definition — one slot = one subagent
  (`Agent`, `create_session`) or card thread running now; the report landing
  releases it; four waiting states (awaiting a human approval, in the merge
  queue, awaiting CI, awaiting a ruling) occupy none; `⛔ 只读不豁免` stays;
  p0 points at the `priority:p0` row instead of restating it.
- dispatch-runbook 卡线程: hand-back releases the slot at once; the thread
  stays open through review occupying none; a REWORK patch round occupies one.
- execution-duties 候选与批次: `batch` waiting points at the one definition;
  one new line for the soft ceiling (accepted Tier H PRs awaiting a human
  approval > 5 ⇒ no new Tier H dispatch), paid by the sub-issue-candidate
  line whose content lives at L11 + L41–42 and 〈Epic 子树车道〉.
- seat-lifecycle 轮次报告: the report carries one fixed line
  「在跑 N / batch · 待落地 PR M」, paid by the 坐席 `batch` default line
  whose content lives in the SKILL.md `batch` row and 收班 L41.

Every file stays at its ceiling (319 / 188 / 245 / 96); every edited prose
line is ≤120 bytes; the `batch` row is 324 B under the 341 B pin.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 28, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Oct 28, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 90502cd40874f5b14830d16cad3e34f912589ce3
Local-runs: probe — the seat ran, in a detached read-only worktree of the head (no edit, no network): node scripts/pm/check-skill-line-ratchet.mjs → ✓, node scripts/pm/check-skill-id-lint.mjs → ✓ 104 files clean, node scripts/check-skill-frame-sync.mjs → ✓
Scope: .claude/skills/pm-dispatch/SKILL.md (L60, the batch:<n> row), references/dispatch-runbook.md (L137), references/execution-duties.md (L20–21 and the paid L12), references/seat-lifecycle.md (L70 and the paid L15) + card #27117's 「What lands」 1–4 and triage's grade 6462756175 (the seam with #27047)

Read at 2026-10-28T14:49Z by the domain:skills#2 seat on the fetched head (merge-base 0d45c0e7): four files, +5/−5, 10 changed lines ≤ 3000 (check-governed-merges --pr 27292: four .claude paths, Tier S). The claim's tier was the ceiling tier by path mandate (SKILL.md); this review is served at CONTRACT_REVIEW_TIER.

① Derived judgments

  • Item 1, SKILL.md L60 (324 B, under the 341 B table-row pin; the widest row is unchanged): 「运行中槽位的上限:一槽 = 一个正在运行的子代理(Agent、create_session)或卡线程,报告落地即释放;等人批、在合并队列、等 CI、等裁决四态不占槽;dev、复核、普查皆计,⛔ 只读不豁免;p0 见 priority:p0 行」 — countable (one slot = one running thing), the four waiting states named as non-occupying, the kept clauses kept, 「在飞」 gone from the row (file-wide count 8 → 7, the dev's control), the p0 clause pointed at the row PR pm-dispatch(p0): a lane's p0 is dispatched in the same round past every cap and lower-priority work pauses; finder stops the bleed, then escalation, then triage stop-bleed; main red and deterministic queue red are p0 at first touch; full-run card filed p0 #27266 landed rather than restated. The maintainer's 「不占并发」 in one row. Holds.
  • Item 2, dispatch-runbook L137 (120 B): hand-back releases the slot at once; the thread stays open through review occupying none; a REWORK patch round occupies one again — the 「或其 PR 合入」 that made a slot wait for a merge is gone. execution-duties L20 (118 B): 「batch 等待不填槽,四态见 SKILL.md 该行」 — one definition, pointed at; the 「不按包或 check 名」 respelling keeps the meaning (dev's deviation 1, accepted: the card's exact phrase did not fit beside the independence clause under 120 B). Holds.
  • Item 3, seat-lifecycle L70 (111 B): 「报告恒带一行「在跑 N / batch · 待落地 PR M」:N 只计运行中的槽,M 计四态等待的 PR」 — the two numbers defined by the same four states, so the mix-up the card names is visible in every round report. Holds.
  • Item 4, execution-duties L21 (120 B): 「软顶:本席已验收等人批的 Tier H PR 逾 5 ⇒ 停派 Tier H,S/非受管照常,轮报列积压;两周复测」 — the maintainer's 「带第 4 项」 as a soft rule: no gate, no script, no label; the round-report line is its only reader. Holds.
  • Line budget: every file at its ceiling before and after (319 / 245 / 188 / 96); two new lines paid by two deletions with homes the seat read on the head — execution-duties old L12 (sub-issue candidacy + the pm:epic exclusion) lives at L11 (sub-issue 承父卡首触), L41–42 (derived sub-issue dispatched directly) and seat-lifecycle L53 (label:pm:epic 即父子保留全集,域座位不取); seat-lifecycle old L15 (the batch default and 前任口径) lives in SKILL.md's batch row default column (默认 3) and seat-lifecycle L40 (派发口径失效,简报 ⛔ 不列作继承裁决). No re-wrap as currency. Holds.
  • The four-axis frame (SKILL.md L242–262) is byte-identical to main (md5 abff5f85…).

② Semver level

  • None owed: protocol text only. Clause-②: no, Metadata-protocol: none on the PR body match the claim; no Skills-docs: line owed; skip-changeset correct.

③ Boundary flags

  • Hypothesis 3 falsified by measurement (the two-number line could not replace a clause of the report line under 120 B; it is a new line, paid) and hypothesis 5 partly (20 families derived, not 7 — all run green; check:pm-half-states / check:pm-dispatch-gates not derived for this diff, CI's). Accepted.
  • One build under the verify lock (formula + lint) only to satisfy a derived gate's prerequisite; no closure claimed. origin/main moved four commits during the run, none touching the four files; no merge performed — the queue arbitrates.
  • Two protocol observations the dev left unfiled, agreed (agent-read text, outside the three classes): execution-duties 并行纪律 ③ 「兄弟卡落地后再合一次」 vs AGENTS.md §10's merge-only-on-cause rule; SKILL.md L74 自退 vs L75 常驻 vs seat-lifecycle's 「队列清空不等于退场」 — both are consistency readings for a later card, not this one's.
  • Author objectstack-fleet[bot] through the relay; mcp_calls: 0; the report comment carries the signature line (the first dev post under PR pm(post-stamped): every seat post opens with a signature line LANE#N · ACCOUNT · SESSION, refused without one; the recognisers skip it #27263's rule); draft, no flip by anyone.

④ Design judgment

  • Against the maintainer's scenario (lanes stopping dispatch behind PRs that only wait on a human): the row now counts only what runs, the four waiting states are named where a seat reads them, the round report shows the two numbers side by side, and the one thing batch cannot express — how many accepted Tier H PRs may wait on an approver — is a soft number with a re-measure date rather than a gate. Against the four-axis frame: focus (no gate, no script, no label; two paid lines), AI-error (a definition that can be counted, not a word that can be misread), long-run (one definition, two pointers). Holds. Residual: the soft ceiling's 5 is a guess with a review date; the round-report line is what makes it measurable.

Implemented-by: claude/issue-27117-batch-slot-definition
Reviewed-by: session_01QSeKYmhU5KEj1nukYhp1Tg

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg

维护者速读 — 席位终稿 · PR #27292 · head 90502cd4 · domain:skills#2 · 2026-10-28T14:52Z

  • 改了什么:把「并发」改成可数的槽定义 —— 一槽 = 一个正在运行的子代理或卡线程,报告落地即释放;等人批、在合并队列、等 CI、等裁决四态不占槽(SKILL.md batch 行);卡线程交回即释放、审核期不占、REWORK 再占(dispatch-runbook);execution-duties 指向唯一定义并新增你的第 4 项软顶:本席已验收等人批的 Tier H PR 逾 5 就停派新的 Tier H(S 级与非受管照常,轮报列积压,两周复测);轮报固定一行「在跑 N / batch · 待落地 PR M」。四文件行数不变(319/245/188/96),两条新行各付一行、家已核。
  • 为什么改:你的原话「同意维持「不占并发」,但是 车道执行的时候经常没有按照这个标准」「立卡,带第 4 项」—— 席位把「在飞」读成在飞的卡数,四张 PR 只是在等人就停派;本 PR 把「在飞」从 batch 行拿掉,给出四个不占槽的等待态,并让两个数并排出现在每轮报告里。
  • 风险与回滚:纯协议文本,无脚本、无门禁、无标签;软顶是句子不是检查;回滚 = revert 单个 commit。
  • 先看:SKILL.md L60(batch 行,324 B ≤ 表行 pin 341);execution-duties L20–21(唯一定义指针 + 软顶行);seat-lifecycle L70(两数行)。
  • 两分钟验证:pnpm check:pm-skill-ratchet 四文件各 headroom 0;grep -c 在飞 .claude/skills/pm-dispatch/SKILL.md 由 8 变 7。
  • 需要你做的:无 —— Tier S,契约复核 PASS(6472222599)后席位按你今天的落地授权落地。
  • 席位意见:ACCEPT。五行新文本逐行量过(324/120/118/120/111 B),两条付行的家在 head 上读到;与 pm-dispatch(p0): a lane's p0 card is dispatched at once — no batch, depth-wait or concurrency cap holds it, and lower-priority dev work pauses to make room; main or merge-queue red is graded p0 at first touch #27047 的接缝按分诊要求处理(p0 指向 priority:p0 行,不复述);dev 推翻了我「两数行可替换报告行子句」的假设(任何拼法 126–142 B),属实。

席位核对 — ACCEPT · domain:skills#2 · session_01QSeKYmhU5KEj1nukYhp1Tg · 2026-10-28T14:52Z

  1. 形态:draft → main,首行 Fixes #27117,Clause-②: no、Metadata-protocol: none 行首在;四个文件 +5/−5(10 行 ≤ 3000);assignee os-justin;skip-changeset 正确;单 commit;dev 报告首行带署名(PR pm(post-stamped): every seat post opens with a signature line LANE#N · ACCOUNT · SESSION, refused without one; the recognisers skip it #27263 规则下的首批 dev 帖)。
  2. 前提实测:席位在取回的 head(merge-base 0d45c0e7)上核 —— 四文件 319/245/188/96;表行 324 B ≤ 341;付行之家:execution-duties L11/L41–42 + seat-lifecycle L53(sub-issue 候选与 pm:epic 排除)、SKILL.md batch 行默认列 + seat-lifecycle L40(坐席默认与前任口径);四维框架块 md5 abff5f85… 与 main 相同;detached worktree 复跑 ratchet / id-lint / frame-sync 皆绿。
  3. 门禁 check-runs(head 90502cd4,本笔读数 2026-10-28T14:52Z):45 check-runs,23 success · 22 skipped · 0 in progress · 0 failure(mergeable_state: clean, draft)。dev 本地派生 20/20 exit 0 钉 90502cd4(报告 6472159911;check:doc-formula-expressions 建前置后 exit 0)。
  4. 接受的偏差:① execution-duties L20 措辞按 120 B 上限微调(「四态见 SKILL.md 该行」「不按包或 check 名」,义同);② 两数行为新行而非替换子句(实测 126–142 B 放不下);③ 派生 20 族而非席位预估 7 族,check:pm-half-states/check:pm-dispatch-gates 未派生留 CI;④ 为满足派生门禁前置建了 formula+lint,无闭包主张;⑤ main 在跑动中前移 4 提交,无触碰,未合并。
  5. 范围外去向:none filed;Acceptance notes:两处协议一致性观察(并行纪律 ③ vs AGENTS.md §10 合 main 时机;SKILL.md L74 自退 vs L75 常驻 vs 待命姿态)留待后续卡,不在本卡。Skills-docs: 不欠(kind none)。
  6. 落地条款:Tier S;契约复核 PASS 评论 6472222599(head 90502cd4);全绿即席位经中继 pr_ready + automerge_enable 落地(本班维护者授权在案);MERGED 后关卡摘 pm:dispatched;SKILL.md 热文件队列放开 → pm-dispatch(triage): a lane seat may self-triage (p1/p2) a card that blocks its own in-flight work on clear evidence, then ask the triage seat to review #27061(仍等 pm-dispatch(contract-review): the lane reviews its own PRs; triage takes only a review nobody is doing, and one claim line per head keeps two reviewers off the same head #27062 的 triage-duties)。

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 28, 2026 14:54
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 28, 2026 14:54
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 28, 2026
Merged via the queue into main with commit fa5e782 Oct 28, 2026
46 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-27117-batch-slot-definition branch October 28, 2026 15:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants