clean-room-skill 0.1.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.
Files changed (56) hide show
  1. package/.claude-plugin/marketplace.json +19 -0
  2. package/.claude-plugin/plugin.json +20 -0
  3. package/.codex-plugin/plugin.json +36 -0
  4. package/LICENSE +21 -0
  5. package/README.md +376 -0
  6. package/agents/clean-architect.md +27 -0
  7. package/agents/clean-qa-editor.md +27 -0
  8. package/agents/contaminated-manager-verifier.md +35 -0
  9. package/agents/contaminated-source-analyst.md +26 -0
  10. package/bin/install.js +535 -0
  11. package/examples/codex/.codex/agents/clean-architect.toml +17 -0
  12. package/examples/codex/.codex/agents/clean-qa-editor.toml +17 -0
  13. package/examples/codex/.codex/agents/contaminated-manager-verifier.toml +21 -0
  14. package/examples/codex/.codex/agents/contaminated-source-analyst.toml +17 -0
  15. package/hooks/check-artifact-leakage.py +317 -0
  16. package/hooks/clean-room-hook.py +88 -0
  17. package/hooks/clean_room_paths.py +130 -0
  18. package/hooks/deny-clean-room-shell.py +30 -0
  19. package/hooks/deny-clean-source-read.py +104 -0
  20. package/hooks/deny-contaminated-clean-write.py +134 -0
  21. package/hooks/hooks.json +44 -0
  22. package/hooks/require-clean-room-env.py +127 -0
  23. package/hooks/validate-handoff-package.py +140 -0
  24. package/hooks/validate-json-schema.py +283 -0
  25. package/lib/fs-utils.cjs +123 -0
  26. package/lib/hooks.cjs +214 -0
  27. package/package.json +49 -0
  28. package/plugin.json +20 -0
  29. package/skills/attended/SKILL.md +25 -0
  30. package/skills/clean-room/SKILL.md +134 -0
  31. package/skills/clean-room/assets/behavior-spec.schema.json +367 -0
  32. package/skills/clean-room/assets/contamination-incident.schema.json +60 -0
  33. package/skills/clean-room/assets/coverage-ledger.schema.json +139 -0
  34. package/skills/clean-room/assets/evidence-ledger.schema.json +80 -0
  35. package/skills/clean-room/assets/handoff-package.schema.json +114 -0
  36. package/skills/clean-room/assets/qc-report.schema.json +248 -0
  37. package/skills/clean-room/assets/skeleton-manifest.schema.json +239 -0
  38. package/skills/clean-room/assets/source-index.schema.json +622 -0
  39. package/skills/clean-room/assets/task-manifest.schema.json +593 -0
  40. package/skills/clean-room/examples/README.md +18 -0
  41. package/skills/clean-room/examples/minimal-spec-package/behavior-spec.json +61 -0
  42. package/skills/clean-room/examples/minimal-spec-package/coverage-ledger.json +27 -0
  43. package/skills/clean-room/examples/minimal-spec-package/evidence-ledger.json +17 -0
  44. package/skills/clean-room/examples/minimal-spec-package/handoff-package.json +26 -0
  45. package/skills/clean-room/examples/minimal-spec-package/qc-report.json +25 -0
  46. package/skills/clean-room/examples/minimal-spec-package/skeleton-manifest.json +45 -0
  47. package/skills/clean-room/examples/minimal-spec-package/source-index.json +156 -0
  48. package/skills/clean-room/examples/minimal-spec-package/task-manifest.json +220 -0
  49. package/skills/clean-room/references/LEAKAGE-RULES.md +92 -0
  50. package/skills/clean-room/references/PROCESS.md +185 -0
  51. package/skills/clean-room/references/SPEC-SCHEMA.md +185 -0
  52. package/skills/clean-room/references/TARGET-LANGUAGE-GUIDE.md +43 -0
  53. package/skills/clean-room/scripts/build_source_index.py +1253 -0
  54. package/skills/clean-room/scripts/clean_room_tool_manager.py +199 -0
  55. package/skills/clean-room/scripts/clean_room_tooling.py +370 -0
  56. package/skills/unattended/SKILL.md +26 -0
@@ -0,0 +1,593 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "Clean-Room Task Manifest",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "required": [
7
+ "task_id",
8
+ "target_identifier",
9
+ "authorization",
10
+ "source_acquisition_basis",
11
+ "source_scope",
12
+ "clean_scope",
13
+ "trust_boundary",
14
+ "format_selection",
15
+ "agent_pipeline",
16
+ "required_profiles",
17
+ "artifact_paths",
18
+ "handoff_policy",
19
+ "tool_policy",
20
+ "model_policy",
21
+ "retention_policy",
22
+ "roles",
23
+ "units",
24
+ "expected_artifacts",
25
+ "audit_log_refs"
26
+ ],
27
+ "properties": {
28
+ "task_id": {
29
+ "type": "string",
30
+ "minLength": 1
31
+ },
32
+ "target_identifier": {
33
+ "type": "string",
34
+ "minLength": 1
35
+ },
36
+ "authorization": {
37
+ "type": "object",
38
+ "additionalProperties": false,
39
+ "required": [
40
+ "requester",
41
+ "scope_statement",
42
+ "allowed_actions",
43
+ "prohibited_actions"
44
+ ],
45
+ "properties": {
46
+ "requester": {
47
+ "type": "string",
48
+ "minLength": 1
49
+ },
50
+ "scope_statement": {
51
+ "type": "string",
52
+ "minLength": 1
53
+ },
54
+ "allowed_actions": {
55
+ "type": "array",
56
+ "items": {
57
+ "type": "string"
58
+ }
59
+ },
60
+ "prohibited_actions": {
61
+ "type": "array",
62
+ "items": {
63
+ "type": "string"
64
+ }
65
+ },
66
+ "evidence_handling": {
67
+ "type": "string"
68
+ }
69
+ }
70
+ },
71
+ "source_acquisition_basis": {
72
+ "type": "string",
73
+ "minLength": 1
74
+ },
75
+ "license_contract_notes": {
76
+ "type": "string"
77
+ },
78
+ "source_index_ref": {
79
+ "type": "string",
80
+ "minLength": 1
81
+ },
82
+ "source_scope": {
83
+ "$ref": "#/$defs/workspace_scope"
84
+ },
85
+ "clean_scope": {
86
+ "$ref": "#/$defs/workspace_scope"
87
+ },
88
+ "trust_boundary": {
89
+ "type": "object",
90
+ "additionalProperties": false,
91
+ "required": [
92
+ "contaminated_domain",
93
+ "clean_domain",
94
+ "separation_controls"
95
+ ],
96
+ "properties": {
97
+ "contaminated_domain": {
98
+ "type": "string",
99
+ "minLength": 1
100
+ },
101
+ "clean_domain": {
102
+ "type": "string",
103
+ "minLength": 1
104
+ },
105
+ "separation_controls": {
106
+ "type": "array",
107
+ "items": {
108
+ "type": "string"
109
+ }
110
+ }
111
+ }
112
+ },
113
+ "format_selection": {
114
+ "type": "object",
115
+ "additionalProperties": false,
116
+ "required": [
117
+ "mode",
118
+ "selection_basis",
119
+ "target_profile",
120
+ "native_artifacts",
121
+ "formatting_rules"
122
+ ],
123
+ "properties": {
124
+ "mode": {
125
+ "const": "canonical-plus-target"
126
+ },
127
+ "selection_basis": {
128
+ "const": "user-choice"
129
+ },
130
+ "target_profile": {
131
+ "enum": [
132
+ "openspec-delta",
133
+ "gsd-planning-package",
134
+ "speckit-feature-folder",
135
+ "kiro-spec-folder"
136
+ ]
137
+ },
138
+ "native_artifacts": {
139
+ "type": "array",
140
+ "items": {
141
+ "type": "string",
142
+ "minLength": 1
143
+ }
144
+ },
145
+ "formatting_rules": {
146
+ "type": "array",
147
+ "items": {
148
+ "type": "string",
149
+ "minLength": 1
150
+ }
151
+ }
152
+ }
153
+ },
154
+ "agent_pipeline": {
155
+ "type": "object",
156
+ "additionalProperties": false,
157
+ "required": [
158
+ "agent_0",
159
+ "agent_1",
160
+ "agent_2",
161
+ "agent_3",
162
+ "handoff_rules"
163
+ ],
164
+ "properties": {
165
+ "agent_0": {
166
+ "$ref": "#/$defs/agent_0_stage"
167
+ },
168
+ "agent_1": {
169
+ "$ref": "#/$defs/agent_1_stage"
170
+ },
171
+ "agent_2": {
172
+ "$ref": "#/$defs/agent_2_stage"
173
+ },
174
+ "agent_3": {
175
+ "$ref": "#/$defs/agent_3_stage"
176
+ },
177
+ "handoff_rules": {
178
+ "type": "object",
179
+ "additionalProperties": false,
180
+ "required": [
181
+ "allowed_inputs",
182
+ "allowed_outputs",
183
+ "blocked_material",
184
+ "report_back_to"
185
+ ],
186
+ "properties": {
187
+ "allowed_inputs": {
188
+ "type": "array",
189
+ "items": {
190
+ "type": "string",
191
+ "minLength": 1
192
+ }
193
+ },
194
+ "allowed_outputs": {
195
+ "type": "array",
196
+ "items": {
197
+ "type": "string",
198
+ "minLength": 1
199
+ }
200
+ },
201
+ "blocked_material": {
202
+ "type": "array",
203
+ "items": {
204
+ "type": "string",
205
+ "minLength": 1
206
+ }
207
+ },
208
+ "report_back_to": {
209
+ "const": "agent_0"
210
+ }
211
+ }
212
+ }
213
+ }
214
+ },
215
+ "controller_policy": {
216
+ "type": "object",
217
+ "additionalProperties": false,
218
+ "required": [
219
+ "mode",
220
+ "stop_conditions"
221
+ ],
222
+ "properties": {
223
+ "mode": {
224
+ "enum": [
225
+ "attended",
226
+ "unattended"
227
+ ]
228
+ },
229
+ "max_iterations": {
230
+ "type": "integer",
231
+ "minimum": 1
232
+ },
233
+ "max_units_per_iteration": {
234
+ "type": "integer",
235
+ "minimum": 1,
236
+ "maximum": 1
237
+ },
238
+ "stop_conditions": {
239
+ "type": "array",
240
+ "minItems": 1,
241
+ "uniqueItems": true,
242
+ "items": {
243
+ "enum": [
244
+ "authorization-missing",
245
+ "scope-change",
246
+ "contamination-suspected",
247
+ "schema-validation-failed",
248
+ "leakage-scan-failed",
249
+ "unit-blocked",
250
+ "coverage-complete",
251
+ "iteration-limit-reached"
252
+ ]
253
+ }
254
+ },
255
+ "notes": {
256
+ "type": "string"
257
+ }
258
+ },
259
+ "allOf": [
260
+ {
261
+ "if": {
262
+ "properties": {
263
+ "mode": {
264
+ "const": "unattended"
265
+ }
266
+ },
267
+ "required": [
268
+ "mode"
269
+ ]
270
+ },
271
+ "then": {
272
+ "required": [
273
+ "max_iterations"
274
+ ]
275
+ }
276
+ }
277
+ ]
278
+ },
279
+ "required_profiles": {
280
+ "type": "array",
281
+ "items": {
282
+ "type": "object",
283
+ "additionalProperties": false,
284
+ "required": [
285
+ "role",
286
+ "profile_id",
287
+ "workspace_id"
288
+ ],
289
+ "properties": {
290
+ "role": {
291
+ "$ref": "#/$defs/role"
292
+ },
293
+ "profile_id": {
294
+ "type": "string",
295
+ "minLength": 1
296
+ },
297
+ "workspace_id": {
298
+ "type": "string",
299
+ "minLength": 1
300
+ }
301
+ }
302
+ }
303
+ },
304
+ "artifact_paths": {
305
+ "type": "object",
306
+ "additionalProperties": false,
307
+ "required": [
308
+ "contaminated_artifacts",
309
+ "contaminated_artifact_roots",
310
+ "clean_artifacts",
311
+ "quarantine"
312
+ ],
313
+ "properties": {
314
+ "contaminated_artifacts": {
315
+ "type": "string",
316
+ "minLength": 1
317
+ },
318
+ "contaminated_artifact_roots": {
319
+ "type": "array",
320
+ "minItems": 1,
321
+ "items": {
322
+ "type": "string",
323
+ "minLength": 1
324
+ }
325
+ },
326
+ "clean_artifacts": {
327
+ "type": "string",
328
+ "minLength": 1
329
+ },
330
+ "quarantine": {
331
+ "type": "string",
332
+ "minLength": 1
333
+ }
334
+ }
335
+ },
336
+ "handoff_policy": {
337
+ "type": "object",
338
+ "additionalProperties": false,
339
+ "required": [
340
+ "allowed_artifacts",
341
+ "blocked_material",
342
+ "one_way_handoff"
343
+ ],
344
+ "properties": {
345
+ "allowed_artifacts": {
346
+ "type": "array",
347
+ "items": {
348
+ "enum": [
349
+ "task-manifest",
350
+ "behavior-spec",
351
+ "handoff-package",
352
+ "skeleton-manifest",
353
+ "qc-report",
354
+ "coverage-ledger-summary",
355
+ "open-questions",
356
+ "test-plan",
357
+ "abstract-delta-ticket"
358
+ ]
359
+ }
360
+ },
361
+ "blocked_material": {
362
+ "type": "array",
363
+ "items": {
364
+ "type": "string"
365
+ }
366
+ },
367
+ "one_way_handoff": {
368
+ "type": "boolean"
369
+ },
370
+ "notes": {
371
+ "type": "string"
372
+ }
373
+ }
374
+ },
375
+ "tool_policy": {
376
+ "type": "array",
377
+ "items": {
378
+ "type": "string"
379
+ }
380
+ },
381
+ "model_policy": {
382
+ "type": "array",
383
+ "items": {
384
+ "type": "string"
385
+ }
386
+ },
387
+ "retention_policy": {
388
+ "type": "string",
389
+ "minLength": 1
390
+ },
391
+ "roles": {
392
+ "type": "array",
393
+ "minItems": 1,
394
+ "items": {
395
+ "type": "object",
396
+ "additionalProperties": false,
397
+ "required": [
398
+ "role",
399
+ "trust_domain",
400
+ "allowed_access"
401
+ ],
402
+ "properties": {
403
+ "role": {
404
+ "$ref": "#/$defs/role"
405
+ },
406
+ "trust_domain": {
407
+ "enum": [
408
+ "contaminated",
409
+ "clean"
410
+ ]
411
+ },
412
+ "allowed_access": {
413
+ "type": "array",
414
+ "items": {
415
+ "type": "string"
416
+ }
417
+ }
418
+ }
419
+ }
420
+ },
421
+ "units": {
422
+ "type": "array",
423
+ "minItems": 1,
424
+ "items": {
425
+ "type": "object",
426
+ "additionalProperties": false,
427
+ "required": [
428
+ "unit_id",
429
+ "description",
430
+ "status"
431
+ ],
432
+ "properties": {
433
+ "unit_id": {
434
+ "type": "string",
435
+ "minLength": 1
436
+ },
437
+ "description": {
438
+ "type": "string",
439
+ "minLength": 1
440
+ },
441
+ "status": {
442
+ "enum": [
443
+ "pending",
444
+ "in-progress",
445
+ "complete",
446
+ "out-of-scope",
447
+ "blocked"
448
+ ]
449
+ },
450
+ "source_index_refs": {
451
+ "type": "array",
452
+ "items": {
453
+ "type": "string",
454
+ "minLength": 1
455
+ }
456
+ },
457
+ "notes": {
458
+ "type": "string"
459
+ }
460
+ }
461
+ }
462
+ },
463
+ "expected_artifacts": {
464
+ "type": "array",
465
+ "items": {
466
+ "type": "string"
467
+ }
468
+ },
469
+ "audit_log_refs": {
470
+ "type": "array",
471
+ "items": {
472
+ "type": "string"
473
+ }
474
+ }
475
+ },
476
+ "$defs": {
477
+ "role": {
478
+ "enum": [
479
+ "contaminated-manager-verifier",
480
+ "contaminated-source-analyst",
481
+ "clean-architect",
482
+ "clean-qa-editor"
483
+ ]
484
+ },
485
+ "agent_0_stage": {
486
+ "type": "object",
487
+ "additionalProperties": false,
488
+ "required": [
489
+ "role",
490
+ "responsibility",
491
+ "trust_domain"
492
+ ],
493
+ "properties": {
494
+ "role": {
495
+ "const": "contaminated-manager-verifier"
496
+ },
497
+ "responsibility": {
498
+ "type": "string",
499
+ "minLength": 1
500
+ },
501
+ "trust_domain": {
502
+ "const": "contaminated"
503
+ }
504
+ }
505
+ },
506
+ "agent_1_stage": {
507
+ "type": "object",
508
+ "additionalProperties": false,
509
+ "required": [
510
+ "role",
511
+ "responsibility",
512
+ "trust_domain"
513
+ ],
514
+ "properties": {
515
+ "role": {
516
+ "const": "contaminated-source-analyst"
517
+ },
518
+ "responsibility": {
519
+ "type": "string",
520
+ "minLength": 1
521
+ },
522
+ "trust_domain": {
523
+ "const": "contaminated"
524
+ }
525
+ }
526
+ },
527
+ "agent_2_stage": {
528
+ "type": "object",
529
+ "additionalProperties": false,
530
+ "required": [
531
+ "role",
532
+ "responsibility",
533
+ "trust_domain"
534
+ ],
535
+ "properties": {
536
+ "role": {
537
+ "const": "clean-architect"
538
+ },
539
+ "responsibility": {
540
+ "type": "string",
541
+ "minLength": 1
542
+ },
543
+ "trust_domain": {
544
+ "const": "clean"
545
+ }
546
+ }
547
+ },
548
+ "agent_3_stage": {
549
+ "type": "object",
550
+ "additionalProperties": false,
551
+ "required": [
552
+ "role",
553
+ "responsibility",
554
+ "trust_domain"
555
+ ],
556
+ "properties": {
557
+ "role": {
558
+ "const": "clean-qa-editor"
559
+ },
560
+ "responsibility": {
561
+ "type": "string",
562
+ "minLength": 1
563
+ },
564
+ "trust_domain": {
565
+ "const": "clean"
566
+ }
567
+ }
568
+ },
569
+ "workspace_scope": {
570
+ "type": "object",
571
+ "additionalProperties": false,
572
+ "required": [
573
+ "workspace_id",
574
+ "description",
575
+ "path_policy"
576
+ ],
577
+ "properties": {
578
+ "workspace_id": {
579
+ "type": "string",
580
+ "minLength": 1
581
+ },
582
+ "description": {
583
+ "type": "string",
584
+ "minLength": 1
585
+ },
586
+ "path_policy": {
587
+ "type": "string",
588
+ "minLength": 1
589
+ }
590
+ }
591
+ }
592
+ }
593
+ }
@@ -0,0 +1,18 @@
1
+ # Clean-Room Examples
2
+
3
+ These examples show artifact shape only. They are not outputs from a real source review and contain no source-derived content.
4
+
5
+ The minimal `task-manifest.json` uses `speckit-feature-folder` as a non-normative example. Real tasks must record the user's actual `format_selection.target_profile` from OpenSpec, GSD, Spec Kit, or Kiro before agents start work.
6
+
7
+ The minimal `source-index.json` is a contaminated-side shape example. Real source indexes may contain source paths and private import/export names, so they must stay out of clean handoff packages.
8
+
9
+ Use them to seed tests, docs, or dry runs:
10
+
11
+ - `minimal-spec-package/task-manifest.json`
12
+ - `minimal-spec-package/source-index.json`
13
+ - `minimal-spec-package/evidence-ledger.json`
14
+ - `minimal-spec-package/coverage-ledger.json`
15
+ - `minimal-spec-package/behavior-spec.json`
16
+ - `minimal-spec-package/handoff-package.json`
17
+ - `minimal-spec-package/skeleton-manifest.json`
18
+ - `minimal-spec-package/qc-report.json`
@@ -0,0 +1,61 @@
1
+ {
2
+ "spec_id": "spec-example-flow",
3
+ "unit_id": "unit-example-flow",
4
+ "producer_role": "contaminated-source-analyst",
5
+ "created_at": "2000-01-01T00:00:00Z",
6
+ "source_unit_refs": [
7
+ "unit-example-flow"
8
+ ],
9
+ "evidence_refs": [
10
+ "evidence-ledger:item-001"
11
+ ],
12
+ "evidence_status": "observed",
13
+ "confidence": "high",
14
+ "leakage_risk": "low",
15
+ "summary": "The example component accepts a valid request and returns a successful result.",
16
+ "observable_surface": [],
17
+ "public_surface": [],
18
+ "compatibility_level": "behavior-compatible",
19
+ "observable_behaviors": [
20
+ {
21
+ "claim_id": "claim-001",
22
+ "claim": "A valid request produces a successful result.",
23
+ "evidence_status": "observed",
24
+ "evidence_refs": [
25
+ "evidence-ledger:item-001"
26
+ ],
27
+ "confidence": "high",
28
+ "rationale": "Example claim only."
29
+ }
30
+ ],
31
+ "inputs": [],
32
+ "outputs": [],
33
+ "state_transitions": [],
34
+ "edge_cases": [],
35
+ "error_conditions": [],
36
+ "negative_behaviors": [],
37
+ "timing_or_ordering": [],
38
+ "security_relevant_behavior": [],
39
+ "invariants": [],
40
+ "compatibility_notes": [],
41
+ "non_goals": [
42
+ "No implementation code is generated."
43
+ ],
44
+ "test_scenarios": [
45
+ {
46
+ "scenario_id": "test-001",
47
+ "scenario": "Submit a valid request.",
48
+ "expected_result": "A successful result is returned.",
49
+ "coverage": [
50
+ "claim-001"
51
+ ]
52
+ }
53
+ ],
54
+ "open_questions": [],
55
+ "leakage_review": {
56
+ "status": "passed",
57
+ "reviewer_role": "contaminated-source-analyst",
58
+ "notes": "No blocked material in example."
59
+ },
60
+ "review_history": []
61
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "ledger_id": "coverage-ledger-example",
3
+ "task_id": "task-example",
4
+ "updated_by_role": "contaminated-manager-verifier",
5
+ "source_units": [
6
+ {
7
+ "unit_id": "unit-example-flow",
8
+ "coverage_state": "covered",
9
+ "evidence_refs": [
10
+ "evidence-ledger:item-001"
11
+ ],
12
+ "notes": "Example coverage entry."
13
+ }
14
+ ],
15
+ "behavior_spec_refs": [
16
+ "spec-example-flow"
17
+ ],
18
+ "coverage_status": "complete",
19
+ "abstract_delta_tickets": [],
20
+ "review_history": [
21
+ {
22
+ "reviewer_role": "contaminated-manager-verifier",
23
+ "status": "covered",
24
+ "notes": "Example only."
25
+ }
26
+ ]
27
+ }