@junghanacs/entwurf 0.41.2 → 0.50.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 -2
- package/BASELINE.md +110 -1
- package/CHANGELOG.md +328 -0
- package/CONTRIBUTING.md +1 -1
- package/ENTWURF-CLI.json +1229 -0
- package/ENTWURF.json +284 -0
- package/FAQ.md +4 -4
- package/README.md +125 -184
- package/VERIFY.md +2 -2
- package/docs/external-mcp-host.md +3 -3
- package/docs/setup-clean-host.md +37 -12
- package/mcp/entwurf-bridge/dist/ENTWURF.json +284 -0
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +46 -196
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/agent-guidance.js +299 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +21 -25
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +498 -29
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +47 -10
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +613 -33
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-resume-call.js +497 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +3 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +23 -20
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +68 -21
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-fresh-preflight.js +7 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-location.js +347 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-owner-fence.js +1132 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-durable-runtime.js +1 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/remote-pair-send.js +7 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +18 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +53 -60
- package/mcp/entwurf-bridge/dist/scripts/herdr-rails.mjs +40 -7
- package/mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js +1 -27
- package/mcp/entwurf-bridge/dist/scripts/meta-bridge-prune.js +1 -1
- package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +1 -1
- package/mcp/entwurf-bridge/dist/scripts/peer-facts.js +1 -1
- package/mcp/entwurf-bridge/src/index.ts +149 -327
- package/mcp/entwurf-bridge/tsconfig.build.json +7 -1
- package/native/win32-x64/manifest.json +1 -1
- package/package.json +8 -4
- package/pi/pi-durable/bootstrap.mjs +179 -6
- package/pi/pi-durable/carrier/runtime.js +108 -9
- package/pi/pi-durable/carrier/session-name.js +11 -0
- package/pi/pi-durable/carrier/sessions.js +96 -20
- package/pi/pi-durable/overlay/upstream-pin.json +11 -5
- package/pi-extensions/lib/agent-guidance.ts +341 -0
- package/pi-extensions/lib/entwurf-v2-surface.ts +25 -31
- package/pi-extensions/lib/entwurf-v2-visible-resume.ts +725 -54
- package/pi-extensions/lib/fresh-call-dispatch.ts +64 -12
- package/pi-extensions/lib/herdr-fresh-call.ts +919 -40
- package/pi-extensions/lib/herdr-resume-call.ts +810 -0
- package/pi-extensions/lib/meta-session.ts +13 -8
- package/pi-extensions/lib/mux-fresh-call.ts +23 -26
- package/pi-extensions/lib/mux-resume-call.ts +95 -23
- package/pi-extensions/lib/pi-durable-fresh-preflight.ts +9 -2
- package/pi-extensions/lib/pi-durable-location.ts +446 -0
- package/pi-extensions/lib/pi-durable-owner-fence.ts +1461 -0
- package/pi-extensions/lib/pi-durable-runtime.ts +4 -0
- package/pi-extensions/lib/remote-pair-send.ts +7 -4
- package/pi-extensions/lib/resume-launch-identity.ts +31 -12
- package/pi-extensions/meta-bridge-pi-durable.ts +52 -79
- package/run.sh +417 -654
- package/scripts/build-bridge.sh +10 -0
- package/scripts/check-capability-bundle-reach.ts +86 -0
- package/scripts/check-claude-launch.ts +341 -0
- package/scripts/check-entwurf-self-address.ts +3 -3
- package/scripts/check-entwurf-v2-surface.ts +94 -98
- package/scripts/check-fresh-call-dispatch.ts +70 -9
- package/scripts/check-fresh-cut-gate.sh +23 -9
- package/scripts/check-gate-qualification.ts +24 -17
- package/scripts/check-herdr-activation.ts +301 -23
- package/scripts/check-herdr-fresh-call.ts +161 -25
- package/scripts/check-herdr-plugin-build.ts +173 -1
- package/scripts/check-herdr-plugin.ts +28 -2
- package/scripts/check-herdr-runtime-bootstrap.ts +136 -0
- package/scripts/check-install-surface.ts +1236 -6
- package/scripts/check-meta-doctor-oracle.sh +1 -1
- package/scripts/check-meta-facts.ts +20 -1
- package/scripts/check-mux-resume-call.ts +48 -3
- package/scripts/check-peer-facts.ts +39 -2
- package/scripts/cli-help.mjs +222 -0
- package/scripts/dev-bin.sh +39 -2
- package/scripts/herdr-activation.mjs +28 -6
- package/scripts/herdr-operator-link.mjs +389 -0
- package/scripts/herdr-plugin-activate.mjs +5 -0
- package/scripts/herdr-plugin-deactivate.mjs +18 -5
- package/scripts/herdr-rails.mjs +43 -7
- package/scripts/herdr-runtime.mjs +27 -0
- package/scripts/meta-bridge-fresh-cut.ts +1 -27
- package/scripts/meta-bridge-prune.ts +1 -1
- package/scripts/meta-facts.ts +1 -1
- package/scripts/mutants/agent-guidance.json +160 -0
- package/scripts/mutants/bridge-boot-resume.json +6 -8
- package/scripts/mutants/capability-bundle-reach.json +124 -0
- package/scripts/mutants/claude-launch.json +142 -0
- package/scripts/mutants/cli-help-source.json +420 -0
- package/scripts/mutants/control-send-receipt.json +21 -4
- package/scripts/mutants/dev-gate-dispatch.json +109 -0
- package/scripts/mutants/fresh-call-dispatch.json +38 -2
- package/scripts/mutants/fresh-cut.json +15 -0
- package/scripts/mutants/herdr-activation.json +128 -0
- package/scripts/mutants/herdr-fresh-call.json +278 -5
- package/scripts/mutants/herdr-operator-link.json +318 -0
- package/scripts/mutants/herdr-plugin-build.json +55 -0
- package/scripts/mutants/herdr-plugin.json +17 -0
- package/scripts/mutants/herdr-resume-call.json +288 -0
- package/scripts/mutants/herdr-runtime-bootstrap.json +48 -0
- package/scripts/mutants/meta-facts.json +15 -0
- package/scripts/mutants/mux-fresh-call.json +14 -3
- package/scripts/mutants/mux-resume-call.json +89 -3
- package/scripts/mutants/peer-facts.json +15 -0
- package/scripts/mutants/pi-durable.json +996 -6
- package/scripts/mutants/remote-pair-send.json +21 -2
- package/scripts/mutants/self-address.json +10 -10
- package/scripts/mutants/source-install.json +35 -0
- package/scripts/mutants/v2-surface.json +50 -64
- package/scripts/mutants/v2-visible-resume.json +266 -6
- package/scripts/peer-facts.ts +1 -1
- package/scripts/smoke-agy-install-state.sh +66 -0
- package/scripts/smoke-meta-prune.sh +23 -0
- package/scripts/smoke-omp-fresh-live.ts +12 -3
- package/scripts/smoke-omp-receive-live.ts +7 -1
- package/scripts/smoke-pi-durable-fresh-live.ts +12 -2
- package/team.json.example +39 -0
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"lane": "pi-durable",
|
|
4
4
|
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "PI-DURABLE-DESCRIPTION-DRIFT-REFUSED",
|
|
7
|
+
"title": "schema comparison ignores description-only drift while still comparing structural schema fields",
|
|
8
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
9
|
+
"find": ["canonicalJson(found.inputSchema) !== canonicalJson(PI_DURABLE_TOOL_SCHEMAS[name])"],
|
|
10
|
+
"replace": [
|
|
11
|
+
"canonicalJson(JSON.parse(JSON.stringify(found.inputSchema, (key, value) => key === \"description\" ? undefined : value))) !== canonicalJson(JSON.parse(JSON.stringify(PI_DURABLE_TOOL_SCHEMAS[name], (key, value) => key === \"description\" ? undefined : value)))"
|
|
12
|
+
],
|
|
13
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
14
|
+
"timeoutSeconds": 300,
|
|
15
|
+
"signature": "[QK:PI-DURABLE-DESCRIPTION-DRIFT-REFUSED]",
|
|
16
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
17
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
18
|
+
},
|
|
5
19
|
{
|
|
6
20
|
"claim": "PI-DURABLE-RETIRE-CALL",
|
|
7
21
|
"title": "retirement alone drops the actual request cancellation signal",
|
|
@@ -24,13 +38,11 @@
|
|
|
24
38
|
{
|
|
25
39
|
"claim": "PI-DURABLE-RETIRE-POLICY",
|
|
26
40
|
"title": "the native retirement description treats actor identity as a standing grant",
|
|
27
|
-
"subject": "
|
|
41
|
+
"subject": "ENTWURF.json",
|
|
28
42
|
"find": [
|
|
29
|
-
"
|
|
30
|
-
],
|
|
31
|
-
"replace": [
|
|
32
|
-
"\t\t\"A caller record alone authorizes this target/work: make ONE retirement attempt for that request \" +"
|
|
43
|
+
"Only when the human operator explicitly requested this particular target/work: make ONE retirement attempt for that request "
|
|
33
44
|
],
|
|
45
|
+
"replace": ["A caller record alone authorizes this target/work: make ONE retirement attempt for that request "],
|
|
34
46
|
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
35
47
|
"timeoutSeconds": 300,
|
|
36
48
|
"signature": "[QK:PI-DURABLE-RETIRE-POLICY]",
|
|
@@ -513,7 +525,7 @@
|
|
|
513
525
|
"claim": "PI-DURABLE-CARRIER-PIN-MATCHES",
|
|
514
526
|
"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",
|
|
515
527
|
"subject": "pi/pi-durable/overlay/upstream-pin.json",
|
|
516
|
-
"find": ["\"sha256\": \"
|
|
528
|
+
"find": ["\"sha256\": \"437834997b9870ab0383aea7d86ff7880ef7e2ebbbfe4c6360f67d8d36f777ec\""],
|
|
517
529
|
"replace": ["\"sha256\": \"0000000000000000000000000000000000000000000000000000000000000000\""],
|
|
518
530
|
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
519
531
|
"timeoutSeconds": 300,
|
|
@@ -1339,6 +1351,66 @@
|
|
|
1339
1351
|
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1340
1352
|
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1341
1353
|
},
|
|
1354
|
+
{
|
|
1355
|
+
"claim": "PI-DURABLE-SESSION-ARGUMENT-REFUSED",
|
|
1356
|
+
"title": "a fresh-only flag beside --session is no longer refused: the named session is reopened with an argument it silently drops",
|
|
1357
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
1358
|
+
"find": ["\tif (session !== undefined && fresh.length > 0) {"],
|
|
1359
|
+
"replace": ["\tif (session !== undefined && fresh.length > FRESH_ONLY_FLAGS.length) {"],
|
|
1360
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1361
|
+
"timeoutSeconds": 300,
|
|
1362
|
+
"signature": "[QK:PI-DURABLE-SESSION-ARGUMENT-REFUSED]",
|
|
1363
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
1364
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1365
|
+
},
|
|
1366
|
+
{
|
|
1367
|
+
"claim": "PI-DURABLE-SESSION-ID-MALFORMED-REFUSED",
|
|
1368
|
+
"title": "a separator check stands in for the session grammar: a malformed --session name reaches the operator's module, the TUI and the app",
|
|
1369
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
1370
|
+
"find": ["\t\tif (!isSessionName(args.session)) {"],
|
|
1371
|
+
"replace": ["\t\tif (args.session.includes(\"/\")) {"],
|
|
1372
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1373
|
+
"timeoutSeconds": 300,
|
|
1374
|
+
"signature": "[QK:PI-DURABLE-SESSION-ID-MALFORMED-REFUSED]",
|
|
1375
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1376
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1377
|
+
},
|
|
1378
|
+
{
|
|
1379
|
+
"claim": "PI-DURABLE-SESSION-OPENS-NAMED",
|
|
1380
|
+
"title": "--session opens this directory's newest session instead of the one it names",
|
|
1381
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
1382
|
+
"find": ["\tif (session !== undefined) return { session, ...nativeModule };"],
|
|
1383
|
+
"replace": ["\tif (session !== undefined) return { continueSession: true, ...nativeModule };"],
|
|
1384
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1385
|
+
"timeoutSeconds": 300,
|
|
1386
|
+
"signature": "[QK:PI-DURABLE-SESSION-OPENS-NAMED]",
|
|
1387
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1388
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1389
|
+
},
|
|
1390
|
+
{
|
|
1391
|
+
"claim": "PI-DURABLE-SESSION-NOT-HERE-REFUSED",
|
|
1392
|
+
"title": "a well-formed session id is trusted without its directory: an id this directory does not hold is opened anyway",
|
|
1393
|
+
"subject": "pi/pi-durable/carrier/sessions.js",
|
|
1394
|
+
"find": ["\t\tif (chosen === undefined || !(await statIfPresent(chosen))?.isDirectory()) {"],
|
|
1395
|
+
"replace": ["\t\tif (chosen === undefined) {"],
|
|
1396
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1397
|
+
"timeoutSeconds": 300,
|
|
1398
|
+
"signature": "[QK:PI-DURABLE-SESSION-NOT-HERE-REFUSED]",
|
|
1399
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1400
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1401
|
+
},
|
|
1402
|
+
{
|
|
1403
|
+
"claim": "PI-DURABLE-SESSION-BEFORE-OPERATOR-ENV",
|
|
1404
|
+
"title": "the bootstrap loads the session store before reading the --session grammar, and the store's SDK config import fixes package state before the operator module prepares the environment",
|
|
1405
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
1406
|
+
"find": ["\t\tconst { isSessionName } = await import(SESSION_NAME);"],
|
|
1407
|
+
"replace": ["\t\tconst { isSessionName } = await import(SESSIONS).then(() => import(SESSION_NAME));"],
|
|
1408
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1409
|
+
"timeoutSeconds": 300,
|
|
1410
|
+
"signature": "[QK:PI-DURABLE-SESSION-BEFORE-OPERATOR-ENV]",
|
|
1411
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1412
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1413
|
+
},
|
|
1342
1414
|
{
|
|
1343
1415
|
"claim": "PI-DURABLE-RESUME-CALL-EXPOSED",
|
|
1344
1416
|
"title": "entwurf_resume_call drops out of the durable contact's tools, so the coordinator citizen cannot reopen a dormant pi sibling",
|
|
@@ -1362,6 +1434,924 @@
|
|
|
1362
1434
|
"signature": "[QK:PI-DURABLE-RESUME-CALL-REACHES-BRIDGE]",
|
|
1363
1435
|
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
1364
1436
|
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1437
|
+
},
|
|
1438
|
+
{
|
|
1439
|
+
"claim": "PDL-COMMIT-BINDS-PAIR",
|
|
1440
|
+
"title": "the birth stops minting the record's binding: the carrier names an incarnation the record never carried",
|
|
1441
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1442
|
+
"find": ["input: { ...input, attachIncarnation },"],
|
|
1443
|
+
"replace": ["input: { ...input },"],
|
|
1444
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1445
|
+
"timeoutSeconds": 600,
|
|
1446
|
+
"signature": "[QK:PDL-COMMIT-BINDS-PAIR]",
|
|
1447
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1448
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1449
|
+
},
|
|
1450
|
+
{
|
|
1451
|
+
"claim": "PDL-NATIVE-DIRECTORY-REALPATH",
|
|
1452
|
+
"title": "the birth records the session directory as spelled, so an alias is written where the directory itself belongs",
|
|
1453
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1454
|
+
"find": ["nativeDirectory = fs.realpathSync(opts.sessionDirectory);"],
|
|
1455
|
+
"replace": ["nativeDirectory = path.resolve(opts.sessionDirectory);"],
|
|
1456
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1457
|
+
"timeoutSeconds": 600,
|
|
1458
|
+
"signature": "[QK:PDL-NATIVE-DIRECTORY-REALPATH]",
|
|
1459
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1460
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1461
|
+
},
|
|
1462
|
+
{
|
|
1463
|
+
"claim": "PDL-ROOT-ISOLATION",
|
|
1464
|
+
"title": "the location directory moves inside the receivers root, where fresh-cut walks every entry as a marker",
|
|
1465
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1466
|
+
"find": ["return path.join(path.dirname(receiversDir), PI_DURABLE_LOCATION_DIRNAME);"],
|
|
1467
|
+
"replace": ["return path.join(receiversDir, PI_DURABLE_LOCATION_DIRNAME);"],
|
|
1468
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1469
|
+
"timeoutSeconds": 600,
|
|
1470
|
+
"signature": "[QK:PDL-ROOT-ISOLATION]",
|
|
1471
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1472
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1473
|
+
},
|
|
1474
|
+
{
|
|
1475
|
+
"claim": "PDL-REFUSES-BEFORE-WRITE",
|
|
1476
|
+
"title": "the birth stops checking that the session directory is a directory, and writes a record and a carrier naming a file",
|
|
1477
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1478
|
+
"find": ["if (!fs.statSync(nativeDirectory).isDirectory()) throw new Error(\"not a directory\");"],
|
|
1479
|
+
"replace": ["void nativeDirectory;"],
|
|
1480
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1481
|
+
"timeoutSeconds": 600,
|
|
1482
|
+
"signature": "[QK:PDL-REFUSES-BEFORE-WRITE]",
|
|
1483
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1484
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1485
|
+
},
|
|
1486
|
+
{
|
|
1487
|
+
"claim": "PDL-ARM-LOCK-BUSY-KEEPS-OLD-PAIR",
|
|
1488
|
+
"title": "the birth takes the record-arm lock under another valid garden id, so a lock held on its own garden no longer stops the minted write",
|
|
1489
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1490
|
+
"find": ["const acquired = acquireLock(existing.gardenId, { dir: lockDir });"],
|
|
1491
|
+
"replace": ["const acquired = acquireLock(\"20000101T000000-000000\", { dir: lockDir });"],
|
|
1492
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1493
|
+
"timeoutSeconds": 600,
|
|
1494
|
+
"signature": "[QK:PDL-ARM-LOCK-BUSY-KEEPS-OLD-PAIR]",
|
|
1495
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1496
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1497
|
+
},
|
|
1498
|
+
{
|
|
1499
|
+
"claim": "PDL-CARRIER-WRITE-FAILS-MISMATCH",
|
|
1500
|
+
"title": "a failed carrier write leaves its tmp beside the final name",
|
|
1501
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1502
|
+
"find": ["fs.rmSync(tmp, { force: true });"],
|
|
1503
|
+
"replace": ["void tmp;"],
|
|
1504
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1505
|
+
"timeoutSeconds": 600,
|
|
1506
|
+
"signature": "[QK:PDL-CARRIER-WRITE-FAILS-MISMATCH]",
|
|
1507
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1508
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1509
|
+
},
|
|
1510
|
+
{
|
|
1511
|
+
"claim": "PDL-VERIFY-CARRIER-REFUSALS",
|
|
1512
|
+
"title": "the read stops comparing attachIncarnation, so a carrier from an older binding passes",
|
|
1513
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1514
|
+
"find": ["([\"nativeSessionId\", \"cwd\", \"attachIncarnation\"] as const)"],
|
|
1515
|
+
"replace": ["([\"nativeSessionId\", \"cwd\"] as const)"],
|
|
1516
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1517
|
+
"timeoutSeconds": 600,
|
|
1518
|
+
"signature": "[QK:PDL-VERIFY-CARRIER-REFUSALS]",
|
|
1519
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1520
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1521
|
+
},
|
|
1522
|
+
{
|
|
1523
|
+
"claim": "PDL-VERIFY-ENTRY-REFUSALS",
|
|
1524
|
+
"title": "the read follows a symlink and opens any entry at the carrier's name",
|
|
1525
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1526
|
+
"find": ["text = readStoreRecordFile(file);"],
|
|
1527
|
+
"replace": ["text = fs.readFileSync(file, \"utf8\");"],
|
|
1528
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1529
|
+
"timeoutSeconds": 600,
|
|
1530
|
+
"signature": "[QK:PDL-VERIFY-ENTRY-REFUSALS]",
|
|
1531
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1532
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1533
|
+
},
|
|
1534
|
+
{
|
|
1535
|
+
"claim": "PDL-READ-RETAINS",
|
|
1536
|
+
"title": "the read starts clearing a carrier whose record is gone",
|
|
1537
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1538
|
+
"find": ["\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"record-unaddressable\","],
|
|
1539
|
+
"replace": [
|
|
1540
|
+
"\t\tfs.rmSync(piDurableLocationPath(opts.gardenId, opts.receiversDir), { force: true });\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"record-unaddressable\","
|
|
1541
|
+
],
|
|
1542
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1543
|
+
"timeoutSeconds": 600,
|
|
1544
|
+
"signature": "[QK:PDL-READ-RETAINS]",
|
|
1545
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1546
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1547
|
+
},
|
|
1548
|
+
{
|
|
1549
|
+
"claim": "PI-DURABLE-BIRTH-LOCATION-BOUND",
|
|
1550
|
+
"title": "the contact hands the binding its cwd instead of the durable session directory",
|
|
1551
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
1552
|
+
"find": ["sessionDirectory: session.directory,"],
|
|
1553
|
+
"replace": ["sessionDirectory: cwd,"],
|
|
1554
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1555
|
+
"timeoutSeconds": 300,
|
|
1556
|
+
"signature": "[QK:PI-DURABLE-BIRTH-LOCATION-BOUND]",
|
|
1557
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
1558
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1559
|
+
},
|
|
1560
|
+
{
|
|
1561
|
+
"claim": "PI-DURABLE-BIRTH-LOCATION-FAILURE-FAILS-BIRTH",
|
|
1562
|
+
"title": "the contact falls back to binding under a lock nobody holds when the birth's own binding cannot commit, and the bridge starts",
|
|
1563
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
1564
|
+
"find": ["const upsert = commitPiDurableBirth({"],
|
|
1565
|
+
"replace": [
|
|
1566
|
+
"const upsert = ((o: Parameters<typeof commitPiDurableBirth>[0]) => { try { return commitPiDurableBirth(o); } catch { return commitPiDurableBirth({ ...o, receiversDir: path.join(o.receiversDir, \"unbound-fallback\") }); } })({"
|
|
1567
|
+
],
|
|
1568
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1569
|
+
"timeoutSeconds": 300,
|
|
1570
|
+
"signature": "[QK:PI-DURABLE-BIRTH-LOCATION-FAILURE-FAILS-BIRTH]",
|
|
1571
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
1572
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1573
|
+
},
|
|
1574
|
+
{
|
|
1575
|
+
"claim": "PI-DURABLE-CLOSE-RETAINS-LOCATION",
|
|
1576
|
+
"title": "closing the contact removes the location evidence along with the doorbell",
|
|
1577
|
+
"subject": "pi-extensions/meta-bridge-pi-durable.ts",
|
|
1578
|
+
"find": ["const problems = retire(\"closed\", \"the contact closed\");"],
|
|
1579
|
+
"replace": [
|
|
1580
|
+
"if (options.receiversDir !== undefined) fs.rmSync(path.join(path.dirname(path.resolve(options.receiversDir)), \"meta-pi-durable-locations\"), { recursive: true, force: true }); const problems = retire(\"closed\", \"the contact closed\");"
|
|
1581
|
+
],
|
|
1582
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1583
|
+
"timeoutSeconds": 300,
|
|
1584
|
+
"signature": "[QK:PI-DURABLE-CLOSE-RETAINS-LOCATION]",
|
|
1585
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
1586
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1587
|
+
},
|
|
1588
|
+
{
|
|
1589
|
+
"claim": "PDL-REFUSES-IMPLAUSIBLE-OWNER-PID",
|
|
1590
|
+
"title": "the writer checks only that the owner pid is an integer, so pid 1 is written into a carrier the parser refuses",
|
|
1591
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1592
|
+
"find": ["if (!isPlausibleOwnerPid(opts.ownerPid)) {"],
|
|
1593
|
+
"replace": ["if (!Number.isSafeInteger(opts.ownerPid)) {"],
|
|
1594
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1595
|
+
"timeoutSeconds": 600,
|
|
1596
|
+
"signature": "[QK:PDL-REFUSES-IMPLAUSIBLE-OWNER-PID]",
|
|
1597
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1598
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1599
|
+
},
|
|
1600
|
+
{
|
|
1601
|
+
"claim": "PDL-REFUSES-RELATIVE-CWD",
|
|
1602
|
+
"title": "the writer stops requiring an absolute cwd, so a relative cwd reaches the record write",
|
|
1603
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1604
|
+
"find": ["if (typeof opts.cwd !== \"string\" || !path.isAbsolute(opts.cwd)) {"],
|
|
1605
|
+
"replace": ["if (typeof opts.cwd !== \"string\") {"],
|
|
1606
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1607
|
+
"timeoutSeconds": 600,
|
|
1608
|
+
"signature": "[QK:PDL-REFUSES-RELATIVE-CWD]",
|
|
1609
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1610
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1611
|
+
},
|
|
1612
|
+
{
|
|
1613
|
+
"claim": "PDF-ADMIT-FRESH",
|
|
1614
|
+
"title": "a D this call created is recorded as unarmed-existing participation, so a fresh enrollment reads like a takeover of an old directory",
|
|
1615
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1616
|
+
"find": ["\t\t\tconst from = created ? \"fresh\" : \"unarmed-existing\";"],
|
|
1617
|
+
"replace": ["\t\t\tconst from = created ? \"unarmed-existing\" : \"unarmed-existing\";"],
|
|
1618
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1619
|
+
"timeoutSeconds": 600,
|
|
1620
|
+
"signature": "[QK:PDF-ADMIT-FRESH]",
|
|
1621
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1622
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1623
|
+
},
|
|
1624
|
+
{
|
|
1625
|
+
"claim": "PDF-ADMIT-UNARMED",
|
|
1626
|
+
"title": "an existing D without a claim is recorded as a fresh participation, so an unarmed directory reads as one this fence created",
|
|
1627
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1628
|
+
"find": ["\t\t\tconst from = created ? \"fresh\" : \"unarmed-existing\";"],
|
|
1629
|
+
"replace": ["\t\t\tconst from = created ? \"fresh\" : \"fresh\";"],
|
|
1630
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1631
|
+
"timeoutSeconds": 600,
|
|
1632
|
+
"signature": "[QK:PDF-ADMIT-UNARMED]",
|
|
1633
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1634
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1635
|
+
},
|
|
1636
|
+
{
|
|
1637
|
+
"claim": "PDF-UNARMED-LEGACY-LEASE",
|
|
1638
|
+
"title": "the lease presence test is negated: an unarmed D whose lease a legacy opener holds is admitted, and the library's stale takeover runs on it",
|
|
1639
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1640
|
+
"find": ["\t\t\tif ((claim !== undefined || !created) && leasePresent(directory)) {"],
|
|
1641
|
+
"replace": ["\t\t\tif ((claim !== undefined || !created) && !leasePresent(directory)) {"],
|
|
1642
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1643
|
+
"timeoutSeconds": 600,
|
|
1644
|
+
"signature": "[QK:PDF-UNARMED-LEGACY-LEASE]",
|
|
1645
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1646
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1647
|
+
},
|
|
1648
|
+
{
|
|
1649
|
+
"claim": "PDF-LIVE-NO-SELF-REENTRY",
|
|
1650
|
+
"title": "a claim this very process owns is let through as if it were dead, so a process re-enters its own open or close-failed directory",
|
|
1651
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1652
|
+
"find": ["\t\tif (!proven) {"],
|
|
1653
|
+
"replace": ["\t\tif (!proven && claim.owner.pid !== process.pid) {"],
|
|
1654
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1655
|
+
"timeoutSeconds": 600,
|
|
1656
|
+
"signature": "[QK:PDF-LIVE-NO-SELF-REENTRY]",
|
|
1657
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1658
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1659
|
+
},
|
|
1660
|
+
{
|
|
1661
|
+
"claim": "PDF-UNKNOWN-FAILS-CLOSED",
|
|
1662
|
+
"title": "an owner that is only not proven live is treated as dead, so an uncertain owner's directory is reclaimed",
|
|
1663
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1664
|
+
"find": ["\t\tconst proven = verdict === \"dead\";"],
|
|
1665
|
+
"replace": ["\t\tconst proven = verdict !== \"live\";"],
|
|
1666
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1667
|
+
"timeoutSeconds": 600,
|
|
1668
|
+
"signature": "[QK:PDF-UNKNOWN-FAILS-CLOSED]",
|
|
1669
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1670
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1671
|
+
},
|
|
1672
|
+
{
|
|
1673
|
+
"claim": "PDF-DEAD-RECLAIM",
|
|
1674
|
+
"title": "a reclaim no longer records what it took over: the claim says fenced with no trace of the dead owner or its lease",
|
|
1675
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1676
|
+
"find": ["\t\t\t...(reclaimedFrom === undefined ? {} : { reclaimedFrom }),"],
|
|
1677
|
+
"replace": ["\t\t\t...(reclaimedFrom === undefined ? {} : {}),"],
|
|
1678
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1679
|
+
"timeoutSeconds": 600,
|
|
1680
|
+
"signature": "[QK:PDF-DEAD-RECLAIM]",
|
|
1681
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1682
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1683
|
+
},
|
|
1684
|
+
{
|
|
1685
|
+
"claim": "PDF-DEAD-LEASE-UNATTRIBUTED",
|
|
1686
|
+
"title": "a failed release counts as an attributed lease, so a present lease after a dead owner's failed release is taken over without proof it was that owner's",
|
|
1687
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1688
|
+
"find": ["\t\tconst attributed = claim.lease === \"held\" || claim.lease === \"unknown\";"],
|
|
1689
|
+
"replace": [
|
|
1690
|
+
"\t\tconst attributed = claim.lease === \"held\" || claim.lease === \"unknown\" || claim.lease === \"failed\";"
|
|
1691
|
+
],
|
|
1692
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1693
|
+
"timeoutSeconds": 600,
|
|
1694
|
+
"signature": "[QK:PDF-DEAD-LEASE-UNATTRIBUTED]",
|
|
1695
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1696
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1697
|
+
},
|
|
1698
|
+
{
|
|
1699
|
+
"claim": "PDF-ALIAS-NOT-ABSENT",
|
|
1700
|
+
"title": "a claim selected under another session id is read as absent, so an alias of a live owner's D is admitted over it",
|
|
1701
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1702
|
+
"find": ["\t\tif (claim === undefined || claim.state === \"closed\") {"],
|
|
1703
|
+
"replace": ["\t\tif (claim === undefined || claim.selected.n !== selectedN || claim.state === \"closed\") {"],
|
|
1704
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1705
|
+
"timeoutSeconds": 600,
|
|
1706
|
+
"signature": "[QK:PDF-ALIAS-NOT-ABSENT]",
|
|
1707
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1708
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1709
|
+
},
|
|
1710
|
+
{
|
|
1711
|
+
"claim": "PDF-RESOURCE-MISMATCH-REFUSED",
|
|
1712
|
+
"title": "a claim naming another resource falls through to the absent row, so a copied D's claim is overwritten instead of refused",
|
|
1713
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1714
|
+
"find": [
|
|
1715
|
+
"\t\tif (read !== undefined && read.resource !== resource) {",
|
|
1716
|
+
"\t\t\tthrow refuse(\"claim-resource-mismatch\", `the claim in ${directory} names ${read.resource}, not ${resource}`);",
|
|
1717
|
+
"\t\t}",
|
|
1718
|
+
"\t\t// Only a claim for THIS resource is judged below; a mismatched one was refused above, never read as absent.",
|
|
1719
|
+
"\t\tconst claim = read;"
|
|
1720
|
+
],
|
|
1721
|
+
"replace": ["\t\tconst claim = read?.resource === resource ? read : undefined;"],
|
|
1722
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1723
|
+
"timeoutSeconds": 600,
|
|
1724
|
+
"signature": "[QK:PDF-RESOURCE-MISMATCH-REFUSED]",
|
|
1725
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1726
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1727
|
+
},
|
|
1728
|
+
{
|
|
1729
|
+
"claim": "PDF-GENERATION-EXACT",
|
|
1730
|
+
"title": "the generation comparison is inverted: a stale ticket transitions over a claim another write already replaced",
|
|
1731
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1732
|
+
"find": ["\t\t\tif (current.generation !== last.generation) {"],
|
|
1733
|
+
"replace": ["\t\t\tif (current.generation === last.generation) {"],
|
|
1734
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1735
|
+
"timeoutSeconds": 600,
|
|
1736
|
+
"signature": "[QK:PDF-GENERATION-EXACT]",
|
|
1737
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1738
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1739
|
+
},
|
|
1740
|
+
{
|
|
1741
|
+
"claim": "PDF-TX-OWN-RELEASED",
|
|
1742
|
+
"title": "the holder no longer unlinks its own transaction file, so every later claim write in that D waits out the bound and refuses",
|
|
1743
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1744
|
+
"find": ["\t\tleaveTx(tx, held, stepError);"],
|
|
1745
|
+
"replace": ["\t\tvoid [held, stepError];"],
|
|
1746
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1747
|
+
"timeoutSeconds": 600,
|
|
1748
|
+
"signature": "[QK:PDF-TX-OWN-RELEASED]",
|
|
1749
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1750
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1751
|
+
},
|
|
1752
|
+
{
|
|
1753
|
+
"claim": "PDF-TX-RESIDUE-FAILS-CLOSED",
|
|
1754
|
+
"title": "the busy path removes a transaction file it did not create, taking over another holder's or a crash's S_D",
|
|
1755
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1756
|
+
"find": ["\t\tif (attempt >= TX_ATTEMPTS) {"],
|
|
1757
|
+
"replace": ["\t\tif (attempt >= TX_ATTEMPTS) {", "\t\t\tfs.rmSync(tx, { force: true });"],
|
|
1758
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1759
|
+
"timeoutSeconds": 600,
|
|
1760
|
+
"signature": "[QK:PDF-TX-RESIDUE-FAILS-CLOSED]",
|
|
1761
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1762
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1763
|
+
},
|
|
1764
|
+
{
|
|
1765
|
+
"claim": "PDF-CLOSED-RECEIPT-KEPT",
|
|
1766
|
+
"title": "the close transition unlinks the claim, so a clean end leaves no receipt and the next opener reads the directory as never armed",
|
|
1767
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1768
|
+
"find": ["\t\tawait this.#end([\"leased\", \"storage-open\"], \"closed\", checked);"],
|
|
1769
|
+
"replace": [
|
|
1770
|
+
"\t\tawait this.#end([\"leased\", \"storage-open\"], \"closed\", checked);",
|
|
1771
|
+
"\t\tfs.rmSync(path.join(this.#resource, PI_DURABLE_OWNER_CLAIM));"
|
|
1772
|
+
],
|
|
1773
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1774
|
+
"timeoutSeconds": 600,
|
|
1775
|
+
"signature": "[QK:PDF-CLOSED-RECEIPT-KEPT]",
|
|
1776
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1777
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1778
|
+
},
|
|
1779
|
+
{
|
|
1780
|
+
"claim": "PDF-TMP-INERT",
|
|
1781
|
+
"title": "the reader takes the newest atomic temp for the claim, so a crash's leftover temp decides admission",
|
|
1782
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1783
|
+
"find": ["\tconst file = path.join(resource, PI_DURABLE_OWNER_CLAIM);"],
|
|
1784
|
+
"replace": [
|
|
1785
|
+
"\tconst file = path.join(resource, fs.readdirSync(resource).filter((name) => name.startsWith(PI_DURABLE_OWNER_TMP_PREFIX)).sort().at(-1) ?? PI_DURABLE_OWNER_CLAIM);"
|
|
1786
|
+
],
|
|
1787
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1788
|
+
"timeoutSeconds": 600,
|
|
1789
|
+
"signature": "[QK:PDF-TMP-INERT]",
|
|
1790
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1791
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1792
|
+
},
|
|
1793
|
+
{
|
|
1794
|
+
"claim": "PDF-SQLITE-NAMESPACE",
|
|
1795
|
+
"title": "the atomic temp moves under the SDK's session.sqlite prefix, where its files and the fence's would share one namespace",
|
|
1796
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1797
|
+
"find": ["export const PI_DURABLE_OWNER_TMP_PREFIX = `${PI_DURABLE_OWNER_CLAIM}.tmp-`;"],
|
|
1798
|
+
"replace": ["export const PI_DURABLE_OWNER_TMP_PREFIX = \"session.sqlite-entwurf.tmp-\";"],
|
|
1799
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1800
|
+
"timeoutSeconds": 600,
|
|
1801
|
+
"signature": "[QK:PDF-SQLITE-NAMESPACE]",
|
|
1802
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1803
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1804
|
+
},
|
|
1805
|
+
{
|
|
1806
|
+
"claim": "PDF-ADMIT-BEFORE-LEASE",
|
|
1807
|
+
"title": "the fence is asked only after the native lease is taken, so the lease it is meant to precede already exists at admission",
|
|
1808
|
+
"subject": "pi/pi-durable/carrier/sessions.js",
|
|
1809
|
+
"find": [
|
|
1810
|
+
"\tconst ticket = await fence.admit({ directory, selectedN: basename(directory), created, profile });",
|
|
1811
|
+
"\t// A lock left by a crashed process goes stale after 10 s; wait that long before giving up.",
|
|
1812
|
+
"\tconst lease = lockfile.lock(directory, {",
|
|
1813
|
+
"\t\trealpath: false,",
|
|
1814
|
+
"\t\tretries: { retries: 12, minTimeout: 1000, maxTimeout: 1000 },",
|
|
1815
|
+
"\t});"
|
|
1816
|
+
],
|
|
1817
|
+
"replace": [
|
|
1818
|
+
"\t// A lock left by a crashed process goes stale after 10 s; wait that long before giving up.",
|
|
1819
|
+
"\tconst lease = lockfile.lock(directory, {",
|
|
1820
|
+
"\t\trealpath: false,",
|
|
1821
|
+
"\t\tretries: { retries: 12, minTimeout: 1000, maxTimeout: 1000 },",
|
|
1822
|
+
"\t});",
|
|
1823
|
+
"\tawait lease.catch(() => {});",
|
|
1824
|
+
"\tconst ticket = await fence.admit({ directory, selectedN: basename(directory), created, profile });"
|
|
1825
|
+
],
|
|
1826
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1827
|
+
"timeoutSeconds": 300,
|
|
1828
|
+
"signature": "[QK:PDF-ADMIT-BEFORE-LEASE]",
|
|
1829
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1830
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1831
|
+
},
|
|
1832
|
+
{
|
|
1833
|
+
"claim": "PDF-INIT-NEVER-OPENED-CLOSED",
|
|
1834
|
+
"title": "an init failure before any storage open is recorded with an unknown storage, so a clean never-opened end becomes close-failed",
|
|
1835
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
1836
|
+
"find": ["\t\tlet storage = ticket.storageOpenAttempted ? \"unknown\" : \"never-opened\";"],
|
|
1837
|
+
"replace": ["\t\tlet storage = ticket.storageOpenAttempted ? \"unknown\" : \"unknown\";"],
|
|
1838
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1839
|
+
"timeoutSeconds": 300,
|
|
1840
|
+
"signature": "[QK:PDF-INIT-NEVER-OPENED-CLOSED]",
|
|
1841
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1842
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1843
|
+
},
|
|
1844
|
+
{
|
|
1845
|
+
"claim": "PDF-INIT-ATTEMPTED-NOT-CLOSED",
|
|
1846
|
+
"title": "the attempt is recorded only after the storage open resolves, so a rejected open reads as never attempted and ends closed",
|
|
1847
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
1848
|
+
"find": [
|
|
1849
|
+
"\t\tticket.storageOpenAttempted = true;",
|
|
1850
|
+
"\t\tconst backend = await openNodeSqliteStorage(location.database);"
|
|
1851
|
+
],
|
|
1852
|
+
"replace": [
|
|
1853
|
+
"\t\tconst backend = await openNodeSqliteStorage(location.database);",
|
|
1854
|
+
"\t\tticket.storageOpenAttempted = true;"
|
|
1855
|
+
],
|
|
1856
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1857
|
+
"timeoutSeconds": 300,
|
|
1858
|
+
"signature": "[QK:PDF-INIT-ATTEMPTED-NOT-CLOSED]",
|
|
1859
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1860
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1861
|
+
},
|
|
1862
|
+
{
|
|
1863
|
+
"claim": "PDF-FIRST-CLOSE-FAILURE-STICKY",
|
|
1864
|
+
"title": "close() is no longer memoized: a second call runs the close again, releasing and recording a second time over the first failure",
|
|
1865
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
1866
|
+
"find": ["\t\t\t\tclosing ??= (async () => {"],
|
|
1867
|
+
"replace": ["\t\t\t\tclosing = (async () => {"],
|
|
1868
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1869
|
+
"timeoutSeconds": 300,
|
|
1870
|
+
"signature": "[QK:PDF-FIRST-CLOSE-FAILURE-STICKY]",
|
|
1871
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1872
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1873
|
+
},
|
|
1874
|
+
{
|
|
1875
|
+
"claim": "PDF-CLOSE-FAIL-KEEPS-CLAIM",
|
|
1876
|
+
"title": "the close-failed write is skipped: a failed close leaves the claim at storage-open under an owner that has released its lease",
|
|
1877
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
1878
|
+
"find": ["\t\t\t\t\t\telse await ticket.closeFailed(record);"],
|
|
1879
|
+
"replace": ["\t\t\t\t\t\telse void record;"],
|
|
1880
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1881
|
+
"timeoutSeconds": 300,
|
|
1882
|
+
"signature": "[QK:PDF-CLOSE-FAIL-KEEPS-CLAIM]",
|
|
1883
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1884
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1885
|
+
},
|
|
1886
|
+
{
|
|
1887
|
+
"claim": "PDF-ENV-CLEANUP-SEPARATE",
|
|
1888
|
+
"title": "an env cleanup failure is taken for a resource failure: a verified storage close and release is recorded as close-failed",
|
|
1889
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
1890
|
+
"find": ["\t\t\t\t\t\tif (storage === \"closed\" && lease === \"released\") await ticket.closed(record);"],
|
|
1891
|
+
"replace": [
|
|
1892
|
+
"\t\t\t\t\t\tif (storage === \"closed\" && lease === \"released\" && envCleanup === undefined) await ticket.closed(record);"
|
|
1893
|
+
],
|
|
1894
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1895
|
+
"timeoutSeconds": 300,
|
|
1896
|
+
"signature": "[QK:PDF-ENV-CLEANUP-SEPARATE]",
|
|
1897
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1898
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1899
|
+
},
|
|
1900
|
+
{
|
|
1901
|
+
"claim": "PDF-FENCE-REQUIRED",
|
|
1902
|
+
"title": "a JS caller without a fence is no longer refused: the session root is created and the open fails later, unnamed",
|
|
1903
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
1904
|
+
"find": ["\tif (options.fence === undefined) {"],
|
|
1905
|
+
"replace": ["\tif (options.fence === null) {"],
|
|
1906
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1907
|
+
"timeoutSeconds": 300,
|
|
1908
|
+
"signature": "[QK:PDF-FENCE-REQUIRED]",
|
|
1909
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1910
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1911
|
+
},
|
|
1912
|
+
{
|
|
1913
|
+
"claim": "PDF-TMP-COLLISION-NOT-OURS",
|
|
1914
|
+
"title": "the failed write removes its temp path whether or not it created it, so a file already holding that name is deleted",
|
|
1915
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1916
|
+
"find": ["\t\tif (created) fs.rmSync(tmp, { force: true });"],
|
|
1917
|
+
"replace": ["\t\tfs.rmSync(tmp, { force: true });"],
|
|
1918
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1919
|
+
"timeoutSeconds": 600,
|
|
1920
|
+
"signature": "[QK:PDF-TMP-COLLISION-NOT-OURS]",
|
|
1921
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1922
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1923
|
+
},
|
|
1924
|
+
{
|
|
1925
|
+
"claim": "PDF-INIT-HARNESS-OPEN-CLOSES-HANDLE",
|
|
1926
|
+
"title": "an init failure closes only a Harness that opened, so the storage handle a rejecting Harness.open was handed is never closed and its close outcome never observed",
|
|
1927
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
1928
|
+
"find": ["\t\tconst closable = harness ?? backendHandle;"],
|
|
1929
|
+
"replace": ["\t\tconst closable = harness;"],
|
|
1930
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1931
|
+
"timeoutSeconds": 300,
|
|
1932
|
+
"signature": "[QK:PDF-INIT-HARNESS-OPEN-CLOSES-HANDLE]",
|
|
1933
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1934
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1935
|
+
},
|
|
1936
|
+
{
|
|
1937
|
+
"claim": "PI-DURABLE-PREFLIGHT-OWNER-FENCE-UNIT",
|
|
1938
|
+
"title": "the preflight stops asking for the compiled owner fence, so a package without the unit its bootstrap imports passes as ready and opens a window that cannot load",
|
|
1939
|
+
"subject": "pi-extensions/lib/pi-durable-fresh-preflight.ts",
|
|
1940
|
+
"find": ["\tif (!existsSync(layout.ownerFence)) return \"pi-durable-owner-fence-missing\";\n"],
|
|
1941
|
+
"replace": [""],
|
|
1942
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
1943
|
+
"timeoutSeconds": 300,
|
|
1944
|
+
"signature": "[QK:PI-DURABLE-PREFLIGHT-OWNER-FENCE-UNIT]",
|
|
1945
|
+
"signatureSource": "pi-extensions/lib/pi-durable-fresh-preflight.test.ts",
|
|
1946
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1947
|
+
},
|
|
1948
|
+
{
|
|
1949
|
+
"claim": "PDL-TMP-COLLISION-NOT-OURS",
|
|
1950
|
+
"title": "a failed carrier write removes its tmp name whether or not it created it, so an entry already holding that name is deleted",
|
|
1951
|
+
"subject": "pi-extensions/lib/pi-durable-location.ts",
|
|
1952
|
+
"find": ["\t\t\tif (created) fs.rmSync(tmp, { force: true });"],
|
|
1953
|
+
"replace": ["\t\t\tfs.rmSync(tmp, { force: true });"],
|
|
1954
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1955
|
+
"timeoutSeconds": 600,
|
|
1956
|
+
"signature": "[QK:PDL-TMP-COLLISION-NOT-OURS]",
|
|
1957
|
+
"signatureSource": "pi-extensions/lib/pi-durable-location.test.ts",
|
|
1958
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1959
|
+
},
|
|
1960
|
+
{
|
|
1961
|
+
"claim": "PDR-RAW-PROFILE-CAPTURED",
|
|
1962
|
+
"title": "the open hands its fence the resolved spelling of the agent directory, so the claim records a normalized profile instead of the value its directory was joined from",
|
|
1963
|
+
"subject": "pi/pi-durable/carrier/sessions.js",
|
|
1964
|
+
"find": ["\treturn { cwd, root, profile: agentDir };"],
|
|
1965
|
+
"replace": ["\treturn { cwd, root, profile: resolve(agentDir) };"],
|
|
1966
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
1967
|
+
"timeoutSeconds": 300,
|
|
1968
|
+
"signature": "[QK:PDR-RAW-PROFILE-CAPTURED]",
|
|
1969
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
1970
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1971
|
+
},
|
|
1972
|
+
{
|
|
1973
|
+
"claim": "PDR-V2-READER-STRICT",
|
|
1974
|
+
"title": "the schema 2 reader compares the joined directory with itself, so a claim whose directory was not joined from its profile reads as valid",
|
|
1975
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1976
|
+
"find": [
|
|
1977
|
+
"\t\tif (joined !== directory) throw bad(\"selected.directory is not joined from selected.profile and selected.n\");"
|
|
1978
|
+
],
|
|
1979
|
+
"replace": [
|
|
1980
|
+
"\t\tif (joined !== joined) throw bad(\"selected.directory is not joined from selected.profile and selected.n\");"
|
|
1981
|
+
],
|
|
1982
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1983
|
+
"timeoutSeconds": 600,
|
|
1984
|
+
"signature": "[QK:PDR-V2-READER-STRICT]",
|
|
1985
|
+
"signatureSource": "pi-extensions/lib/pi-durable-owner-fence.test.ts",
|
|
1986
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
1987
|
+
},
|
|
1988
|
+
{
|
|
1989
|
+
"claim": "PDR-V1-UNATTRIBUTED",
|
|
1990
|
+
"title": "the reserve guesses a schema 1 donor's profile from four dirnames of its directory, so the guess passes the P-rules and the named profile-unattributed refusal is lost; the writer then refuses the schema 1 selection as transition-invalid, so nothing is reserved either way",
|
|
1991
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
1992
|
+
"find": ["\tconst recorded = selected.profile;"],
|
|
1993
|
+
"replace": [
|
|
1994
|
+
"\tconst recorded = selected.profile ?? path.dirname(path.dirname(path.dirname(path.dirname(selected.directory))));"
|
|
1995
|
+
],
|
|
1996
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
1997
|
+
"timeoutSeconds": 600,
|
|
1998
|
+
"signature": "[QK:PDR-V1-UNATTRIBUTED]",
|
|
1999
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2000
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2001
|
+
},
|
|
2002
|
+
{
|
|
2003
|
+
"claim": "PDR-ADOPT-BINDING-CHANGED",
|
|
2004
|
+
"title": "the adoption compares the reservation's binding with itself, so a child adopts a reservation whose record was bound again after it was taken",
|
|
2005
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2006
|
+
"find": ["\t\tif (record.attachIncarnation !== reservation.attachIncarnation) {"],
|
|
2007
|
+
"replace": ["\t\tif (reservation.attachIncarnation !== reservation.attachIncarnation) {"],
|
|
2008
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2009
|
+
"timeoutSeconds": 600,
|
|
2010
|
+
"signature": "[QK:PDR-ADOPT-BINDING-CHANGED]",
|
|
2011
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2012
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2013
|
+
},
|
|
2014
|
+
{
|
|
2015
|
+
"claim": "PDR-ARM-BEFORE-SD",
|
|
2016
|
+
"title": "the reserve runs its S_D decision and write before it takes the record-arm lock, so a busy arm refuses only after the claim was already rewritten",
|
|
2017
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2018
|
+
"find": [
|
|
2019
|
+
"\tconst arm = takeRecordArm(gardenId, roots);",
|
|
2020
|
+
"\tlet reserved: PiDurableReservation;",
|
|
2021
|
+
"\ttry {",
|
|
2022
|
+
"\t\treserved = await reserveInPair(gardenId, roots, metaRoot, owner);"
|
|
2023
|
+
],
|
|
2024
|
+
"replace": [
|
|
2025
|
+
"\tlet reserved: PiDurableReservation;",
|
|
2026
|
+
"\treserved = await reserveInPair(gardenId, roots, metaRoot, owner);",
|
|
2027
|
+
"\tconst arm = takeRecordArm(gardenId, roots);",
|
|
2028
|
+
"\ttry {"
|
|
2029
|
+
],
|
|
2030
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2031
|
+
"timeoutSeconds": 600,
|
|
2032
|
+
"signature": "[QK:PDR-ARM-BEFORE-SD]",
|
|
2033
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2034
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2035
|
+
},
|
|
2036
|
+
{
|
|
2037
|
+
"claim": "PDR-ROW-ORDER",
|
|
2038
|
+
"title": "the reserve judges the P-rules before the holder row, so a live holder is refused by a profile rule instead of as owner-live",
|
|
2039
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2040
|
+
"find": ["\t\tif (claim.state !== \"closed\") requireHolderGone(claim, resource, owner.hostname);"],
|
|
2041
|
+
"replace": [
|
|
2042
|
+
"\t\trequireProfile(donorOf(claim), pair, resource);",
|
|
2043
|
+
"\t\tif (claim.state !== \"closed\") requireHolderGone(claim, resource, owner.hostname);"
|
|
2044
|
+
],
|
|
2045
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2046
|
+
"timeoutSeconds": 600,
|
|
2047
|
+
"signature": "[QK:PDR-ROW-ORDER]",
|
|
2048
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2049
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2050
|
+
},
|
|
2051
|
+
{
|
|
2052
|
+
"claim": "PDR-HOST-BEFORE-LIVENESS",
|
|
2053
|
+
"title": "the reserve probes a holder's pid on this host before its host, so another host's holder is refused by this host's liveness of a pid that is not its own",
|
|
2054
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2055
|
+
"find": ["\tconst verdict = otherHost ? \"other-host\" : holderVerdict(claim.owner);"],
|
|
2056
|
+
"replace": [
|
|
2057
|
+
"\tconst verdict = holderVerdict(claim.owner) === \"dead\" && otherHost ? \"other-host\" : holderVerdict(claim.owner);"
|
|
2058
|
+
],
|
|
2059
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2060
|
+
"timeoutSeconds": 600,
|
|
2061
|
+
"signature": "[QK:PDR-HOST-BEFORE-LIVENESS]",
|
|
2062
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2063
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2064
|
+
},
|
|
2065
|
+
{
|
|
2066
|
+
"claim": "PDR-DONOR-ATTRIBUTION",
|
|
2067
|
+
"title": "the reserve attributes a dead reservation's donor to its current holder, so a parent's reservation is judged as if the parent had been the native owner",
|
|
2068
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2069
|
+
"find": ["\t\tconst profile = requireProfile(donor, pair, resource);"],
|
|
2070
|
+
"replace": ["\t\tconst profile = requireProfile({ ...donor, owner: claim.owner }, pair, resource);"],
|
|
2071
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2072
|
+
"timeoutSeconds": 600,
|
|
2073
|
+
"signature": "[QK:PDR-DONOR-ATTRIBUTION]",
|
|
2074
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2075
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2076
|
+
},
|
|
2077
|
+
{
|
|
2078
|
+
"claim": "PDR-LEASE-SNAPSHOT",
|
|
2079
|
+
"title": "the adoption reads the donor's own lease instead of the reservation's snapshot, so a lease that appeared after a reservation saw none is adopted when the donor once held one",
|
|
2080
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2081
|
+
"find": ["\t\tif (reservation.nativeLease === \"absent\" && leasePresent(directory)) {"],
|
|
2082
|
+
"replace": ["\t\tif (reservation.from.lease !== \"held\" && leasePresent(directory)) {"],
|
|
2083
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2084
|
+
"timeoutSeconds": 600,
|
|
2085
|
+
"signature": "[QK:PDR-LEASE-SNAPSHOT]",
|
|
2086
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2087
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2088
|
+
},
|
|
2089
|
+
{
|
|
2090
|
+
"claim": "PDR-LEASE-NO-LAUNDER",
|
|
2091
|
+
"title": "a re-reserve retakes the snapshot from the donor's lease, so a lease that appeared after a reservation saw none is laundered into an attributed one",
|
|
2092
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2093
|
+
"find": ["\t\t\tif (before === \"absent\" && sidecar) {"],
|
|
2094
|
+
"replace": ["\t\t\tif (!leaseAttributed(donor.lease) && sidecar) {"],
|
|
2095
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2096
|
+
"timeoutSeconds": 600,
|
|
2097
|
+
"signature": "[QK:PDR-LEASE-NO-LAUNDER]",
|
|
2098
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2099
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2100
|
+
},
|
|
2101
|
+
{
|
|
2102
|
+
"claim": "PDR-LEASE-SIDECAR-SELECTION",
|
|
2103
|
+
"title": "the reserve takes its lease snapshot beside the physical directory instead of the donor's selection, so under an alias it sees a lock nobody's SDK takes and misses the one it does",
|
|
2104
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2105
|
+
"find": ["\t\tconst sidecar = leasePresent(donor.selected.directory);"],
|
|
2106
|
+
"replace": ["\t\tconst sidecar = leasePresent(resource);"],
|
|
2107
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2108
|
+
"timeoutSeconds": 600,
|
|
2109
|
+
"signature": "[QK:PDR-LEASE-SIDECAR-SELECTION]",
|
|
2110
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2111
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2112
|
+
},
|
|
2113
|
+
{
|
|
2114
|
+
"claim": "PDR-SNAPSHOT-ATTRIBUTION-READER",
|
|
2115
|
+
"title": "the reader accepts a present-attributed snapshot for any donor, so a reservation attributes a lease to a donor that released it or never held one",
|
|
2116
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2117
|
+
"find": ["\tconst attributable = leaseAttributed(donor.lease);"],
|
|
2118
|
+
"replace": ["\tconst attributable = true;"],
|
|
2119
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2120
|
+
"timeoutSeconds": 600,
|
|
2121
|
+
"signature": "[QK:PDR-SNAPSHOT-ATTRIBUTION-READER]",
|
|
2122
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2123
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2124
|
+
},
|
|
2125
|
+
{
|
|
2126
|
+
"claim": "PDR-RESERVE-CLEAN-ONLY",
|
|
2127
|
+
"title": "the clean test on a closed donor fires only for a storage failure no closed row can carry, so a closed row whose storage never opened is reserved as if it had closed clean",
|
|
2128
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2129
|
+
"find": ["\t\tif (claim.state === \"closed\" && claim.end?.storage !== \"closed\") {"],
|
|
2130
|
+
"replace": ["\t\tif (claim.state === \"closed\" && claim.end?.storage === \"failed\") {"],
|
|
2131
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2132
|
+
"timeoutSeconds": 600,
|
|
2133
|
+
"signature": "[QK:PDR-RESERVE-CLEAN-ONLY]",
|
|
2134
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2135
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2136
|
+
},
|
|
2137
|
+
{
|
|
2138
|
+
"claim": "PDR-RESERVED-ROW",
|
|
2139
|
+
"title": "the reader refuses only a reservation on another state, so a reserved claim that carries no reservation reads as valid",
|
|
2140
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2141
|
+
"find": ["\tif ((claim.state === \"reserved\") !== (value.reservation !== undefined)) {"],
|
|
2142
|
+
"replace": [
|
|
2143
|
+
"\tif ((claim.state === \"reserved\") !== (value.reservation !== undefined) && value.reservation !== undefined) {"
|
|
2144
|
+
],
|
|
2145
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2146
|
+
"timeoutSeconds": 600,
|
|
2147
|
+
"signature": "[QK:PDR-RESERVED-ROW]",
|
|
2148
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2149
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2150
|
+
},
|
|
2151
|
+
{
|
|
2152
|
+
"claim": "PDR-ADOPT-EXACT",
|
|
2153
|
+
"title": "the adoption compares the claim's generation with itself, so a child adopts a reservation at a generation it was not launched for",
|
|
2154
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2155
|
+
"find": ["\t\tif (claim.generation !== adoption.sourceGeneration) {"],
|
|
2156
|
+
"replace": ["\t\tif (claim.generation !== claim.generation) {"],
|
|
2157
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2158
|
+
"timeoutSeconds": 600,
|
|
2159
|
+
"signature": "[QK:PDR-ADOPT-EXACT]",
|
|
2160
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2161
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2162
|
+
},
|
|
2163
|
+
{
|
|
2164
|
+
"claim": "PDR-ADOPT-NOT-RESERVED",
|
|
2165
|
+
"title": "the adoption refuses only a missing claim, so a claim no longer reserved is not refused as adopt-not-reserved",
|
|
2166
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2167
|
+
"find": ["\t\tif (claim === undefined || claim.state !== \"reserved\") {"],
|
|
2168
|
+
"replace": ["\t\tif (claim === undefined) {"],
|
|
2169
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2170
|
+
"timeoutSeconds": 600,
|
|
2171
|
+
"signature": "[QK:PDR-ADOPT-NOT-RESERVED]",
|
|
2172
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2173
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2174
|
+
},
|
|
2175
|
+
{
|
|
2176
|
+
"claim": "PDR-WITHDRAW-PROJECTION",
|
|
2177
|
+
"title": "the withdrawal restores the donor's row under the parent's owner, so a schema-valid claim names the withdrawing parent as the native owner it never was",
|
|
2178
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2179
|
+
"find": ["\t\t\towner: donor.owner,"],
|
|
2180
|
+
"replace": ["\t\t\towner: claim.owner,"],
|
|
2181
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2182
|
+
"timeoutSeconds": 600,
|
|
2183
|
+
"signature": "[QK:PDR-WITHDRAW-PROJECTION]",
|
|
2184
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2185
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2186
|
+
},
|
|
2187
|
+
{
|
|
2188
|
+
"claim": "PDR-WITHDRAW-OWN-GEN",
|
|
2189
|
+
"title": "the withdrawal compares this owner with itself, so a process withdraws another owner's reservation",
|
|
2190
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2191
|
+
"find": ["\t\tif (!sameOwner(claim.owner, owner)) {"],
|
|
2192
|
+
"replace": ["\t\tif (!sameOwner(owner, owner)) {"],
|
|
2193
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2194
|
+
"timeoutSeconds": 600,
|
|
2195
|
+
"signature": "[QK:PDR-WITHDRAW-OWN-GEN]",
|
|
2196
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2197
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2198
|
+
},
|
|
2199
|
+
{
|
|
2200
|
+
"claim": "PDR-ADOPTED-EVIDENCE-KEPT",
|
|
2201
|
+
"title": "an adopted owner's next transition drops its adoptedFrom, so the adoption evidence is lost before the owner ends",
|
|
2202
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2203
|
+
"find": ["\t\t\t\t...(last.adoptedFrom === undefined ? {} : { adoptedFrom: last.adoptedFrom }),"],
|
|
2204
|
+
"replace": ["\t\t\t\t...(last.adoptedFrom === undefined ? {} : {}),"],
|
|
2205
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2206
|
+
"timeoutSeconds": 600,
|
|
2207
|
+
"signature": "[QK:PDR-ADOPTED-EVIDENCE-KEPT]",
|
|
2208
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2209
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2210
|
+
},
|
|
2211
|
+
{
|
|
2212
|
+
"claim": "PDR-OBSERVATION-CLASSES",
|
|
2213
|
+
"title": "an observation classifies a claim the strict reader refused as lost, so an unreadable claim is reported as a lost reservation instead of unobserved",
|
|
2214
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2215
|
+
"find": ["\t\t\treturn { class: \"unobserved\", reason: error.reason, detail: error.message };"],
|
|
2216
|
+
"replace": ["\t\t\treturn { class: \"lost\" };"],
|
|
2217
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2218
|
+
"timeoutSeconds": 600,
|
|
2219
|
+
"signature": "[QK:PDR-OBSERVATION-CLASSES]",
|
|
2220
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2221
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2222
|
+
},
|
|
2223
|
+
{
|
|
2224
|
+
"claim": "PDR-ADOPT-PATH-FRESH",
|
|
2225
|
+
"title": "the adoption compares the reservation with the resource the pair named instead of its directory resolved in the hold, so an alias retargeted after the hold was entered is adopted",
|
|
2226
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2227
|
+
"find": ["\t\t\treal = fs.realpathSync(directory);"],
|
|
2228
|
+
"replace": ["\t\t\treal = resource;"],
|
|
2229
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2230
|
+
"timeoutSeconds": 600,
|
|
2231
|
+
"signature": "[QK:PDR-ADOPT-PATH-FRESH]",
|
|
2232
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2233
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2234
|
+
},
|
|
2235
|
+
{
|
|
2236
|
+
"claim": "PDR-ORDINARY-RESERVED-ATTRIBUTION",
|
|
2237
|
+
"title": "an ordinary admission attributes a dead reservation's present-attributed snapshot to any spelling of D, so a lease beside another alias is taken over as the donor's",
|
|
2238
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2239
|
+
"find": [
|
|
2240
|
+
"\t\t\tsnapshot?.nativeLease === \"present-attributed\" && snapshot.from.selected.directory === directory;"
|
|
2241
|
+
],
|
|
2242
|
+
"replace": ["\t\t\tsnapshot?.nativeLease === \"present-attributed\";"],
|
|
2243
|
+
"gate": ["bash", "run.sh", "check-tests-beside-behavior"],
|
|
2244
|
+
"timeoutSeconds": 600,
|
|
2245
|
+
"signature": "[QK:PDR-ORDINARY-RESERVED-ATTRIBUTION]",
|
|
2246
|
+
"signatureSource": "pi-extensions/lib/pi-durable-reservation.test.ts",
|
|
2247
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2248
|
+
},
|
|
2249
|
+
{
|
|
2250
|
+
"claim": "PDR-CONTEXT-CLOSED",
|
|
2251
|
+
"title": "the adopt context's key test asks only for the four keys, so a context carrying any other key (a session, cwd, model, profile, prompt, module, env, nonce or callback) is decoded",
|
|
2252
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
2253
|
+
"find": ["\t\tObject.keys(value).sort().join(\",\") !== ADOPT_KEYS.join(\",\")"],
|
|
2254
|
+
"replace": ["\t\t!ADOPT_KEYS.every((key) => Object.hasOwn(value, key))"],
|
|
2255
|
+
"gate": ["bash", "run.sh", "check-pi-durable-beside"],
|
|
2256
|
+
"timeoutSeconds": 300,
|
|
2257
|
+
"signature": "[QK:PDR-CONTEXT-CLOSED]",
|
|
2258
|
+
"signatureSource": "pi-extensions/meta-bridge-pi-durable.test.ts",
|
|
2259
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2260
|
+
},
|
|
2261
|
+
{
|
|
2262
|
+
"claim": "PDR-ADOPT-ROOTS",
|
|
2263
|
+
"title": "the received-root check compares the mismatch count with itself, so an adoption opens under meta roots this process received from elsewhere",
|
|
2264
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
2265
|
+
"find": ["\tif (mismatched.length > 0) {"],
|
|
2266
|
+
"replace": ["\tif (mismatched.length > mismatched.length) {"],
|
|
2267
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
2268
|
+
"timeoutSeconds": 300,
|
|
2269
|
+
"signature": "[QK:PDR-ADOPT-ROOTS]",
|
|
2270
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
2271
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2272
|
+
},
|
|
2273
|
+
{
|
|
2274
|
+
"claim": "PDR-ADOPT-BEFORE-LEASE",
|
|
2275
|
+
"title": "adopt mode hands the open the ordinary owner fence instead of the adoption's, so the reservation is read as a live parent's claim and the matching adoption never reaches its lease",
|
|
2276
|
+
"subject": "pi/pi-durable/bootstrap.mjs",
|
|
2277
|
+
"find": ["\tconst fence = adopt === undefined ? OWNER_FENCE : adopt.fence;"],
|
|
2278
|
+
"replace": ["\tconst fence = adopt === undefined ? OWNER_FENCE : OWNER_FENCE;"],
|
|
2279
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
2280
|
+
"timeoutSeconds": 300,
|
|
2281
|
+
"signature": "[QK:PDR-ADOPT-BEFORE-LEASE]",
|
|
2282
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
2283
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2284
|
+
},
|
|
2285
|
+
{
|
|
2286
|
+
"claim": "PDF-CLOSE-RELEASES-PROVIDER-SOCKETS",
|
|
2287
|
+
"title": "the owned close no longer releases the provider session resources, so a closed host keeps its Codex WebSocket and idle timer and stays alive after a normal close",
|
|
2288
|
+
"subject": "pi/pi-durable/carrier/runtime.js",
|
|
2289
|
+
"find": ["\t\t\t\t\t\t\tcleanupSessionResources();"],
|
|
2290
|
+
"replace": ["\t\t\t\t\t\t\tvoid cleanupSessionResources;"],
|
|
2291
|
+
"gate": ["bash", "run.sh", "check-pi-durable-carrier"],
|
|
2292
|
+
"timeoutSeconds": 300,
|
|
2293
|
+
"signature": "[QK:PDF-CLOSE-RELEASES-PROVIDER-SOCKETS]",
|
|
2294
|
+
"signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
|
|
2295
|
+
"build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
|
|
2296
|
+
},
|
|
2297
|
+
{
|
|
2298
|
+
"claim": "PDR-HOLDER-STATE-NAMED",
|
|
2299
|
+
"title": "a reserve's live-holder refusal no longer names the refused claim's state, so a reservation's live parent cannot be told from a running native owner",
|
|
2300
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2301
|
+
"find": ["\tconst context = { holderState: claim.state };"],
|
|
2302
|
+
"replace": ["\tconst context = {};"],
|
|
2303
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
2304
|
+
"timeoutSeconds": 60,
|
|
2305
|
+
"signature": "[QK:PDR-HOLDER-STATE-NAMED]",
|
|
2306
|
+
"signatureSource": "pi-extensions/lib/pi-durable-release-failure.test.ts"
|
|
2307
|
+
},
|
|
2308
|
+
{
|
|
2309
|
+
"claim": "PDR-RESERVE-TX-RELEASE-NAMES-WRITE",
|
|
2310
|
+
"title": "the reserve forgets the reservation it wrote, so an S_D release failing after the write reads as a refusal that reserved nothing",
|
|
2311
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2312
|
+
"find": ["\t\twriteClaim(resource, body);", "\t\tcommitted = writtenOf(body);", "\t\treturn body;"],
|
|
2313
|
+
"replace": ["\t\twriteClaim(resource, body);", "\t\treturn body;"],
|
|
2314
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
2315
|
+
"timeoutSeconds": 60,
|
|
2316
|
+
"signature": "[QK:PDR-RESERVE-TX-RELEASE-NAMES-WRITE]",
|
|
2317
|
+
"signatureSource": "pi-extensions/lib/pi-durable-release-failure.test.ts"
|
|
2318
|
+
},
|
|
2319
|
+
{
|
|
2320
|
+
"claim": "PDR-RESERVE-ARM-RELEASE-NAMES-WRITE",
|
|
2321
|
+
"title": "a record-arm release failing after a clean reserve is thrown bare, without the reservation it left",
|
|
2322
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2323
|
+
"find": ["\t\tthrow afterWrite(failure, { resource, state: \"reserved\", generation, ownerPid: owner.pid });"],
|
|
2324
|
+
"replace": ["\t\tthrow failure;"],
|
|
2325
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
2326
|
+
"timeoutSeconds": 60,
|
|
2327
|
+
"signature": "[QK:PDR-RESERVE-ARM-RELEASE-NAMES-WRITE]",
|
|
2328
|
+
"signatureSource": "pi-extensions/lib/pi-durable-release-failure.test.ts"
|
|
2329
|
+
},
|
|
2330
|
+
{
|
|
2331
|
+
"claim": "PDR-ARM-RELEASE-KEEPS-STEP-WRITE",
|
|
2332
|
+
"title": "a record-arm failure wrapping an S_D failure keeps its words but drops the write that failure named",
|
|
2333
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2334
|
+
"find": ["\tconst written = during instanceof PiDurableOwnerFenceError ? during.written : undefined;"],
|
|
2335
|
+
"replace": ["\tconst written = undefined;"],
|
|
2336
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
2337
|
+
"timeoutSeconds": 60,
|
|
2338
|
+
"signature": "[QK:PDR-ARM-RELEASE-KEEPS-STEP-WRITE]",
|
|
2339
|
+
"signatureSource": "pi-extensions/lib/pi-durable-release-failure.test.ts"
|
|
2340
|
+
},
|
|
2341
|
+
{
|
|
2342
|
+
"claim": "PDR-WITHDRAW-TX-RELEASE-NAMES-WRITE",
|
|
2343
|
+
"title": "the withdrawal forgets the donor row it restored, so an S_D release failing after it reads as a withdrawal that wrote nothing",
|
|
2344
|
+
"subject": "pi-extensions/lib/pi-durable-owner-fence.ts",
|
|
2345
|
+
"find": [
|
|
2346
|
+
"\t\twriteClaim(resource, body);",
|
|
2347
|
+
"\t\tcommitted = writtenOf(body);",
|
|
2348
|
+
"\t}).catch((error: unknown) => {"
|
|
2349
|
+
],
|
|
2350
|
+
"replace": ["\t\twriteClaim(resource, body);", "\t}).catch((error: unknown) => {"],
|
|
2351
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
2352
|
+
"timeoutSeconds": 60,
|
|
2353
|
+
"signature": "[QK:PDR-WITHDRAW-TX-RELEASE-NAMES-WRITE]",
|
|
2354
|
+
"signatureSource": "pi-extensions/lib/pi-durable-release-failure.test.ts"
|
|
1365
2355
|
}
|
|
1366
2356
|
]
|
|
1367
2357
|
}
|