Skip to content

Commit fc2ec79

Browse files
committed
docs: describe TFD engineering contract
1 parent 205d4cf commit fc2ec79

4 files changed

Lines changed: 79 additions & 8 deletions

File tree

README-CN.md

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

10-
当前已发布版本是 `3.2.0`。本地检出本身不能证明已经安装、部署或发布。
10+
源码树当前是本地 `3.3.0` 候选;当前已发布版本仍是 `3.2.0`。本地检出本身不能
11+
证明已经安装、部署或发布。
1112

1213
## 使用
1314

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

25+
## 工程合同
26+
27+
凡是修改源码或软件架构的任务,TFD 都必须在最终确定 `PLAN` 前完整读取
28+
[`references/engineering-constraints.md`](plugins/tfd/skills/using-tfd/references/engineering-constraints.md)
29+
这个要求同时适用于 `SOLO` 和团队执行。规则保持不变;证据深度按风险缩放。
30+
31+
该 reference 是唯一规范副本。计划只识别相关改动形状,执行只携带适用约束,
32+
review 检查完整候选;不增加第二个 Skill 或策略引擎。
33+
2434
## 项目团队
2535

2636
项目创建时可以定义可复用的团队和成员资料:
@@ -198,6 +208,8 @@ GitHub Release 作为发布证据。
198208
```text
199209
plugins/tfd/.codex-plugin/plugin.json 插件清单
200210
plugins/tfd/skills/using-tfd/SKILL.md 唯一用户 Skill
211+
plugins/tfd/skills/using-tfd/references/engineering-constraints.md
212+
按需加载的工程合同
201213
plugins/tfd/skills/using-tfd/references/team-wiki.md
202214
按需加载的 Team Wiki 协议
203215
plugins/tfd/scripts/tfd_wiki/ 标准库 Wiki Guard

README.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ 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 current published release is `3.2.0`. A local checkout does not by itself
12-
prove installation, deployment, or publication.
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,
13+
deployment, or publication.
1314

1415
## Use
1516

@@ -24,6 +25,17 @@ Simple work stays with one Agent and does not read or write `.tfd/`. Work with
2425
separable professional responsibilities, or enough risk to require an
2526
independent reviewer, may use a project-configured team.
2627

28+
## Engineering contract
29+
30+
For every source-code or architecture change, TFD reads
31+
[`references/engineering-constraints.md`](plugins/tfd/skills/using-tfd/references/engineering-constraints.md)
32+
completely before finalizing `PLAN`. This applies to both `SOLO` and team
33+
execution. The rules remain fixed; evidence depth scales with risk.
34+
35+
The reference is the single normative copy. Planning identifies the relevant
36+
change shape, execution carries only the applicable constraints, and review
37+
checks the complete candidate without adding a second Skill or policy engine.
38+
2739
## Project teams
2840

2941
Project setup may define reusable team and member profiles:
@@ -230,6 +242,8 @@ deployment. Use the `v3.2.0` tag and GitHub Release as publication evidence.
230242
```text
231243
plugins/tfd/.codex-plugin/plugin.json Plugin manifest
232244
plugins/tfd/skills/using-tfd/SKILL.md Single user-facing Skill
245+
plugins/tfd/skills/using-tfd/references/engineering-constraints.md
246+
On-demand engineering contract
233247
plugins/tfd/skills/using-tfd/references/team-wiki.md
234248
On-demand Team Wiki protocol
235249
plugins/tfd/scripts/tfd_wiki/ Standard-library Wiki Guard

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "tfd",
3-
"version": "3.2.0",
4-
"description": "Session-first development with YAML team profiles, member-selected Codex Runtimes, and a per-team Markdown Team Wiki.",
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.",
55
"author": {
66
"name": "Howe829",
77
"url": "https://github.com/Howe829"
@@ -14,7 +14,7 @@
1414
"interface": {
1515
"displayName": "Team First Development",
1616
"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 for session-scoped delivery, independent review, and a Git-native per-team Markdown Team Wiki.",
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.",
1818
"developerName": "Howe829",
1919
"category": "Developer Tools",
2020
"capabilities": ["Interactive", "Write"],

scripts/test_plugin_contract.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@
2929
"scripts/test_tfd_wiki_proposal.py",
3030
"scripts/test_tfd_wiki_records.py",
3131
}
32+
ENGINEERING_RULE_HEADINGS = (
33+
"One concern, one owner",
34+
"Dependencies point toward logic",
35+
"One capability, one implementation",
36+
"A feature is an add/remove unit",
37+
"One canonical paradigm",
38+
"Shipped code has a current caller",
39+
"Complexity must earn its place now",
40+
)
3241

3342

3443
class PluginPackageContractTests(unittest.TestCase):
@@ -48,18 +57,23 @@ def test_manifest_points_to_the_single_skill_package(self) -> None:
4857
self.assertEqual(manifest["skills"], "./skills/")
4958
self.assertEqual(skill_dirs, ["using-tfd"])
5059

51-
def test_candidate_metadata_describes_yaml_teams_and_team_wiki(self) -> None:
60+
def test_candidate_metadata_describes_all_tfd_capabilities(self) -> None:
5261
manifest = json.loads(
5362
(PLUGIN_ROOT / ".codex-plugin" / "plugin.json").read_text(
5463
encoding="utf-8"
5564
)
5665
)
57-
self.assertEqual(manifest["version"], "3.2.0")
66+
self.assertEqual(manifest["version"], "3.3.0")
5867
self.assertIn("YAML", manifest["description"])
5968
self.assertIn("Runtimes", manifest["description"])
6069
self.assertIn("Team Wiki", manifest["description"])
70+
self.assertIn("engineering contract", manifest["description"].lower())
6171
self.assertIn("Runtime", manifest["interface"]["longDescription"])
6272
self.assertIn("Team Wiki", manifest["interface"]["longDescription"])
73+
self.assertIn(
74+
"engineering contract",
75+
manifest["interface"]["longDescription"].lower(),
76+
)
6377
self.assertIn("knowledge-base", manifest["keywords"])
6478
self.assertNotIn("state", manifest["description"].lower())
6579

@@ -147,6 +161,37 @@ def test_readmes_document_member_runtime_contract(self) -> None:
147161
with self.subTest(path=path.name, clause=clause):
148162
self.assertIn(clause, content)
149163

164+
def test_readmes_route_code_changes_to_engineering_contract(self) -> None:
165+
expectations = {
166+
"README.md": (
167+
"candidate",
168+
"published",
169+
"rules remain fixed",
170+
"evidence depth scales with risk",
171+
),
172+
"README-CN.md": (
173+
"候选",
174+
"已发布",
175+
"规则保持不变",
176+
"证据深度按风险",
177+
),
178+
}
179+
for filename, localized in expectations.items():
180+
content = (ROOT / filename).read_text(encoding="utf-8")
181+
for clause in (
182+
"3.3.0",
183+
"3.2.0",
184+
"references/engineering-constraints.md",
185+
"`SOLO`",
186+
"`PLAN`",
187+
*localized,
188+
):
189+
with self.subTest(filename=filename, clause=clause):
190+
self.assertIn(clause, content)
191+
for heading in ENGINEERING_RULE_HEADINGS:
192+
with self.subTest(filename=filename, heading=heading):
193+
self.assertNotIn(heading, content)
194+
150195
def test_plugin_package_contains_no_dot_tfd_tree(self) -> None:
151196
packaged_state = sorted(
152197
path.relative_to(PLUGIN_ROOT).as_posix()

0 commit comments

Comments
 (0)