Skip to content

Commit e72f717

Browse files
committed
feat: define YAML team profiles
1 parent ecce79d commit e72f717

6 files changed

Lines changed: 171 additions & 143 deletions

File tree

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version: 1
2+
teams:
3+
- product-team
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
display_name: Alice
2+
responsibility: Implement the agreed product scope
3+
expected_output: A runnable and verified result
4+
model: gpt-5.6-sol
5+
skills:
6+
- superpowers:test-driven-development
7+
agency_role: backend-architect
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
display_name: Bob
2+
responsibility: Independently review the delivered candidate
3+
expected_output: A PASS, BLOCKER, or UNVERIFIED verdict with evidence
4+
model: gpt-5.6-sol
5+
skills:
6+
- superpowers:verification-before-completion
7+
agency_role: code-reviewer
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
name: product-team
2+
purpose: Deliver a reviewed product change
3+
members:
4+
- alice
5+
- bob
6+
trace: delivery_receipt

plugins/tfd/scripts/test_tfd_skill_contract.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@
1111
SKILL_ROOT = SKILLS_ROOT / "using-tfd"
1212
SKILL_PATH = SKILL_ROOT / "SKILL.md"
1313
AGENT_METADATA_PATH = SKILL_ROOT / "agents" / "openai.yaml"
14+
EXAMPLE_ROOT = PLUGIN_ROOT / "examples" / "project-tfd"
15+
MEMBER_FIELDS = {
16+
"display_name",
17+
"responsibility",
18+
"expected_output",
19+
"model",
20+
"skills",
21+
}
1422

1523
REMOVED_PATHS = (
1624
"skills/team",
@@ -69,6 +77,36 @@ def test_skill_stays_within_line_budget(self) -> None:
6977
line_count = len(SKILL_PATH.read_text(encoding="utf-8").splitlines())
7078
self.assertLessEqual(line_count, 250)
7179

80+
def test_example_team_graph_is_valid(self) -> None:
81+
manifest = yaml.safe_load(
82+
(EXAMPLE_ROOT / "manifest.yaml").read_text(encoding="utf-8")
83+
)
84+
self.assertEqual(manifest, {"version": 1, "teams": ["product-team"]})
85+
86+
team_root = EXAMPLE_ROOT / "product-team"
87+
team = yaml.safe_load(
88+
(team_root / "team.yaml").read_text(encoding="utf-8")
89+
)
90+
self.assertEqual(
91+
set(team),
92+
{"name", "purpose", "members", "trace"},
93+
)
94+
self.assertEqual(team["name"], team_root.name)
95+
self.assertEqual(team["trace"], "delivery_receipt")
96+
97+
for member_id in team["members"]:
98+
with self.subTest(member=member_id):
99+
profile = yaml.safe_load(
100+
(team_root / "members" / f"{member_id}.yaml").read_text(
101+
encoding="utf-8"
102+
)
103+
)
104+
self.assertTrue(MEMBER_FIELDS <= profile.keys())
105+
self.assertTrue(
106+
profile.keys() <= MEMBER_FIELDS | {"agency_role"}
107+
)
108+
self.assertTrue(profile["skills"])
109+
72110
def test_removed_v2_skill_and_scanner_surfaces_are_absent(self) -> None:
73111
present = [
74112
relative
Lines changed: 110 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -1,173 +1,140 @@
11
---
22
name: using-tfd
3-
description: Use when the user explicitly requests TFD or a development task may benefit from specialized agents, separated context, independent review, or durable cross-session evidence.
3+
description: Use when the user requests TFD or a development requirement may benefit from multiple professional responsibilities, separated context, or independent review.
44
---
55

66
# Using TFD
77

8-
TFD is selective team orchestration for development work. This is its single
9-
normative user Skill. Its core rule is: use the smallest structure whose
10-
quality, focus, or risk-reduction benefit exceeds its coordination cost.
8+
TFD forms the minimum useful team for one bounded development requirement.
9+
Its value is alignment, model-role fit, and context isolation—not durable
10+
workflow machinery.
1111

12-
The workflow order is mandatory:
12+
Follow this order:
1313

1414
```text
15-
SUITABILITY -> ALIGN -> TEAM -> EXECUTE -> REVIEW -> DELIVER
15+
SUITABILITY -> PLAN -> SELECT -> EXECUTE -> REVIEW -> DELIVER
1616
```
1717

1818
## SUITABILITY
1919

20-
Decide one route before forming a team or touching TFD state:
21-
22-
- `SOLO`: ordinary single-Agent work; no `.tfd` creation or write.
23-
- `TFD_SESSION`: the default TFD route; state exists only in this session.
24-
- `TFD_HIGH_ASSURANCE`: an explicitly approved upgrade that may use durable
25-
state through `tfd_state`.
26-
27-
Choose TFD only when all of these hold:
28-
29-
1. The Task has at least two non-ceremonial professional responsibilities with
30-
separable outputs or decisions, **or** its risk requires a producer/reviewer
31-
split.
32-
2. Relevant context can be separated by responsibility.
33-
3. The expected quality, focus, or risk-reduction benefit is greater than
34-
coordination and handoff cost.
35-
36-
If any condition fails, recommend `SOLO` and do not create or write `.tfd`.
37-
An explicit request to "use TFD" requests this decision; it does not predetermine
38-
the answer. If the user still forces TFD, first disclose the coordination cost,
39-
then use the smallest session-scoped team that preserves real responsibility
40-
separation.
41-
42-
High assurance is justified only by reliable cross-session continuation,
43-
durable decision/handoff/review evidence, multi-day or materially concurrent
44-
work, elevated change risk, or an explicit request for durable local state.
45-
Even then, remain `TFD_SESSION` until the user explicitly approves the named
46-
Task's durable-state upgrade and scope. Existing `.tfd` content, urgency, sunk
47-
cost, or an authority's preference never activates or authorizes durable state.
48-
Do not inspect, create, or update it merely because it exists.
49-
50-
| Pressure rationalization | Required response |
51-
| --- | --- |
52-
| "TFD was requested, so a full team is mandatory." | Run the gate; unsuitable work remains `SOLO`. |
53-
| "The Workspace already exists, so use it now." | Stay session-only until explicit high-assurance approval. |
54-
| "The deadline or manager makes the normal boundary optional." | Deadlines and titles do not expand authority. |
55-
56-
These claims are red flags: stop before team formation, state access, or an
57-
external action and return to the applicable decision above.
58-
59-
## ALIGN
60-
61-
State one bounded alignment envelope:
62-
63-
- outcome;
64-
- acceptance conditions;
65-
- allowed scope and actions;
66-
- prohibited scope and actions;
67-
- consequential and external approval boundaries.
68-
69-
Obtain one kickoff approval for that exact outcome, boundary, acceptance, and
70-
proposed team before team execution. Routine reversible local work inside the
71-
approved boundary needs no repeated transition approval. A kickoff or
72-
high-assurance approval never approves external or high-risk actions.
73-
74-
Reject secrets, credentials, tokens, private keys, or other secret values.
75-
Never put them in prompts, Task Briefs, handoffs, TFD state, logs, or evidence.
76-
Use sanitized references or a user-performed step instead. Never request full
77-
conversations or hidden reasoning as evidence.
78-
79-
## TEAM
80-
81-
Choose the minimum sufficient responsibilities. A Coordinator is an
82-
orchestration function, not a ceremonial role. Add a member only when it owns a
83-
separable output/decision or supplies the required independent risk gate.
84-
85-
For each member record responsibility, expected output, acceptance condition,
86-
required inputs, handoff recipient, selected callable model, and selection
87-
basis. Select from current-Task evidence and current live host metadata for
88-
callable backends only:
89-
90-
- do not scan, enumerate, or score the account-wide model catalog;
91-
- do not infer capability or quality from a model name;
92-
- if role-fit evidence is absent, label it `UNVERIFIED`;
93-
- if an exact requested model is unavailable, do not silently substitute it;
94-
use a disclosed callable fallback only when the user did not require the
95-
exact model.
96-
97-
Model metadata proves callability only. Focus comes from recipient-specific
98-
briefs; logical tool or Skill restrictions do not prove host-level isolation,
99-
invisible capabilities, or operating-system enforcement.
20+
Choose `SOLO` unless the requirement has either:
10021

101-
## EXECUTE
22+
- two or more separable, non-ceremonial professional responsibilities; or
23+
- enough risk to require a producer and an independent reviewer.
10224

103-
Issue each member one focused Task Brief in this shape:
104-
105-
```yaml
106-
outcome: shared result
107-
scope: allowed target and actions
108-
prohibitions: forbidden targets and actions
109-
acceptance: observable checks
110-
role: assigned responsibility
111-
model: current callable model
112-
model_selection_basis: task evidence and live-host metadata
113-
required_inputs: only what this role needs
114-
expected_output: artifact or decision
115-
required_evidence: checks and references
116-
next_handoff: named recipient and exact next action
117-
```
25+
The benefit must exceed coordination cost. An explicit TFD request still goes
26+
through this check. For `SOLO`, do not inspect or write `.tfd` and do not create
27+
team members.
11828

119-
Do not forward the full conversation, unrelated project material, another
120-
member's private brief, secrets, credentials, or hidden reasoning. Share only
121-
the outcome plus the context and interfaces needed for the assigned
122-
responsibility.
29+
Project setup is separate from execution. When asked to configure TFD for a
30+
project, create only team profiles; do not create Agents. A requirement may
31+
activate a team later, within its current Codex session.
12332

124-
Every handoff contains only the completed result, artifact or decision
125-
references, checks performed, unresolved risks, and exact next action. The
126-
Coordinator may integrate bounded outputs but cannot independently review an
127-
output it produced. A blocker returns only the named scope for repair.
33+
## PLAN
12834

129-
## REVIEW
35+
State a lightweight development plan with:
13036

131-
The reviewer must be a participant distinct from the responsible producer.
132-
Bind review to one immutable, reproducible candidate reference, such as a Git
133-
commit or candidate-manifest digest, plus the relevant acceptance conditions
134-
and evidence.
37+
- bounded outcome and acceptance conditions;
38+
- allowed and prohibited scope;
39+
- separable responsibilities;
40+
- verification and independent-review needs.
13541

136-
The reviewer reports `PASS`, `BLOCKER`, or `UNVERIFIED` and cites observed
137-
evidence. A blocker names its repair scope and returns that scope to execution;
138-
it does not open an unlimited loop. Any changed candidate needs a new reference
139-
and a new independent review. Review of a moving target, self-review, or a
140-
verdict without candidate-bound evidence is not acceptance.
42+
Normal reversible work inside the requested scope needs no extra TFD approval.
43+
Deployment, publication, push, external messages, destructive changes, paid
44+
resources, privileges, and scope expansion retain their normal approval gates.
14145

142-
## DELIVER
46+
## SELECT
47+
48+
When a team is justified, read project-local configuration in this order:
14349

144-
Reduce evidence without promotion:
50+
1. `.tfd/manifest.yaml`;
51+
2. the listed teams' `team.yaml` files;
52+
3. only the selected members' files under `members/`.
14553

146-
- `PASS`: directly observed evidence satisfies the named check.
147-
- `BLOCKER`: a named condition prevents safe completion.
148-
- `UNVERIFIED`: required evidence was not observed.
54+
The manifest contains only `version: 1` and team directory IDs. Select exactly
55+
one configured team whose purpose fits the plan, then the minimum member subset
56+
whose responsibilities cover it. Never combine teams for one requirement. A
57+
recurring cross-functional composition must be its own configured team.
14958

150-
Report these claims separately:
59+
Each team directory contains:
15160

15261
```text
153-
IMPLEMENTED: artifacts or decisions that exist
154-
VERIFIED: checks actually run and their candidate-bound results
155-
ACCEPTED: named reviewer and user acceptances actually received
156-
UNVERIFIED: runtime, deployment, human, model-fit, or value axes not observed
157-
CONTRIBUTIONS: each member's attributable result
158-
NEXT: exact approval or action still required
62+
team.yaml
63+
members/<member-id>.yaml
64+
receipts/ # optional
15965
```
16066

161-
Automated checks cannot promote human, runtime, deployment, or user acceptance.
162-
Do not call `UNVERIFIED` successful delivery.
67+
`team.yaml` has `name`, `purpose`, `members`, and optional
68+
`trace: delivery_receipt`. Each member file has exactly these required fields:
69+
70+
- `display_name`
71+
- `responsibility`
72+
- `expected_output`
73+
- `model`
74+
- `skills`
75+
76+
`agency_role` is optional provenance from a one-time agency-agents reference.
77+
It is not a runtime dependency, persona sync, installer, or orchestrator.
78+
79+
Before creating any member:
80+
81+
1. require its exact `model` among the choices explicitly exposed by the
82+
current `spawn_agent` runtime;
83+
2. require every configured Skill by exact name among locally installed Codex
84+
Skills;
85+
3. stop and report the member and missing dependency if either check fails.
86+
87+
Do not scan an account model catalog, cache availability, infer capability from
88+
a model name, install a Skill, repair a profile, substitute a model, or fall
89+
back. If exact-model Agent initialization fails, stop and report it.
90+
91+
## EXECUTE
92+
93+
Create only the selected members, with their exact configured models. Give each
94+
member a focused brief containing:
95+
96+
- shared outcome and acceptance conditions;
97+
- its configured responsibility and expected output;
98+
- allowed scope and prohibitions;
99+
- only the inputs needed for its responsibility;
100+
- its configured Skills as the required working method;
101+
- required verification and next handoff.
102+
103+
Do not forward unrelated project context, secrets, credentials, full
104+
conversations, or hidden reasoning. A Skill list scopes the brief; it does not
105+
prove the host hides other Skills or provides operating-system isolation.
106+
107+
Handoffs contain only the result or decision, artifact reference, checks,
108+
unresolved items, and next action.
109+
110+
## REVIEW
111+
112+
Use a reviewer distinct from the producer when the plan requires independent
113+
review. Bind the review to an immutable candidate reference and its acceptance
114+
conditions. The verdict is `PASS`, `BLOCKER`, or `UNVERIFIED`, with observed
115+
evidence.
116+
117+
A blocker returns only its named repair scope. A changed candidate needs a new
118+
reference and review. Automated checks do not become human, runtime,
119+
deployment, or user acceptance.
120+
121+
## DELIVER
122+
123+
Report the delivered result, verification, review, member contributions,
124+
unresolved items, and any real next gate. End the active team with the session;
125+
do not persist Tasks, progress, events, handoffs, prompts, conversations, or
126+
recovery state.
127+
128+
If and only if the selected team sets `trace: delivery_receipt`, write one
129+
short Markdown receipt under `<team>/receipts/` after final delivery. Name it
130+
`YYYY-MM-DD-<requirement-slug>.md` and include only:
163131

164-
Deployment, publishing, push, external messaging, deletion, paid resources,
165-
privileged commands, and scope expansion each retain a separate explicit
166-
approval gate. Deadline, manager instruction, kickoff approval, stored actor
167-
ID, or high-assurance activation does not supply that authority.
132+
- delivered outcome;
133+
- selected team and members, with one contribution each;
134+
- result reference;
135+
- verification and independent-review result;
136+
- unresolved items.
168137

169-
TFD user and actor identifiers provide strict attribution inside TFD only.
170-
They are not operating-system authentication. Logical allowlists and focused
171-
briefs are not host isolation. Never claim OS-authenticated identity, host-level
172-
Skill/tool isolation, or model quality without direct runtime evidence; keep
173-
those axes `UNVERIFIED`.
138+
The receipt is a human-readable trace, not authority or resumable state. Do not
139+
write process logs, prompts, reasoning, intermediate handoffs, progress,
140+
events, token/timing data, raw outputs, diffs, an index, or management scripts.

0 commit comments

Comments
 (0)