@namewta/speculo 0.7.2 → 0.7.4

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 (55) hide show
  1. package/dist/src/migrations.js +755 -23
  2. package/dist/src/migrations.js.map +1 -1
  3. package/package.json +1 -1
  4. package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +200 -448
  5. package/template/canonical/canonical-specdev-goal-plan.md +744 -1108
  6. package/template/canonical/canonical-specdev-grill-with-docs.md +201 -449
  7. package/template/canonical/canonical-specdev-spec.md +232 -486
  8. package/template/canonical/canonical-specdev-tickets.md +411 -590
  9. package/template/canonical/canonical-specdev-wayfinder.md +199 -447
  10. package/template/skills/migrate-runtime-state/SKILL.md +6 -6
  11. package/template/skills/migrate-runtime-state/references/migration-contract.md +9 -3
  12. package/template/skills/migrate-runtime-state/scripts/migrate-runtime-state.mjs +404 -33
  13. package/template/workflows/specdev/I-implement/I-implement.md +98 -143
  14. package/template/workflows/specdev/I-implement/evidence-template.md +66 -48
  15. package/template/workflows/specdev/I-implement/execution-preflight.md +31 -21
  16. package/template/workflows/specdev/I-implement/merge-conflict-protocol.md +12 -12
  17. package/template/workflows/specdev/I-init-setup/I-init-setup.md +4 -5
  18. package/template/workflows/specdev/I-init-setup/change-status-template.json +14 -1
  19. package/template/workflows/specdev/I-init-setup/config-template.json +7 -6
  20. package/template/workflows/specdev/I-init-setup/status-template.json +1 -1
  21. package/template/workflows/specdev/INDEX.md +11 -8
  22. package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +76 -102
  23. package/template/workflows/specdev/P-goal-plan/completion-control.md +26 -44
  24. package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +46 -37
  25. package/template/workflows/specdev/P-goal-plan/lead-orchestration.md +34 -0
  26. package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +31 -46
  27. package/template/workflows/specdev/P-goal-plan/planning-modes.md +67 -89
  28. package/template/workflows/specdev/P-prototype/ui-prototype.md +1 -1
  29. package/template/workflows/specdev/T-tickets/T-tickets.md +6 -3
  30. package/template/workflows/specdev/T-tickets/ticket-readiness.md +5 -3
  31. package/template/workflows/specdev/T-tickets/ticket-template.md +8 -1
  32. package/template/workflows/specdev/T-tickets/tickets-map-template.md +5 -4
  33. package/template/workflows/specdev/_state/status.json +1 -1
  34. package/template/workflows/specdev/common/README.md +2 -2
  35. package/template/workflows/specdev/common/rules/change-completion.md +17 -20
  36. package/template/workflows/specdev/common/rules/deviation-control.md +1 -1
  37. package/template/workflows/specdev/common/rules/evidence-and-verification.md +31 -37
  38. package/template/workflows/specdev/common/rules/path-ownership.md +21 -23
  39. package/template/workflows/specdev/common/rules/readiness-and-depth.md +1 -1
  40. package/template/workflows/specdev/common/schemas/change-status.schema.json +153 -363
  41. package/template/workflows/specdev/common/schemas/config.schema.json +17 -13
  42. package/template/workflows/specdev/common/schemas/goal-plan.schema.json +33 -16
  43. package/template/workflows/specdev/common/schemas/status.schema.json +7 -63
  44. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +42 -21
  45. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +36 -21
  46. package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +46 -18
  47. package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +34 -31
  48. package/template/workflows/specdev/common/skills/subagent-delivery/references/external-web-subagent.md +10 -23
  49. package/template/workflows/specdev/common/skills/subagent-delivery/references/native-subagent.md +15 -25
  50. package/template/workflows/specdev/common/tools/README.md +2 -1
  51. package/template/workflows/specdev/common/tools/validate-specdev.mjs +591 -219
  52. package/template/workflows/specdev/I-implement/delegated-evidence-template.md +0 -12
  53. package/template/workflows/specdev/P-goal-plan/delegated-execution-template.md +0 -35
  54. package/template/workflows/specdev/P-goal-plan/delegated-execution.md +0 -59
  55. package/template/workflows/specdev/P-goal-plan/workspace-execution-template.md +0 -24
@@ -324,16 +324,15 @@ resolution: answered
324
324
 
325
325
  ```json
326
326
  {
327
- "schema_version": 3,
327
+ "schema_version": 5,
328
328
  "interaction_language": "zh-CN",
329
329
  "artifact_language": "zh-CN",
330
330
  "git": {
331
- "auto_commit": false,
332
- "default_branch": null,
333
- "worktree_for_parallel": true
331
+ "default_branch": null
334
332
  },
335
333
  "execution": {
336
- "max_parallel": 3,
334
+ "max_implementation_agents": 3,
335
+ "max_integration_attempts": 3,
337
336
  "deep_ticket_human_approval": true,
338
337
  "shared_path_owner": "explicit"
339
338
  },
@@ -346,7 +345,9 @@ resolution: answered
346
345
  "planning": {
347
346
  "default_depth": "standard",
348
347
  "require_ready_gate": true,
349
- "require_evidence": true
348
+ "require_evidence": true,
349
+ "ui_prototype_default_variants": 3,
350
+ "ui_prototype_max_variants": 5
350
351
  }
351
352
  }
352
353
  ```
@@ -358,33 +359,32 @@ resolution: answered
358
359
  ```json
359
360
  {
360
361
  "$schema": "https://json-schema.org/draft/2020-12/schema",
361
- "$id": "urn:speculo:specdev:config:v3",
362
+ "$id": "urn:speculo:specdev:config:v5",
362
363
  "title": "SpecDev Configuration",
363
364
  "type": "object",
364
365
  "required": ["schema_version", "interaction_language", "artifact_language", "git", "execution", "verification", "planning"],
365
366
  "properties": {
366
- "schema_version": {"const": 3},
367
+ "schema_version": {"const": 5},
367
368
  "interaction_language": {"type": "string", "minLength": 1},
368
369
  "artifact_language": {"type": "string", "minLength": 1},
369
370
  "git": {
370
371
  "type": "object",
371
- "required": ["auto_commit", "default_branch", "worktree_for_parallel"],
372
+ "required": ["default_branch"],
372
373
  "properties": {
373
- "auto_commit": {"type": "boolean"},
374
- "default_branch": {"type": ["string", "null"]},
375
- "worktree_for_parallel": {"type": "boolean"}
374
+ "default_branch": {"type": ["string", "null"]}
376
375
  },
377
- "additionalProperties": true
376
+ "additionalProperties": false
378
377
  },
379
378
  "execution": {
380
379
  "type": "object",
381
- "required": ["max_parallel", "deep_ticket_human_approval", "shared_path_owner"],
380
+ "required": ["max_implementation_agents", "max_integration_attempts", "deep_ticket_human_approval", "shared_path_owner"],
382
381
  "properties": {
383
- "max_parallel": {"type": "integer", "minimum": 1},
382
+ "max_implementation_agents": {"type": "integer", "minimum": 1},
383
+ "max_integration_attempts": {"type": "integer", "minimum": 1},
384
384
  "deep_ticket_human_approval": {"type": "boolean"},
385
385
  "shared_path_owner": {"type": "string", "minLength": 1}
386
386
  },
387
- "additionalProperties": true
387
+ "additionalProperties": false
388
388
  },
389
389
  "verification": {
390
390
  "type": "object",
@@ -399,16 +399,21 @@ resolution: answered
399
399
  },
400
400
  "planning": {
401
401
  "type": "object",
402
- "required": ["default_depth", "require_ready_gate", "require_evidence"],
402
+ "required": ["default_depth", "require_ready_gate", "require_evidence", "ui_prototype_default_variants", "ui_prototype_max_variants"],
403
403
  "properties": {
404
404
  "default_depth": {"enum": ["lite", "standard", "deep"]},
405
405
  "require_ready_gate": {"type": "boolean"},
406
- "require_evidence": {"type": "boolean"}
406
+ "require_evidence": {"type": "boolean"},
407
+ "ui_prototype_default_variants": {"type": "integer", "minimum": 1},
408
+ "ui_prototype_max_variants": {"type": "integer", "minimum": 1}
407
409
  },
408
410
  "additionalProperties": true
409
411
  }
410
412
  },
411
- "additionalProperties": true
413
+ "allOf": [{
414
+ "$comment": "ui_prototype_default_variants <= ui_prototype_max_variants is enforced by validate-specdev.mjs because JSON Schema cannot compare sibling numeric values."
415
+ }],
416
+ "additionalProperties": false
412
417
  }
413
418
  ```
414
419
 
@@ -418,7 +423,7 @@ resolution: answered
418
423
 
419
424
  ```json
420
425
  {
421
- "schema_version": 4,
426
+ "schema_version": 5,
422
427
  "workflow": "specdev",
423
428
  "active": [],
424
429
  "archived": []
@@ -432,83 +437,27 @@ resolution: answered
432
437
  ```json
433
438
  {
434
439
  "$schema": "https://json-schema.org/draft/2020-12/schema",
435
- "$id": "urn:speculo:specdev:status:v4",
440
+ "$id": "urn:speculo:specdev:status:v5",
436
441
  "title": "SpecDev Global Status",
437
442
  "type": "object",
438
- "required": [
439
- "schema_version",
440
- "workflow",
441
- "active",
442
- "archived"
443
- ],
443
+ "required": ["schema_version", "workflow", "active", "archived"],
444
444
  "properties": {
445
- "schema_version": {
446
- "const": 4
447
- },
448
- "workflow": {
449
- "const": "specdev"
450
- },
445
+ "schema_version": {"const": 5},
446
+ "workflow": {"const": "specdev"},
451
447
  "active": {
452
448
  "type": "array",
453
449
  "items": {
454
450
  "type": "object",
455
- "required": [
456
- "change",
457
- "current_work",
458
- "works_run"
459
- ],
451
+ "required": ["change"],
460
452
  "properties": {
461
453
  "change": {
462
454
  "type": "string",
463
455
  "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
464
- },
465
- "current_work": {
466
- "type": [
467
- "string",
468
- "null"
469
- ],
470
- "pattern": "^specdev/"
471
- },
472
- "works_run": {
473
- "type": "array",
474
- "items": {
475
- "type": "string",
476
- "pattern": "^specdev/"
477
- },
478
- "uniqueItems": true
479
- },
480
- "claimed_investigations": {
481
- "type": "array",
482
- "items": {
483
- "type": "object",
484
- "required": [
485
- "id",
486
- "owner",
487
- "claimed_at"
488
- ],
489
- "properties": {
490
- "id": {
491
- "type": "string"
492
- },
493
- "owner": {
494
- "type": "string"
495
- },
496
- "session": {
497
- "type": [
498
- "string",
499
- "null"
500
- ]
501
- },
502
- "claimed_at": {
503
- "type": "string"
504
- }
505
- },
506
- "additionalProperties": false
507
- }
508
456
  }
509
457
  },
510
458
  "additionalProperties": false
511
- }
459
+ },
460
+ "uniqueItems": true
512
461
  },
513
462
  "archived": {
514
463
  "type": "array",
@@ -529,11 +478,24 @@ resolution: answered
529
478
 
530
479
  ```json
531
480
  {
532
- "schema_version": 3,
481
+ "schema_version": 6,
533
482
  "artifact": "change-status",
534
483
  "change": "<YYYY-MM-DD-topic>",
535
484
  "change_status": "active",
536
485
  "current_work": null,
486
+ "works_run": [],
487
+ "claimed_investigations": [],
488
+ "execution_authorization": {
489
+ "implementation_commit": {"status": "not-authorized", "source": null, "granted_at": null, "scope": "Ticket implementation commits"},
490
+ "local_candidate_integration": {"status": "not-authorized", "source": null, "granted_at": null, "scope": "Lead-owned local direct-parent or candidate integration and parent update"},
491
+ "source_cleanup": {"status": "not-authorized", "source": null, "granted_at": null, "scope": "Source worktree and branch cleanup"}
492
+ },
493
+ "leadership": {
494
+ "current": "<owner-or-session-locator>",
495
+ "epoch": 1,
496
+ "assigned_at": "<ISO-8601>",
497
+ "history": []
498
+ },
537
499
  "created_at": "<ISO-8601>",
538
500
  "updated_at": "<ISO-8601>",
539
501
  "completed_at": null,
@@ -552,394 +514,184 @@ resolution: answered
552
514
  ```json
553
515
  {
554
516
  "$schema": "https://json-schema.org/draft/2020-12/schema",
555
- "$id": "urn:speculo:specdev:change-status:v3",
517
+ "$id": "urn:speculo:specdev:change-status:v6",
556
518
  "title": "SpecDev Change Status",
557
519
  "type": "object",
558
520
  "required": [
559
- "schema_version",
560
- "artifact",
561
- "change",
562
- "change_status",
563
- "current_work",
564
- "created_at",
565
- "updated_at",
566
- "completed_at",
567
- "archived",
568
- "archive_path",
569
- "blockers",
570
- "deviations"
521
+ "schema_version", "artifact", "change", "change_status", "current_work", "works_run",
522
+ "claimed_investigations", "execution_authorization", "leadership", "created_at", "updated_at",
523
+ "completed_at", "archived", "archive_path", "blockers", "deviations", "worktrees"
571
524
  ],
572
525
  "properties": {
573
- "schema_version": {
574
- "const": 3
575
- },
576
- "artifact": {
577
- "const": "change-status"
578
- },
579
- "change": {
580
- "type": "string",
581
- "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
582
- },
583
- "change_status": {
584
- "enum": [
585
- "active",
586
- "blocked",
587
- "completed",
588
- "archived"
589
- ]
526
+ "schema_version": {"const": 6},
527
+ "artifact": {"const": "change-status"},
528
+ "change": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"},
529
+ "change_status": {"enum": ["active", "blocked", "completed", "archived"]},
530
+ "current_work": {"type": ["string", "null"], "pattern": "^specdev/"},
531
+ "works_run": {"type": "array", "items": {"type": "string", "pattern": "^specdev/"}, "uniqueItems": true},
532
+ "claimed_investigations": {"type": "array", "items": {"$ref": "#/$defs/claim"}},
533
+ "execution_authorization": {"$ref": "#/$defs/authorization"},
534
+ "leadership": {"$ref": "#/$defs/leadership"},
535
+ "created_at": {"type": "string", "minLength": 1},
536
+ "updated_at": {"type": "string", "minLength": 1},
537
+ "completed_at": {"type": ["string", "null"]},
538
+ "archived": {"type": "boolean"},
539
+ "archive_path": {"anyOf": [{"type": "null"}, {"type": "string", "pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"}]},
540
+ "blockers": {"type": "array", "items": {"type": "string"}},
541
+ "deviations": {"type": "array", "items": {"type": "string"}},
542
+ "worktrees": {"type": "array", "items": {"$ref": "#/$defs/worktree"}}
543
+ },
544
+ "$defs": {
545
+ "claim": {
546
+ "type": "object",
547
+ "required": ["id", "owner", "session", "claimed_at"],
548
+ "properties": {
549
+ "id": {"type": "string", "minLength": 1},
550
+ "owner": {"type": "string", "minLength": 1},
551
+ "session": {"type": ["string", "null"]},
552
+ "claimed_at": {"type": "string", "minLength": 1}
553
+ },
554
+ "additionalProperties": false
590
555
  },
591
- "current_work": {
592
- "type": [
593
- "string",
594
- "null"
595
- ]
556
+ "authorization-entry": {
557
+ "type": "object",
558
+ "required": ["status", "source", "granted_at", "scope"],
559
+ "properties": {
560
+ "status": {"enum": ["authorized", "not-authorized", "revoked"]},
561
+ "source": {"type": ["string", "null"]},
562
+ "granted_at": {"type": ["string", "null"]},
563
+ "scope": {"type": "string", "minLength": 1}
564
+ },
565
+ "allOf": [{
566
+ "if": {"properties": {"status": {"const": "authorized"}}, "required": ["status"]},
567
+ "then": {"properties": {"source": {"type": "string", "minLength": 1}, "granted_at": {"type": "string", "minLength": 1}}}
568
+ }],
569
+ "additionalProperties": false
596
570
  },
597
- "created_at": {
598
- "type": "string",
599
- "minLength": 1
571
+ "authorization": {
572
+ "type": "object",
573
+ "required": ["implementation_commit", "local_candidate_integration", "source_cleanup"],
574
+ "properties": {
575
+ "implementation_commit": {"$ref": "#/$defs/authorization-entry"},
576
+ "local_candidate_integration": {"$ref": "#/$defs/authorization-entry"},
577
+ "source_cleanup": {"$ref": "#/$defs/authorization-entry"}
578
+ },
579
+ "additionalProperties": false
600
580
  },
601
- "updated_at": {
602
- "type": "string",
603
- "minLength": 1
581
+ "leadership-history": {
582
+ "type": "object",
583
+ "required": ["owner", "epoch", "assigned_at", "ended_at"],
584
+ "properties": {
585
+ "owner": {"type": "string", "minLength": 1},
586
+ "epoch": {"type": "integer", "minimum": 1},
587
+ "assigned_at": {"type": "string", "minLength": 1},
588
+ "ended_at": {"type": "string", "minLength": 1}
589
+ },
590
+ "additionalProperties": false
604
591
  },
605
- "completed_at": {
606
- "type": [
607
- "string",
608
- "null"
609
- ]
592
+ "leadership": {
593
+ "type": "object",
594
+ "required": ["current", "epoch", "assigned_at", "history"],
595
+ "properties": {
596
+ "current": {"type": "string", "minLength": 1},
597
+ "epoch": {"type": "integer", "minimum": 1},
598
+ "assigned_at": {"type": "string", "minLength": 1},
599
+ "history": {"type": "array", "items": {"$ref": "#/$defs/leadership-history"}}
600
+ },
601
+ "additionalProperties": false
610
602
  },
611
- "archived": {
612
- "type": "boolean"
603
+ "full-suite": {
604
+ "type": "object",
605
+ "required": ["required", "status", "reason", "evidence"],
606
+ "properties": {
607
+ "required": {"type": "boolean"},
608
+ "status": {"enum": ["not-required", "pending", "passed", "failed"]},
609
+ "reason": {"type": ["string", "null"]},
610
+ "evidence": {"type": ["string", "null"]}
611
+ },
612
+ "allOf": [{
613
+ "if": {"properties": {"required": {"const": false}}, "required": ["required"]},
614
+ "then": {"properties": {"status": {"const": "not-required"}, "reason": {"type": "string", "minLength": 1}}}
615
+ }],
616
+ "additionalProperties": false
613
617
  },
614
- "archive_path": {
615
- "anyOf": [
616
- {
617
- "type": "null"
618
- },
618
+ "worktree": {
619
+ "type": "object",
620
+ "required": ["ticket_id", "owner", "implementation_owner", "integration_owner", "provider", "base_sha", "parent_branch", "branch", "workspace_ref", "source_checkpoint", "integration", "status", "updated_at"],
621
+ "properties": {
622
+ "ticket_id": {"type": "string", "pattern": "^T-[0-9]{2,}$"},
623
+ "owner": {"type": "string", "minLength": 1},
624
+ "implementation_owner": {"type": "string", "minLength": 1},
625
+ "integration_owner": {"type": "string", "minLength": 1},
626
+ "provider": {"const": "git"},
627
+ "base_sha": {"type": "string", "minLength": 1},
628
+ "parent_branch": {"type": "string", "minLength": 1},
629
+ "branch": {"type": "string", "minLength": 1},
630
+ "workspace_ref": {"type": "string", "pattern": "^(?:current|specdev-worktree/[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*/T-[0-9]{2,})$"},
631
+ "source_checkpoint": {"type": ["string", "null"]},
632
+ "integration": {"$ref": "#/$defs/integration"},
633
+ "status": {"enum": ["planned", "active", "review", "integrating", "integrated", "removed", "blocked"]},
634
+ "updated_at": {"type": "string", "minLength": 1}
635
+ },
636
+ "allOf": [
619
637
  {
620
- "type": "string",
621
- "pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
622
- }
623
- ]
624
- },
625
- "blockers": {
626
- "type": "array",
627
- "items": {
628
- "type": "string"
629
- }
630
- },
631
- "deviations": {
632
- "type": "array",
633
- "items": {
634
- "type": "string"
635
- }
636
- },
637
- "worktrees": {
638
- "type": "array",
639
- "items": {
640
- "type": "object",
641
- "required": [
642
- "ticket_id",
643
- "owner",
644
- "provider",
645
- "base_sha",
646
- "branch",
647
- "workspace_ref",
648
- "status",
649
- "updated_at"
650
- ],
651
- "properties": {
652
- "ticket_id": {
653
- "type": "string",
654
- "pattern": "^T-[0-9]{2,}$"
655
- },
656
- "owner": {
657
- "type": "string",
658
- "minLength": 1
659
- },
660
- "integration_owner": {
661
- "type": "string",
662
- "minLength": 1
663
- },
664
- "provider": {
665
- "enum": [
666
- "native",
667
- "git",
668
- "external"
669
- ]
670
- },
671
- "base_sha": {
672
- "type": "string",
673
- "minLength": 1
674
- },
675
- "parent_branch": {
676
- "type": "string",
677
- "minLength": 1
678
- },
679
- "branch": {
680
- "type": "string",
681
- "minLength": 1
682
- },
683
- "workspace_ref": {
684
- "type": "string",
685
- "minLength": 1,
686
- "pattern": "^(?!/)(?![A-Za-z]:[\\\\/]).+"
687
- },
688
- "terminal_action": {
689
- "enum": [
690
- "integrate",
691
- "retain"
692
- ]
693
- },
694
- "source_checkpoint": {
695
- "type": [
696
- "string",
697
- "null"
698
- ]
699
- },
700
- "integration": {
701
- "type": "object",
702
- "required": [
703
- "status",
704
- "parent_before_sha",
705
- "source_sha",
706
- "result_sha",
707
- "method",
708
- "conflict_paths",
709
- "verification",
710
- "evidence",
711
- "attempts"
712
- ],
638
+ "if": {"properties": {"workspace_ref": {"const": "current"}}, "required": ["workspace_ref"]},
639
+ "then": {
713
640
  "properties": {
714
- "status": {
715
- "enum": [
716
- "pending",
717
- "running",
718
- "passed",
719
- "blocked"
720
- ]
721
- },
722
- "parent_before_sha": {
723
- "type": ["string", "null"]
724
- },
725
- "source_sha": {
726
- "type": ["string", "null"]
727
- },
728
- "result_sha": {
729
- "type": ["string", "null"]
730
- },
731
- "method": {
732
- "enum": [null, "fast-forward", "merge-commit"]
733
- },
734
- "conflict_paths": {
735
- "type": "array",
736
- "items": {"type": "string"}
737
- },
738
- "verification": {
739
- "enum": ["pending", "passed", "failed"]
740
- },
741
- "evidence": {
742
- "type": "string",
743
- "pattern": "^\\{roots\\.state\\}/specdev/changes/[^<]+/evidence/T-[0-9]{2,}\\.md$"
744
- },
745
- "attempts": {
746
- "type": "integer",
747
- "minimum": 0
748
- }
749
- },
750
- "additionalProperties": true
751
- },
752
- "status": {
753
- "enum": [
754
- "planned",
755
- "active",
756
- "review",
757
- "integrating",
758
- "integrated",
759
- "removed",
760
- "blocked"
761
- ]
762
- },
763
- "updated_at": {
764
- "type": "string",
765
- "minLength": 1
766
- }
767
- },
768
- "dependentRequired": {
769
- "terminal_action": [
770
- "integration_owner",
771
- "parent_branch",
772
- "source_checkpoint",
773
- "integration"
774
- ]
775
- },
776
- "allOf": [
777
- {
778
- "if": {
779
- "properties": {
780
- "status": {"const": "integrating"}
781
- },
782
- "required": ["status"]
783
- },
784
- "then": {
785
- "required": [
786
- "terminal_action",
787
- "integration_owner",
788
- "parent_branch",
789
- "source_checkpoint",
790
- "integration"
791
- ],
792
- "properties": {
793
- "terminal_action": {"const": "integrate"}
794
- }
795
- }
796
- },
797
- {
798
- "if": {
799
- "properties": {
800
- "status": {"enum": ["integrating", "integrated"]},
801
- "terminal_action": {"const": "integrate"}
802
- },
803
- "required": ["status", "terminal_action"]
804
- },
805
- "then": {
806
- "properties": {
807
- "source_checkpoint": {"type": "string", "minLength": 1},
808
- "integration": {
641
+ "integration": {
642
+ "allOf": [{
809
643
  "properties": {
810
- "parent_before_sha": {"type": "string", "minLength": 1},
811
- "source_sha": {"type": "string", "minLength": 1},
812
- "attempts": {"type": "integer", "minimum": 1}
644
+ "candidate_sha": {"const": null},
645
+ "candidate_tree_sha": {"const": null},
646
+ "candidate_branch": {"const": null},
647
+ "candidate_workspace_ref": {"const": null},
648
+ "method": {"enum": [null, "direct-parent"]}
813
649
  }
814
- }
650
+ }]
815
651
  }
816
652
  }
817
653
  },
818
- {
819
- "if": {
820
- "properties": {
821
- "status": {"const": "integrating"},
822
- "terminal_action": {"const": "integrate"}
823
- },
824
- "required": ["status", "terminal_action"]
825
- },
826
- "then": {
827
- "properties": {
828
- "integration": {
829
- "properties": {
830
- "status": {"const": "running"}
831
- }
832
- }
833
- }
834
- }
835
- },
836
- {
837
- "if": {
838
- "properties": {
839
- "status": {"const": "integrated"},
840
- "terminal_action": {"const": "integrate"}
841
- },
842
- "required": ["status", "terminal_action"]
843
- },
844
- "then": {
845
- "properties": {
846
- "integration": {
847
- "properties": {
848
- "status": {"const": "passed"},
849
- "result_sha": {"type": "string", "minLength": 1},
850
- "method": {"enum": ["fast-forward", "merge-commit"]},
851
- "verification": {"const": "passed"}
852
- }
853
- }
854
- }
855
- }
856
- },
857
- {
858
- "if": {
859
- "properties": {
860
- "terminal_action": {"const": "retain"}
861
- },
862
- "required": ["terminal_action"]
863
- },
864
- "then": {
865
- "properties": {
866
- "status": {
867
- "not": {"enum": ["integrating", "integrated"]}
868
- }
869
- }
870
- }
871
- }
872
- ],
873
- "additionalProperties": true
874
- }
875
- }
876
- },
877
- "allOf": [
878
- {
879
- "if": {
880
- "properties": {
881
- "worktrees": {
882
- "contains": {
883
- "properties": {
884
- "provider": {
885
- "const": "git"
886
- }
887
- },
888
- "required": [
889
- "provider"
890
- ]
891
- }
892
- }
893
- }
894
- },
895
- "then": {
896
- "properties": {
897
- "worktrees": {
898
- "items": {
899
- "if": {
900
- "properties": {
901
- "provider": {
902
- "const": "git"
903
- }
904
- },
905
- "required": [
906
- "provider"
907
- ]
908
- },
909
- "then": {
910
- "properties": {
911
- "workspace_ref": {
912
- "pattern": "^specdev-worktree/T-[0-9]{2,}$"
913
- }
914
- }
654
+ "else": {
655
+ "properties": {
656
+ "integration": {
657
+ "allOf": [{"properties": {"method": {"enum": [null, "fast-forward", "merge-commit"]}}}]
915
658
  }
916
659
  }
917
660
  }
918
661
  }
919
- }
662
+ ],
663
+ "additionalProperties": false
920
664
  },
921
- {
922
- "if": {
923
- "properties": {
924
- "change_status": {
925
- "const": "archived"
926
- }
927
- }
665
+ "integration": {
666
+ "type": "object",
667
+ "required": ["status", "parent_ref", "parent_before_sha", "source_sha", "candidate_sha", "candidate_tree_sha", "candidate_branch", "candidate_workspace_ref", "result_sha", "method", "conflict_paths", "verification", "full_suite", "e2e", "evidence", "attempts", "promotion_status"],
668
+ "properties": {
669
+ "status": {"enum": ["pending", "candidate", "passed", "failed", "stale"]},
670
+ "parent_ref": {"type": ["string", "null"]},
671
+ "parent_before_sha": {"type": ["string", "null"]},
672
+ "source_sha": {"type": ["string", "null"]},
673
+ "candidate_sha": {"type": ["string", "null"]},
674
+ "candidate_tree_sha": {"type": ["string", "null"]},
675
+ "candidate_branch": {"type": ["string", "null"]},
676
+ "candidate_workspace_ref": {"anyOf": [{"type": "null"}, {"type": "string", "pattern": "^specdev-worktree/\\.integration/[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*/T-[0-9]{2,}$"}]},
677
+ "result_sha": {"type": ["string", "null"]},
678
+ "method": {"enum": [null, "direct-parent", "fast-forward", "merge-commit"]},
679
+ "conflict_paths": {"type": "array", "items": {"type": "string"}},
680
+ "verification": {"enum": ["pending", "passed", "failed"]},
681
+ "full_suite": {"$ref": "#/$defs/full-suite"},
682
+ "e2e": {"$ref": "#/$defs/full-suite"},
683
+ "evidence": {"type": "string", "pattern": "^\\{roots\\.state\\}/specdev/changes/[^<]+/evidence/T-[0-9]{2,}\\.md$"},
684
+ "attempts": {"type": "integer", "minimum": 0},
685
+ "promotion_status": {"enum": ["pending", "applying", "applied", "failed", "stale"]}
928
686
  },
929
- "then": {
930
- "properties": {
931
- "archived": {
932
- "const": true
933
- },
934
- "archive_path": {
935
- "type": "string",
936
- "pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
937
- }
938
- }
939
- }
687
+ "additionalProperties": false
940
688
  }
941
- ],
942
- "additionalProperties": true
689
+ },
690
+ "allOf": [{
691
+ "if": {"properties": {"change_status": {"const": "archived"}}, "required": ["change_status"]},
692
+ "then": {"properties": {"archived": {"const": true}, "archive_path": {"type": "string", "pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"}}}
693
+ }],
694
+ "additionalProperties": false
943
695
  }
944
696
  ```
945
697