instar 1.3.804 → 1.3.806
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/dashboard/index.html +19 -1
- package/dashboard/subscriptions.js +513 -67
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +43 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/CoherenceJournal.d.ts +14 -0
- package/dist/core/CoherenceJournal.d.ts.map +1 -1
- package/dist/core/CoherenceJournal.js +33 -0
- package/dist/core/CoherenceJournal.js.map +1 -1
- package/dist/core/EnrollmentWizard.d.ts +23 -0
- package/dist/core/EnrollmentWizard.d.ts.map +1 -1
- package/dist/core/EnrollmentWizard.js +42 -1
- package/dist/core/EnrollmentWizard.js.map +1 -1
- package/dist/core/JournalSyncApplier.d.ts +14 -0
- package/dist/core/JournalSyncApplier.d.ts.map +1 -1
- package/dist/core/JournalSyncApplier.js +33 -0
- package/dist/core/JournalSyncApplier.js.map +1 -1
- package/dist/core/ReplicatedPeerStreamReader.d.ts +29 -1
- package/dist/core/ReplicatedPeerStreamReader.d.ts.map +1 -1
- package/dist/core/ReplicatedPeerStreamReader.js +175 -0
- package/dist/core/ReplicatedPeerStreamReader.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +128 -30
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +46 -46
- package/upgrades/1.3.805.md +41 -0
- package/upgrades/1.3.806.md +30 -0
- package/upgrades/eli16/replicated-witness-index.md +19 -0
- package/upgrades/side-effects/replicated-witness-index.md +83 -0
- package/upgrades/side-effects/subs-setup-flow-ux.md +79 -0
- package/upgrades/subs-setup-flow-ux.eli16.md +31 -0
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-07-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-07-10T22:01:40.007Z",
|
|
5
|
+
"instarVersion": "1.3.806",
|
|
6
6
|
"entryCount": 202,
|
|
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": "
|
|
421
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
429
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
437
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
445
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
453
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
461
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
469
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
477
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
485
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
493
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
501
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
509
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
517
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
525
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
533
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
541
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
549
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
557
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
565
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
573
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
581
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
589
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
597
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
605
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
613
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
621
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
629
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
637
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
645
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
653
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
661
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
669
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
677
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
685
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
693
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
701
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
709
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
717
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
725
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
733
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
741
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
749
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
757
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
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": "
|
|
773
|
+
"contentHash": "c24f3022b7d216daab5b517b55fae6da6d9ca04471c4fcf47ee18c9d1abb37a9",
|
|
774
774
|
"since": "2025-01-01"
|
|
775
775
|
},
|
|
776
776
|
"cli:init": {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
Subscriptions "Set up" flow — the five topic-29836 operator-observed defects (screenshot-proven, 2026-07-10), fixed end to end:
|
|
9
|
+
|
|
10
|
+
1. **D1 — a background refresh never clobbers an open interaction (new Dashboard UX Standard floor F9).** The tab's 30s poll used to rebuild the matrix/panel out from under the operator: the PIN input reverted to "Set up" mid-typing; the code-paste step was swapped for "◷ Signing in…" before the code could be pasted. New shared primitives in `dashboard/subscriptions.js` (`hasOpenInteraction`, `updateCountdowns`): a surface holding an open interaction (an episode marked `data-interaction-open`, a focused text-entry, or a dirty field) is never rebuilt — the poll merges server state around it (live TTL countdowns via `data-ttl-expires`) until the flow reaches a terminal state or the operator backs out (new Back affordance on PIN entry). Applied to the matrix, the pending panel, AND the follow-me Approve card (same defect class). Floor registered in `docs/specs/dashboard-ux-standard.md` (F9) + `docs/STANDARDS-REGISTRY.md`; enforcement: `tests/unit/dashboard-refresh-interaction-hold.test.ts` (with a negative control) + controller integration tests. Migrating the other polling tabs onto the primitives is tracked in the spec <!-- tracked: topic-29836 -->.
|
|
11
|
+
2. **D2 — the matrix cell carries the COMPLETE flow.** Sign-in link, expected-account notice, code input + Submit, live link-expiry countdown, the two-codes heads-up, and Cancel all render IN the cell — from SERVER pending-login state (`appendCellSignInFlow`), so the step survives reloads and rebuilds and can never exist only in the bottom panel. start-cell responses pass through `expectedEmail`/`ttlExpiresAt`/`notice`/`kind`. The bottom panel stays as a mirror.
|
|
12
|
+
3. **D3 — wrong-account hazard, both layers.** UI: the cell and the panel state prominently which account the provider's OAuth page MUST show ("the sign-in page must show headley.justin@gmail.com — if it shows a different account, tap “Switch account” first"), rendered from the enrollment record. Structural: the pre-existing fail-closed S7 email gate's held verdict now carries `expected`/`got` through `completeFollowMe` → the submit-code response → plain-language copy naming BOTH accounts ("that code signed in X — this slot needs Y; the account was NOT enrolled"). Oracle-unavailable keeps failing CLOSED, now with honest "couldn't confirm which account that was" copy.
|
|
13
|
+
4. **D4 — unmistakable terminal states.** Validated → in-cell "✓ All set — <email> is signed in" with a transient `just-verified` highlight that bridges until the pool read shows Active (never a blink back to "Set up"); held/expired/dead-pane → explicit red states with a working Retry; the pending panel keeps durable ✓ Done / ✗ failed / expired cards (never a vanishing line).
|
|
14
|
+
5. **D5 — the re-sign-in flow made honest (the 2026-07-10 justin-gmail incident).** (a) Record⟂pane liveness: pending-logins responses annotate each local login with `paneAlive` (tri-state, fail-toward-unknown; peers annotate their own in the pool merge); a dead-pane record renders an explicit "Sign-in needs a restart" state (no code input) and code-submit against it answers a machine-readable 409 `code:'pane-dead'` (live-but-not-ready → `pane-not-ready`). (b) Single-attempt discipline at the mint chokepoint: enroll/start returns the existing LIVE attempt on a re-request (one attempt, one URL — parallel-PKCE code crossing is structurally closed) and atomically supersedes a dead-pane zombie (abandon + fresh drive, record and pane replaced together); the start-cell reuse gate honors the same rule. (c) The already-authorized short-circuit ("You're all set up… close this window", no code ever shown): a new `EnrollmentWizard.sweepFollowMeCompletions` on the existing 5-min reissue timer detects the landed credential and completes through the SAME identity gate — making submit-code's "the reissue/complete sweep finishes it" contract true. (d) A validated completion UPSERTS an existing pool account back to active (re-auth previously crashed on `add()`'s duplicate-id refusal and stranded the flow at "finishing sign-in…" forever). (e) Wording floors: accounts by email, machines by nickname (the pool-scope pending merge now tags the SELF machine's nickname; a raw `m_<hex>` id is never shown), and error copy only references affordances that exist on its surface (no more "re-tap Approve" on surfaces with no Approve).
|
|
15
|
+
|
|
16
|
+
All touched routes stay behind the existing `multiMachine.accountFollowMe` dev-gate — fleet installs keep 503ing exactly as before. API changes are additive response fields only; never a credential.
|
|
17
|
+
|
|
18
|
+
## What to Tell Your User
|
|
19
|
+
|
|
20
|
+
- Setting up an account on a machine from the Subscriptions grid no longer fights you: the page can't wipe your PIN or your pasted code while it refreshes, every step (link, code box, expiry countdown, warnings, Cancel) lives right in the grid cell, and finishing shows an unmistakable green "✓ All set" instead of a quiet text line.
|
|
21
|
+
- Before you open a sign-in link, the cell now tells you exactly which account the sign-in page must show — and if you sign in with the wrong one, it's refused safely with a message naming both accounts. Nothing gets enrolled under the wrong identity.
|
|
22
|
+
- Re-signing-in an account that expired ("Needs sign-in") actually works now: dead sign-in attempts announce themselves and restart cleanly, a second tap can't create two crossing sign-ins, and a sign-in that finishes without showing a code completes on its own within a few minutes.
|
|
23
|
+
|
|
24
|
+
## Summary of New Capabilities
|
|
25
|
+
|
|
26
|
+
| Capability | How to Use |
|
|
27
|
+
|---|---|
|
|
28
|
+
| Never-clobber refresh (Dashboard UX floor F9) | Automatic on the Subscriptions tab — type/tap freely; the poll merges around you |
|
|
29
|
+
| Complete in-cell sign-in flow | Tap "Set up"/"Sign in"/"Retry" on a grid cell — every step stays in the cell |
|
|
30
|
+
| Expected-account warning + both-accounts mismatch copy | Automatic — rendered from the enrollment record; held refusals name both emails |
|
|
31
|
+
| Pane-liveness on pending logins | `GET /subscription-pool/pending-logins` → each local login carries `paneAlive: true\|false\|null` |
|
|
32
|
+
| Machine-readable submit refusals | 409 `{ code: 'pane-dead' \| 'pane-not-ready' }` on `/follow-me/enroll/:id/submit-code` |
|
|
33
|
+
| Single live attempt per slot | Automatic — enroll/start reuses the live attempt (`reused:true`) or supersedes a dead one |
|
|
34
|
+
| No-code (short-circuit) completion sweep | Automatic — runs on the enrollment reissue timer; identity-gated like every completion |
|
|
35
|
+
|
|
36
|
+
## Evidence
|
|
37
|
+
|
|
38
|
+
- Tier 1: `tests/unit/dashboard-refresh-interaction-hold.test.ts` (16 — F9 predicate both sides, merge arm, NEGATIVE CONTROL proving a naive rebuild clobbers, wording floors, both-accounts copy); `tests/unit/subscriptions-render.test.ts` (48 — full in-cell flow, broken/expired/just-verified/held-detail states, expected-account notice, dead-pane card, outcome cards, wording floors, XSS-inertness); `tests/unit/enrollment-wizard.test.ts` (36 — held verdict carries expected/got both sides; completion sweep: match→validated+pool-add, mismatch→held+attention+NOT added, not-ready→untouched, non-follow-me skipped, throwing probe safe).
|
|
39
|
+
- Tier 2: `tests/integration/subscriptions-tab.test.ts` (16 — poll mid-PIN/mid-code/untyped-open never clobbers, Back releases, countdown merges on held DOM, validated→ceremony→active+just-verified→done card, held names both accounts and persists, pane-dead→needs-restart, vanished-episode→explicit expired, panel dead-pane not submittable, Approve-card PIN survives); `tests/integration/account-matrix-start-cell-route.test.ts` (7 — flow-detail passthrough, reuse carries same URL, dead-pane superseded not reused); `tests/integration/account-follow-me-submit-code-route.test.ts` (19 — pane-dead/pane-not-ready codes, wording floor, held carries both emails + parked-not-pooled, re-auth upsert); `tests/integration/account-follow-me-enroll-start-route.test.ts` (9 — healthy reuse: one URL/one drive; dead-pane supersede: exactly one live attempt); `tests/integration/subscription-enrollment-routes.test.ts` (paneAlive tri-state + live/dead annotation).
|
|
40
|
+
- Tier 3: `tests/e2e/subscriptions-tab-lifecycle.test.ts` — the production route path + SHIPPED controller: the matrix cell renders the complete flow from the LIVE server (expected email, code=true link, code input, TTL, Cancel), `paneAlive` flows through the real read, and a REAL poll tick against the live server preserves a half-typed code. `tests/e2e/matrix-cell-cancel-alive.test.ts` re-run green (Cancel relay preserved).
|
|
41
|
+
- Regression sweep: full subscription/follow-me/matrix suites + dashboard floor suites green.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
Replicated-store witness lookup now uses a derived in-memory index instead of scanning the journal streams on every emitted record. `ReplicatedPeerStreamReader` builds the index from own and peer replicated journal streams, then serves `loadWitness(store, recordKey)` from a `(store, recordKey) -> max HLC` map. `CoherenceJournal` and `JournalSyncApplier` update the index after replicated records are durably committed, so the index tracks fsynced bytes rather than queued writes.
|
|
9
|
+
|
|
10
|
+
The journal remains authoritative. The index is not persisted and rebuilds from disk on startup or loss. Rebuild includes parity mode: the derived witness answer is compared with the legacy full-scan answer, and any mismatch logs loudly and falls back to the scan.
|
|
11
|
+
|
|
12
|
+
## What to Tell Your User
|
|
13
|
+
|
|
14
|
+
- Multi-machine replicated-store writes should do much less synchronous journal work. A surviving emit no longer has to rescan a large replicated-store journal just to find the latest witness for one key.
|
|
15
|
+
- The optimization is conservative: it does not change merge rules, does not add a new data file, and does not make the index authoritative. If the derived answer ever disagrees with the legacy scan, Instar uses the old answer.
|
|
16
|
+
|
|
17
|
+
## Summary of New Capabilities
|
|
18
|
+
|
|
19
|
+
| Capability | How to Use |
|
|
20
|
+
|---|---|
|
|
21
|
+
| O(1) replicated witness lookup | No operator action; replicated-store emitters use the indexed `loadWitness` path automatically |
|
|
22
|
+
| Derived witness index rebuild | Restart or index loss rebuilds from authoritative journal streams |
|
|
23
|
+
| Witness parity fallback | A mismatch between index and legacy scan logs and falls back to legacy scan |
|
|
24
|
+
|
|
25
|
+
## Evidence
|
|
26
|
+
|
|
27
|
+
- Unit: `tests/unit/ReplicatedPeerStreamReader.test.ts` covers index correctness across own/peer updates, no journal-byte reads during emitter witness lookup, and rebuild after in-memory loss.
|
|
28
|
+
- Integration: `tests/integration/replicated-witness-index.integration.test.ts` covers the real emitter path with a counted filesystem seam.
|
|
29
|
+
- E2E: `tests/e2e/replicated-witness-index-lifecycle.test.ts` rebuilds from own + peer journal streams and preserves the union read shape.
|
|
30
|
+
- Regression: `tests/unit/ReplicatedRecordEmitter.test.ts`, `tests/unit/evolution-manager-emit-wedge.test.ts`, and `npx tsc --noEmit` are green.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# ELI16 — Replicated Witness Index
|
|
2
|
+
|
|
3
|
+
## What Changed
|
|
4
|
+
|
|
5
|
+
Replicated stores write their updates into append-only journal files. When one machine writes a new record, it also stamps an `observed` witness: the newest version of that same record key that this machine had already seen. That witness is what keeps two machines from silently overwriting each other when they edited the same thing at the same time.
|
|
6
|
+
|
|
7
|
+
Before this change, the witness lookup was correct but expensive. Every emitted replicated record asked the peer-stream reader to find the latest witness for one `(store, recordKey)`, and the reader answered by scanning the journal streams again. On a small journal that was fine. On a real evolution-action journal with tens of megabytes and many keys, every surviving emit still paid a synchronous journal scan.
|
|
8
|
+
|
|
9
|
+
This change keeps the journal as the source of truth but adds a derived in-memory witness index. When the reader attaches, it streams the journal files once in fixed-size chunks and builds a map from `(store, recordKey)` to the latest HLC witness. After that, `loadWitness()` reads the map directly instead of re-reading the journal. When the local journal or peer applier durably commits replicated records, they notify the reader after `fdatasync`, and the reader updates the map incrementally.
|
|
10
|
+
|
|
11
|
+
## Why It Is Safe
|
|
12
|
+
|
|
13
|
+
The index is derived and rebuildable. It is never more authoritative than the journal. A restart, missing index, or lost in-memory state simply rebuilds the map from the journal streams. The update hooks run only after durable append boundaries: local records after the journal flush has written and synced the batch, and peer records after the applier has written and synced the replica batch.
|
|
14
|
+
|
|
15
|
+
The rollout also keeps a parity check. During rebuild, the derived map is compared with the legacy full-scan witness answer. If the answers ever disagree, the reader logs a loud warning and falls back to the legacy scan instead of trusting the index.
|
|
16
|
+
|
|
17
|
+
## How To Verify
|
|
18
|
+
|
|
19
|
+
The unit tests prove the index matches the legacy answer across local writes, peer writes, and later updates. They also prove an emitter using `loadWitness()` does not read journal bytes once the index is built. The integration test covers the real emitter path with a counted filesystem seam. The e2e lifecycle test proves a fresh reader rebuilds the witness from own and peer journal streams after the in-memory index is gone.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Side-Effects Review — Replicated witness index
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `replicated-witness-index`
|
|
4
|
+
**Date:** `2026-07-10`
|
|
5
|
+
**Author:** `instar-codey`
|
|
6
|
+
**Second-pass reviewer:** `not required`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
This change makes the replicated-store `loadWitness(store, recordKey)` path use a derived in-memory index instead of rematerializing journal streams on every emit. The index is built by `ReplicatedPeerStreamReader` from the authoritative own and peer journal streams, then incrementally updated from two post-durability observers: `CoherenceJournal` notifies after a replicated local batch is written and `fdatasync` has returned, and `JournalSyncApplier` notifies after a peer replica batch is written and `fdatasync` has returned.
|
|
11
|
+
|
|
12
|
+
The journal and replica files remain the only authority. The index is process memory only, can be rebuilt at any time, and is parity-checked against the legacy full-scan witness answer before it is trusted. If parity fails, `loadWitness` falls back to the legacy scan and logs a loud witness-index warning.
|
|
13
|
+
|
|
14
|
+
## Decision-point inventory
|
|
15
|
+
|
|
16
|
+
- `ReplicatedPeerStreamReader.rebuildWitnessIndex` — add — streams registered replicated journal files to build the derived `(store, recordKey) -> max HLC` map.
|
|
17
|
+
- `ReplicatedPeerStreamReader.loadWitness` — modify — serves the derived map when parity is trusted; falls back to the old scan if parity is not trusted.
|
|
18
|
+
- `ReplicatedPeerStreamReader.observeCommittedEntries` — add — folds durable local/peer append notifications into the derived map.
|
|
19
|
+
- `CoherenceJournal.setReplicatedRecordCommitObserver` / notification — add — notifies only after local replicated records have crossed the flush/fdatasync boundary.
|
|
20
|
+
- `JournalSyncApplier.setReplicatedRecordCommitObserver` / notification — add — notifies only after peer replica records have crossed the append/fdatasync boundary.
|
|
21
|
+
- `server.ts` WS2 wiring — modify — attaches the two observers to the one `ReplicatedPeerStreamReader`.
|
|
22
|
+
|
|
23
|
+
## 1. Over-block
|
|
24
|
+
|
|
25
|
+
No user operation is newly blocked. The witness index is a read optimization for the replicated-store send path. If the index is wrong, the parity guard disables trust in it and serves the old scan result. If an observer callback throws, journal/apply durability is preserved and the index remains rebuildable from disk.
|
|
26
|
+
|
|
27
|
+
## 2. Under-block
|
|
28
|
+
|
|
29
|
+
The main under-detection risk is a stale derived index missing a witness. That would make a later emit omit `observed`, which is the safe merge direction: peers flag possible concurrency instead of silently clobbering. Production wiring reduces that risk by updating the index after every local and peer durable append. Restart/loss rebuilds from the journal streams.
|
|
30
|
+
|
|
31
|
+
## 3. Level-of-abstraction fit
|
|
32
|
+
|
|
33
|
+
Correct layer. `ReplicatedPeerStreamReader` already owns the witness seam and knows the registry, own streams, peer streams, schema validation, and HLC ordering. The journal and applier only expose post-fsync observations; they do not own witness semantics and do not persist an index. This keeps the optimization store-agnostic and avoids per-store caches.
|
|
34
|
+
|
|
35
|
+
Claim-check note: `src/commands/server.ts` has several unrelated open PR claims in dashboard/update/messaging layers. This change touches only the WS2 replicated-store wiring block to attach observer callbacks. No sibling appears to own the witness-index layer.
|
|
36
|
+
|
|
37
|
+
## 4. Signal vs authority compliance
|
|
38
|
+
|
|
39
|
+
- [x] No new gate or authority surface.
|
|
40
|
+
|
|
41
|
+
The new callbacks are informational derived-index updates. They cannot approve, block, mutate user-visible state, or make the journal authoritative in a new way. The existing journal/applier durability contracts remain the authority.
|
|
42
|
+
|
|
43
|
+
## 5. Interactions
|
|
44
|
+
|
|
45
|
+
- **Local journal flush:** the observer fires after the replicated batch is written and synced, so queued in-memory emits are never witnessed as durable.
|
|
46
|
+
- **Peer replica apply:** the observer fires after durable replica append, matching the applier's ack-after-fsync contract.
|
|
47
|
+
- **Parity mode:** rebuild compares the index answer with the legacy full-scan witness answer. A mismatch logs once and falls back to the scan.
|
|
48
|
+
- **Crash/restart:** there is no persisted index to corrupt. A new reader rebuilds from own and peer streams.
|
|
49
|
+
- **Existing union reads:** `loadOriginRecords`, `listRecordKeys`, and `loadOwnEntries` keep their existing behavior. This PR narrows the optimization to the hot witness lookup.
|
|
50
|
+
|
|
51
|
+
## 6. External surfaces
|
|
52
|
+
|
|
53
|
+
No new API route, config key, dashboard control, CLI, or persistent schema. Runtime logs may include a new `[ws2-witness-index]` parity mismatch line if the derived index ever disagrees with the legacy scan.
|
|
54
|
+
|
|
55
|
+
## 6b. Operator-surface quality
|
|
56
|
+
|
|
57
|
+
No operator surface. The only operator-visible change should be reduced synchronous work during replicated-store emission.
|
|
58
|
+
|
|
59
|
+
## 7. Multi-machine posture
|
|
60
|
+
|
|
61
|
+
This is explicitly multi-machine shared infrastructure and affects every replicated store, including PII replicated stores. The index is store-agnostic and uses the same `ReplicatedKindRegistry` and `validateReplicatedEnvelope` path as the existing reader. It does not replicate additional fields, does not write a new file, and does not expose more data to peers. It only changes how the local machine finds the max HLC it has already durably observed.
|
|
62
|
+
|
|
63
|
+
## 8. Rollback cost
|
|
64
|
+
|
|
65
|
+
Low to moderate. Reverting restores the legacy scan path and removes the observer callbacks. Because the index is not persisted, rollback has no data migration and cannot strand state. The cost is performance regression back to synchronous scan-per-witness on large journals.
|
|
66
|
+
|
|
67
|
+
## Conclusion
|
|
68
|
+
|
|
69
|
+
The change closes the performance residual without changing merge semantics: same witness answer, derived in memory, built from streamed journal reads, updated only after durable appends, and backed by parity fallback. The blast radius is shared infra, so coverage includes unit, integration, and e2e lifecycle tests.
|
|
70
|
+
|
|
71
|
+
## Second-pass review (if required)
|
|
72
|
+
|
|
73
|
+
**Reviewer:** not required
|
|
74
|
+
**Independent read of the artifact:** not required for this Tier-1 performance optimization with no new authority, no schema migration, and parity fallback.
|
|
75
|
+
|
|
76
|
+
## Evidence pointers
|
|
77
|
+
|
|
78
|
+
- `npx tsc --noEmit`
|
|
79
|
+
- `npx vitest run tests/unit/ReplicatedPeerStreamReader.test.ts tests/unit/ReplicatedRecordEmitter.test.ts tests/unit/evolution-manager-emit-wedge.test.ts tests/integration/replicated-witness-index.integration.test.ts tests/e2e/replicated-witness-index-lifecycle.test.ts`
|
|
80
|
+
|
|
81
|
+
## Class-Closure Declaration
|
|
82
|
+
|
|
83
|
+
No agent-authored-artifact defect. The recurring class was synchronous scan-per-emit after the #1414 emit-count fix. The closure is structural: witness lookup reads an O(1) derived map in the hot path, local/peer append sites update the map after fsync, and rebuild/parity keeps the journal authoritative.
|