Skip to content

Commit e912544

Browse files
committed
feat: orchestrate confirmed workstreams
1 parent fc2ec79 commit e912544

9 files changed

Lines changed: 139 additions & 31 deletions

File tree

.agents/plugins/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"source": {
1010
"source": "local",
1111
"path": "./plugins/tfd",
12-
"version": "3.1.0"
12+
"version": "3.4.0"
1313
},
1414
"policy": {
1515
"installation": "AVAILABLE",

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,28 @@ All notable public changes to Team First Development are documented here.
44

55
## Unreleased
66

7+
## 3.4.0 - 2026-08-05
8+
9+
- Make the Coordinator decompose a `TEAM` outcome into the minimum useful
10+
workstreams and map each one to exactly one accountable selected member.
11+
- Include the session-only workstream map, write scopes, dependencies,
12+
handoffs, and parallel or serial order in the exact confirmation proposal.
13+
- Allow only the Coordinator to activate members; prohibit member
14+
re-delegation and unconfirmed helper Agents.
15+
- Run only dependency-free, non-overlapping workstreams in parallel, stop
16+
dependent work after a `BLOCKER`, and integrate accepted outputs into one
17+
immutable candidate before review.
18+
19+
## 3.3.0 - 2026-08-01
20+
21+
- Add one progressively loaded engineering contract for every source-code or
22+
architecture change, including `SOLO` work.
23+
- Require one concern owner, inward dependencies, fake or in-memory unit-test
24+
seams, one authoritative capability implementation, add/remove feature
25+
units, one canonical paradigm, current callers, and current-need minimalism.
26+
- Scale evidence depth with risk while retaining `PASS`, `BLOCKER`, and
27+
`UNVERIFIED` as the exact review verdicts.
28+
729
## 3.2.0 - 2026-07-31
830

931
- Add an exact per-member Runtime binding with `codex_spawn`,

README-CN.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
Team First Development(TFD)是一套选择性使用的 Codex 团队开发方法。它通过
88
目标对齐、模型与职责匹配、聚焦上下文和独立审核,改善一个边界明确的开发结果。
99

10-
源码树当前是本地 `3.3.0` 候选;当前已发布版本仍是 `3.2.0`。本地检出本身不能
11-
证明已经安装、部署或发布。
10+
当前源码版本为 `3.4.0`。是否已发布以 `v3.4.0` 标签和 GitHub Release 为准;
11+
本地检出本身不能证明已经安装、部署或发布。
1212

1313
## 使用
1414

@@ -22,6 +22,16 @@ TFD 首先判断协作收益是否高于协调成本。简单任务由单 Agent
2222
`.tfd/`。当任务包含可分离的专业职责,或风险确实要求独立审核时,才考虑使用
2323
项目已配置的团队。
2424

25+
## Coordinator workstream
26+
27+
对于 `TEAM`,Coordinator 在激活成员前把有界目标拆成最少且有用的
28+
workstream。精确确认方案必须展示每个 workstream 的责任成员、验收条件、写入
29+
范围、依赖、交接,以及并行或串行顺序。
30+
31+
只有 Coordinator 可以激活成员;成员不能继续委派,也不能创建未经确认的辅助
32+
Agent。只有无依赖且写入范围不重叠的 workstream 才可并行;`BLOCKER` 会停止
33+
下游,Coordinator 最后把已接受的产出整合成一个不可变审核候选。
34+
2535
## 工程合同
2636

2737
凡是修改源码或软件架构的任务,TFD 都必须在最终确定 `PLAN` 前完整读取
@@ -200,7 +210,7 @@ Wiki 存在后,最终交付只记录一个 `delivery` activity,不再创建
200210
推送、打标签、发布、部署、对外消息、破坏性清理、特权命令、付费动作或扩大
201211
范围;这些动作继续遵循各自的正常审批边界。
202212

203-
本地检出目录中的版本号本身不能证明已经安装或部署。请以 `v3.2.0` 标签和
213+
本地检出目录中的版本号本身不能证明已经安装或部署。请以 `v3.4.0` 标签和
204214
GitHub Release 作为发布证据。
205215

206216
## 仓库结构

README.md

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ Team First Development (TFD) is a selective Codex team-development method.
88
It improves a bounded development result through alignment, model-role fit,
99
focused context, and independent review.
1010

11-
The source tree is a local `3.3.0` candidate. The current published release
12-
remains `3.2.0`. A local checkout does not by itself prove installation,
11+
This source tree is version `3.4.0`. The `v3.4.0` tag and GitHub Release are
12+
the publication evidence; a local checkout alone does not prove installation,
1313
deployment, or publication.
1414

1515
## Use
@@ -25,6 +25,18 @@ Simple work stays with one Agent and does not read or write `.tfd/`. Work with
2525
separable professional responsibilities, or enough risk to require an
2626
independent reviewer, may use a project-configured team.
2727

28+
## Coordinator workstreams
29+
30+
For `TEAM`, the Coordinator decomposes the bounded outcome into the minimum
31+
useful workstreams before activation. The exact confirmation proposal shows
32+
each workstream's accountable member, acceptance conditions, write scope,
33+
dependencies, handoff, and parallel or serial order.
34+
35+
Only the Coordinator activates members. Members do not re-delegate or create
36+
unconfirmed helper Agents. Dependency-free workstreams may run in parallel only
37+
when their write scopes do not overlap; a blocker stops its dependents, and the
38+
Coordinator integrates accepted outputs into one immutable review candidate.
39+
2840
## Engineering contract
2941

3042
For every source-code or architecture change, TFD reads
@@ -235,7 +247,7 @@ commands, paid actions, or scope expansion. Each keeps its normal approval
235247
boundary.
236248

237249
A version in a local checkout does not by itself prove installation or
238-
deployment. Use the `v3.2.0` tag and GitHub Release as publication evidence.
250+
deployment. Use the `v3.4.0` tag and GitHub Release as publication evidence.
239251

240252
## Repository layout
241253

plugins/tfd/.codex-plugin/plugin.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "tfd",
3-
"version": "3.3.0",
4-
"description": "Session-first development with YAML team profiles, member-selected Codex Runtimes, a progressively loaded engineering contract, and a per-team Markdown Team Wiki.",
3+
"version": "3.4.0",
4+
"description": "Session-first development with Coordinator-decomposed workstreams, YAML team profiles, member-selected Codex Runtimes, a progressively loaded engineering contract, and a per-team Markdown Team Wiki.",
55
"author": {
66
"name": "Howe829",
77
"url": "https://github.com/Howe829"
@@ -13,8 +13,8 @@
1313
"skills": "./skills/",
1414
"interface": {
1515
"displayName": "Team First Development",
16-
"shortDescription": "按需求从 YAML 配置组建最小团队",
17-
"longDescription": "Route simple work to one Agent, or select one configured YAML team and its minimum useful members with exact Codex Runtime bindings; apply one progressively loaded engineering contract to code changes; and retain session-scoped delivery, independent review, and a Git-native per-team Markdown Team Wiki.",
16+
"shortDescription": "按需求拆分 workstream 并组建最小团队",
17+
"longDescription": "Route simple work to one Agent, or decompose TEAM work into confirmed workstreams assigned to the minimum configured members with exact Codex Runtime bindings; apply one progressively loaded engineering contract to code changes; and retain session-scoped delivery, independent review, and a Git-native per-team Markdown Team Wiki.",
1818
"developerName": "Howe829",
1919
"category": "Developer Tools",
2020
"capabilities": ["Interactive", "Write"],

plugins/tfd/scripts/test_tfd_skill_contract.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,27 @@ def test_skill_confirms_runtime_binding_without_fallback(self) -> None:
141141
with self.subTest(clause=clause):
142142
self.assertIn(clause, skill)
143143

144+
def test_coordinator_decomposes_and_dispatches_confirmed_workstreams(
145+
self,
146+
) -> None:
147+
skill = _squash_whitespace(
148+
SKILL_PATH.read_text(encoding="utf-8")
149+
)
150+
for clause in (
151+
"minimum useful workstreams",
152+
"exactly one accountable selected member",
153+
"spawning per microtask",
154+
"workstream map",
155+
"write scope",
156+
"dependency-free workstreams",
157+
"Only the Coordinator activates",
158+
"must not re-delegate",
159+
"stops its dependent workstreams",
160+
"one integrated candidate",
161+
):
162+
with self.subTest(clause=clause):
163+
self.assertIn(clause, skill)
164+
144165
def test_team_wiki_reference_is_packaged_and_routed_on_demand(self) -> None:
145166
self.assertTrue(WIKI_REFERENCE_PATH.is_file())
146167
skill = SKILL_PATH.read_text(encoding="utf-8")
@@ -258,11 +279,20 @@ def test_wiki_protocol_keeps_v1_and_safety_boundaries_explicit(self) -> None:
258279
with self.subTest(clause=clause):
259280
self.assertIn(clause, protocol)
260281

261-
def test_agent_metadata_mentions_wiki_confirmation_boundary(self) -> None:
282+
def test_agent_metadata_matches_confirmation_and_dispatch_boundaries(
283+
self,
284+
) -> None:
262285
metadata = yaml.safe_load(AGENT_METADATA_PATH.read_text(encoding="utf-8"))
263286
prompt = metadata["interface"]["default_prompt"]
264-
self.assertIn("per-team Wiki", prompt)
265-
self.assertIn("exact proposal confirmation", prompt)
287+
for clause in (
288+
"$using-tfd",
289+
"workstream map",
290+
"dispatch only confirmed members",
291+
"per-team Wiki",
292+
"exact proposal confirmation",
293+
):
294+
with self.subTest(clause=clause):
295+
self.assertIn(clause, prompt)
266296

267297
def test_example_team_graph_is_valid(self) -> None:
268298
manifest = yaml.safe_load(

plugins/tfd/skills/using-tfd/SKILL.md

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ State a lightweight development plan with:
4040
- separable responsibilities;
4141
- verification and independent-review needs.
4242

43+
For `TEAM`, decompose the bounded outcome into the minimum useful workstreams.
44+
Give each a distinct result or evidence obligation; combine related work instead
45+
of spawning per microtask. Declare dependencies and whether independent work
46+
may run in parallel.
47+
4348
After the required team confirmation, normal reversible work inside the
4449
confirmed scope needs no repeated TFD approval. Deployment, publication, push,
4550
external messages, destructive changes, paid resources, privileges, and scope
@@ -68,6 +73,9 @@ one configured team whose purpose fits the plan, then the minimum member subset
6873
whose responsibilities cover it. Never combine teams for one requirement. A
6974
recurring cross-functional composition must be its own configured team.
7075

76+
Map each workstream to exactly one accountable selected member; each active
77+
member owns one workstream. Do not select a member without current work.
78+
7179
For project setup, draft the same manifest, team, and member structure from the
7280
plan, but do not create or update `.tfd` before `CONFIRM`.
7381

@@ -115,6 +123,9 @@ containing:
115123
- exact Runtime and model, explicit reasoning effort or the Runtime/model
116124
default, available eligibility evidence and its source, and the Runtime's
117125
user-visible behavior;
126+
- the session-only workstream map: outcome and acceptance, accountable member,
127+
allowed write scope, dependencies, output and handoff, and parallel or serial
128+
order;
118129
- the minimum active subset, including any independent reviewer.
119130

120131
`codex_spawn` creates a child Agent in the current task. `codex_thread` creates
@@ -132,9 +143,9 @@ when both actions are named in the same proposal. Any material change to any
132143
proposal field invalidates the confirmation and requires a new proposal,
133144
including a changed outcome, acceptance condition, scope, exclusion, action
134145
mode, team identity or purpose, member identity, responsibility, output, model,
135-
Runtime, reasoning effort, Skill, active subset, or reviewer. Confirmation
136-
authorizes only the named local actions; all separate approval gates remain in
137-
force.
146+
Runtime, reasoning effort, Skill, active subset, workstream map, order, or
147+
reviewer. Confirmation authorizes only the named local actions; all separate
148+
approval gates remain in force.
138149

139150
## TEAM WIKI
140151

@@ -157,7 +168,7 @@ work, and audit-record statuses distinct.
157168
For profile-only setup, write exactly the confirmed profiles and stop without
158169
creating members. After confirmation, start each selected member once through
159170
its exact Runtime, model, and reasoning effort. Give each member a focused brief
160-
containing:
171+
for its confirmed workstream containing:
161172

162173
- shared outcome and acceptance conditions;
163174
- its configured responsibility and expected output;
@@ -166,6 +177,17 @@ containing:
166177
- its configured Skills as the required working method;
167178
- required verification and next handoff.
168179

180+
Only the Coordinator activates members and dispatches confirmed workstreams.
181+
Members must not re-delegate or create unconfirmed Agents. Start dependency-free
182+
workstreams in parallel only when their write scopes do not overlap and Runtime
183+
capacity is available; otherwise sequence them.
184+
185+
Validate each handoff against its acceptance conditions before releasing its
186+
dependents. A `BLOCKER` stops its dependent workstreams, and `UNVERIFIED`
187+
evidence remains unresolved. Integrate accepted outputs into one integrated
188+
candidate, run whole-candidate verification, then route its immutable reference
189+
to review. Member self-report alone is not delivery.
190+
169191
Do not forward unrelated project context, secrets, credentials, full
170192
conversations, or hidden reasoning. A Skill list scopes the brief; it does not
171193
prove the host hides other Skills or provides operating-system isolation.
@@ -178,9 +200,9 @@ and verify explicit reasoning effort when the Runtime exposes it.
178200
Missing proof remains `UNVERIFIED`; startup failure or a mismatch cannot become
179201
successful delivery.
180202

181-
Do not automatically retry, switch Runtime, substitute a model, or reduce
182-
reasoning effort. A user-requested retry of the same unchanged binding does not
183-
require a new member proposal; any binding change does.
203+
Do not automatically retry or reassign work, switch Runtime, substitute a model,
204+
or reduce reasoning effort. A user-requested retry of the same unchanged binding
205+
does not require a new member proposal; any binding change does.
184206

185207
Runtime-owned tasks, sessions, and logs remain Runtime-owned. Do not copy them
186208
into `.tfd` or automatically delete or archive them.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
interface:
22
display_name: "TFD"
33
short_description: "Suitability-first team orchestration for development"
4-
default_prompt: "Start by assessing whether TFD has a credible net benefit for this task. Then follow the single TFD Skill and preserve its exact-team confirmation gate, per-team Wiki exact proposal confirmation, session-only execution, focused briefs, independent review, evidence boundaries, and separate approval gates."
4+
default_prompt: "Use $using-tfd to assess suitability, confirm the exact roster and session-only workstream map, dispatch only confirmed members, integrate one candidate, and preserve the per-team Wiki exact proposal confirmation, independent review, evidence boundaries, and separate approval gates."

scripts/test_plugin_contract.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,19 +57,30 @@ def test_manifest_points_to_the_single_skill_package(self) -> None:
5757
self.assertEqual(manifest["skills"], "./skills/")
5858
self.assertEqual(skill_dirs, ["using-tfd"])
5959

60-
def test_candidate_metadata_describes_all_tfd_capabilities(self) -> None:
60+
def test_release_metadata_describes_all_tfd_capabilities(self) -> None:
6161
manifest = json.loads(
6262
(PLUGIN_ROOT / ".codex-plugin" / "plugin.json").read_text(
6363
encoding="utf-8"
6464
)
6565
)
66-
self.assertEqual(manifest["version"], "3.3.0")
66+
self.assertEqual(manifest["version"], "3.4.0")
67+
marketplace = json.loads(
68+
(ROOT / ".agents" / "plugins" / "marketplace.json").read_text(
69+
encoding="utf-8"
70+
)
71+
)
72+
self.assertEqual(
73+
marketplace["plugins"][0]["source"]["version"],
74+
manifest["version"],
75+
)
6776
self.assertIn("YAML", manifest["description"])
6877
self.assertIn("Runtimes", manifest["description"])
6978
self.assertIn("Team Wiki", manifest["description"])
79+
self.assertIn("workstreams", manifest["description"])
7080
self.assertIn("engineering contract", manifest["description"].lower())
7181
self.assertIn("Runtime", manifest["interface"]["longDescription"])
7282
self.assertIn("Team Wiki", manifest["interface"]["longDescription"])
83+
self.assertIn("workstreams", manifest["interface"]["longDescription"])
7384
self.assertIn(
7485
"engineering contract",
7586
manifest["interface"]["longDescription"].lower(),
@@ -161,26 +172,27 @@ def test_readmes_document_member_runtime_contract(self) -> None:
161172
with self.subTest(path=path.name, clause=clause):
162173
self.assertIn(clause, content)
163174

164-
def test_readmes_route_code_changes_to_engineering_contract(self) -> None:
175+
def test_readmes_document_release_and_engineering_contract(self) -> None:
165176
expectations = {
166177
"README.md": (
167-
"candidate",
168-
"published",
178+
"publication evidence",
179+
"Coordinator workstreams",
169180
"rules remain fixed",
170181
"evidence depth scales with risk",
171182
),
172183
"README-CN.md": (
173-
"候选",
174-
"已发布",
184+
"是否已发布",
185+
"Coordinator workstream",
175186
"规则保持不变",
176187
"证据深度按风险",
177188
),
178189
}
179190
for filename, localized in expectations.items():
180191
content = (ROOT / filename).read_text(encoding="utf-8")
181192
for clause in (
182-
"3.3.0",
183-
"3.2.0",
193+
"3.4.0",
194+
"v3.4.0",
195+
"workstream",
184196
"references/engineering-constraints.md",
185197
"`SOLO`",
186198
"`PLAN`",

0 commit comments

Comments
 (0)