@ttsc/unplugin 0.31.3 → 0.31.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/lib/core/transform/session/claimSharedCompile.js +6 -4
  2. package/lib/core/transform/session/claimSharedCompile.js.map +1 -1
  3. package/lib/core/transform/session/claimSharedCompile.mjs +6 -4
  4. package/lib/core/transform/session/claimSharedCompile.mjs.map +1 -1
  5. package/lib/core/transform/session/openTtscTransformSession.d.cts +1 -1
  6. package/lib/core/transform/session/openTtscTransformSession.d.mts +1 -1
  7. package/lib/core/transform/session/openTtscTransformSession.d.ts +1 -1
  8. package/lib/core/transform/session/openTtscTransformSession.js +7 -3
  9. package/lib/core/transform/session/openTtscTransformSession.js.map +1 -1
  10. package/lib/core/transform/session/openTtscTransformSession.mjs +7 -3
  11. package/lib/core/transform/session/openTtscTransformSession.mjs.map +1 -1
  12. package/lib/core/transform/tracker/broker/sweepAbandonedWatchProbes.d.cts +6 -6
  13. package/lib/core/transform/tracker/broker/sweepAbandonedWatchProbes.d.mts +6 -6
  14. package/lib/core/transform/tracker/broker/sweepAbandonedWatchProbes.d.ts +6 -6
  15. package/lib/core/transform/tracker/broker/sweepAbandonedWatchProbes.js +9 -7
  16. package/lib/core/transform/tracker/broker/sweepAbandonedWatchProbes.js.map +1 -1
  17. package/lib/core/transform/tracker/broker/sweepAbandonedWatchProbes.mjs +9 -7
  18. package/lib/core/transform/tracker/broker/sweepAbandonedWatchProbes.mjs.map +1 -1
  19. package/lib/core/transform/tracker/broker/watchBrokerSource.js +14 -0
  20. package/lib/core/transform/tracker/broker/watchBrokerSource.js.map +1 -1
  21. package/lib/core/transform/tracker/broker/watchBrokerSource.mjs +14 -0
  22. package/lib/core/transform/tracker/broker/watchBrokerSource.mjs.map +1 -1
  23. package/lib/core/transform/tracker/createHostInputMutationTracker.js +20 -0
  24. package/lib/core/transform/tracker/createHostInputMutationTracker.js.map +1 -1
  25. package/lib/core/transform/tracker/createHostInputMutationTracker.mjs +20 -0
  26. package/lib/core/transform/tracker/createHostInputMutationTracker.mjs.map +1 -1
  27. package/lib/core/transform/tracker/createProjectMutationTracker.d.cts +6 -5
  28. package/lib/core/transform/tracker/createProjectMutationTracker.d.mts +6 -5
  29. package/lib/core/transform/tracker/createProjectMutationTracker.d.ts +6 -5
  30. package/lib/core/transform/tracker/createProjectMutationTracker.js +57 -36
  31. package/lib/core/transform/tracker/createProjectMutationTracker.js.map +1 -1
  32. package/lib/core/transform/tracker/createProjectMutationTracker.mjs +57 -36
  33. package/lib/core/transform/tracker/createProjectMutationTracker.mjs.map +1 -1
  34. package/lib/core/transform/tracker/settleProjectMutationEvents.d.cts +23 -29
  35. package/lib/core/transform/tracker/settleProjectMutationEvents.d.mts +23 -29
  36. package/lib/core/transform/tracker/settleProjectMutationEvents.d.ts +23 -29
  37. package/lib/core/transform/tracker/settleProjectMutationEvents.js +25 -37
  38. package/lib/core/transform/tracker/settleProjectMutationEvents.js.map +1 -1
  39. package/lib/core/transform/tracker/settleProjectMutationEvents.mjs +25 -37
  40. package/lib/core/transform/tracker/settleProjectMutationEvents.mjs.map +1 -1
  41. package/lib/core/transform/tracker/verifyGenerationLocations.d.cts +41 -0
  42. package/lib/core/transform/tracker/verifyGenerationLocations.d.mts +41 -0
  43. package/lib/core/transform/tracker/verifyGenerationLocations.d.ts +41 -0
  44. package/lib/core/transform/tracker/verifyGenerationLocations.js +54 -0
  45. package/lib/core/transform/tracker/verifyGenerationLocations.js.map +1 -0
  46. package/lib/core/transform/tracker/verifyGenerationLocations.mjs +52 -0
  47. package/lib/core/transform/tracker/verifyGenerationLocations.mjs.map +1 -0
  48. package/lib/core/transform/utils/isZombieProcess.d.cts +26 -0
  49. package/lib/core/transform/utils/isZombieProcess.d.mts +26 -0
  50. package/lib/core/transform/utils/isZombieProcess.d.ts +26 -0
  51. package/lib/core/transform/utils/isZombieProcess.js +46 -0
  52. package/lib/core/transform/utils/isZombieProcess.js.map +1 -0
  53. package/lib/core/transform/utils/isZombieProcess.mjs +44 -0
  54. package/lib/core/transform/utils/isZombieProcess.mjs.map +1 -0
  55. package/lib/core/transform/validation/TtscGenerationProof.d.cts +12 -4
  56. package/lib/core/transform/validation/TtscGenerationProof.d.mts +12 -4
  57. package/lib/core/transform/validation/TtscGenerationProof.d.ts +12 -4
  58. package/lib/core/transform/validation/TtscGenerationProof.js +13 -4
  59. package/lib/core/transform/validation/TtscGenerationProof.js.map +1 -1
  60. package/lib/core/transform/validation/TtscGenerationProof.mjs +13 -4
  61. package/lib/core/transform/validation/TtscGenerationProof.mjs.map +1 -1
  62. package/lib/core/transform/validation/matchesCachedExternalInputs.d.cts +2 -2
  63. package/lib/core/transform/validation/matchesCachedExternalInputs.d.mts +2 -2
  64. package/lib/core/transform/validation/matchesCachedExternalInputs.d.ts +2 -2
  65. package/lib/core/transform/validation/matchesCachedExternalInputs.js +26 -5
  66. package/lib/core/transform/validation/matchesCachedExternalInputs.js.map +1 -1
  67. package/lib/core/transform/validation/matchesCachedExternalInputs.mjs +26 -5
  68. package/lib/core/transform/validation/matchesCachedExternalInputs.mjs.map +1 -1
  69. package/lib/core/transform/validation/matchesCompleteInputSnapshot.js +1 -1
  70. package/lib/core/transform/validation/matchesCompleteInputSnapshot.js.map +1 -1
  71. package/lib/core/transform/validation/matchesCompleteInputSnapshot.mjs +1 -1
  72. package/lib/core/transform/validation/matchesCompleteInputSnapshot.mjs.map +1 -1
  73. package/lib/core/transform/validation/matchesUniversalHostInputProbes.d.cts +15 -8
  74. package/lib/core/transform/validation/matchesUniversalHostInputProbes.d.mts +15 -8
  75. package/lib/core/transform/validation/matchesUniversalHostInputProbes.d.ts +15 -8
  76. package/lib/core/transform/validation/matchesUniversalHostInputProbes.js +29 -20
  77. package/lib/core/transform/validation/matchesUniversalHostInputProbes.js.map +1 -1
  78. package/lib/core/transform/validation/matchesUniversalHostInputProbes.mjs +29 -20
  79. package/lib/core/transform/validation/matchesUniversalHostInputProbes.mjs.map +1 -1
  80. package/lib/core/transform/validation/matchesUniversalHostInputs.js +1 -1
  81. package/lib/core/transform/validation/matchesUniversalHostInputs.js.map +1 -1
  82. package/lib/core/transform/validation/matchesUniversalHostInputs.mjs +1 -1
  83. package/lib/core/transform/validation/matchesUniversalHostInputs.mjs.map +1 -1
  84. package/package.json +3 -3
  85. package/src/core/transform/session/claimSharedCompile.ts +6 -4
  86. package/src/core/transform/session/openTtscTransformSession.ts +7 -3
  87. package/src/core/transform/tracker/broker/sweepAbandonedWatchProbes.ts +8 -7
  88. package/src/core/transform/tracker/broker/watchBrokerSource.ts +14 -0
  89. package/src/core/transform/tracker/createHostInputMutationTracker.ts +18 -0
  90. package/src/core/transform/tracker/createProjectMutationTracker.ts +61 -40
  91. package/src/core/transform/tracker/settleProjectMutationEvents.ts +25 -36
  92. package/src/core/transform/tracker/verifyGenerationLocations.ts +53 -0
  93. package/src/core/transform/utils/isZombieProcess.ts +39 -0
  94. package/src/core/transform/validation/TtscGenerationProof.ts +20 -4
  95. package/src/core/transform/validation/matchesCachedExternalInputs.ts +28 -5
  96. package/src/core/transform/validation/matchesCompleteInputSnapshot.ts +1 -1
  97. package/src/core/transform/validation/matchesUniversalHostInputProbes.ts +27 -16
  98. package/src/core/transform/validation/matchesUniversalHostInputs.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"matchesCachedExternalInputs.js","sources":["../../../../src/core/transform/validation/matchesCachedExternalInputs.ts"],"sourcesContent":[null],"names":["envelopeDerivation","resultFilesystem","derivationIdentity","inputMetadataEvidence","matchesGraphInputObservation","inputMetadataSignature","graphInputStateHash","hostInputStateHash","MISSING_INPUT_STATE"],"mappings":"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"}
1
+ {"version":3,"file":"matchesCachedExternalInputs.js","sources":["../../../../src/core/transform/validation/matchesCachedExternalInputs.ts"],"sourcesContent":[null],"names":["envelopeDerivation","resultFilesystem","derivationIdentity","inputMetadataEvidence","matchesGraphInputObservation","inputMetadataSignature","hostInputRealpath","graphInputStateHash","hostInputStateHash","MISSING_INPUT_STATE"],"mappings":"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"}
@@ -3,6 +3,7 @@ import { resultFilesystem } from '../cache/resultFilesystem.mjs';
3
3
  import { derivationIdentity } from '../envelope/derivationIdentity.mjs';
4
4
  import { envelopeDerivation } from '../envelope/envelopeDerivation.mjs';
5
5
  import { graphInputStateHash } from '../inputs/graphInputStateHash.mjs';
6
+ import { hostInputRealpath } from '../inputs/hostInputRealpath.mjs';
6
7
  import { hostInputStateHash } from '../inputs/hostInputStateHash.mjs';
7
8
  import { inputMetadataEvidence } from '../inputs/inputMetadataEvidence.mjs';
8
9
  import { inputMetadataSignature } from '../inputs/inputMetadataSignature.mjs';
@@ -18,7 +19,7 @@ import { MISSING_INPUT_STATE } from './MISSING_INPUT_STATE.mjs';
18
19
  * The caller adopts those signatures only once every input is proven unchanged,
19
20
  * so a signature never outlives the content comparison that justified it.
20
21
  *
21
- * @evidence contracts/common.md#principled-implementation Each lexical spelling replays its predicates or owning content codec; only stable separable metadata can replace that comparison, so aliases cannot answer for one another.
22
+ * @evidence contracts/common.md#principled-implementation Each lexical spelling replays its predicates or owning content codec and resolves its own physical file; only stable separable metadata can replace that comparison, so aliases cannot answer for one another. Spellings resolving to one physical file now share that file's content read, which the codecs hash by content alone.
22
23
  * @evidence contracts/common.md#clear-and-simple-design One pass returns the aggregate verdict and earned signatures, leaving all-or-nothing adoption to its caller.
23
24
  * @evidence contracts/common.md#prohibited-implementation-shortcuts Recorded missing states and absent hash keys remain distinct from successful content proof; newer reads do not rewrite the authoritative recorded hashes.
24
25
  * @evidence contracts/common.md#meaningful-documentation Native paragraphs distinguish mixed codecs, clock-qualified reuse and caller-owned signature adoption before tags.
@@ -32,7 +33,7 @@ import { MISSING_INPUT_STATE } from './MISSING_INPUT_STATE.mjs';
32
33
  * failures/listings, then recaptures metadata for earned signatures.
33
34
  * Earned signature storage grows with successful observed spellings; legacy
34
35
  * fallback also materializes the recorded hash key array.
35
- * @evidence contracts/performance.md#reuse-equivalent-work The generation's unchanged separable signatures share prior content validation; changed metadata or clock ordering requires replay, and adopted signatures come only from a completely successful caller verdict.
36
+ * @evidence contracts/performance.md#reuse-equivalent-work The generation's unchanged separable signatures share prior content validation; changed metadata or clock ordering requires replay, read once per codec and physical file in this pass, and adopted signatures come only from a completely successful caller verdict.
36
37
  */
37
38
  function matchesCachedExternalInputs(
38
39
  /** Generation recording lexical inputs, distinct codecs and earned signatures. */
@@ -44,6 +45,8 @@ cached) {
44
45
  const filesystem = resultFilesystem(cached.result);
45
46
  const recordedHashes = cached.externalInputHashes ?? {};
46
47
  const recordedSignatures = cached.externalInputSignatures ?? {};
48
+ // Content hashes this pass read, by codec and current physical file.
49
+ const sharedReads = new Map();
47
50
  // Compare each spelling against the recorded state under its own name. Two
48
51
  // spellings share one identity exactly when they selected one physical file
49
52
  // at generation time, which is the state a retarget ends, so neither may
@@ -85,9 +88,27 @@ cached) {
85
88
  before.signature === recordedSignatures[spelling]) {
86
89
  continue;
87
90
  }
88
- const hash = Object.prototype.hasOwnProperty.call(graphRealpaths, identity)
89
- ? graphInputStateHash(file, filesystem)
90
- : hostInputStateHash(file, filesystem);
91
+ // Each spelling resolves on its own and the first one resolving to a
92
+ // physical file reads it through its own spelling, as the filesystem view
93
+ // answers; a later spelling resolving to that file now reuses the read,
94
+ // since the codecs hash content alone. A metadata-only change otherwise
95
+ // read an alias and its target twice in one delivery.
96
+ const graph = Object.prototype.hasOwnProperty.call(graphRealpaths, identity);
97
+ const physical = hostInputRealpath(file, filesystem);
98
+ const shared = physical === null
99
+ ? undefined
100
+ : `${graph ? "graph" : "host"}\0${physical}`;
101
+ let hash;
102
+ if (shared !== undefined && sharedReads.has(shared)) {
103
+ hash = sharedReads.get(shared);
104
+ }
105
+ else {
106
+ hash = graph
107
+ ? graphInputStateHash(file, filesystem)
108
+ : hostInputStateHash(file, filesystem);
109
+ if (shared !== undefined)
110
+ sharedReads.set(shared, hash);
111
+ }
91
112
  const after = inputMetadataSignature(file, filesystem);
92
113
  if (!Object.prototype.hasOwnProperty.call(recordedHashes, identity) ||
93
114
  recordedHashes[identity] !== (hash ?? MISSING_INPUT_STATE)) {
@@ -1 +1 @@
1
- {"version":3,"file":"matchesCachedExternalInputs.mjs","sources":["../../../../src/core/transform/validation/matchesCachedExternalInputs.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;AAaA;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;SACa,2BAA2B;AACzC;AACA,MAAkC,EAAA;IAQlC,MAAM,UAAU,GAA2B,EAAE;IAC7C,IAAI,OAAO,GAAG,IAAI;AAClB,IAAA,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;AACxC,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,sBAAsB,IAAI,EAAE;IAC1D,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;AAClD,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,mBAAmB,IAAI,EAAE;AACvD,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,uBAAuB,IAAI,EAAE;;;;;;;AAO/D,IAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,kBAAkB;QAC1C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC,EAAE;QAC/C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QACnC,MAAM,WAAW,GAAG,MAAM,CAAC,yBAAyB,GAAG,QAAQ,CAAC;AAChE,QAAA,IAAI,WAAW,KAAK,SAAS,EAAE;YAC7B,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC;YACtD,IACE,MAAM,KAAK,SAAS;AACpB,gBAAA,MAAM,CAAC,SAAS;gBAChB,kBAAkB,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,SAAS,EACjD;AACA,gBAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,SAAS;gBACvC;YACF;AACA,YAAA,MAAM,QAAQ,GAAG,4BAA4B,CAC3C,IAAI,EACJ,WAAW,EACX,UAAU,EACV,KAAK,CAAC,eAAe,CACtB;YACD,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC;YACtD,IAAI,CAAC,QAAQ,EAAE;gBACb,OAAO,GAAG,KAAK;YACjB;AAAO,iBAAA,IAAI,MAAM,EAAE,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE;AACnE,gBAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,KAAK;YAC9B;YACA;QACF;;;;;QAKA,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC;QACtD,IACE,MAAM,KAAK,SAAS;YACpB,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC;YAClE,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;AAC9D,YAAA,MAAM,CAAC,SAAS;YAChB,MAAM,CAAC,SAAS,KAAK,kBAAkB,CAAC,QAAQ,CAAC,EACjD;YACA;QACF;AACA,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ;AACxE,cAAE,mBAAmB,CAAC,IAAI,EAAE,UAAU;AACtC,cAAE,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC;QACxC,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC;AACtD,QAAA,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;YAC/D,cAAc,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,mBAAmB,CAAC,EAC1D;YACA,OAAO,GAAG,KAAK;QACjB;QACA,IACE,IAAI,KAAK,IAAI;AACb,YAAA,KAAK,KAAK,SAAS;YACnB,MAAM,EAAE,SAAS,KAAK,KAAK;YAC3B,MAAM,CAAC,SAAS,EAChB;AACA,YAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,KAAK;QAC9B;IACF;AACA,IAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE;AAChC;;;;"}
1
+ {"version":3,"file":"matchesCachedExternalInputs.mjs","sources":["../../../../src/core/transform/validation/matchesCachedExternalInputs.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -69,7 +69,7 @@ cached, proof) {
69
69
  const hostValidation = cached.hostInputValidation;
70
70
  if (hostValidation === undefined ||
71
71
  !matchesUniversalHostInputEntries.matchesUniversalHostInputEntries(cached, hostValidation) ||
72
- !matchesUniversalHostInputProbes.matchesUniversalHostInputProbes(cached, hostValidation) ||
72
+ !matchesUniversalHostInputProbes.matchesUniversalHostInputProbes(cached, hostValidation, proof) ||
73
73
  !matchesUniversalHostInputTrees.matchesUniversalHostInputTrees(cached, hostValidation, proof)) {
74
74
  return false;
75
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"matchesCompleteInputSnapshot.js","sources":["../../../../src/core/transform/validation/matchesCompleteInputSnapshot.ts"],"sourcesContent":[null],"names":["nativeInputPredicatesHold","envelopeDerivation","matchesUniversalHostInputEntries","matchesUniversalHostInputProbes","matchesUniversalHostInputTrees","declaredProjectInputKeys","collectProjectInputSnapshot","resultFilesystem","walkSnapshotComplete","sameProjectDirectories","sameHashes","matchesCachedExternalInputs","matchesExternalInputRealpaths"],"mappings":"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"}
1
+ {"version":3,"file":"matchesCompleteInputSnapshot.js","sources":["../../../../src/core/transform/validation/matchesCompleteInputSnapshot.ts"],"sourcesContent":[null],"names":["nativeInputPredicatesHold","envelopeDerivation","matchesUniversalHostInputEntries","matchesUniversalHostInputProbes","matchesUniversalHostInputTrees","declaredProjectInputKeys","collectProjectInputSnapshot","resultFilesystem","walkSnapshotComplete","sameProjectDirectories","sameHashes","matchesCachedExternalInputs","matchesExternalInputRealpaths"],"mappings":"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"}
@@ -67,7 +67,7 @@ cached, proof) {
67
67
  const hostValidation = cached.hostInputValidation;
68
68
  if (hostValidation === undefined ||
69
69
  !matchesUniversalHostInputEntries(cached, hostValidation) ||
70
- !matchesUniversalHostInputProbes(cached, hostValidation) ||
70
+ !matchesUniversalHostInputProbes(cached, hostValidation, proof) ||
71
71
  !matchesUniversalHostInputTrees(cached, hostValidation, proof)) {
72
72
  return false;
73
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"matchesCompleteInputSnapshot.mjs","sources":["../../../../src/core/transform/validation/matchesCompleteInputSnapshot.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"matchesCompleteInputSnapshot.mjs","sources":["../../../../src/core/transform/validation/matchesCompleteInputSnapshot.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { TtscCachedProjectTransform } from "../cache/TtscCachedProjectTransform.cjs";
2
+ import type { TtscGenerationProof } from "./TtscGenerationProof.cjs";
2
3
  import type { TtscHostInputValidation } from "./TtscHostInputValidation.cjs";
3
4
  /**
4
5
  * Prove the universal inputs that were absent are still absent, through one
@@ -13,13 +14,19 @@ import type { TtscHostInputValidation } from "./TtscHostInputValidation.cjs";
13
14
  * Complete validation still compares its recorded byte and membership
14
15
  * populations after this independent native absence predicate holds.
15
16
  *
16
- * @evidence contracts/common.md#principled-implementation Exact native ENOENT or ENOTDIR observations prove candidate absence, including native Unicode and short-name aliases. A vanished ancestor leaves descendants unreachable; replacement by a file rejects the grouped directory proof.
17
+ * A group also needs its directory to still be one, which a candidate's own
18
+ * stat cannot say: Windows answers ENOENT below a file just as below nothing.
19
+ * The admission's location verification has already read that of every watched
20
+ * directory, so a group under one reuses it instead of stating the directory a
21
+ * second time in the same delivery (samchon/ttsc#1735).
22
+ *
23
+ * @evidence contracts/common.md#principled-implementation Exact native ENOENT or ENOTDIR observations prove candidate absence, including native Unicode and short-name aliases. A vanished ancestor leaves descendants unreachable; replacement by a file rejects the grouped directory proof, whether this pass or the admission's location verification observed the directory.
17
24
  * @evidence contracts/common.md#clear-and-simple-design Missing-name validation has its own native absence boundary shared by narrow and complete proof; byte hashes and project membership remain separate predicates.
18
- * @evidence contracts/common.md#prohibited-implementation-shortcuts Listing inequality is not native name inequality; permission and transient failures are not fabricated absence. Only ENOENT and ENOTDIR qualify missing-path observations.
19
- * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain inability-to-prove rejection, unreadable-content ambiguity and both caller routes before tags.
20
- * @evidence contracts/portability.md#os-neutral-implementation The injected native stat resolves original candidate spelling, and its platform selects the same win32 or posix joining grammar as capture's ancestor probe. Case flags and JavaScript Unicode folding do not replace native alias resolution.
21
- * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources The pass borrows generation-owned groups and retains only each current native probe result; no directory listing, historical state or handle is acquired.
22
- * @evidence contracts/performance.md#efficient-algorithms Each group checks its directory once, then each candidate requires one native stat. Work follows candidate count and native path resolution, without enumerating unrelated directory entries; exact probes are necessary because listing names cannot establish all native aliases.
23
- * @evidence contracts/performance.md#reuse-equivalent-work Capture shares nearest-ancestor selection and raw candidate groups across consumers; each current absence proof must observe native candidates again unless the owning notification validator establishes unchanged inputs.
25
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Listing inequality is not native name inequality; permission and transient failures are not fabricated absence. Only ENOENT and ENOTDIR qualify missing-path observations, and only an identity read by the same synchronous admission stands for a directory stat.
26
+ * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain inability-to-prove rejection, unreadable-content ambiguity, both caller routes and the shared directory reading before tags.
27
+ * @evidence contracts/portability.md#os-neutral-implementation The injected native stat resolves original candidate spelling, and its platform selects the same win32 or posix joining grammar as capture's ancestor probe. Case flags and JavaScript Unicode folding do not replace native alias resolution, and the directory check does not rely on ENOTDIR, which Windows does not report.
28
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources The pass borrows generation-owned groups and the admission's identities, and retains only each current native probe result; no directory listing, historical state or handle is acquired.
29
+ * @evidence contracts/performance.md#efficient-algorithms Each candidate requires one native stat, and each group one directory stat unless its admission already read the directory's identity. Work follows candidate count and native path resolution, without enumerating unrelated directory entries; exact probes are necessary because listing names cannot establish all native aliases.
30
+ * @evidence contracts/performance.md#reuse-equivalent-work Capture shares nearest-ancestor selection and raw candidate groups across consumers, and one synchronous admission shares its watched directories' identities; each current absence proof must observe native candidates again unless the owning notification validator establishes unchanged inputs.
24
31
  */
25
- export declare function matchesUniversalHostInputProbes(cached: TtscCachedProjectTransform, validation: TtscHostInputValidation): boolean;
32
+ export declare function matchesUniversalHostInputProbes(cached: TtscCachedProjectTransform, validation: TtscHostInputValidation, proof?: TtscGenerationProof.Transaction): boolean;
@@ -1,4 +1,5 @@
1
1
  import type { TtscCachedProjectTransform } from "../cache/TtscCachedProjectTransform.mjs";
2
+ import type { TtscGenerationProof } from "./TtscGenerationProof.mjs";
2
3
  import type { TtscHostInputValidation } from "./TtscHostInputValidation.mjs";
3
4
  /**
4
5
  * Prove the universal inputs that were absent are still absent, through one
@@ -13,13 +14,19 @@ import type { TtscHostInputValidation } from "./TtscHostInputValidation.mjs";
13
14
  * Complete validation still compares its recorded byte and membership
14
15
  * populations after this independent native absence predicate holds.
15
16
  *
16
- * @evidence contracts/common.md#principled-implementation Exact native ENOENT or ENOTDIR observations prove candidate absence, including native Unicode and short-name aliases. A vanished ancestor leaves descendants unreachable; replacement by a file rejects the grouped directory proof.
17
+ * A group also needs its directory to still be one, which a candidate's own
18
+ * stat cannot say: Windows answers ENOENT below a file just as below nothing.
19
+ * The admission's location verification has already read that of every watched
20
+ * directory, so a group under one reuses it instead of stating the directory a
21
+ * second time in the same delivery (samchon/ttsc#1735).
22
+ *
23
+ * @evidence contracts/common.md#principled-implementation Exact native ENOENT or ENOTDIR observations prove candidate absence, including native Unicode and short-name aliases. A vanished ancestor leaves descendants unreachable; replacement by a file rejects the grouped directory proof, whether this pass or the admission's location verification observed the directory.
17
24
  * @evidence contracts/common.md#clear-and-simple-design Missing-name validation has its own native absence boundary shared by narrow and complete proof; byte hashes and project membership remain separate predicates.
18
- * @evidence contracts/common.md#prohibited-implementation-shortcuts Listing inequality is not native name inequality; permission and transient failures are not fabricated absence. Only ENOENT and ENOTDIR qualify missing-path observations.
19
- * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain inability-to-prove rejection, unreadable-content ambiguity and both caller routes before tags.
20
- * @evidence contracts/portability.md#os-neutral-implementation The injected native stat resolves original candidate spelling, and its platform selects the same win32 or posix joining grammar as capture's ancestor probe. Case flags and JavaScript Unicode folding do not replace native alias resolution.
21
- * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources The pass borrows generation-owned groups and retains only each current native probe result; no directory listing, historical state or handle is acquired.
22
- * @evidence contracts/performance.md#efficient-algorithms Each group checks its directory once, then each candidate requires one native stat. Work follows candidate count and native path resolution, without enumerating unrelated directory entries; exact probes are necessary because listing names cannot establish all native aliases.
23
- * @evidence contracts/performance.md#reuse-equivalent-work Capture shares nearest-ancestor selection and raw candidate groups across consumers; each current absence proof must observe native candidates again unless the owning notification validator establishes unchanged inputs.
25
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Listing inequality is not native name inequality; permission and transient failures are not fabricated absence. Only ENOENT and ENOTDIR qualify missing-path observations, and only an identity read by the same synchronous admission stands for a directory stat.
26
+ * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain inability-to-prove rejection, unreadable-content ambiguity, both caller routes and the shared directory reading before tags.
27
+ * @evidence contracts/portability.md#os-neutral-implementation The injected native stat resolves original candidate spelling, and its platform selects the same win32 or posix joining grammar as capture's ancestor probe. Case flags and JavaScript Unicode folding do not replace native alias resolution, and the directory check does not rely on ENOTDIR, which Windows does not report.
28
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources The pass borrows generation-owned groups and the admission's identities, and retains only each current native probe result; no directory listing, historical state or handle is acquired.
29
+ * @evidence contracts/performance.md#efficient-algorithms Each candidate requires one native stat, and each group one directory stat unless its admission already read the directory's identity. Work follows candidate count and native path resolution, without enumerating unrelated directory entries; exact probes are necessary because listing names cannot establish all native aliases.
30
+ * @evidence contracts/performance.md#reuse-equivalent-work Capture shares nearest-ancestor selection and raw candidate groups across consumers, and one synchronous admission shares its watched directories' identities; each current absence proof must observe native candidates again unless the owning notification validator establishes unchanged inputs.
24
31
  */
25
- export declare function matchesUniversalHostInputProbes(cached: TtscCachedProjectTransform, validation: TtscHostInputValidation): boolean;
32
+ export declare function matchesUniversalHostInputProbes(cached: TtscCachedProjectTransform, validation: TtscHostInputValidation, proof?: TtscGenerationProof.Transaction): boolean;
@@ -1,4 +1,5 @@
1
1
  import type { TtscCachedProjectTransform } from "../cache/TtscCachedProjectTransform";
2
+ import type { TtscGenerationProof } from "./TtscGenerationProof";
2
3
  import type { TtscHostInputValidation } from "./TtscHostInputValidation";
3
4
  /**
4
5
  * Prove the universal inputs that were absent are still absent, through one
@@ -13,13 +14,19 @@ import type { TtscHostInputValidation } from "./TtscHostInputValidation";
13
14
  * Complete validation still compares its recorded byte and membership
14
15
  * populations after this independent native absence predicate holds.
15
16
  *
16
- * @evidence contracts/common.md#principled-implementation Exact native ENOENT or ENOTDIR observations prove candidate absence, including native Unicode and short-name aliases. A vanished ancestor leaves descendants unreachable; replacement by a file rejects the grouped directory proof.
17
+ * A group also needs its directory to still be one, which a candidate's own
18
+ * stat cannot say: Windows answers ENOENT below a file just as below nothing.
19
+ * The admission's location verification has already read that of every watched
20
+ * directory, so a group under one reuses it instead of stating the directory a
21
+ * second time in the same delivery (samchon/ttsc#1735).
22
+ *
23
+ * @evidence contracts/common.md#principled-implementation Exact native ENOENT or ENOTDIR observations prove candidate absence, including native Unicode and short-name aliases. A vanished ancestor leaves descendants unreachable; replacement by a file rejects the grouped directory proof, whether this pass or the admission's location verification observed the directory.
17
24
  * @evidence contracts/common.md#clear-and-simple-design Missing-name validation has its own native absence boundary shared by narrow and complete proof; byte hashes and project membership remain separate predicates.
18
- * @evidence contracts/common.md#prohibited-implementation-shortcuts Listing inequality is not native name inequality; permission and transient failures are not fabricated absence. Only ENOENT and ENOTDIR qualify missing-path observations.
19
- * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain inability-to-prove rejection, unreadable-content ambiguity and both caller routes before tags.
20
- * @evidence contracts/portability.md#os-neutral-implementation The injected native stat resolves original candidate spelling, and its platform selects the same win32 or posix joining grammar as capture's ancestor probe. Case flags and JavaScript Unicode folding do not replace native alias resolution.
21
- * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources The pass borrows generation-owned groups and retains only each current native probe result; no directory listing, historical state or handle is acquired.
22
- * @evidence contracts/performance.md#efficient-algorithms Each group checks its directory once, then each candidate requires one native stat. Work follows candidate count and native path resolution, without enumerating unrelated directory entries; exact probes are necessary because listing names cannot establish all native aliases.
23
- * @evidence contracts/performance.md#reuse-equivalent-work Capture shares nearest-ancestor selection and raw candidate groups across consumers; each current absence proof must observe native candidates again unless the owning notification validator establishes unchanged inputs.
25
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Listing inequality is not native name inequality; permission and transient failures are not fabricated absence. Only ENOENT and ENOTDIR qualify missing-path observations, and only an identity read by the same synchronous admission stands for a directory stat.
26
+ * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain inability-to-prove rejection, unreadable-content ambiguity, both caller routes and the shared directory reading before tags.
27
+ * @evidence contracts/portability.md#os-neutral-implementation The injected native stat resolves original candidate spelling, and its platform selects the same win32 or posix joining grammar as capture's ancestor probe. Case flags and JavaScript Unicode folding do not replace native alias resolution, and the directory check does not rely on ENOTDIR, which Windows does not report.
28
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources The pass borrows generation-owned groups and the admission's identities, and retains only each current native probe result; no directory listing, historical state or handle is acquired.
29
+ * @evidence contracts/performance.md#efficient-algorithms Each candidate requires one native stat, and each group one directory stat unless its admission already read the directory's identity. Work follows candidate count and native path resolution, without enumerating unrelated directory entries; exact probes are necessary because listing names cannot establish all native aliases.
30
+ * @evidence contracts/performance.md#reuse-equivalent-work Capture shares nearest-ancestor selection and raw candidate groups across consumers, and one synchronous admission shares its watched directories' identities; each current absence proof must observe native candidates again unless the owning notification validator establishes unchanged inputs.
24
31
  */
25
- export declare function matchesUniversalHostInputProbes(cached: TtscCachedProjectTransform, validation: TtscHostInputValidation): boolean;
32
+ export declare function matchesUniversalHostInputProbes(cached: TtscCachedProjectTransform, validation: TtscHostInputValidation, proof?: TtscGenerationProof.Transaction): boolean;
@@ -16,16 +16,22 @@ var resultFilesystem = require('../cache/resultFilesystem.js');
16
16
  * Complete validation still compares its recorded byte and membership
17
17
  * populations after this independent native absence predicate holds.
18
18
  *
19
- * @evidence contracts/common.md#principled-implementation Exact native ENOENT or ENOTDIR observations prove candidate absence, including native Unicode and short-name aliases. A vanished ancestor leaves descendants unreachable; replacement by a file rejects the grouped directory proof.
19
+ * A group also needs its directory to still be one, which a candidate's own
20
+ * stat cannot say: Windows answers ENOENT below a file just as below nothing.
21
+ * The admission's location verification has already read that of every watched
22
+ * directory, so a group under one reuses it instead of stating the directory a
23
+ * second time in the same delivery (samchon/ttsc#1735).
24
+ *
25
+ * @evidence contracts/common.md#principled-implementation Exact native ENOENT or ENOTDIR observations prove candidate absence, including native Unicode and short-name aliases. A vanished ancestor leaves descendants unreachable; replacement by a file rejects the grouped directory proof, whether this pass or the admission's location verification observed the directory.
20
26
  * @evidence contracts/common.md#clear-and-simple-design Missing-name validation has its own native absence boundary shared by narrow and complete proof; byte hashes and project membership remain separate predicates.
21
- * @evidence contracts/common.md#prohibited-implementation-shortcuts Listing inequality is not native name inequality; permission and transient failures are not fabricated absence. Only ENOENT and ENOTDIR qualify missing-path observations.
22
- * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain inability-to-prove rejection, unreadable-content ambiguity and both caller routes before tags.
23
- * @evidence contracts/portability.md#os-neutral-implementation The injected native stat resolves original candidate spelling, and its platform selects the same win32 or posix joining grammar as capture's ancestor probe. Case flags and JavaScript Unicode folding do not replace native alias resolution.
24
- * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources The pass borrows generation-owned groups and retains only each current native probe result; no directory listing, historical state or handle is acquired.
25
- * @evidence contracts/performance.md#efficient-algorithms Each group checks its directory once, then each candidate requires one native stat. Work follows candidate count and native path resolution, without enumerating unrelated directory entries; exact probes are necessary because listing names cannot establish all native aliases.
26
- * @evidence contracts/performance.md#reuse-equivalent-work Capture shares nearest-ancestor selection and raw candidate groups across consumers; each current absence proof must observe native candidates again unless the owning notification validator establishes unchanged inputs.
27
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Listing inequality is not native name inequality; permission and transient failures are not fabricated absence. Only ENOENT and ENOTDIR qualify missing-path observations, and only an identity read by the same synchronous admission stands for a directory stat.
28
+ * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain inability-to-prove rejection, unreadable-content ambiguity, both caller routes and the shared directory reading before tags.
29
+ * @evidence contracts/portability.md#os-neutral-implementation The injected native stat resolves original candidate spelling, and its platform selects the same win32 or posix joining grammar as capture's ancestor probe. Case flags and JavaScript Unicode folding do not replace native alias resolution, and the directory check does not rely on ENOTDIR, which Windows does not report.
30
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources The pass borrows generation-owned groups and the admission's identities, and retains only each current native probe result; no directory listing, historical state or handle is acquired.
31
+ * @evidence contracts/performance.md#efficient-algorithms Each candidate requires one native stat, and each group one directory stat unless its admission already read the directory's identity. Work follows candidate count and native path resolution, without enumerating unrelated directory entries; exact probes are necessary because listing names cannot establish all native aliases.
32
+ * @evidence contracts/performance.md#reuse-equivalent-work Capture shares nearest-ancestor selection and raw candidate groups across consumers, and one synchronous admission shares its watched directories' identities; each current absence proof must observe native candidates again unless the owning notification validator establishes unchanged inputs.
27
33
  */
28
- function matchesUniversalHostInputProbes(cached, validation) {
34
+ function matchesUniversalHostInputProbes(cached, validation, proof) {
29
35
  const filesystem = resultFilesystem.resultFilesystem(cached.result);
30
36
  const paths = (filesystem.platform ?? process.platform) === "win32"
31
37
  ? path.win32
@@ -41,18 +47,21 @@ function matchesUniversalHostInputProbes(cached, validation) {
41
47
  }
42
48
  }
43
49
  for (const [directory, names] of validation.missing) {
44
- try {
45
- if (!filesystem.stat(directory).isDirectory())
46
- return false;
47
- }
48
- catch (error) {
49
- // Only a provably absent/non-directory ancestor keeps every descendant
50
- // unreachable. Permission and transient I/O failures cannot prove that
51
- // a candidate is still missing, while replacing the proving directory
52
- // with an exact file can itself redirect module resolution.
53
- if (!isMissingPathError(error))
54
- return false;
55
- continue;
50
+ // An identity the admission read proves the directory is one now.
51
+ if (proof?.locations?.get(directory) === undefined) {
52
+ try {
53
+ if (!filesystem.stat(directory).isDirectory())
54
+ return false;
55
+ }
56
+ catch (error) {
57
+ // Only a provably absent/non-directory ancestor keeps every descendant
58
+ // unreachable. Permission and transient I/O failures cannot prove that
59
+ // a candidate is still missing, while replacing the proving directory
60
+ // with an exact file can itself redirect module resolution.
61
+ if (!isMissingPathError(error))
62
+ return false;
63
+ continue;
64
+ }
56
65
  }
57
66
  for (const name of names) {
58
67
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"matchesUniversalHostInputProbes.js","sources":["../../../../src/core/transform/validation/matchesUniversalHostInputProbes.ts"],"sourcesContent":[null],"names":["resultFilesystem"],"mappings":";;;;;AAMA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACG,SAAU,+BAA+B,CAC7C,MAAkC,EAClC,UAAmC,EAAA;IAEnC,MAAM,UAAU,GAAGA,iCAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;AAClD,IAAA,MAAM,KAAK,GACT,CAAC,UAAU,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,MAAM;UAC1C,IAAI,CAAC;AACP,UAAE,IAAI,CAAC,KAAK;IAChB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,aAAa,IAAI,EAAE,EAAE;AAClD,QAAA,IAAI;AACF,YAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,YAAA,OAAO,KAAK;QACd;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,gBAAA,OAAO,KAAK;QAC9C;IACF;IACA,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE;AACnD,QAAA,IAAI;YACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;AAAE,gBAAA,OAAO,KAAK;QAC7D;QAAE,OAAO,KAAK,EAAE;;;;;AAKd,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,gBAAA,OAAO,KAAK;YAC5C;QACF;AACA,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI;AACF,gBAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC5C,gBAAA,OAAO,KAAK;YACd;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,oBAAA,OAAO,KAAK;YAC9C;QACF;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAEA;AACA,SAAS,kBAAkB,CAAC,KAAc,EAAA;AACxC,IAAA,MAAM,IAAI,GAAI,KAA2C,EAAE,IAAI;AAC/D,IAAA,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;AAChD;;;;"}
1
+ {"version":3,"file":"matchesUniversalHostInputProbes.js","sources":["../../../../src/core/transform/validation/matchesUniversalHostInputProbes.ts"],"sourcesContent":[null],"names":["resultFilesystem"],"mappings":";;;;;AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;SACa,+BAA+B,CAC7C,MAAkC,EAClC,UAAmC,EACnC,KAAuC,EAAA;IAEvC,MAAM,UAAU,GAAGA,iCAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;AAClD,IAAA,MAAM,KAAK,GACT,CAAC,UAAU,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,MAAM;UAC1C,IAAI,CAAC;AACP,UAAE,IAAI,CAAC,KAAK;IAChB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,aAAa,IAAI,EAAE,EAAE;AAClD,QAAA,IAAI;AACF,YAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,YAAA,OAAO,KAAK;QACd;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,gBAAA,OAAO,KAAK;QAC9C;IACF;IACA,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE;;QAEnD,IAAI,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;AAClD,YAAA,IAAI;gBACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;AAAE,oBAAA,OAAO,KAAK;YAC7D;YAAE,OAAO,KAAK,EAAE;;;;;AAKd,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,oBAAA,OAAO,KAAK;gBAC5C;YACF;QACF;AACA,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI;AACF,gBAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC5C,gBAAA,OAAO,KAAK;YACd;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,oBAAA,OAAO,KAAK;YAC9C;QACF;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAEA;AACA,SAAS,kBAAkB,CAAC,KAAc,EAAA;AACxC,IAAA,MAAM,IAAI,GAAI,KAA2C,EAAE,IAAI;AAC/D,IAAA,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;AAChD;;;;"}
@@ -14,16 +14,22 @@ import { resultFilesystem } from '../cache/resultFilesystem.mjs';
14
14
  * Complete validation still compares its recorded byte and membership
15
15
  * populations after this independent native absence predicate holds.
16
16
  *
17
- * @evidence contracts/common.md#principled-implementation Exact native ENOENT or ENOTDIR observations prove candidate absence, including native Unicode and short-name aliases. A vanished ancestor leaves descendants unreachable; replacement by a file rejects the grouped directory proof.
17
+ * A group also needs its directory to still be one, which a candidate's own
18
+ * stat cannot say: Windows answers ENOENT below a file just as below nothing.
19
+ * The admission's location verification has already read that of every watched
20
+ * directory, so a group under one reuses it instead of stating the directory a
21
+ * second time in the same delivery (samchon/ttsc#1735).
22
+ *
23
+ * @evidence contracts/common.md#principled-implementation Exact native ENOENT or ENOTDIR observations prove candidate absence, including native Unicode and short-name aliases. A vanished ancestor leaves descendants unreachable; replacement by a file rejects the grouped directory proof, whether this pass or the admission's location verification observed the directory.
18
24
  * @evidence contracts/common.md#clear-and-simple-design Missing-name validation has its own native absence boundary shared by narrow and complete proof; byte hashes and project membership remain separate predicates.
19
- * @evidence contracts/common.md#prohibited-implementation-shortcuts Listing inequality is not native name inequality; permission and transient failures are not fabricated absence. Only ENOENT and ENOTDIR qualify missing-path observations.
20
- * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain inability-to-prove rejection, unreadable-content ambiguity and both caller routes before tags.
21
- * @evidence contracts/portability.md#os-neutral-implementation The injected native stat resolves original candidate spelling, and its platform selects the same win32 or posix joining grammar as capture's ancestor probe. Case flags and JavaScript Unicode folding do not replace native alias resolution.
22
- * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources The pass borrows generation-owned groups and retains only each current native probe result; no directory listing, historical state or handle is acquired.
23
- * @evidence contracts/performance.md#efficient-algorithms Each group checks its directory once, then each candidate requires one native stat. Work follows candidate count and native path resolution, without enumerating unrelated directory entries; exact probes are necessary because listing names cannot establish all native aliases.
24
- * @evidence contracts/performance.md#reuse-equivalent-work Capture shares nearest-ancestor selection and raw candidate groups across consumers; each current absence proof must observe native candidates again unless the owning notification validator establishes unchanged inputs.
25
+ * @evidence contracts/common.md#prohibited-implementation-shortcuts Listing inequality is not native name inequality; permission and transient failures are not fabricated absence. Only ENOENT and ENOTDIR qualify missing-path observations, and only an identity read by the same synchronous admission stands for a directory stat.
26
+ * @evidence contracts/common.md#meaningful-documentation Separate native paragraphs explain inability-to-prove rejection, unreadable-content ambiguity, both caller routes and the shared directory reading before tags.
27
+ * @evidence contracts/portability.md#os-neutral-implementation The injected native stat resolves original candidate spelling, and its platform selects the same win32 or posix joining grammar as capture's ancestor probe. Case flags and JavaScript Unicode folding do not replace native alias resolution, and the directory check does not rely on ENOTDIR, which Windows does not report.
28
+ * @evidenceExclude contracts/performance.md#bound-retention-and-release-resources The pass borrows generation-owned groups and the admission's identities, and retains only each current native probe result; no directory listing, historical state or handle is acquired.
29
+ * @evidence contracts/performance.md#efficient-algorithms Each candidate requires one native stat, and each group one directory stat unless its admission already read the directory's identity. Work follows candidate count and native path resolution, without enumerating unrelated directory entries; exact probes are necessary because listing names cannot establish all native aliases.
30
+ * @evidence contracts/performance.md#reuse-equivalent-work Capture shares nearest-ancestor selection and raw candidate groups across consumers, and one synchronous admission shares its watched directories' identities; each current absence proof must observe native candidates again unless the owning notification validator establishes unchanged inputs.
25
31
  */
26
- function matchesUniversalHostInputProbes(cached, validation) {
32
+ function matchesUniversalHostInputProbes(cached, validation, proof) {
27
33
  const filesystem = resultFilesystem(cached.result);
28
34
  const paths = (filesystem.platform ?? process.platform) === "win32"
29
35
  ? path.win32
@@ -39,18 +45,21 @@ function matchesUniversalHostInputProbes(cached, validation) {
39
45
  }
40
46
  }
41
47
  for (const [directory, names] of validation.missing) {
42
- try {
43
- if (!filesystem.stat(directory).isDirectory())
44
- return false;
45
- }
46
- catch (error) {
47
- // Only a provably absent/non-directory ancestor keeps every descendant
48
- // unreachable. Permission and transient I/O failures cannot prove that
49
- // a candidate is still missing, while replacing the proving directory
50
- // with an exact file can itself redirect module resolution.
51
- if (!isMissingPathError(error))
52
- return false;
53
- continue;
48
+ // An identity the admission read proves the directory is one now.
49
+ if (proof?.locations?.get(directory) === undefined) {
50
+ try {
51
+ if (!filesystem.stat(directory).isDirectory())
52
+ return false;
53
+ }
54
+ catch (error) {
55
+ // Only a provably absent/non-directory ancestor keeps every descendant
56
+ // unreachable. Permission and transient I/O failures cannot prove that
57
+ // a candidate is still missing, while replacing the proving directory
58
+ // with an exact file can itself redirect module resolution.
59
+ if (!isMissingPathError(error))
60
+ return false;
61
+ continue;
62
+ }
54
63
  }
55
64
  for (const name of names) {
56
65
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"matchesUniversalHostInputProbes.mjs","sources":["../../../../src/core/transform/validation/matchesUniversalHostInputProbes.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAMA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACG,SAAU,+BAA+B,CAC7C,MAAkC,EAClC,UAAmC,EAAA;IAEnC,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;AAClD,IAAA,MAAM,KAAK,GACT,CAAC,UAAU,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,MAAM;UAC1C,IAAI,CAAC;AACP,UAAE,IAAI,CAAC,KAAK;IAChB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,aAAa,IAAI,EAAE,EAAE;AAClD,QAAA,IAAI;AACF,YAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,YAAA,OAAO,KAAK;QACd;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,gBAAA,OAAO,KAAK;QAC9C;IACF;IACA,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE;AACnD,QAAA,IAAI;YACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;AAAE,gBAAA,OAAO,KAAK;QAC7D;QAAE,OAAO,KAAK,EAAE;;;;;AAKd,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,gBAAA,OAAO,KAAK;YAC5C;QACF;AACA,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI;AACF,gBAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC5C,gBAAA,OAAO,KAAK;YACd;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,oBAAA,OAAO,KAAK;YAC9C;QACF;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAEA;AACA,SAAS,kBAAkB,CAAC,KAAc,EAAA;AACxC,IAAA,MAAM,IAAI,GAAI,KAA2C,EAAE,IAAI;AAC/D,IAAA,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;AAChD;;;;"}
1
+ {"version":3,"file":"matchesUniversalHostInputProbes.mjs","sources":["../../../../src/core/transform/validation/matchesUniversalHostInputProbes.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;SACa,+BAA+B,CAC7C,MAAkC,EAClC,UAAmC,EACnC,KAAuC,EAAA;IAEvC,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;AAClD,IAAA,MAAM,KAAK,GACT,CAAC,UAAU,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,MAAM;UAC1C,IAAI,CAAC;AACP,UAAE,IAAI,CAAC,KAAK;IAChB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,aAAa,IAAI,EAAE,EAAE;AAClD,QAAA,IAAI;AACF,YAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AACtB,YAAA,OAAO,KAAK;QACd;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,gBAAA,OAAO,KAAK;QAC9C;IACF;IACA,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE;;QAEnD,IAAI,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;AAClD,YAAA,IAAI;gBACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;AAAE,oBAAA,OAAO,KAAK;YAC7D;YAAE,OAAO,KAAK,EAAE;;;;;AAKd,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,oBAAA,OAAO,KAAK;gBAC5C;YACF;QACF;AACA,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI;AACF,gBAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC5C,gBAAA,OAAO,KAAK;YACd;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,oBAAA,OAAO,KAAK;YAC9C;QACF;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAEA;AACA,SAAS,kBAAkB,CAAC,KAAc,EAAA;AACxC,IAAA,MAAM,IAAI,GAAI,KAA2C,EAAE,IAAI;AAC/D,IAAA,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;AAChD;;;;"}
@@ -44,7 +44,7 @@ function matchesUniversalHostInputs(cached, validation, proof) {
44
44
  if (notificationsProveAll)
45
45
  return matchesUniversalHostInputTrees.matchesUniversalHostInputTrees(cached, validation, proof);
46
46
  return (matchesUniversalHostInputEntries.matchesUniversalHostInputEntries(cached, validation) &&
47
- matchesUniversalHostInputProbes.matchesUniversalHostInputProbes(cached, validation) &&
47
+ matchesUniversalHostInputProbes.matchesUniversalHostInputProbes(cached, validation, proof) &&
48
48
  matchesUniversalHostInputTrees.matchesUniversalHostInputTrees(cached, validation, proof));
49
49
  }
50
50
 
@@ -1 +1 @@
1
- {"version":3,"file":"matchesUniversalHostInputs.js","sources":["../../../../src/core/transform/validation/matchesUniversalHostInputs.ts"],"sourcesContent":[null],"names":["nativeInputPredicatesHold","trackerProvesInputUnchanged","matchesUniversalHostInputTrees","matchesUniversalHostInputEntries","matchesUniversalHostInputProbes"],"mappings":";;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;SACa,0BAA0B,CACxC,MAAkC,EAClC,UAAmC,EACnC,KAAuC,EAAA;AAEvC,IAAA,IAAI,CAACA,mDAAyB,CAAC,MAAM,EAAE,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;IAC3D,IAAI,qBAAqB,GAAG,IAAI;AAChC,IAAA,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE;QACtC,IAAI,CAACC,uDAA2B,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC,EAAE;YACxE,qBAAqB,GAAG,KAAK;YAC7B;QACF;IACF;AACA,IAAA,IAAI,qBAAqB;QACvB,OAAOC,6DAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;AAClE,IAAA,QACEC,iEAAgC,CAAC,MAAM,EAAE,UAAU,CAAC;AACpD,QAAAC,+DAA+B,CAAC,MAAM,EAAE,UAAU,CAAC;QACnDF,6DAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;AAE7D;;;;"}
1
+ {"version":3,"file":"matchesUniversalHostInputs.js","sources":["../../../../src/core/transform/validation/matchesUniversalHostInputs.ts"],"sourcesContent":[null],"names":["nativeInputPredicatesHold","trackerProvesInputUnchanged","matchesUniversalHostInputTrees","matchesUniversalHostInputEntries","matchesUniversalHostInputProbes"],"mappings":";;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;SACa,0BAA0B,CACxC,MAAkC,EAClC,UAAmC,EACnC,KAAuC,EAAA;AAEvC,IAAA,IAAI,CAACA,mDAAyB,CAAC,MAAM,EAAE,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;IAC3D,IAAI,qBAAqB,GAAG,IAAI;AAChC,IAAA,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE;QACtC,IAAI,CAACC,uDAA2B,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC,EAAE;YACxE,qBAAqB,GAAG,KAAK;YAC7B;QACF;IACF;AACA,IAAA,IAAI,qBAAqB;QACvB,OAAOC,6DAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;AAClE,IAAA,QACEC,iEAAgC,CAAC,MAAM,EAAE,UAAU,CAAC;AACpD,QAAAC,+DAA+B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;QAC1DF,6DAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;AAE7D;;;;"}
@@ -42,7 +42,7 @@ function matchesUniversalHostInputs(cached, validation, proof) {
42
42
  if (notificationsProveAll)
43
43
  return matchesUniversalHostInputTrees(cached, validation, proof);
44
44
  return (matchesUniversalHostInputEntries(cached, validation) &&
45
- matchesUniversalHostInputProbes(cached, validation) &&
45
+ matchesUniversalHostInputProbes(cached, validation, proof) &&
46
46
  matchesUniversalHostInputTrees(cached, validation, proof));
47
47
  }
48
48
 
@@ -1 +1 @@
1
- {"version":3,"file":"matchesUniversalHostInputs.mjs","sources":["../../../../src/core/transform/validation/matchesUniversalHostInputs.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;SACa,0BAA0B,CACxC,MAAkC,EAClC,UAAmC,EACnC,KAAuC,EAAA;AAEvC,IAAA,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;IAC3D,IAAI,qBAAqB,GAAG,IAAI;AAChC,IAAA,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE;QACtC,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC,EAAE;YACxE,qBAAqB,GAAG,KAAK;YAC7B;QACF;IACF;AACA,IAAA,IAAI,qBAAqB;QACvB,OAAO,8BAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;AAClE,IAAA,QACE,gCAAgC,CAAC,MAAM,EAAE,UAAU,CAAC;AACpD,QAAA,+BAA+B,CAAC,MAAM,EAAE,UAAU,CAAC;QACnD,8BAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;AAE7D;;;;"}
1
+ {"version":3,"file":"matchesUniversalHostInputs.mjs","sources":["../../../../src/core/transform/validation/matchesUniversalHostInputs.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;SACa,0BAA0B,CACxC,MAAkC,EAClC,UAAmC,EACnC,KAAuC,EAAA;AAEvC,IAAA,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;IAC3D,IAAI,qBAAqB,GAAG,IAAI;AAChC,IAAA,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE;QACtC,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC,EAAE;YACxE,qBAAqB,GAAG,KAAK;YAC7B;QACF;IACF;AACA,IAAA,IAAI,qBAAqB;QACvB,OAAO,8BAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;AAClE,IAAA,QACE,gCAAgC,CAAC,MAAM,EAAE,UAAU,CAAC;AACpD,QAAA,+BAA+B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;QAC1D,8BAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;AAE7D;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ttsc/unplugin",
3
- "version": "0.31.3",
3
+ "version": "0.31.5",
4
4
  "description": "Bundler adapters for ttsc plugins.",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/index.mjs",
@@ -202,7 +202,7 @@
202
202
  "fsevents": "^2.3.3"
203
203
  },
204
204
  "peerDependencies": {
205
- "ttsc": "^0.31.3"
205
+ "ttsc": "^0.31.5"
206
206
  },
207
207
  "devDependencies": {
208
208
  "@wrtnlabs/evidence": "^0.3.1",
@@ -217,7 +217,7 @@
217
217
  "tslib": "^2.8.1",
218
218
  "typescript": "^7.0.2",
219
219
  "vite": "^7.3.5",
220
- "ttsc": "0.31.3"
220
+ "ttsc": "0.31.5"
221
221
  },
222
222
  "repository": {
223
223
  "type": "git",
@@ -2,6 +2,7 @@ import crypto from "node:crypto";
2
2
  import fs from "node:fs";
3
3
  import path from "node:path";
4
4
 
5
+ import { isZombieProcess } from "../utils/isZombieProcess";
5
6
  import type { TtscSharedCompileClaim } from "./TtscSharedCompileClaim";
6
7
  import type { TtscSharedCompilePublication } from "./TtscSharedCompilePublication";
7
8
 
@@ -294,15 +295,16 @@ function owns(lock: string, token: string): boolean {
294
295
  }
295
296
 
296
297
  /**
297
- * Whether no process with this id exists on this machine, which the store's
298
- * locks and partial writes name their writer by. An id that is not a positive
299
- * integer names nothing this can tell, and counts as alive.
298
+ * Whether no process with this id runs on this machine, which the store's locks
299
+ * and partial writes name their writer by. An id that is not a positive integer
300
+ * names nothing this can tell, and counts as alive. An exited process its
301
+ * parent never collected is gone too.
300
302
  */
301
303
  function processGone(pid: number): boolean {
302
304
  if (!Number.isInteger(pid) || pid <= 0) return false;
303
305
  try {
304
306
  process.kill(pid, 0);
305
- return false;
307
+ return isZombieProcess(pid);
306
308
  } catch (error) {
307
309
  return (error as NodeJS.ErrnoException).code === "ESRCH";
308
310
  }
@@ -2,6 +2,7 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
 
4
4
  import { userStateDirectory } from "../filesystem/userStateDirectory";
5
+ import { isZombieProcess } from "../utils/isZombieProcess";
5
6
  import { TTSC_TRANSFORM_SESSION_ENV } from "./TTSC_TRANSFORM_SESSION_ENV";
6
7
  import { readTtscTransformSession } from "./readTtscTransformSession";
7
8
 
@@ -48,7 +49,7 @@ import { readTtscTransformSession } from "./readTtscTransformSession";
48
49
  * @evidence contracts/common.md#clear-and-simple-design New directory ownership stays in userStateDirectory, claiming in claimSharedCompile and adoption proof in generation capture; this operation declares the address and reclaims recognized legacy children.
49
50
  * @evidence contracts/common.md#prohibited-implementation-shortcuts Optional store failure leaves real local compilation in place, rather than reusing unproven output or suppressing compiler failure.
50
51
  * @evidence contracts/common.md#meaningful-documentation The prose explains worker inheritance, persistent versus obsolete process storage, and why sharing failures return undefined.
51
- * @evidence contracts/portability.md#os-neutral-implementation Native joins and user-state capability checks provide new storage; inherited addresses receive only current directory checks. process.kill(pid, 0) treats success and EPERM as live, other failures as not live; this classification is not a general proof of death under every process-probe failure.
52
+ * @evidence contracts/portability.md#os-neutral-implementation Native joins and user-state capability checks provide new storage; inherited addresses receive only current directory checks. process.kill(pid, 0) treats success and EPERM as live, other failures as not live, and a success naming a Linux zombie as not live; this classification is not a general proof of death under every process-probe failure.
52
53
  * @evidence contracts/performance.md#efficient-algorithms An inherited path performs native path/stat work and avoids the root scan. Cold opening materializes N child names, matches their text and probes recognized PIDs, with provider realpath/create/stat work and recursive deletion of selected subtrees. Cost depends on name bytes, removed descendants and native operations, not just N; persistent shared-store contents are not scanned here.
53
54
  * @evidence contracts/performance.md#reuse-equivalent-work Parent and worker processes retain the inherited store capability, while compile identity, state proof and publication reuse remain with the claim/adoption owners.
54
55
  * @evidence contracts/performance.md#bound-retention-and-release-resources Recognized clock and legacy children classified not live are recursively reclaimed. Inherited, live and unrecognized children bypass reclamation; a failed removal aborts opening, so no count or byte bound is enforced here. The environment retains the current address; claimSharedCompile owns best-effort publication pruning. Synchronous operations leave no open handle.
@@ -84,11 +85,14 @@ export function openTtscTransformSession(): string | undefined {
84
85
  /** The store's name below the per-user root, which names no process. */
85
86
  const SHARED_STORE = "shared";
86
87
 
87
- /** Whether a process with this id exists, as far as this process can tell. */
88
+ /**
89
+ * Whether a process with this id runs, as far as this process can tell. An
90
+ * exited process its parent never collected does not.
91
+ */
88
92
  function processAlive(pid: number): boolean {
89
93
  try {
90
94
  process.kill(pid, 0);
91
- return true;
95
+ return !isZombieProcess(pid);
92
96
  } catch (error) {
93
97
  // EPERM: it exists and belongs to another user.
94
98
  return (error as NodeJS.ErrnoException).code === "EPERM";