instar 1.3.613 → 1.3.614

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.613",
3
+ "version": "1.3.614",
4
4
  "description": "Coherence infrastructure for self-evolving AI agents — on the Claude Code or Codex subscription you already have.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-06-17T12:30:56.584Z",
5
- "instarVersion": "1.3.613",
4
+ "generatedAt": "2026-06-17T13:13:46.301Z",
5
+ "instarVersion": "1.3.614",
6
6
  "entryCount": 201,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -418,7 +418,7 @@
418
418
  "type": "route-group",
419
419
  "domain": "monitoring",
420
420
  "sourcePath": "src/server/routes.ts",
421
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
421
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
422
422
  "since": "2025-01-01"
423
423
  },
424
424
  "route-group:agents": {
@@ -426,7 +426,7 @@
426
426
  "type": "route-group",
427
427
  "domain": "sessions",
428
428
  "sourcePath": "src/server/routes.ts",
429
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
429
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
430
430
  "since": "2025-01-01"
431
431
  },
432
432
  "route-group:backups": {
@@ -434,7 +434,7 @@
434
434
  "type": "route-group",
435
435
  "domain": "operations",
436
436
  "sourcePath": "src/server/routes.ts",
437
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
437
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
438
438
  "since": "2025-01-01"
439
439
  },
440
440
  "route-group:git": {
@@ -442,7 +442,7 @@
442
442
  "type": "route-group",
443
443
  "domain": "coordination",
444
444
  "sourcePath": "src/server/routes.ts",
445
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
445
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
446
446
  "since": "2025-01-01"
447
447
  },
448
448
  "route-group:memory": {
@@ -450,7 +450,7 @@
450
450
  "type": "route-group",
451
451
  "domain": "memory",
452
452
  "sourcePath": "src/server/routes.ts",
453
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
453
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
454
454
  "since": "2025-01-01"
455
455
  },
456
456
  "route-group:semantic": {
@@ -458,7 +458,7 @@
458
458
  "type": "route-group",
459
459
  "domain": "memory",
460
460
  "sourcePath": "src/server/routes.ts",
461
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
461
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
462
462
  "since": "2025-01-01"
463
463
  },
464
464
  "route-group:status": {
@@ -466,7 +466,7 @@
466
466
  "type": "route-group",
467
467
  "domain": "monitoring",
468
468
  "sourcePath": "src/server/routes.ts",
469
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
469
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
470
470
  "since": "2025-01-01"
471
471
  },
472
472
  "route-group:capabilities": {
@@ -474,7 +474,7 @@
474
474
  "type": "route-group",
475
475
  "domain": "mapping",
476
476
  "sourcePath": "src/server/routes.ts",
477
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
477
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
478
478
  "since": "2025-01-01"
479
479
  },
480
480
  "route-group:project-map": {
@@ -482,7 +482,7 @@
482
482
  "type": "route-group",
483
483
  "domain": "mapping",
484
484
  "sourcePath": "src/server/routes.ts",
485
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
485
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
486
486
  "since": "2025-01-01"
487
487
  },
488
488
  "route-group:coherence": {
@@ -490,7 +490,7 @@
490
490
  "type": "route-group",
491
491
  "domain": "coherence",
492
492
  "sourcePath": "src/server/routes.ts",
493
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
493
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
494
494
  "since": "2025-01-01"
495
495
  },
496
496
  "route-group:topic-bindings": {
@@ -498,7 +498,7 @@
498
498
  "type": "route-group",
499
499
  "domain": "sessions",
500
500
  "sourcePath": "src/server/routes.ts",
501
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
501
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
502
502
  "since": "2025-01-01"
503
503
  },
504
504
  "route-group:context": {
@@ -506,7 +506,7 @@
506
506
  "type": "route-group",
507
507
  "domain": "context",
508
508
  "sourcePath": "src/server/routes.ts",
509
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
509
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
510
510
  "since": "2025-01-01"
511
511
  },
512
512
  "route-group:scope-coherence": {
@@ -514,7 +514,7 @@
514
514
  "type": "route-group",
515
515
  "domain": "coherence",
516
516
  "sourcePath": "src/server/routes.ts",
517
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
517
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
518
518
  "since": "2025-01-01"
519
519
  },
520
520
  "route-group:canonical-state": {
@@ -522,7 +522,7 @@
522
522
  "type": "route-group",
523
523
  "domain": "state",
524
524
  "sourcePath": "src/server/routes.ts",
525
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
525
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
526
526
  "since": "2025-01-01"
527
527
  },
528
528
  "route-group:ci": {
@@ -530,7 +530,7 @@
530
530
  "type": "route-group",
531
531
  "domain": "monitoring",
532
532
  "sourcePath": "src/server/routes.ts",
533
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
533
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
534
534
  "since": "2025-01-01"
535
535
  },
536
536
  "route-group:sessions": {
@@ -538,7 +538,7 @@
538
538
  "type": "route-group",
539
539
  "domain": "sessions",
540
540
  "sourcePath": "src/server/routes.ts",
541
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
541
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
542
542
  "since": "2025-01-01"
543
543
  },
544
544
  "route-group:jobs": {
@@ -546,7 +546,7 @@
546
546
  "type": "route-group",
547
547
  "domain": "scheduling",
548
548
  "sourcePath": "src/server/routes.ts",
549
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
549
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
550
550
  "since": "2025-01-01"
551
551
  },
552
552
  "route-group:skip-ledger": {
@@ -554,7 +554,7 @@
554
554
  "type": "route-group",
555
555
  "domain": "scheduling",
556
556
  "sourcePath": "src/server/routes.ts",
557
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
557
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
558
558
  "since": "2025-01-01"
559
559
  },
560
560
  "route-group:telegram": {
@@ -562,7 +562,7 @@
562
562
  "type": "route-group",
563
563
  "domain": "communication",
564
564
  "sourcePath": "src/server/routes.ts",
565
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
565
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
566
566
  "since": "2025-01-01"
567
567
  },
568
568
  "route-group:attention": {
@@ -570,7 +570,7 @@
570
570
  "type": "route-group",
571
571
  "domain": "communication",
572
572
  "sourcePath": "src/server/routes.ts",
573
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
573
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
574
574
  "since": "2025-01-01"
575
575
  },
576
576
  "route-group:relationships": {
@@ -578,7 +578,7 @@
578
578
  "type": "route-group",
579
579
  "domain": "relationships",
580
580
  "sourcePath": "src/server/routes.ts",
581
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
581
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
582
582
  "since": "2025-01-01"
583
583
  },
584
584
  "route-group:feedback": {
@@ -586,7 +586,7 @@
586
586
  "type": "route-group",
587
587
  "domain": "feedback",
588
588
  "sourcePath": "src/server/routes.ts",
589
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
589
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
590
590
  "since": "2025-01-01"
591
591
  },
592
592
  "route-group:updates": {
@@ -594,7 +594,7 @@
594
594
  "type": "route-group",
595
595
  "domain": "updates",
596
596
  "sourcePath": "src/server/routes.ts",
597
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
597
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
598
598
  "since": "2025-01-01"
599
599
  },
600
600
  "route-group:dispatches": {
@@ -602,7 +602,7 @@
602
602
  "type": "route-group",
603
603
  "domain": "dispatches",
604
604
  "sourcePath": "src/server/routes.ts",
605
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
605
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
606
606
  "since": "2025-01-01"
607
607
  },
608
608
  "route-group:quota": {
@@ -610,7 +610,7 @@
610
610
  "type": "route-group",
611
611
  "domain": "monitoring",
612
612
  "sourcePath": "src/server/routes.ts",
613
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
613
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
614
614
  "since": "2025-01-01"
615
615
  },
616
616
  "route-group:publishing": {
@@ -618,7 +618,7 @@
618
618
  "type": "route-group",
619
619
  "domain": "publishing",
620
620
  "sourcePath": "src/server/routes.ts",
621
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
621
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
622
622
  "since": "2025-01-01"
623
623
  },
624
624
  "route-group:private-views": {
@@ -626,7 +626,7 @@
626
626
  "type": "route-group",
627
627
  "domain": "publishing",
628
628
  "sourcePath": "src/server/routes.ts",
629
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
629
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
630
630
  "since": "2025-01-01"
631
631
  },
632
632
  "route-group:tunnel": {
@@ -634,7 +634,7 @@
634
634
  "type": "route-group",
635
635
  "domain": "networking",
636
636
  "sourcePath": "src/server/routes.ts",
637
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
637
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
638
638
  "since": "2025-01-01"
639
639
  },
640
640
  "route-group:events": {
@@ -642,7 +642,7 @@
642
642
  "type": "route-group",
643
643
  "domain": "networking",
644
644
  "sourcePath": "src/server/routes.ts",
645
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
645
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
646
646
  "since": "2025-01-01"
647
647
  },
648
648
  "route-group:evolution": {
@@ -650,7 +650,7 @@
650
650
  "type": "route-group",
651
651
  "domain": "evolution",
652
652
  "sourcePath": "src/server/routes.ts",
653
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
653
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
654
654
  "since": "2025-01-01"
655
655
  },
656
656
  "route-group:watchdog": {
@@ -658,7 +658,7 @@
658
658
  "type": "route-group",
659
659
  "domain": "monitoring",
660
660
  "sourcePath": "src/server/routes.ts",
661
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
661
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
662
662
  "since": "2025-01-01"
663
663
  },
664
664
  "route-group:topic-memory": {
@@ -666,7 +666,7 @@
666
666
  "type": "route-group",
667
667
  "domain": "memory",
668
668
  "sourcePath": "src/server/routes.ts",
669
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
669
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
670
670
  "since": "2025-01-01"
671
671
  },
672
672
  "route-group:state-sync": {
@@ -674,7 +674,7 @@
674
674
  "type": "route-group",
675
675
  "domain": "coordination",
676
676
  "sourcePath": "src/server/routes.ts",
677
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
677
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
678
678
  "since": "2025-01-01"
679
679
  },
680
680
  "route-group:intent": {
@@ -682,7 +682,7 @@
682
682
  "type": "route-group",
683
683
  "domain": "intent",
684
684
  "sourcePath": "src/server/routes.ts",
685
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
685
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
686
686
  "since": "2025-01-01"
687
687
  },
688
688
  "route-group:triage": {
@@ -690,7 +690,7 @@
690
690
  "type": "route-group",
691
691
  "domain": "safety",
692
692
  "sourcePath": "src/server/routes.ts",
693
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
693
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
694
694
  "since": "2025-01-01"
695
695
  },
696
696
  "route-group:operations": {
@@ -698,7 +698,7 @@
698
698
  "type": "route-group",
699
699
  "domain": "safety",
700
700
  "sourcePath": "src/server/routes.ts",
701
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
701
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
702
702
  "since": "2025-01-01"
703
703
  },
704
704
  "route-group:sentinel": {
@@ -706,7 +706,7 @@
706
706
  "type": "route-group",
707
707
  "domain": "safety",
708
708
  "sourcePath": "src/server/routes.ts",
709
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
709
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
710
710
  "since": "2025-01-01"
711
711
  },
712
712
  "route-group:trust": {
@@ -714,7 +714,7 @@
714
714
  "type": "route-group",
715
715
  "domain": "safety",
716
716
  "sourcePath": "src/server/routes.ts",
717
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
717
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
718
718
  "since": "2025-01-01"
719
719
  },
720
720
  "route-group:monitoring": {
@@ -722,7 +722,7 @@
722
722
  "type": "route-group",
723
723
  "domain": "monitoring",
724
724
  "sourcePath": "src/server/routes.ts",
725
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
725
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
726
726
  "since": "2025-01-01"
727
727
  },
728
728
  "route-group:commitments": {
@@ -730,7 +730,7 @@
730
730
  "type": "route-group",
731
731
  "domain": "commitments",
732
732
  "sourcePath": "src/server/routes.ts",
733
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
733
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
734
734
  "since": "2025-01-01"
735
735
  },
736
736
  "route-group:episodes": {
@@ -738,7 +738,7 @@
738
738
  "type": "route-group",
739
739
  "domain": "memory",
740
740
  "sourcePath": "src/server/routes.ts",
741
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
741
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
742
742
  "since": "2025-01-01"
743
743
  },
744
744
  "route-group:messages": {
@@ -746,7 +746,7 @@
746
746
  "type": "route-group",
747
747
  "domain": "coordination",
748
748
  "sourcePath": "src/server/routes.ts",
749
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
749
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
750
750
  "since": "2025-01-01"
751
751
  },
752
752
  "route-group:system-reviews": {
@@ -754,7 +754,7 @@
754
754
  "type": "route-group",
755
755
  "domain": "monitoring",
756
756
  "sourcePath": "src/server/routes.ts",
757
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
757
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
758
758
  "since": "2025-01-01"
759
759
  },
760
760
  "route-group:machine-mesh": {
@@ -770,7 +770,7 @@
770
770
  "type": "route-group",
771
771
  "domain": "security",
772
772
  "sourcePath": "src/server/routes.ts",
773
- "contentHash": "4666744e990aab57550cd8216d9d56e2a1c1a33ed90001f6e96afb20399d0f85",
773
+ "contentHash": "d3b9435003ddf83d05ccfd6574a296907ca85320f54d35b27488fde6b9feeb08",
774
774
  "since": "2025-01-01"
775
775
  },
776
776
  "cli:init": {
@@ -0,0 +1,22 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ WS5.2 R6b — the Phase-C headless-enrollment reliability contract, layered onto the existing secure enroll-start route without weakening its mandate-gate/authoritative-email guarantees. Three parts: (1) a configurable, larger scrape-timeout budget for remote/cloud enrollments — new config knob `multiMachine.accountFollowMe.remoteScrapeTimeoutMs` (default 180000ms / 3min), threaded into the follow-me enroll path ONLY (normal local enrollment keeps the 60s default); `FrameworkLoginDriver.drive()` gained an optional per-call timeout override (invalid values fall back safely). (2) The honest failure surface: `EnrollmentWizard.start()` now catches a login-drive failure and re-raises a typed `EnrollmentDriveError` — and because the drive runs BEFORE the pending-login is persisted, a failure never leaves a silently-stuck pending-login; both enroll routes map it to an honest, retryable 502 instead of an opaque 500. (3) The two-code Claude case: the remote path prefers the device-code single-code flow where the provider supports it (OpenAI/Codex), and for Claude (no device-code endpoint) the larger budget covers a late-arriving verification URL.
9
+
10
+ ## What to Tell Your User
11
+
12
+ Still nothing to do — this hardens the multi-machine enrollment (off by default). When a machine enrolls one of your accounts, it now gets a realistic login window (cloud/remote logins are slower than local), prefers the simplest one-code login where possible, and if the login can't start it tells you honestly with a retry instead of leaving a stuck half-started enrollment.
13
+
14
+ ## Summary of New Capabilities
15
+
16
+ Enrollment reliability (dark): a configurable larger remote scrape-timeout, an honest typed drive-failure surface (no silently-stuck pending logins; retryable 502), and a device-code preference for remote enrollments. No user-facing surface is live in this release.
17
+
18
+ ## Evidence
19
+
20
+ - 60 tests across 4 files: `enrollment-wizard` (honest-failure + no-dangling-pending for local & remote, remoteKind, device-code preference, explicit-kind-wins, timeout threading), `framework-login-driver` (per-call override reaches a late artifact; default still times out; invalid override falls back), `ws52-account-follow-me-wiring` (the new defaults knob), and the enroll-start integration test (kept all of #1214's security cases: dark→503, denied→403, valid→201 w/ S7 email, unresolvable→409, 400; added: drive-throw→502 honest + no stuck pending, and the drive receives the larger remote timeout + device-code). `tsc --noEmit` clean.
21
+ - Side-effects review + mandatory independent second-pass security review (concurred): CRITICALLY verified the reconciliation kept #1214's mandate gate + authoritative-email resolution intact (this change was reconciled after a parallel-timing collision); confirmed no stuck pending-login, local enrollment unchanged, both callers handle the typed error, and no fail-open.
22
+ - Spec: `docs/specs/ws52-account-follow-me-security.md` R6/R6b (converged, approved).
@@ -0,0 +1,66 @@
1
+ # Side-Effects Review — WS5.2 R6b: Phase-C headless-enrollment reliability
2
+
3
+ **Version / slug:** `ws52-account-follow-me-r6b-reliability`
4
+ **Date:** `2026-06-17`
5
+ **Author:** `Echo (instar-dev agent)`
6
+ **Second-pass reviewer:** `pending (high-risk: enrollment/credential path — EnrollmentWizard.start failure handling + the follow-me enroll-start route)`
7
+
8
+ ## Summary of the change
9
+
10
+ WS5.2 R6b — the Phase-C headless-enrollment reliability contract, layered onto the existing (#1214) secure enroll-start route WITHOUT weakening its mandate-gate/authoritative-email guarantees. Three parts: (1) `FrameworkLoginDriver.drive()` accepts an optional per-call `scrapeTimeoutMs` override (non-finite/≤0 ignored → falls back to the constructor default); a new config knob `multiMachine.accountFollowMe.remoteScrapeTimeoutMs` (default 180000ms / 3min) is threaded into the FOLLOW-ME enroll path only — normal local enrollment keeps the 60s default. (2) The HONEST FAILURE SURFACE: `EnrollmentWizard.start()` now wraps `driveLogin` in try/catch and re-raises a drive failure as a typed `EnrollmentDriveError` (with `code`/`operatorMessage`/`cause`); because `start()` calls `driveLogin` BEFORE `store.issue()`, a drive failure never leaves a stuck pending-login. Both `start()` callers map `EnrollmentDriveError` → an honest, retryable 502 (the generic `/subscription-pool/enroll` route and the follow-me enroll-start route) instead of a bare 500. (3) The two-code Claude case: the follow-me/remote path prefers the device-code single-code flow where the provider supports it (`remoteKind()` → device-code for OpenAI/Codex; Anthropic has no device-code endpoint so it stays `url-code-paste`), and for the no-single-code provider the larger remote timeout covers a late-arriving verification URL (instar only scrapes the URL; the second code is operator→CLI, never scraped). Files: `FrameworkLoginDriver.ts`, `EnrollmentWizard.ts`, `ConfigDefaults.ts`, `routes.ts` (502 mapping + enhancements on #1214's route — the duplicate insecure route an earlier stale-base build added was removed; #1214's secure route is authoritative), + 4 test files.
11
+
12
+ ## Decision-point inventory
13
+
14
+ - `EnrollmentWizard.start()` drive-failure handling — **modify** — a drive failure becomes a typed error a caller can render honestly, never a silent stuck pending-login.
15
+ - Follow-me enroll-start route 502 mapping + remote timeout/device-code — **modify** (on #1214's route) — enrollment reliability; the mandate gate + authoritative email (the authorization decisions) are UNCHANGED.
16
+ - `remoteScrapeTimeoutMs` config knob — **add** — larger cloud scrape budget, follow-me path only.
17
+
18
+ ---
19
+
20
+ ## 1. Over-block
21
+
22
+ None. The larger timeout only ever makes the remote path WAIT LONGER before failing — it never rejects a legitimate enrollment that the old 60s would have accepted. The honest-failure path turns a previously-opaque drive throw into a clear 502 retry signal; it does not reject anything that previously succeeded. Local enrollment is byte-for-byte unchanged (the knob is read only on the follow-me path).
23
+
24
+ ## 2. Under-block
25
+
26
+ The reliability layer does not add authorization — that remains #1214's mandate gate (unchanged). A drive that SUCCEEDS but mints the wrong account is still caught downstream by S7 at `/complete` (email validation) — R6b does not touch that. The honest-failure surface reports a START failure; it does not itself verify the eventual login outcome (by design — the completion gate owns that).
27
+
28
+ ## 3. Level-of-abstraction fit
29
+
30
+ Correct layers: the timeout knob lives on the driver (which owns the scrape), the failure-typing lives on `EnrollmentWizard.start` (which owns the drive call), and the HTTP mapping lives on the routes (which own the operator-facing surface). The kind-preference (device-code) extends the existing `defaultKind` logic rather than re-implementing flow selection. No logic was duplicated; the earlier stale-base duplicate route was removed in favor of #1214's secure one.
31
+
32
+ ## 4. Signal vs authority compliance
33
+
34
+ R6b adds NO new authority — it is purely reliability + honest reporting. The only authority on this path (the mandate gate) is #1214's and is untouched. `EnrollmentDriveError` is a signal (a typed failure the caller renders); it never blocks an authorized action — it reports that a drive could not START, with a retry hint. Deterministic (a timeout or a thrown driver error), not heuristic.
35
+
36
+ ## 5. Interactions
37
+
38
+ The change composes with #1214's enroll-start route (enhances it) and the S7 `/complete` gate (unchanged downstream). The `start()`-before-`issue()` ordering is the load-bearing invariant for "no stuck pending-login on drive failure" — preserved. Both `start()` callers were updated to map the typed error (no caller left throwing an opaque 500). The background `reissueExpired` sweep already swallowed driver errors by design and was deliberately NOT changed (it is not the start path). No double-fire, no shadowing.
39
+
40
+ ## 6. External surfaces
41
+
42
+ One new config knob (`remoteScrapeTimeoutMs`, additive, defaulted). The enroll-start + generic enroll routes now return 502 (retryable) on a drive failure instead of 500 — a more honest status for the same failure class; both remain dark behind `multiMachine.accountFollowMe` (the follow-me route) / unchanged-gating (the generic route). No new route. No cross-machine surface.
43
+
44
+ ## 7. Multi-machine posture (Cross-Machine Coherence)
45
+
46
+ The reliability layer is per-machine by nature: the larger timeout + device-code preference apply to the enrollment running ON the target machine (the one minting its own login). The config knob is read locally. Nothing replicates. This directly serves the multi-machine case (a remote/slower target gets a realistic login budget + an honest failure message instead of a silent 60s timeout), which is exactly the Phase-C scenario R6b targets.
47
+
48
+ ## 8. Rollback cost
49
+
50
+ Low. Dark behind `multiMachine.accountFollowMe` for the follow-me path; the generic-route 502 mapping is a status-code refinement (revert is trivial). The config knob is additive (absence → the driver's existing 60s default). No migration, no persisted state. Single-commit back-out.
51
+
52
+ ---
53
+
54
+ ## Second-pass review
55
+
56
+ **Concur with the review.** Independent audit (the reconciliation was verified to NOT weaken #1214):
57
+
58
+ 1. **(CRITICAL) Mandate authorization intact** — exactly one `/subscription-pool/follow-me/enroll/start` route; the mandate gate (`ctx.coordination.gate.evaluate({action:'account-follow-me',...})` → 403 on `decision !== 'allow'`) and `resolveFollowMeEnrollTarget` (409 fail-closed, body email never used) are fully preserved. R6b only inserted `remote:true` + `remoteScrapeTimeoutMs` INSIDE the already-gated block.
59
+ 2. **No stuck pending-login** — `driveLogin` runs before `store.issue()`; a throw is caught + re-raised as `EnrollmentDriveError` before any persistence; tests assert `pending()` empty after a drive throw.
60
+ 3. **Local enrollment unchanged** — the larger budget + `remoteKind` apply only when `remote:true`; the generic route keeps the 60s default.
61
+ 4. **Both start() callers handle EnrollmentDriveError** → 502 retryable; none unhandled.
62
+ 5. **Config knob** — `remoteScrapeTimeoutMs` default 180000, read on the follow-me path with a `Number.isFinite` guard.
63
+ 6. **Device-code preference** — `remoteKind` returns device-code only for openai; Claude stays `url-code-paste` (no unsupported flow forced).
64
+ 7. **No fail-open** — invalid timeout falls back to the safe default (tested); deny-by-default gate unchanged.
65
+
66
+ `tsc --noEmit` EXIT=0; 60/60 tests pass.