@junghanacs/entwurf 0.33.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -4
- package/CHANGELOG.md +57 -0
- package/README.md +9 -6
- package/VERIFY.md +19 -6
- package/docs/setup-clean-host.md +25 -4
- package/package.json +1 -1
- package/pi/pi-durable/bootstrap.mjs +111 -11
- package/pi/pi-durable/carrier/runtime.js +11 -14
- package/pi/pi-durable/carrier/tui.js +76 -11
- package/pi/pi-durable/overlay/runtime-contacts.patch +199 -7
- package/pi/pi-durable/overlay/upstream-pin.json +3 -3
- package/run.sh +39 -7
- package/scripts/check-gate-qualification.ts +60 -3
- package/scripts/check-release-gate-outcomes.ts +1 -1
- package/scripts/emit-pi-durable-carrier.ts +61 -21
- package/scripts/mutants/gate-qualification.json +24 -0
- package/scripts/mutants/pi-durable.json +178 -11
|
@@ -53,12 +53,8 @@
|
|
|
53
53
|
"claim": "PI-DURABLE-BOOTSTRAP-ARGV-NO-BRIDGE-ENTRY",
|
|
54
54
|
"title": "the launch argv accepts --bridge-entry, so a caller can point the contact at a bridge outside this package",
|
|
55
55
|
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
56
|
-
"find": [
|
|
57
|
-
|
|
58
|
-
],
|
|
59
|
-
"replace": [
|
|
60
|
-
"const VALUE_FLAGS = [\"--bridge-entry\", \"--provider\", \"--model\", \"--width\", \"--entwurf-bootstrap\", \"--native-module\"];"
|
|
61
|
-
],
|
|
56
|
+
"find": ["const VALUE_FLAGS = ["],
|
|
57
|
+
"replace": ["const VALUE_FLAGS = [\n\t\"--bridge-entry\","],
|
|
62
58
|
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
63
59
|
"timeoutSeconds": 300,
|
|
64
60
|
"signature": "[QK:PI-DURABLE-BOOTSTRAP-ARGV-NO-BRIDGE-ENTRY]",
|
|
@@ -345,7 +341,7 @@
|
|
|
345
341
|
"claim": "PI-DURABLE-CARRIER-PIN-MATCHES",
|
|
346
342
|
"title": "the pin records a digest the committed carrier file does not carry, so a carrier edited after emission would still be the declared one",
|
|
347
343
|
"subject": "pi/pi-durable/overlay/upstream-pin.json",
|
|
348
|
-
"find": ["\"sha256\": \"
|
|
344
|
+
"find": ["\"sha256\": \"bfd88844fae61e8bd32d57b5b986f48056c64eebb5466d9826318a0783ac9005\""],
|
|
349
345
|
"replace": ["\"sha256\": \"0000000000000000000000000000000000000000000000000000000000000000\""],
|
|
350
346
|
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
351
347
|
"timeoutSeconds": 300,
|
|
@@ -588,8 +584,8 @@
|
|
|
588
584
|
"claim": "PI-DURABLE-MODULE-ABSENT-UNCHANGED",
|
|
589
585
|
"title": "the module phase runs without a --native-module, so a launch that names no module still tries to import one",
|
|
590
586
|
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
591
|
-
"find": ["\tconst
|
|
592
|
-
"replace": ["\tconst
|
|
587
|
+
"find": ["\tconst { nativeModules = [], ...args } = parseArgs(argv);"],
|
|
588
|
+
"replace": ["\tconst { nativeModules = [undefined], ...args } = parseArgs(argv);"],
|
|
593
589
|
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
594
590
|
"timeoutSeconds": 300,
|
|
595
591
|
"signature": "[QK:PI-DURABLE-MODULE-ABSENT-UNCHANGED]",
|
|
@@ -619,7 +615,7 @@
|
|
|
619
615
|
"title": "the module initializes after the TUI is imported, so its environment arrives after the SDK modules have evaluated",
|
|
620
616
|
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
621
617
|
"find": [
|
|
622
|
-
"\tconst extensions =
|
|
618
|
+
"\tconst extensions = await loadNativeModules(nativeModules);",
|
|
623
619
|
"\t// Loaded before anything opens, as upstream main.ts imports it statically: a TUI that cannot",
|
|
624
620
|
"\t// load opens no session, mints no citizen and leaves nothing to clean up.",
|
|
625
621
|
"\tconst { runDurableTui } = await loadTui();"
|
|
@@ -628,7 +624,7 @@
|
|
|
628
624
|
"\t// Loaded before anything opens, as upstream main.ts imports it statically: a TUI that cannot",
|
|
629
625
|
"\t// load opens no session, mints no citizen and leaves nothing to clean up.",
|
|
630
626
|
"\tconst { runDurableTui } = await loadTui();",
|
|
631
|
-
"\tconst extensions =
|
|
627
|
+
"\tconst extensions = await loadNativeModules(nativeModules);"
|
|
632
628
|
],
|
|
633
629
|
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
634
630
|
"timeoutSeconds": 300,
|
|
@@ -718,6 +714,177 @@
|
|
|
718
714
|
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
719
715
|
"output": "mcp/entwurf-bridge/dist"
|
|
720
716
|
}
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
"claim": "PI-DURABLE-CARRIER-PATCH-SECTIONS",
|
|
720
|
+
"title": "a declared patched file with no section of its own passes the patch-shape check, so the emitter would ship that file unpatched",
|
|
721
|
+
"subject": "scripts/emit-pi-durable-carrier.ts",
|
|
722
|
+
"find": ["\tif (undeclared.length > 0 || missing.length > 0) {"],
|
|
723
|
+
"replace": ["\tif (undeclared.length > 0) {"],
|
|
724
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
725
|
+
"timeoutSeconds": 300,
|
|
726
|
+
"signature": "[QK:PI-DURABLE-CARRIER-PATCH-SECTIONS]",
|
|
727
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
728
|
+
"build": {
|
|
729
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
730
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
731
|
+
}
|
|
732
|
+
},
|
|
733
|
+
{
|
|
734
|
+
"claim": "PI-DURABLE-FOOTER-GRAPH-LIFETIME",
|
|
735
|
+
"title": "/tasks closes the task-graph observation again, so hiding the panel also hides live background work from the badge",
|
|
736
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
737
|
+
"find": ["\t\t\ttoggleTasks: () => command(async () => update({ tasksPanel: !state.tasksPanel })),"],
|
|
738
|
+
"replace": [
|
|
739
|
+
"\t\t\ttoggleTasks: () => command(async () => update({ tasksPanel: !state.tasksPanel, tasks: state.tasksPanel ? undefined : state.tasks })),"
|
|
740
|
+
],
|
|
741
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
742
|
+
"timeoutSeconds": 300,
|
|
743
|
+
"signature": "[QK:PI-DURABLE-FOOTER-GRAPH-LIFETIME]",
|
|
744
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
745
|
+
"build": {
|
|
746
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
747
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
748
|
+
}
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
"claim": "PI-DURABLE-FOOTER-BADGE-COUNT",
|
|
752
|
+
"title": "the badge counts every live task, foreground generation and tool tasks included, so an idle-but-turning session shows phantom background work",
|
|
753
|
+
"subject": "pi/pi-durable/carrier/tui.js",
|
|
754
|
+
"find": ["\t\tconst nodes = Object.values(graph?.tasks ?? {}).filter((node) => node.background);"],
|
|
755
|
+
"replace": ["\t\tconst nodes = Object.values(graph?.tasks ?? {});"],
|
|
756
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
757
|
+
"timeoutSeconds": 300,
|
|
758
|
+
"signature": "[QK:PI-DURABLE-FOOTER-BADGE-COUNT]",
|
|
759
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
760
|
+
"build": {
|
|
761
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
762
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
763
|
+
}
|
|
764
|
+
},
|
|
765
|
+
{
|
|
766
|
+
"claim": "PI-DURABLE-FOOTER-BADGE-WIDTH",
|
|
767
|
+
"title": "the badge has no one- or two-cell form, so a very narrow terminal shows a bare marker with no count",
|
|
768
|
+
"subject": "pi/pi-durable/carrier/tui.js",
|
|
769
|
+
"find": ["\t\tconst forms = [...detailed, tasks, `⏳ ${n}`, `⏳${n}`, `*${n}`, \"*+\", \"*\"];"],
|
|
770
|
+
"replace": ["\t\tconst forms = [...detailed, tasks, `⏳ ${n}`, `⏳${n}`, \"*\"];"],
|
|
771
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
772
|
+
"timeoutSeconds": 300,
|
|
773
|
+
"signature": "[QK:PI-DURABLE-FOOTER-BADGE-WIDTH]",
|
|
774
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
775
|
+
"build": {
|
|
776
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
777
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
778
|
+
}
|
|
779
|
+
},
|
|
780
|
+
{
|
|
781
|
+
"claim": "PI-DURABLE-FOOTER-BADGE-PROTECTED",
|
|
782
|
+
"title": "the badge sits last in the dock, so the renderer's bottom clip drops it first on a short terminal",
|
|
783
|
+
"subject": "pi/pi-durable/carrier/tui.js",
|
|
784
|
+
"find": [
|
|
785
|
+
"\t\t{ component: new VStack([{ component: badge, shrink: 0 }, ...dock]), basis: \"auto\", grow: 0, shrink: 1, minSize: 1 },"
|
|
786
|
+
],
|
|
787
|
+
"replace": [
|
|
788
|
+
"\t\t{ component: new VStack([...dock, { component: badge, shrink: 0 }]), basis: \"auto\", grow: 0, shrink: 1, minSize: 1 },"
|
|
789
|
+
],
|
|
790
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
791
|
+
"timeoutSeconds": 300,
|
|
792
|
+
"signature": "[QK:PI-DURABLE-FOOTER-BADGE-PROTECTED]",
|
|
793
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
794
|
+
"build": {
|
|
795
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
796
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
797
|
+
}
|
|
798
|
+
},
|
|
799
|
+
{
|
|
800
|
+
"claim": "PI-DURABLE-FOOTER-ZERO-UPSTREAM",
|
|
801
|
+
"title": "a one-row terminal hides the transcript even with no background work, so the idle screen is no longer upstream's",
|
|
802
|
+
"subject": "pi/pi-durable/carrier/tui.js",
|
|
803
|
+
"find": ["\t\t\tvisible: (viewport) => badge.count === 0 || viewport.height > 1,"],
|
|
804
|
+
"replace": ["\t\t\tvisible: (viewport) => viewport.height > 1,"],
|
|
805
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
806
|
+
"timeoutSeconds": 300,
|
|
807
|
+
"signature": "[QK:PI-DURABLE-FOOTER-ZERO-UPSTREAM]",
|
|
808
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
809
|
+
"build": {
|
|
810
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
811
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
812
|
+
}
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
"claim": "PI-DURABLE-MODULE-DIR-TOPLEVEL-FILTER",
|
|
816
|
+
"title": "a dotfile ending in .extension.mjs counts as a module, so a hidden file in the named directory is evaluated as operator code",
|
|
817
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
818
|
+
"find": ["const MODULE_ENTRY = /^[^.].*\\.extension\\.mjs$/;"],
|
|
819
|
+
"replace": ["const MODULE_ENTRY = /\\.extension\\.mjs$/;"],
|
|
820
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
821
|
+
"timeoutSeconds": 300,
|
|
822
|
+
"signature": "[QK:PI-DURABLE-MODULE-DIR-TOPLEVEL-FILTER]",
|
|
823
|
+
"signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
|
|
824
|
+
"build": {
|
|
825
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
826
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
827
|
+
}
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
"claim": "PI-DURABLE-MODULE-DIR-ORDER-BYTEWISE",
|
|
831
|
+
"title": "modules are ordered by the locale's collation, so the initialization order depends on the host's language settings",
|
|
832
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
833
|
+
"find": ["\t\t.sort((a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b)));"],
|
|
834
|
+
"replace": ["\t\t.sort((a, b) => a.localeCompare(b));"],
|
|
835
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
836
|
+
"timeoutSeconds": 300,
|
|
837
|
+
"signature": "[QK:PI-DURABLE-MODULE-DIR-ORDER-BYTEWISE]",
|
|
838
|
+
"signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
|
|
839
|
+
"build": {
|
|
840
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
841
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
842
|
+
}
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
"claim": "PI-DURABLE-MODULE-DIR-REFUSED",
|
|
846
|
+
"title": "a named directory without a module launches with none, so a wrong path or an unrenamed plain index.mjs goes unnoticed",
|
|
847
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
848
|
+
"find": ["\tif (names.length === 0) {"],
|
|
849
|
+
"replace": ["\tif (false) {"],
|
|
850
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
851
|
+
"timeoutSeconds": 300,
|
|
852
|
+
"signature": "[QK:PI-DURABLE-MODULE-DIR-REFUSED]",
|
|
853
|
+
"signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
|
|
854
|
+
"build": {
|
|
855
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
856
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
857
|
+
}
|
|
858
|
+
},
|
|
859
|
+
{
|
|
860
|
+
"claim": "PI-DURABLE-MODULE-DIR-EXCLUSIVE",
|
|
861
|
+
"title": "naming both the file and the directory silently keeps only the file",
|
|
862
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
863
|
+
"find": ["\tif (moduleArg !== undefined && dirArg !== undefined) {"],
|
|
864
|
+
"replace": ["\tif (false) {"],
|
|
865
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
866
|
+
"timeoutSeconds": 300,
|
|
867
|
+
"signature": "[QK:PI-DURABLE-MODULE-DIR-EXCLUSIVE]",
|
|
868
|
+
"signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
|
|
869
|
+
"build": {
|
|
870
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
871
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
872
|
+
}
|
|
873
|
+
},
|
|
874
|
+
{
|
|
875
|
+
"claim": "PI-DURABLE-MODULE-DIR-NAME-DUPLICATE",
|
|
876
|
+
"title": "a second module's same-named extension or tool is accepted, so the native registry replaces the first extension or keeps both tools without a word",
|
|
877
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
878
|
+
"find": ["\t\t\tif (owners.has(name)) {"],
|
|
879
|
+
"replace": ["\t\t\tif (false) {"],
|
|
880
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
881
|
+
"timeoutSeconds": 300,
|
|
882
|
+
"signature": "[QK:PI-DURABLE-MODULE-DIR-NAME-DUPLICATE]",
|
|
883
|
+
"signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
|
|
884
|
+
"build": {
|
|
885
|
+
"argv": ["bash", "scripts/build-bridge.sh"],
|
|
886
|
+
"output": "mcp/entwurf-bridge/dist"
|
|
887
|
+
}
|
|
721
888
|
}
|
|
722
889
|
]
|
|
723
890
|
}
|