@givolt/i3-composer-agent 2.3.7 → 3.0.0
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/.agents/plugins/marketplace.json +1 -1
- package/.claude/commands/i3-sop.md +19 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.gemini/commands/i3-sop.toml +19 -0
- package/README.md +37 -3
- package/commands/i3-sop.toml +19 -0
- package/docs/codebuddy-setup.md +3 -3
- package/docs/codex-setup.md +2 -2
- package/docs/other-hosts.md +2 -2
- package/docs/workbuddy-setup.md +3 -3
- package/evals/cases/i3-enterprise-sop.json +64 -0
- package/evals/fixtures/i3-enterprise-sop/brief.md +11 -0
- package/evals/zh-CN/cases/i3-enterprise-sop.json +61 -0
- package/package.json +7 -1
- package/plugin.json +1 -1
- package/references/engineering-skeleton-resources/README.md +52 -0
- package/references/engineering-skeleton-resources/adoption.md +200 -0
- package/references/engineering-skeleton-resources/catalog.json +17 -0
- package/references/engineering-skeleton-resources/directory-standard.md +119 -0
- package/references/enterprise-sop-resources/README.md +165 -0
- package/references/enterprise-sop-resources/ad/README.md +70 -0
- package/references/enterprise-sop-resources/ad/assets-manifest.json +106 -0
- package/references/enterprise-sop-resources/ad/prompts/01-generate.md +58 -0
- package/references/enterprise-sop-resources/ad/prompts/02-review.md +54 -0
- package/references/enterprise-sop-resources/ad/prompts/03-revise.md +54 -0
- package/references/enterprise-sop-resources/ad/prompts/04-recheck.md +54 -0
- package/references/enterprise-sop-resources/ad/templates/AD.md +337 -0
- package/references/enterprise-sop-resources/assets-manifest.json +199 -0
- package/references/enterprise-sop-resources/brd/README.md +50 -0
- package/references/enterprise-sop-resources/brd/assets-manifest.json +94 -0
- package/references/enterprise-sop-resources/brd/prompts/01-generate.md +51 -0
- package/references/enterprise-sop-resources/brd/prompts/02-review.md +47 -0
- package/references/enterprise-sop-resources/brd/prompts/03-revise.md +47 -0
- package/references/enterprise-sop-resources/brd/prompts/04-recheck.md +47 -0
- package/references/enterprise-sop-resources/brd/templates/BRD.md +169 -0
- package/references/enterprise-sop-resources/codebuddy-project-guide.md +34 -0
- package/references/enterprise-sop-resources/controlled-handoff.md +41 -0
- package/references/enterprise-sop-resources/controlled_handoff.py +334 -0
- package/references/enterprise-sop-resources/handoff-contract.md +196 -0
- package/references/enterprise-sop-resources/handoff.py +277 -0
- package/references/enterprise-sop-resources/lifecycle-contract.md +91 -0
- package/references/enterprise-sop-resources/plan-handoff.md +73 -0
- package/references/enterprise-sop-resources/prd/README.md +137 -0
- package/references/enterprise-sop-resources/prd/assets-manifest.json +115 -0
- package/references/enterprise-sop-resources/prd/prompts/01-generate.md +64 -0
- package/references/enterprise-sop-resources/prd/prompts/02-review.md +49 -0
- package/references/enterprise-sop-resources/prd/prompts/03-revise.md +48 -0
- package/references/enterprise-sop-resources/prd/prompts/04-recheck.md +47 -0
- package/references/enterprise-sop-resources/prd/template-contracts.md +39 -0
- package/references/enterprise-sop-resources/prd/templates/AD.md +17 -0
- package/references/enterprise-sop-resources/prd/templates/PRD.md +257 -0
- package/references/enterprise-sop-resources/recovery-contract.md +65 -0
- package/references/enterprise-sop-resources/review-handoff.md +105 -0
- package/references/enterprise-sop-resources/selection-handoff.md +55 -0
- package/references/enterprise-sop-resources/selection_handoff.py +225 -0
- package/references/enterprise-sop-resources/stages.json +262 -0
- package/references/enterprise-sop-resources/technical-baseline/README.md +132 -0
- package/references/enterprise-sop-resources/technical-baseline/assets-manifest.json +101 -0
- package/references/enterprise-sop-resources/technical-baseline/baselines/PROVENANCE.md +40 -0
- package/references/enterprise-sop-resources/technical-baseline/baselines//344/274/201/344/270/232/345/272/224/347/224/250-/346/212/200/346/234/257/350/247/204/347/272/246_v0.0.2.md +295 -0
- package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/adoption.md +112 -0
- package/references/enterprise-sop-resources/technical-baseline/references/engineering-directory-v0.2.0/directory-standard.md +119 -0
- package/references/enterprise-sop-resources/technical-baseline/templates/TECHNICAL-BASELINE.md +133 -0
- package/references/enterprise-sop-resources/template-contracts.md +142 -0
- package/references/enterprise-sop-resources/testcase/README.md +61 -0
- package/references/enterprise-sop-resources/testcase/assets-manifest.json +111 -0
- package/references/enterprise-sop-resources/testcase/prompts/01-generate.md +53 -0
- package/references/enterprise-sop-resources/testcase/prompts/02-review.md +51 -0
- package/references/enterprise-sop-resources/testcase/prompts/03-revise.md +49 -0
- package/references/enterprise-sop-resources/testcase/prompts/04-recheck.md +51 -0
- package/references/enterprise-sop-resources/testcase/templates/TestCase.md +269 -0
- package/references/enterprise-sop-resources/verification/README.md +149 -0
- package/references/enterprise-sop-resources/verification/check_execution.py +185 -0
- package/references/enterprise-sop-resources/verification/check_native_execution.py +282 -0
- package/references/enterprise-sop-resources/verification/check_reads.py +348 -0
- package/references/enterprise-sop-resources/verification/review-output.schema.json +155 -0
- package/references/enterprise-sop-resources/verification/review_handoff.py +329 -0
- package/skills/i3-enterprise-sop/SKILL.md +173 -0
- package/skills/i3-enterprise-sop/agents/openai.yaml +2 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Path-only SOP handoff helper. Never writes business documents or approvals."""
|
|
3
|
+
import argparse
|
|
4
|
+
import copy
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import tempfile
|
|
9
|
+
import uuid
|
|
10
|
+
|
|
11
|
+
VERSION = '0.2.0'
|
|
12
|
+
GLOBAL_ROLES = {'brd', 'technicalBaseline'}
|
|
13
|
+
TOPIC_ROLES = {'prd', 'ad', 'testCase', 'prototype', 'engineeringSkeleton', 'contracts'}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _unique(pairs):
|
|
17
|
+
value = {}
|
|
18
|
+
for key, item in pairs:
|
|
19
|
+
if key in value:
|
|
20
|
+
raise ValueError('duplicate JSON key: ' + key)
|
|
21
|
+
value[key] = item
|
|
22
|
+
return value
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _nonstandard(value):
|
|
26
|
+
raise ValueError('nonstandard JSON constant: ' + value)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _load(raw):
|
|
30
|
+
value = json.loads(raw, object_pairs_hook=_unique, parse_constant=_nonstandard)
|
|
31
|
+
if not isinstance(value, dict) or type(value.get('schemaVersion')) is not int or value['schemaVersion'] != 1:
|
|
32
|
+
raise ValueError('unsupported handoff schemaVersion; no automatic migration')
|
|
33
|
+
scope = value.get('scope')
|
|
34
|
+
if not isinstance(scope, dict) or not isinstance(scope.get('work'), str) or not scope['work'].strip():
|
|
35
|
+
raise ValueError('scope.work must identify the actual work')
|
|
36
|
+
if not isinstance(value.get('selected'), dict):
|
|
37
|
+
raise ValueError('selected must be an object')
|
|
38
|
+
topics = value['selected'].get('topics', [])
|
|
39
|
+
if not isinstance(topics, list):
|
|
40
|
+
raise ValueError('selected.topics must be an array')
|
|
41
|
+
seen = set()
|
|
42
|
+
for topic in topics:
|
|
43
|
+
if not isinstance(topic, dict) or not all(isinstance(topic.get(k), str) and topic[k].strip() for k in ['capabilityId', 'prdId']):
|
|
44
|
+
raise ValueError('topic requires capabilityId and prdId')
|
|
45
|
+
identity = (topic['capabilityId'], topic['prdId'])
|
|
46
|
+
if identity in seen:
|
|
47
|
+
raise ValueError('ambiguous duplicate topic selection')
|
|
48
|
+
seen.add(identity)
|
|
49
|
+
return value
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _selected_only(value):
|
|
53
|
+
"""Canonical writes; legacy draft indexes never become selected inputs."""
|
|
54
|
+
unexpected = set(value) - {'schemaVersion', 'scope', 'selected', 'candidates', 'delivery'}
|
|
55
|
+
if unexpected:
|
|
56
|
+
raise ValueError('unrecognized top-level fields; preserve the original and resolve their purpose before writing: '
|
|
57
|
+
+ ', '.join(sorted(unexpected)))
|
|
58
|
+
return {key: copy.deepcopy(value[key]) for key in ('schemaVersion', 'scope', 'selected')}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _manifest_path(root, raw):
|
|
62
|
+
if not raw:
|
|
63
|
+
raise ValueError('an explicit manifest path is required for this operation')
|
|
64
|
+
path = Path(raw)
|
|
65
|
+
path = Path(os.path.abspath(path if path.is_absolute() else root / path))
|
|
66
|
+
if not path.resolve().is_relative_to(root):
|
|
67
|
+
raise ValueError('manifest must stay inside the explicit project root')
|
|
68
|
+
current = path
|
|
69
|
+
while current != root:
|
|
70
|
+
if current.is_symlink():
|
|
71
|
+
raise ValueError('manifest path must not traverse symbolic links')
|
|
72
|
+
current = current.parent
|
|
73
|
+
if current == current.parent and current != root:
|
|
74
|
+
raise ValueError('manifest path is outside project root')
|
|
75
|
+
return path
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _reference(root, role, raw, capability_id=None, prd_id=None):
|
|
79
|
+
if role not in GLOBAL_ROLES | TOPIC_ROLES:
|
|
80
|
+
raise ValueError('unknown reference role')
|
|
81
|
+
if not isinstance(raw, str) or not raw.strip():
|
|
82
|
+
raise ValueError('reference path must be explicit')
|
|
83
|
+
path = Path(raw)
|
|
84
|
+
resolved = (path if path.is_absolute() else root / path).resolve()
|
|
85
|
+
if not path.is_absolute() and not resolved.is_relative_to(root):
|
|
86
|
+
raise ValueError('relative reference escapes project root; use an explicitly adopted absolute source')
|
|
87
|
+
if resolved.is_file():
|
|
88
|
+
if not resolved.read_text(encoding='utf-8').strip():
|
|
89
|
+
raise ValueError('empty document is not a complete handoff reference')
|
|
90
|
+
elif role != 'engineeringSkeleton' or not resolved.is_dir():
|
|
91
|
+
raise ValueError('reference missing or unreadable: ' + raw)
|
|
92
|
+
result = {'role': role, 'path': str(resolved.relative_to(root)) if resolved.is_relative_to(root) else str(resolved)}
|
|
93
|
+
if role in TOPIC_ROLES:
|
|
94
|
+
if not all(isinstance(x, str) and x.strip() for x in [capability_id, prd_id]):
|
|
95
|
+
raise ValueError('topic reference requires explicit capabilityId and prdId')
|
|
96
|
+
result.update(capabilityId=capability_id, prdId=prd_id)
|
|
97
|
+
return result
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _assign(selected, reference, *, transient=False):
|
|
101
|
+
role, path = reference['role'], reference['path']
|
|
102
|
+
target = selected
|
|
103
|
+
if role in TOPIC_ROLES:
|
|
104
|
+
topics = selected.setdefault('topics', [])
|
|
105
|
+
matches = [x for x in topics if x['capabilityId'] == reference['capabilityId'] and x['prdId'] == reference['prdId']]
|
|
106
|
+
if len(matches) > 1:
|
|
107
|
+
raise ValueError('ambiguous duplicate topic selection')
|
|
108
|
+
if matches:
|
|
109
|
+
target = matches[0]
|
|
110
|
+
else:
|
|
111
|
+
target = {k: reference[k] for k in ['capabilityId', 'prdId']}
|
|
112
|
+
topics.append(target)
|
|
113
|
+
if role == 'contracts':
|
|
114
|
+
values = target.setdefault(role, [])
|
|
115
|
+
if not isinstance(values, list) or not all(isinstance(x, str) for x in values):
|
|
116
|
+
raise ValueError('contracts must be a path array')
|
|
117
|
+
if transient:
|
|
118
|
+
target[role] = [path]
|
|
119
|
+
elif path not in values:
|
|
120
|
+
values.append(path)
|
|
121
|
+
else:
|
|
122
|
+
if not transient and role in target and target[role] != path:
|
|
123
|
+
raise ValueError('existing selection differs; replacement and affected-pair recovery belong to S08')
|
|
124
|
+
target[role] = path
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _resolve(root, value, capability_id, prd_id, manual):
|
|
128
|
+
selected = copy.deepcopy(value['selected'])
|
|
129
|
+
topics = selected.get('topics', [])
|
|
130
|
+
if bool(capability_id) != bool(prd_id):
|
|
131
|
+
raise ValueError('provide both capabilityId and prdId')
|
|
132
|
+
if not capability_id and len(topics) == 1:
|
|
133
|
+
capability_id, prd_id = topics[0]['capabilityId'], topics[0]['prdId']
|
|
134
|
+
manual_roles = set()
|
|
135
|
+
for item in manual:
|
|
136
|
+
role, separator, path = item.partition('=')
|
|
137
|
+
if not separator or role in manual_roles:
|
|
138
|
+
raise ValueError('manual references require one unambiguous ROLE=PATH per role')
|
|
139
|
+
manual_roles.add(role)
|
|
140
|
+
reference = _reference(root, role, path, capability_id, prd_id)
|
|
141
|
+
_assign(selected, reference, transient=True)
|
|
142
|
+
topics = selected.get('topics', [])
|
|
143
|
+
if not capability_id and len(topics) > 1:
|
|
144
|
+
raise ValueError('multiple topics; explicitly choose capabilityId and prdId')
|
|
145
|
+
references = []
|
|
146
|
+
for role in sorted(GLOBAL_ROLES):
|
|
147
|
+
if role in selected:
|
|
148
|
+
references.append(_reference(root, role, selected[role]))
|
|
149
|
+
matches = [x for x in topics if x['capabilityId'] == capability_id and x['prdId'] == prd_id]
|
|
150
|
+
if capability_id and topics and not matches:
|
|
151
|
+
raise ValueError('requested topic is not selected; no highest-version fallback')
|
|
152
|
+
for topic in matches:
|
|
153
|
+
for role in sorted(TOPIC_ROLES):
|
|
154
|
+
if role not in topic:
|
|
155
|
+
continue
|
|
156
|
+
paths = topic[role] if role == 'contracts' else [topic[role]]
|
|
157
|
+
if not isinstance(paths, list):
|
|
158
|
+
raise ValueError('contracts must be a path array')
|
|
159
|
+
for path in paths:
|
|
160
|
+
references.append(_reference(root, role, path, capability_id, prd_id))
|
|
161
|
+
for reference in references:
|
|
162
|
+
path = Path(reference['path'])
|
|
163
|
+
reference['resolvedPath'] = str(path if path.is_absolute() else root / path)
|
|
164
|
+
return {'ok': True, 'changed': False, 'source': 'manual' if manual else 'manifest',
|
|
165
|
+
'scope': value['scope'], 'references': references,
|
|
166
|
+
'proof': 'paths read now; caller must verify current identity, upstream, scope and actual human decisions'}
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _store(root, path, old, value):
|
|
170
|
+
value = _selected_only(value)
|
|
171
|
+
if old is not None and _load(old) == value:
|
|
172
|
+
return {'ok': True, 'changed': False, 'manifest': str(path.relative_to(root))}
|
|
173
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
174
|
+
lock = path.with_name(path.name + '.lock')
|
|
175
|
+
try:
|
|
176
|
+
fd = os.open(lock, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
|
|
177
|
+
except FileExistsError as error:
|
|
178
|
+
raise ValueError('handoff writer is busy; leave existing files unchanged') from error
|
|
179
|
+
os.close(fd)
|
|
180
|
+
temporary = None
|
|
181
|
+
try:
|
|
182
|
+
if (path.read_bytes() if path.exists() else None) != old:
|
|
183
|
+
raise ValueError('manifest changed since read; stop and re-read')
|
|
184
|
+
history = None
|
|
185
|
+
if old is not None:
|
|
186
|
+
history = _manifest_path(root, str(path.parent / 'history' / (path.stem + '-' + uuid.uuid4().hex + '.json')))
|
|
187
|
+
history.parent.mkdir(exist_ok=True)
|
|
188
|
+
history.write_bytes(old)
|
|
189
|
+
fd, name = tempfile.mkstemp(prefix=path.name + '.', suffix='.tmp', dir=path.parent)
|
|
190
|
+
temporary = Path(name)
|
|
191
|
+
with os.fdopen(fd, 'w', encoding='utf-8') as stream:
|
|
192
|
+
json.dump(value, stream, ensure_ascii=False, indent=2)
|
|
193
|
+
stream.write('\n'); stream.flush(); os.fsync(stream.fileno())
|
|
194
|
+
if (path.read_bytes() if path.exists() else None) != old:
|
|
195
|
+
raise ValueError('manifest changed during update; stop without replacing it')
|
|
196
|
+
if old is None:
|
|
197
|
+
os.link(temporary, path)
|
|
198
|
+
else:
|
|
199
|
+
os.replace(temporary, path)
|
|
200
|
+
if _load(path.read_bytes()) != value:
|
|
201
|
+
raise ValueError('saved manifest readback differs')
|
|
202
|
+
result = {'ok': True, 'changed': True, 'manifest': str(path.relative_to(root))}
|
|
203
|
+
if history:
|
|
204
|
+
result['history'] = str(history.relative_to(root))
|
|
205
|
+
return result
|
|
206
|
+
finally:
|
|
207
|
+
if temporary and temporary.exists():
|
|
208
|
+
temporary.unlink()
|
|
209
|
+
lock.unlink()
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def execute(project_root, manifest, action, *, work=None, role=None, path=None,
|
|
213
|
+
capability_id=None, prd_id=None, manual=()):
|
|
214
|
+
root = Path(project_root).resolve()
|
|
215
|
+
if not root.is_dir():
|
|
216
|
+
raise ValueError('explicit project root must already exist')
|
|
217
|
+
if action == 'resolve':
|
|
218
|
+
if manifest:
|
|
219
|
+
target = _manifest_path(root, manifest)
|
|
220
|
+
if not target.is_file():
|
|
221
|
+
raise ValueError('manifest missing; no automatic creation in read-only resolve')
|
|
222
|
+
value = _load(target.read_bytes())
|
|
223
|
+
if work is not None and work != value['scope']['work']:
|
|
224
|
+
raise ValueError('manifest belongs to a different work scope')
|
|
225
|
+
elif manual and isinstance(work, str) and work.strip():
|
|
226
|
+
value = {'schemaVersion': 1, 'scope': {'work': work}, 'selected': {}}
|
|
227
|
+
else:
|
|
228
|
+
raise ValueError('resolve requires an explicit manifest or manual references with work scope')
|
|
229
|
+
return _resolve(root, value, capability_id, prd_id, manual)
|
|
230
|
+
target = _manifest_path(root, manifest)
|
|
231
|
+
old = target.read_bytes() if target.is_file() else None
|
|
232
|
+
if action == 'init':
|
|
233
|
+
if not isinstance(work, str) or not work.strip():
|
|
234
|
+
raise ValueError('init requires the actual work scope')
|
|
235
|
+
value = _load(old) if old is not None else {'schemaVersion': 1, 'scope': {'work': work}, 'selected': {}}
|
|
236
|
+
if value['scope']['work'] != work:
|
|
237
|
+
raise ValueError('existing manifest belongs to a different work scope')
|
|
238
|
+
return _store(root, target, old, value)
|
|
239
|
+
if action == 'select':
|
|
240
|
+
if manual:
|
|
241
|
+
raise ValueError('manual overrides are read-only resolve inputs')
|
|
242
|
+
if old is None:
|
|
243
|
+
raise ValueError('manifest missing; initialize the explicit work first or use manual resolve')
|
|
244
|
+
value = _load(old)
|
|
245
|
+
if work is not None and work != value['scope']['work']:
|
|
246
|
+
raise ValueError('manifest belongs to a different work scope')
|
|
247
|
+
reference = _reference(root, role, path, capability_id, prd_id)
|
|
248
|
+
_assign(value['selected'], reference)
|
|
249
|
+
return _store(root, target, old, value)
|
|
250
|
+
raise ValueError('handoff operation not implemented in this increment')
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def main():
|
|
254
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
255
|
+
parser.add_argument('action', choices=['init', 'select', 'resolve'])
|
|
256
|
+
parser.add_argument('--project-root', required=True)
|
|
257
|
+
parser.add_argument('--manifest')
|
|
258
|
+
parser.add_argument('--work')
|
|
259
|
+
parser.add_argument('--role', choices=sorted(GLOBAL_ROLES | TOPIC_ROLES))
|
|
260
|
+
parser.add_argument('--path')
|
|
261
|
+
parser.add_argument('--capability-id')
|
|
262
|
+
parser.add_argument('--prd-id')
|
|
263
|
+
parser.add_argument('--manual', action='append', default=[], metavar='ROLE=PATH')
|
|
264
|
+
args = parser.parse_args()
|
|
265
|
+
try:
|
|
266
|
+
result = execute(args.project_root, args.manifest, args.action, work=args.work,
|
|
267
|
+
role=args.role, path=args.path, capability_id=args.capability_id,
|
|
268
|
+
prd_id=args.prd_id, manual=args.manual)
|
|
269
|
+
except (OSError, ValueError, UnicodeError) as error:
|
|
270
|
+
print(json.dumps({'ok': False, 'error': str(error)}, ensure_ascii=False))
|
|
271
|
+
return 1
|
|
272
|
+
print(json.dumps(result, ensure_ascii=False))
|
|
273
|
+
return 0
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
if __name__ == '__main__':
|
|
277
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# 新增、修改、撤销需求与功能退役合同
|
|
2
|
+
|
|
3
|
+
<!-- i3:zh-guide:start -->
|
|
4
|
+
## 中文使用说明
|
|
5
|
+
|
|
6
|
+
按下文完整工程步骤、检查项与验证条件执行。根据任务选择适用步骤,保留证据、风险和退出条件;正文示例中的英文标签在面向用户输出时译为中文。
|
|
7
|
+
|
|
8
|
+
默认使用简体中文解释、追问及生成报告;用户明确要求其他语言时可切换。原方法正文、引用、阈值和审批条件完整保留。代码标识、路径、命令、工具参数、JSON 键/枚举与原文引用保持原样。
|
|
9
|
+
<!-- i3:zh-guide:end -->
|
|
10
|
+
|
|
11
|
+
合同版本:v0.1.1;资源组合:0.6.1。仅为明确企业作业使用的自有资料规则,不是新Skill/命令、JSON程序或工程执行器。资源定位见[入口](README.md),引用字段见[交接合同](handoff-contract.md),文档职责见[共用合同](template-contracts.md)。三份合同共同使用,业务JSON仍schemaVersion1,无新增必填状态字段。
|
|
12
|
+
|
|
13
|
+
## 1. 先分清意图和事实
|
|
14
|
+
|
|
15
|
+
| 意图 | 本次规格责任 | 工程责任 |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| 新增 | 同主题补行为或为独立目标新建prdId;复用相容BRD/公共规范,不按页面拆PBC | 本主题足以交接后增量交原Plan,不重新生成整个工程 |
|
|
18
|
+
| 修改 | 先读现稿、人工修改与真实来源,保留稳定需求/AC,输出完整当前目标和新增/修改/保留/撤销映射 | 核配套、任务、已实现和消费者影响;文字更正不机械全链升版 |
|
|
19
|
+
| 撤销需求 | 明确单项、部分范围或整个主题;保留仍有效内容与撤销依据 | 未实施取消待办,进行中核真实进展,已实现部分需要新的移除/迁移任务 |
|
|
20
|
+
| 功能退役 | 已实现或运行功能的停止/替代目标;假设与真实状态分开 | 新的兼容、移除、数据/任务迁移和回归;删PRD文件不表示代码或生产已退役 |
|
|
21
|
+
|
|
22
|
+
当前有效目标、任务实际状态、已发生工程事实分别从真实来源回读。selected仅表示明确采用的输入,不证明运行已切换或测试通过;工程及报告沿用原方法,不回写delivery。讨论、status、review/recheck和只读预览零项目写入。
|
|
23
|
+
|
|
24
|
+
## 2. 各阶段承接及来源
|
|
25
|
+
|
|
26
|
+
| 产物 | 必须核对的本阶段责任 |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| BRD | 业务目标/能力边界/跨PBC责任改变才修订;同PBC新增主题可复用已有BRD,不补造认可 |
|
|
29
|
+
| PRD | 固定capabilityId/prdId与仍有效FR/AC;完整当前目标、新旧映射、直接来源;部分撤销不删整个主题 |
|
|
30
|
+
| AD | 对应一份明确主题PRD,保留技术/功能/ER三图及详设;准确公共规范、正式契约、数据owner、消费者、实际骨架及影响/恢复 |
|
|
31
|
+
| TestCase | 同时核产品预期及AD技术判据;新增/变更、撤销后不可用或替代、迁移/失败恢复、保留行为和跨主题回归 |
|
|
32
|
+
|
|
33
|
+
一能力一目录,主题独立版本、配套不强制同号。允许同路径人工编辑,先读当前正文、旧稿和真实变更依据;不强制SHA、不恢复发行模板,不仅凭路径/版本继承旧认可。没有旧稿或未知业务决定,只限制依赖范围,不编造历史。
|
|
34
|
+
|
|
35
|
+
公共规范、共享契约、数据与状态有各自权威,必要直接及传递消费者明确;一个主题变化不自动改全部AD或删除共享底座。原型按需、AD可并行,已采用原型核appliesTo及影响,不借SOP改其登记。TestCase是Plan可选输入,验证要求须足够,缺文件可安排设计补齐,不取消企业测试设计交付。
|
|
36
|
+
|
|
37
|
+
## 3. 选用引用与需求变更
|
|
38
|
+
|
|
39
|
+
| 时点/对象 | 处理 |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| 本次生成或修订 | 完成后回读、保存并展示真实路径,按原方法交审;不自动更新JSON |
|
|
42
|
+
| 新主题/新版本 | 文档保留独立版本,明确采用后才登记selected;不自动替换Plan,不预填未来配套 |
|
|
43
|
+
| 明确选择 | 核正文和实际配套,保留选择前清单;不适用的旧配套移出本次选择并报缺口,不假配新PRD |
|
|
44
|
+
| 部分需求撤销 | 由完整新PRD表达撤销编号和保留行为,不删除整个topic;明确选用后再更新引用 |
|
|
45
|
+
| 整个未实施主题撤销 | 核任务与消费者,只处理本主题明确需要撤销的当前选择;其他主题及仍被消费的公共引用保持 |
|
|
46
|
+
| 已实现功能退役 | 选择真实退役目标,不用selected证明生产停用;保留旧运行依据、工程根和真实报告 |
|
|
47
|
+
| 已选路径缺失/移动 | 报具体断引用;新位置实际回读后才更新,缺失不推定撤销,不猜最高版或找history兜底 |
|
|
48
|
+
|
|
49
|
+
业务JSON不加approved/cancelled/完成率;理由和旧新映射可在项目已有PRD、AD影响表、Plan/唯一tracker或已有决定记录中表达,不强制新变更文件。清单只保存引用,不接管任务状态或生产状态。物理删除需要明确文件操作任务和引用/保留检查,不能顺带删除仍被Plan/报告引用的文件。
|
|
50
|
+
|
|
51
|
+
本资源不实现登记:S06/S08另建有限辅助并验证。文档成功、登记失败保留文档和旧清单,后续只补引用;只读作业不能补写清单。多个作业无整体事务保证,写前回读并发变化则停覆盖、保留差异;不凭提示词宣称消除竞态。
|
|
52
|
+
|
|
53
|
+
## 4. 原Plan与任务状态
|
|
54
|
+
|
|
55
|
+
Plan仍是tasks/plan.md,任务仍为默认tasks/todo.md或项目明确指定唯一tracker。原方法已有“同一工作重规划原位更新;不同工作存在未完计划时停止处理冲突”,不得覆盖/搬走旧计划、批量关闭其他工作或复制竞争待办。
|
|
56
|
+
|
|
57
|
+
| 实际任务状态 | 增量交接要求 |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| 已完成 | 原ID、来源、完成状态及证据保留;要移除该功能时新建退役任务,不撤勾或改写成按新版本完成 |
|
|
60
|
+
| 未开始且仍有效 | 保留;只对受影响来源、依赖、范围与验收作获准调整,不无故重建全部ID |
|
|
61
|
+
| 未开始且明确取消 | 退出有效未完集合,保留原ID、取消依据和依赖处理;不勾为完成,不让下一次Build误领 |
|
|
62
|
+
| 进行中/部分实现 | 核真实文件、进展、副作用和未知,停在受影响安全边界,保留人工工作;不自动reset/回滚/删工程 |
|
|
63
|
+
| 其他未完工作 | 原方法停止说明冲突,由用户决定范围,不越权修改 |
|
|
64
|
+
|
|
65
|
+
默认Markdown取消记录可用同一Plan/todo的独立文字区,不使用待办或完成复选框;具体形态须在S11实际验证Build不会误领。外部tracker按其真实支持及本次授权表达取消/不实施,不能当Done,也不复制本地状态表。恢复同语义需求是新的明确变更,保留恢复关系,不复用旧取消任务当新完成证据。
|
|
66
|
+
|
|
67
|
+
资料作业只交本次变更意图、准确文档及范围、现有代码/任务事实、受影响/保留需求和AC、共享消费者、验证/恢复与Q。后续明确调用原Plan才修订计划;任务记录实际路径及编号,不只留下可变JSON链接。只改JSON不算任务已取消,资料作业不直接修改Plan/tracker。
|
|
68
|
+
|
|
69
|
+
## 5. 原Build、工程与退役
|
|
70
|
+
|
|
71
|
+
Build按获准Plan的具体任务回读实际来源。新候选、selected改变或同路径改稿不自动切设计;下一受影响任务前核计划差量,未调整时不按旧稿实现撤销内容,也不偷偷按新稿施工。无关且已获准任务按依赖及原方法可继续,不全量重置。没有监测/锁能力时不承诺即时中断其他会话;在实际检查点处理,S11验证真实接点。
|
|
72
|
+
|
|
73
|
+
AD选择真实骨架,Plan安排,获准Build才应用/验证。保留pbc-composite/agent-standalone及frontend/backend/agents/jobs、contracts/shared/tests/delivery职责,既有人工代码、原始生成基线和有效工程锁不整仓覆盖。JSON或AD修改不证明工程已生成/更新;I4/I5实际工程与存量更新另验。
|
|
74
|
+
|
|
75
|
+
退役按实际适用范围明确:入口和替代/拒绝行为;API/事件及已知提供消费双方、兼容窗口/在途请求;共享数据、保留/迁移和权限;jobs/队列/Agent工具与重试;工程配置/部署/观察;恢复点、补偿和不可逆限制。未知结果先调查,不盲重试迁移或写操作。代码回滚不等于已删数据恢复,撤销需求不授权删库;具体工程/生产动作按真实授权和原风险停点执行。
|
|
76
|
+
|
|
77
|
+
## 6. 测试、审查和Ship
|
|
78
|
+
|
|
79
|
+
TestCase为设计,原TDD/适用测试及test负责真实测试代码/运行,原代码review保持自身方法;不把企业只读文档审查套到原review。文档审查只读标注真实问题、位置、来源、影响和最小建议;用户可人工修订、明确委托、有据不采纳或保留Q,不自动改实例或取消任务。
|
|
80
|
+
|
|
81
|
+
正式撤销/退役后,原正向测试可按真实新目标更新,但保留旧用例/原始报告和变更依据,补停用/拒绝/替代、迁移/恢复及未受影响回归。不能删失败用例、改阈值或降低覆盖制造通过,不以mock关闭必需真实集成。
|
|
82
|
+
|
|
83
|
+
报告绑定实际runId、输入/配套、代码或制品、环境/依赖、执行主体、原始证据和缺陷;失败、阻断、未运行、未知分别保留。审查报告由获准调用者按原约定另存,不要求在JSON重复登记。Ship GO只说明就绪,实际发布/部署/生产退役许可和回执分别取证。
|
|
84
|
+
|
|
85
|
+
## 7. 手动方式和任务结束
|
|
86
|
+
|
|
87
|
+
无JSON时仍可原命令/适用Skill+明确任务+真实路径,读取原文和变更依据,不强制建清单、补BRD、安装登记程序或修改项目默认。不增加add/delete/retire操作;未来/i3-sop和显式Skill共用相同阶段规则,using不增路由,跨阶段auto留3.1.0。
|
|
88
|
+
|
|
89
|
+
本次结束说明真实文档/来源/读写、意图与影响、文档存在/选用/任务/运行事实、Q和未执行范围。原方法的澄清、内容、工具、认可和停轮保留;一次单阶段作业不自动连改下一文档、Plan、代码、生产或发布。资源、严格读取、完整生成、独立审查、实际工程、人审和发布各自取证,规则存在不等于已实现稳定自动化。
|
|
90
|
+
|
|
91
|
+
B05收口补充:影响结论绑定实际核查范围;对未知消费者、历史数据和恢复条件保留待核,不写成无消费者/无需迁移。回读完成以[共用合同](template-contracts.md)末次编辑后全文要求为准,外层工具仅校验证据,不授予JSON、任务、代码或生产写入。
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# SOP Plan:选定规格交给原规划能力
|
|
2
|
+
|
|
3
|
+
<!-- i3:zh-guide:start -->
|
|
4
|
+
## 中文使用说明
|
|
5
|
+
|
|
6
|
+
按下文完整工程步骤、检查项与验证条件执行。根据任务选择适用步骤,保留证据、风险和退出条件;正文示例中的英文标签在面向用户输出时译为中文。
|
|
7
|
+
|
|
8
|
+
默认使用简体中文解释、追问及生成报告;用户明确要求其他语言时可切换。原方法正文、引用、阈值和审批条件完整保留。代码标识、路径、命令、工具参数、JSON 键/枚举与原文引用保持原样。
|
|
9
|
+
<!-- i3:zh-guide:end -->
|
|
10
|
+
|
|
11
|
+
合同版本:v0.2.2。`/i3-sop plan` 与显式 i3-enterprise-sop 的plan动作共用本合同,只做一次明确规划。四阶段文档仍由原Spec生成/修订;plan不生成第五份规格,不调用Build、测试执行、提交或发布。普通标准 `/i3-plan` 保持原入口,不强制读取本资料或handoff。
|
|
12
|
+
|
|
13
|
+
**统一读取准备:**JSON与手动路径共用同一准备环节;手动只免JSON解析,不免共用规则。先从项目实际采用记录或当前宿主真实安装清单确定所选资料根,不从skills目录猜路径。CodeBuddy无项目自改采用根时显式Glob `.codebuddy/.*composer*.json`,读取name/version/scope/resources,以清单所在目录解析resources.references;再定位该根。原 `/i3-plan` 命令可用 `.codebuddy/commands/*plan*` 定位;无项目安装才查同宿主真实全局登记,不读其他宿主副本。
|
|
14
|
+
|
|
15
|
+
**首批必读:**完整Read原 `/i3-plan` 命令正文,以及所选根README.md、stages.json、template-contracts.md、handoff-contract.md、本plan-handoff.md。索引planHandoff.requiredResourceReads是共用文件名的同一清单,调用者和外层验证据此固定实际路径;不能只读最后一份,不用用户补内部路径。必要正文仍由模型实际读取,脚本解析索引不能冒充读取回执。项目自改资料优先,未确认完整覆盖时仍读其选定原件,不回退发行副本。
|
|
16
|
+
|
|
17
|
+
资料和目录定位用Read/Glob/Grep,不调用ls/find/mkdir等shell探测或试验权限。解析辅助仅在本次真实工具许可范围内使用,不将工具名可见视作任意命令获准;失败尝试保留且准确报告。此处约束SOP准备环节,不改原规划方法或增加权限。
|
|
18
|
+
|
|
19
|
+
**进入原规划前的检查点:**共用文件及原命令全文已读→准确业务/技术输入已读且身份/直接上游无冲突→实际加载原规划Skill成功→允许原plan/todo写入。缺读/部分读/失败先补齐,未齐停止;身份或上游冲突按§2.1先停,不因打算写待审稿绕过。原Skill已加载、命令名称或自述合规均不代替其他条件。最终列出实际共用读取、原命令路径及真实失败。此检查点统一既有要求,不新增用户必填参数、通用拦截器或业务JSON字段。
|
|
20
|
+
|
|
21
|
+
## 1. 对象明确后再规划
|
|
22
|
+
|
|
23
|
+
只读核当前项目与已采用规则、输入选择、真实资料和现有任务目标。用户可只输入 `/i3-sop plan`,或加一句主题;唯一材料与有效选择足够时直接承接,不要求再写长提示词或内部路径。多清单/多主题、动作正文矛盾、关键缺口或不同工作的未完计划,先说明实际选项、原因和建议并等待。无答复或取消零写入,不能按最大版本、目录顺序或模型推荐代选。
|
|
24
|
+
|
|
25
|
+
先区分清单路径交接和手动方式。显式给清单、项目实际采用记录或当前唯一且适用的清单均须真实读取;清单存在本身不改变标准流程或证明业务认可。损坏、不可读或未知格式先报告,不静默换源或退回手动掩盖。没有清单时可请用户明确实际AD及其配套或选择已有手动材料,不强制创建JSON、补BRD或重走前序。范围选择仅为本次会话,不写入永久偏好。
|
|
26
|
+
|
|
27
|
+
资源按本次明确材料→项目已采用自改副本→同宿主项目安装→同宿主可读全局定位。已选项目源失效就报告,不探读低优先级根来替代;不能确认自改合同已覆盖时完整读项目选定原件,不恢复发行副本。当前项目实际采用的CONSTRAINTS/ADR/技术规则照常有效。
|
|
28
|
+
|
|
29
|
+
## 2. 只读解析并实际读原文
|
|
30
|
+
|
|
31
|
+
先完成首批必读,再区分JSON解析和手动路径读取。两种方式均读所选根README、本索引stages.json、template-contracts.md、handoff-contract.md和本合同;生命周期或恢复有实质影响时读其适用约定。plan不加载BRD/PRD/AD/TestCase模板及其生成/审查提示词。项目规则及真实业务/技术依据必须实际回读。
|
|
32
|
+
|
|
33
|
+
复用[handoff.py](handoff.py)的 `resolve`,先核实际 `--help`;相对路径以明确的业务项目根解析,不以清单目录解析。以capabilityId+prdId识别本主题,明确组合逐主题解析;不以单个AD或JSON代替完整规格。工具返回路径不证明模型已读、配套正确或获得批准。
|
|
34
|
+
|
|
35
|
+
清单顶层仍仅schemaVersion、scope、selected。读取selected.technicalBaseline和本主题prd/ad/contracts/engineeringSkeleton及适用testCase/prototype;BRD按追溯需要读。不调用init/select/改选,不写JSON、审批、delivery、candidates、activeTopic或任务状态。
|
|
36
|
+
|
|
37
|
+
Python不可用时直接按用户明确的手动路径及准确引用读取,不安装环境或改JSON。手动输入可临时覆盖相同角色,但须说明与既有选择的差异,不持久化selected。现有resolve不做语义验证;身份、文件与正文版本、直接上游、共享权威与消费者影响由本次实际材料核对。
|
|
38
|
+
|
|
39
|
+
| 必要输入 | 如何核对 |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| 当前主题PRD+配套AD | 完整读取本次有效正文,核能力/主题、独立版本、AD直接上游和需求/AC;不猜高版本、不读另一主题替代 |
|
|
42
|
+
| 已采用技术规约与质量边界 | 真实文档或适用CONSTRAINTS/ADR;不是空模板。若已由AD/项目规则完整承载,不强制另建总规约 |
|
|
43
|
+
| 必要共享契约 | 当前接口、事件、数据责任、兼容/迁移和实际权威;跨主题只读所依赖定义,不全量加载所有AD或历史 |
|
|
44
|
+
| 工程采用/骨架来源 | 准确采用说明、来源版本、目录/模块责任和已有结构映射;规范不冒充可运行工程;初始化、调整或迁移按实际缺口排任务 |
|
|
45
|
+
| 相关代码及工程事实 | 实际完整读取相关源码及本项目依赖/构建配置,按真实技术栈定位,例如Node项目package.json;不能以AD/规范里的命令代替读取现有配置。核真实测试命令及示例,区分拟建与已有,不虚构已构建成功 |
|
|
46
|
+
| TestCase/原型 | 已形成且适用就核准确配套和范围。没有独立TestCase不统一阻断Plan,测试策略从AD/实际规范承接并排必要补齐;原型按需,无界面不强制补画 |
|
|
47
|
+
| 当前Plan/唯一任务目标 | 实际读取;不同工作未完先问,不覆盖或静默另起权威;同工作修订保留人工内容及已完成事实 |
|
|
48
|
+
|
|
49
|
+
逐项定位原SPEC六项:目标、完整可执行命令、项目结构、代码风格及示例、测试策略、Always/Ask first/Never工程边界。关键缺口先说明依赖影响;只有§2.1身份与直接上游已核一致后,非阻断缺口才可在明确范围内规划独立部分,不能用此条跨过身份停点或杜撰技术决定。长文按段覆盖并记录范围,摘要只导航,不以省上下文省略必要业务依据,不承诺固定耗时。
|
|
50
|
+
|
|
51
|
+
### 2.1 身份或直接上游冲突先停
|
|
52
|
+
|
|
53
|
+
对照本次准确PRD、AD正文的能力/主题标识、AD声明的直接上游路径与PRD版本,以及适用清单/手动选择。已声明内容互相矛盾时先报告冲突,不加载原规划、不创建或修改plan/todo,也不另存候选计划。即使AD正文功能一致、模型判断头部疑似笔误,身份仍不能由模型自行裁定;只给原文证据、影响、建议和可选操作,等待人工处理后重新核对,不修业务稿或JSON。选择了某个文件路径不等于确认了文件内部矛盾。
|
|
54
|
+
|
|
55
|
+
PRD与AD各自独立版本不必相同,例如PRD v0.0.1与AD v0.0.3明确引用该PRD v0.0.1是允许的;AD改引另一主题、错误路径或不同PRD版本则须先停。缺独立TestCase/原型仍按需处理,不扩大为统一规划前置。无冲突后的非阻断Q保留人工空间,不要求问题清零。
|
|
56
|
+
|
|
57
|
+
## 3. 实际复用原Plan
|
|
58
|
+
|
|
59
|
+
依据本宿主真实安装清单/命令目录定位原 `/i3-plan`(TOML宿主可能登记为planning),实际读当前命令义务;不要复制一份删减规则或写死开发工作区路径。加载原 [i3-planning-and-task-breakdown Skill](../../skills/i3-planning-and-task-breakdown/SKILL.md)并取得本宿主正式机制的成功回执,再执行原方法。资源版本与安装位置须以实际文件核对。
|
|
60
|
+
|
|
61
|
+
有正式命令转交能力时记录真实转交;只有Skill工具时实际加载该Skill并履行原命令义务。两者如实区分,不能把Skill加载称为执行另一个slash命令。调用拒绝/失败或没有正式机制时停止,不裸跑生成计划;当前主会话阅读本说明不构成原规划已调用证据。
|
|
62
|
+
|
|
63
|
+
把上述实际引用、本次目标和必要澄清组织为内部规划任务,直接交原规划方法,不要求用户再复制提示词。原Plan负责只读理解、依赖图、纵向切片、AC/验证步骤、检查点和风险;本合同不重写其算法。计划文件的保存仍按原规则允许,不把“只读理解”误作不能写规划产物。
|
|
64
|
+
|
|
65
|
+
## 4. 原产物与停点
|
|
66
|
+
|
|
67
|
+
保持原默认 `tasks/plan.md` 与 `tasks/todo.md`,或项目已有明确且原规则允许的外部唯一任务目标。不得改原命令、另建SOP任务格式或覆盖不同工作的未完计划。计划内保留实际来源路径、正文版本、主题、FR/AC、必要共享依赖和验证依据;不能只留下一个可变JSON链接。
|
|
68
|
+
|
|
69
|
+
来源表列本次实际使用的PRD、AD、技术规范、共享契约、工程采用说明的完整项目相对路径和文档版本;明确项目外来源才用绝对路径。AD_v…、契约简称或JSON位置不代替准确来源。最终回读时逐项对照实际读取集合,缺引用先补齐原Plan再全文回读交审,不能只在会话报告补路径;不据此改写输入业务稿。
|
|
70
|
+
|
|
71
|
+
本动作只允许原规划产物,不改业务稿、JSON、采用记录、工程配置或代码。最后写入后完整回读实际plan与唯一任务目标,核覆盖和差量;来源在执行中变化须报告,不把旧任务套新设计。展示实际路径、未决项和范围,交人工审阅并停轮,不代批或自动Build。
|
|
72
|
+
|
|
73
|
+
使用者另行批准后调用原 `/i3-build` 或 `/i3-build auto`。有效规格路径、Git基线、完整计划明确认可、逐任务测试/构建/提交和风险停点均保留。未提交JSON、项目指引等仍可能触发原Git停点,不自动ignore、不擅自提交来规避;非默认位置与auto有冲突时如实说明。企业跨阶段auto属于3.1.0,不能由plan暗中启动。
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# 企业 SOP · PRD 资源切片
|
|
2
|
+
|
|
3
|
+
<!-- i3:zh-guide:start -->
|
|
4
|
+
## 中文使用说明
|
|
5
|
+
|
|
6
|
+
按下文完整工程步骤、检查项与验证条件执行。根据任务选择适用步骤,保留证据、风险和退出条件;正文示例中的英文标签在面向用户输出时译为中文。
|
|
7
|
+
|
|
8
|
+
默认使用简体中文解释、追问及生成报告;用户明确要求其他语言时可切换。原方法正文、引用、阈值和审批条件完整保留。代码标识、路径、命令、工具参数、JSON 键/枚举与原文引用保持原样。
|
|
9
|
+
<!-- i3:zh-guide:end -->
|
|
10
|
+
|
|
11
|
+
当前子包版本:0.3.3;模板内容版本沿本阶段manifest,正文不改。下文B05等旧版本文字保留为历史说明。
|
|
12
|
+
|
|
13
|
+
审查加载分支:review/recheck完整读取本README、完整模板、唯一动作、实际业务与采用约束,依[统一审查约定](../review-handoff.md)由外层解析元数据并保留变化核对。下文涉及整套共用文件的加载要求在这两个动作按该分支理解;未知自改组合完整读选定原件,其余作业及实质条款保持。
|
|
14
|
+
|
|
15
|
+
本切片提供 PRD v0.0.4 固定模板、四阶段任务提示词及使用说明,用“原命令或原 Skill+本次明确任务+实际采用模板”制作一个需求主题的 PRD 候选。它是自有补充资料,不是新增 Skill、命令、Persona、自动调度或机器门禁;当前发行基线仍为 **26 Skills/10 个逻辑命令/4 Personas**,继承的原 25/9 及已确认增量不因本切片改变。
|
|
16
|
+
|
|
17
|
+
本文、合同承接页及 AD 承接页为本切片编写的说明。source 中的 [templates/PRD.md](templates/PRD.md) 为自有分发模板 v0.0.4,基于设计模板 v0.0.3 清理历史迁移页的引用及说明;行为卡、AC、S01—S14 与共用 G01—G08 的有效要求全部保留,任务直接读取当前模板和合同。distribution 中的模板经过既有品牌转换流程插入标准 8 行中文指南,除此之外保留 source 模板正文;不能声称 source、distribution 和安装件的模板全链字节相同。其中“草案、待评审、未作为运行技能安装”等文字保留其来源语境。资源被打包、安装或明确选用,不自动变成业务认可或完整 3.0 交付。
|
|
18
|
+
|
|
19
|
+
## 1. 先选择材料,再开始一次文档任务
|
|
20
|
+
|
|
21
|
+
项目已启用企业资料指引时,模型可按本次明确业务任务查找采用记录、安装清单与本资源清单,自动整理下述路径和任务卡。未明确选择企业 SOP 时不采用这些企业材料;本轮标准流程要求优先。用户不必逐项输入路径,模型只对真实缺口、歧义、冲突和覆盖风险提问。项目指引随同位的企业资源入口交付,当前资源清单仍只登记本 PRD 子目录。
|
|
22
|
+
|
|
23
|
+
1. 读取随包 `assets-manifest.json`,核对模板版本、来源身份、文件摘要和适用范围。缺失或不一致时列准确缺口,不能猜测“已经安装”或“已采用”。
|
|
24
|
+
2. 确定真实项目根、PBC、`capabilityId`、主题 `prdId`、本次文档版本与唯一目标路径。一个 PBC 可有多个主题;主题各自演进,不能把同号文件当成同一文档或自动配套关系。
|
|
25
|
+
3. 选择可回读的业务来源、BRD、真实答复、前版、共享规则及适用原型;登记准确版本、条目、实际已读范围和用途。早期 PRD 不要求尚未形成的 AD/TestCase;不存在就写“未形成”。
|
|
26
|
+
4. 决定直接采用包内固定模板,或采用已准备好的项目副本。明确读到的模板位置、版本、来源摘要和本地修改,不能仅写“使用最新版”。
|
|
27
|
+
5. 按清单定位 [生成提示词](prompts/01-generate.md);模型从已读材料补齐任务卡,候选完成后结束当前轮。另用独立上下文做[只读审查](prompts/02-review.md),再由作者[修订](prompts/03-revise.md),最后[独立复查](prompts/04-recheck.md)。每次任务均需明确范围,四份提示词不自动串行执行。
|
|
28
|
+
|
|
29
|
+
真实项目可按自身约定保存 `{PBC}-{需求主题}-PRD_v0.0.1.md`。初始版本只是示例;不能为了套用模板改名、重编稳定 ID、伪造版本历史或覆盖已有人工内容。正文身份与准确引用优先于显示名称和文件名。
|
|
30
|
+
|
|
31
|
+
## 2. 原命令与直接 Skill 两种入口
|
|
32
|
+
|
|
33
|
+
两种入口使用同一份明确任务、业务输入、模板、输出及停点。以下英文名称是 source 入口名称;品牌化版本和不同宿主的实际显示名称、调用能力,以本次安装与发现结果为准。不要把一种宿主的安装路径或命令写法当成通用路径。
|
|
34
|
+
|
|
35
|
+
| 入口 | 使用方法 | 必须核对的边界 |
|
|
36
|
+
| --- | --- | --- |
|
|
37
|
+
| 短命令 | 先发完整生成任务,要求核对输入、模板和拟写位置后复述并等待;然后在支持该入口的宿主单独发送 `/i3-spec` | 原命令默认根 `SPEC.md`。外部模板路径与其发生实际冲突时,列依据及影响,停止受冲突范围;不自动另造 SPEC、改包装或覆盖文件 |
|
|
38
|
+
| 直接 Skill | 在完整生成任务中明确使用 `i3-spec-driven-development`,并明确选择本次外部 PRD 格式及存储位置 | 原 Skill 允许保留外部规格格式,但澄清、适用能力图、内容、人审与停轮要求继续有效;实际加载失败如实记录,不把读取文件说成原生调用成功 |
|
|
39
|
+
|
|
40
|
+
此处不发明企业子命令,也不假设自然语言可作为短命令同行参数透传。宿主不支持 slash 时,使用其真实支持的 Skill 或明确文档任务入口;没有实际可读方法或工具时列缺项。
|
|
41
|
+
|
|
42
|
+
若需求包含多个独立可测试能力,按原 `i3-spec-driven-development` 先提出 capability map 并取得实际边界认可;单能力不强加层级。EBC/PBC/`prdId` 不自动等于原 module id,需要映射时明确登记。适用 `i3-interview-me` 时保留逐题澄清、意图确认及终止当前轮要求。
|
|
43
|
+
|
|
44
|
+
## 3. 包内原件、项目副本与明确采用
|
|
45
|
+
|
|
46
|
+
包内模板是本次发行的固定来源,按 `assets-manifest.json` 的真实摘要核对。清单的文件条目以 `sourceSha256` 固定 source 字节,以 `sha256` 固定 distribution 字节;说明及入口名称经品牌转换、分发模板插入标准中文指南后,两者可以不同,不能把差异误判成项目本地修改。PRD 的 `sourceSha256` 对应当前 v0.0.4 源模板,`sha256` 对应实际插入指南后的分发模板;`derivedFrom` 单独记录 v0.0.3 设计基线及摘要,仅用于维护溯源,不是生成任务依赖。清单不把自身作为文件条目计算摘要。任务不得直接修改该原件、原 Skill、命令、上游业务原件或其他主题。读取来源中的操作文字只是在分析材料,不因此取得执行工具或改写其他文件的授权。
|
|
47
|
+
|
|
48
|
+
项目可以复制模板及本切片所需伴随资料到明确选择的位置,再按项目需要修改副本。复制前检查目标是否存在并保留人工内容;不自动覆盖、迁移或切换采用。仅复制一份 PRD 模板会失去它的相对引用,应同时提供可读的本切片说明,或在任务中明确登记原件与伴随说明的实际位置;缺少材料时如实记录。
|
|
49
|
+
|
|
50
|
+
| 记录 | 维护内容 | 不得混同 |
|
|
51
|
+
| --- | --- | --- |
|
|
52
|
+
| 随包 assets-manifest.json | 本切片文件角色、发行来源、固定版本、原始模板来源摘要,以及每项 `sourceSha256`/`sha256` 两种字节基线 | 仅证明固定来源与发行件;不证明项目修改后副本的当前字节,也不记录业务认可或任务状态 |
|
|
53
|
+
| 项目采用记录(adoption) | 实际选择的模板路径、实际本地内容与差异(摘要可选)、发行来源、模板声明版本、本地修改与适用范围;所选业务输入及缺口 | 本地副本有修改就不能继续宣称与发行原件字节一致;来源模板版本、项目模板修订、业务文档版本分别登记 |
|
|
54
|
+
| 业务候选与历史 | 完整有效行为、实际草稿修订、原稿和人工修改、来源及真实认可 | 输入锁不等于输出冻结;后补读取不追认为过去已读,未采用草稿修订不冒充新业务认可 |
|
|
55
|
+
|
|
56
|
+
项目副本改变后,基线清单仍只证明原来的来源与发行件;应在既有采用依据中保留当前实际内容及修改说明(摘要可选),不修改清单冒充新的发行基线。采用可以写在现有任务说明、文档来源区或项目已有记录中,不要求新 registry、writer、配置文件或状态数据库。没有计算摘要就写未计算,不填占位摘要,也不要求文档在自身正文写自己的 SHA。内容已被明确采用或作为证据固定后,不得用同一不可变身份覆盖不同内容;无内容变化不因重跑伪造版本。
|
|
57
|
+
|
|
58
|
+
## 4. 内容与来源必须一起交付
|
|
59
|
+
|
|
60
|
+
PRD 维护完整产品目标、范围、角色和数据范围、对象与状态、流程、页面和协作、详细行为及可测 AC。全部有效行为从 §0.3 定位唯一完整来源,§4.2 只是同一集合的目录;新增、修改、保留、替代、停用以及比较材料分别表达,不能只交差异摘要或复活旧来源中已被替代的条目。
|
|
61
|
+
|
|
62
|
+
写前公开本次新增假设或设计选择的准确来源、候选性质和影响。每项新增规范性断言都回查来源与强度,区分原文明示、来源内推导、真实确认、冲突、演练假设和待确认建议。明示不等于业务获批;推导不扩展为无源权限、状态、指标、外部系统或范围。实质业务选择不能安全保持未决时,澄清并停止依赖它的范围;无依赖部分可继续,明确限制。
|
|
63
|
+
|
|
64
|
+
角色表、业务规则、流程、页面、行为卡、AC 和问题表的权限条件必须一致。多角色组合按实际来源核对,不能仅因存在另一角色就取消已有授权,也不能把全读推成代执行;特别禁止的适用对象与时间范围同样需要来源。分别核字段生成、存储、展示、编辑,业务前提、系统必须检查及系统明确不判断;校验拒绝、无权限、技术失败、结果未知和恢复不能用一句“失败”合并。
|
|
65
|
+
|
|
66
|
+
每张表按自身表头逐行核列数与列义;复合 AC 拆出可定位子项,保留条件、例外、允许与禁止副作用。实际保存后使用可用读取工具回读;未读、读取失败、部分读取分别如实写,作者自查不能替代独立审查或人审。
|
|
67
|
+
|
|
68
|
+
### 4.1 SPEC 六项由完整规格集合承接
|
|
69
|
+
|
|
70
|
+
| 原要求 | 权威承接 | 必须保留的具体内容 |
|
|
71
|
+
| --- | --- | --- |
|
|
72
|
+
| Objective | BRD/PRD;PRD §1、§3、§6 | 用户、问题、业务价值和可测成功条件;功能验收与真实业务收益分开 |
|
|
73
|
+
| Commands | AD §9.1;TestCase §3.1 固定引用 | build/test/lint/dev 完整命令、参数、cwd、前提及副作用,不只列工具名 |
|
|
74
|
+
| Project Structure | AD §3.2、§9.2 | 源码、测试、文档、适用生成物的位置及责任,拟建与已有分开 |
|
|
75
|
+
| Code Style | AD §9.3 | 真实可定位示例,或固定规范及其实际示例、命名和格式范围 |
|
|
76
|
+
| Testing Strategy | TestCase §2、§3.1、§5;AD §9.1、§9.5 | 框架与版本、目录、层级、命令、条件、覆盖要求及来源 |
|
|
77
|
+
| Boundaries | AD §9.4;BRD/PRD 提供业务依据 | Always do/Ask first/Never do;保留原方法与项目工程授权边界 |
|
|
78
|
+
|
|
79
|
+
AD 另承接技术栈与精确版本、字段/API/数据库、权限实施、事务、并发、迁移及恢复;TestCase 直接从选定 PRD 取产品预期,再核 AD 技术判据。实际运行结果另存 TestReport。这里的章节号是设计合同的承接定位,不表示本包已交付相应完整模板或实例;当前缺项逐项注明。
|
|
80
|
+
|
|
81
|
+
早期 PRD 可先形成业务候选;不能凭此宣称六项完整、完整 Spec 已获认可、可计划或可编码。不为补六项另造第五核心规格或强制复制一份 SPEC;标准项目已有 SPEC 及其原约定继续保留。Plan、唯一任务清单或实际指定 tracker、CONSTRAINTS、ADR、原型、正式契约、测试代码及真实报告继续按适用方法维护。
|
|
82
|
+
|
|
83
|
+
## 5. S01—S14 与 G01—G08 逐项核对
|
|
84
|
+
|
|
85
|
+
这些是内容检查编号,既不是阶段状态,也不是已实现的机器门禁。每项填写实际位置、证据、齐备/部分/缺失/不适用及理由,不能只勾总项或比较覆盖数量。[固定模板](templates/PRD.md) §10.2 保留 S01—S14 完整清单;以下给出本切片使用索引。
|
|
86
|
+
|
|
87
|
+
| 编号 | 必须核对的内容 | PRD 定位 |
|
|
88
|
+
| --- | --- | --- |
|
|
89
|
+
| S01 | 上游目标、业务假设、验证闭环、纳入及排除有来源,未知指标保持缺口 | §1/§2/§4.1 |
|
|
90
|
+
| S02 | 每条有效行为有唯一固定完整来源;Feature/Story 与既有编号映射可追溯 | §0.3/§4.2/§6 |
|
|
91
|
+
| S03 | 角色、前置、动作、状态、结果、拒绝/失败/未知/重复达到可原型、可测试粒度 | §6九项行为卡 |
|
|
92
|
+
| S04 | AC 可判断、前置可构造、复合子项完整、跨卡引用可定位,测试不猜预期 | §6逐条 AC |
|
|
93
|
+
| S05 | 规则、对象、页面只有一个权威定义,专用行为有来源 | §3/§5/§6/§7 |
|
|
94
|
+
| S06 | 跨功能/主题闭环一致;已知执行依赖与业务问题分开,既有影响及回归输入明确 | §4.1/§4.3/§8.1/§9 |
|
|
95
|
+
| S07 | 优先级沿用来源;必需路径降级/移出/停用有理由、闭环影响、受影响条目和真实确认 | §4.2/§0.2 |
|
|
96
|
+
| S08 | 候选及同一问题关联保留,展开行为不把候选变成确定需求 | §0.1/§6/§9 |
|
|
97
|
+
| S09 | 业务前提、系统检查和明确不判断事项分别表达 | §2/§3/§5/§6 |
|
|
98
|
+
| S10 | 冲突保留双方,问题绑定行为/AC、具体受阻交接和真实关闭依据 | §9 |
|
|
99
|
+
| S11 | 变化追到受影响行为、AC 及下游复核,旧确认不静默转移 | §0.2/§9/§10 |
|
|
100
|
+
| S12 | 完整有效集合可定位,目标、上下文和比较分开,缺项不冒充齐备 | §0.3/§4.2 |
|
|
101
|
+
| S13 | 产品与工程责任、原型/AD/TestCase/Plan 的分范围交接明确,保留六项及原认可 | §10.3 |
|
|
102
|
+
| S14 | G01—G08 每项有实际位置及结果 | §0/§10 与下表 |
|
|
103
|
+
|
|
104
|
+
### 5.1 G01—G08 共用检查
|
|
105
|
+
|
|
106
|
+
| 编号 | 当前必须保留的要求 |
|
|
107
|
+
| --- | --- |
|
|
108
|
+
| G01 | 文档、能力、主题、版本及实际位置可定位;未绑定如实写,不猜项目或主题 |
|
|
109
|
+
| G02 | 明示、推导、真实确认、冲突、演练假设分别表达;候选不自动变确定 |
|
|
110
|
+
| G03 | 全量核对目标、价值、角色、范围、场景、附件、质量及明确排除,不只读场景摘要 |
|
|
111
|
+
| G04 | 输入及附件可回读,版本矛盾照录、缺附件登记、不自动取最新;真实已读范围有依据 |
|
|
112
|
+
| G05 | 当前有效目标、上下文、比较基准及真实实现/生产现状分开;保留需求不证明代码可复用 |
|
|
113
|
+
| G06 | 修订先读旧稿及人工修改,保留原件、理由、影响;无变化不加版本,模板/方法变化不自动重建或重放外部动作 |
|
|
114
|
+
| G07 | 认可绑定实际修订、范围、参与者、时间及固定记录;模板、业务、开工、生产认可分别表达,不预填批准/实现/测试通过 |
|
|
115
|
+
| G08 | 规则和执行状态各有单一权威;缺口限制具体依赖范围,不造平行状态表或任务数据库 |
|
|
116
|
+
|
|
117
|
+
沿用 FT/US/FR/AC,不假定 FR 与 US 一对一,也不为套模板重编 ID。已知依赖写双方、准确对象及版本、影响 Story/AC、冻结或决定时点、联调组织、环境/数据/权限/服务前提、责任及实际状态;未知不伪造已就绪。未获真实确认的范围缩减不能删除有效要求。
|
|
118
|
+
|
|
119
|
+
## 6. 停点、证据与本切片边界
|
|
120
|
+
|
|
121
|
+
保存规格后总结候选、开放问题和无法交接范围,请求人审并结束当前轮;后续轮取得原方法要求的真实认可,再考虑规划。审查只判断是否可交人工审阅,不能代签业务批准;修订或复查也不自动进入 Plan、Build、测试执行、提交、部署或发布。既有真实授权按原对象和范围延续,不为每份文件增设机械审批。
|
|
122
|
+
|
|
123
|
+
项目明确选择某版 PRD 时,只登记当前需要的输入;以后选 AD/TestCase 时固定各自版本及直接上游,不强制同号、不按最大版本猜组合。PRD 可提供行为/AC、执行依赖、变化和产品回归输入;交 Plan 仍需适用 AD/TestCase、工程规范、六项和原认可。原 Plan 默认 `tasks/plan.md`;任务默认 `tasks/todo.md`,或项目明确指定且真实可用的 tracker,避免双写当前状态。
|
|
124
|
+
|
|
125
|
+
I1 的一个合成案例在 CodeBuddy CLI/默认模型下完成了 PRD v0.0.3 直接 Skill 的生成、独立审查、修订和复查;同轮短命令作业是 BRD,不能据此宣称新版 PRD 在两个入口及全部宿主均通过。证据只支持当次文档范围,不证明业务人审、I1 整体通过、真实系统实现或执行许可。v0.0.4 仅清理模板说明依赖,先前模型执行记录仍对应当时的 v0.0.3,不能充作 v0.0.4 的新模型执行证据。`assets-manifest.json` 的 `designSources[]` 记录合同原设计的路径、版本及摘要,`derivedFrom` 记录模板设计基线,`designEvidence` 记录 I1 来源报告与证据摘要;它们均标记 `included:false`,只供维护溯源,不随包提供,也不代表安装后可直接读取这些路径。`files` 中合同说明页的摘要只对应该说明页本身,不能当作原设计摘要。未取得并实际读取来源原件时,不声称本次已回查其内容。
|
|
126
|
+
|
|
127
|
+
本切片没有交付 BRD 模板、完整 AD 模板、TestCase 模板、业务实例、工程骨架或生成器、统一 config、研发调度 Agent、自动选版或企业 auto。`templates/AD.md` 仅说明未来工程责任。只新增资料不改变 26/10/4,不把静态检查、包内存在、宿主发现、模型执行、人工认可、安装回归或正式发行互相替代。
|
|
128
|
+
|
|
129
|
+
## B05 变更交接规则
|
|
130
|
+
|
|
131
|
+
B05当时资源子包0.3.0;本次增量见收口说明,模板正文和版本保持。按[入口](../README.md)§3列本次必要读取,实际读三份共用合同及本次唯一动作;[生命周期合同](../lifecycle-contract.md)统一新增、修改、撤销和退役,不新增命令、JSON程序或工程执行器。
|
|
132
|
+
|
|
133
|
+
保持主题、FR/AC身份和完整当前目标;明确新增/修改/保留/撤销及真实来源,部分撤销不删整个主题,已实现事实不因目标撤销消失。原方法停点、只读审查与人工空间、候选/选择/Plan边界保留,项目副本升级不覆盖人工内容。
|
|
134
|
+
|
|
135
|
+
## B05收口资源增量
|
|
136
|
+
|
|
137
|
+
B05当时子包0.3.1,模板正文及版本不改。统一修订全文回读措辞、适用来源和单项目审查证据;外层校验见[说明](../verification/README.md)。不把辅助资料/Plan统一变前置,不自动改业务稿、JSON、任务或原版方法。旧验证与历史版本按当时对象保留。
|