dsh-ptc-plus 0.3.2 → 0.4.1

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 (199) hide show
  1. package/README.en.md +65 -78
  2. package/README.md +65 -78
  3. package/assets/ptc-plus-bindings-en.png +0 -0
  4. package/assets/ptc-plus-bindings-zh.png +0 -0
  5. package/assets/ptc-plus-repair-en.png +0 -0
  6. package/assets/ptc-plus-repair-zh.png +0 -0
  7. package/assets/ptc-plus-repl-workspace-en.png +0 -0
  8. package/assets/ptc-plus-repl-workspace-zh.png +0 -0
  9. package/assets/ptc-plus-settings-en.png +0 -0
  10. package/assets/ptc-plus-settings-zh.png +0 -0
  11. package/client.js +30596 -742
  12. package/compiler-amaro.cjs +5 -0
  13. package/compiler-amaro.cjs.map +6 -0
  14. package/compiler-asset-124f80c1bba92ff5fe79cfec6e8ad518f476de4a42514cae3919538887f510e8.txt +1 -0
  15. package/compiler-assets.json +3 -0
  16. package/compiler-core.cjs +554 -0
  17. package/compiler-core.cjs.map +6 -0
  18. package/compiler-platform.cjs +2 -0
  19. package/compiler-platform.cjs.map +6 -0
  20. package/compiler-typescript.cjs +388 -0
  21. package/compiler-typescript.cjs.map +6 -0
  22. package/docs/README.md +6 -0
  23. package/docs/adr/0004-declare-program-bindings-at-the-host.md +1 -1
  24. package/docs/adr/0006-rewrite-module-syntax-with-an-ast.md +5 -3
  25. package/docs/adr/0007-separate-worker-transport-from-session-semantics.md +1 -1
  26. package/docs/adr/0009-bound-expensive-acceptance-default.md +2 -0
  27. package/docs/adr/0010-session-log-derived-recovery-tips.md +59 -5
  28. package/docs/adr/0011-isolate-the-local-recovery-tip-provider.md +1 -1
  29. package/docs/adr/0012-preserve-mixed-destructuring-initialization.md +3 -1
  30. package/docs/adr/0013-isolate-repl-redeclaration-convenience.md +3 -1
  31. package/docs/adr/0014-persist-cell-rewrite-policy.md +6 -2
  32. package/docs/adr/0015-preserve-source-positions-through-rewrites.md +1 -1
  33. package/docs/adr/0016-archive-resolved-review-findings.md +1 -1
  34. package/docs/adr/0017-track-the-latest-dsh-public-surface.md +49 -0
  35. package/docs/adr/0018-use-versioned-fixture-for-ab-benchmark.md +3 -3
  36. package/docs/adr/0019-plugin-settings-and-kill-switch.md +5 -3
  37. package/docs/adr/0020-optional-cordis-tools-in-ptc-mode.md +2 -2
  38. package/docs/adr/0021-separate-host-bootstrap-from-session-runtime.md +12 -0
  39. package/docs/adr/0023-global-user-bindings.md +104 -0
  40. package/docs/adr/0024-repl-console-observation.md +33 -0
  41. package/docs/adr/0025-use-versioned-logical-binding-identities.md +119 -0
  42. package/docs/adr/0026-persist-the-delivery-verdict-against-the-verified-candidate.md +21 -0
  43. package/docs/adr/0027-run-the-session-kernel-in-a-killable-helper-process.md +37 -0
  44. package/docs/adr/0028-attach-to-the-host-ptc-execution-seam.md +103 -0
  45. package/docs/adr/0029-keep-plugin-unavailability-out-of-the-host-agent-lifecycle.md +27 -0
  46. package/docs/adr/0030-serve-both-typert-codec-generations-from-one-codec.md +27 -0
  47. package/docs/architecture.md +73 -21
  48. package/docs/binding-review-placement-design.md +200 -0
  49. package/docs/capability-projection.md +1 -1
  50. package/docs/client-ui.md +95 -19
  51. package/docs/durability-design.md +25 -10
  52. package/docs/evaluation.md +78 -6
  53. package/docs/installation.md +41 -6
  54. package/docs/publishing.md +5 -3
  55. package/docs/runtime-reference.md +72 -25
  56. package/docs/semantic-validation.md +29 -0
  57. package/docs/stateful-binding-updates-proposal.md +755 -0
  58. package/docs/user-bindings.en.md +64 -0
  59. package/docs/user-bindings.md +64 -0
  60. package/docs/value-wire.md +3 -3
  61. package/docs/verification.md +57 -0
  62. package/index.js +369 -92
  63. package/internal/ast-traversal.js +5 -2
  64. package/internal/binding-descriptors.js +1 -0
  65. package/internal/binding-pattern-traversal.js +25 -0
  66. package/internal/binding-pattern.js +26 -29
  67. package/internal/binding-source-analysis.js +391 -0
  68. package/internal/binding-update-policy.js +66 -0
  69. package/internal/bounded-worker-round.js +56 -0
  70. package/internal/callable-definition-environment.js +42 -0
  71. package/internal/callable-source-catalog.js +129 -0
  72. package/internal/callable-source-encoding.js +47 -0
  73. package/internal/callable-source-facts.js +459 -0
  74. package/internal/callable-source-format.js +2 -0
  75. package/internal/callable-source-lowering.js +123 -0
  76. package/internal/cell-analysis-contract.js +25 -0
  77. package/internal/cell-analysis.js +240 -290
  78. package/internal/cell-completion.js +15 -0
  79. package/internal/cell-error.js +7 -0
  80. package/internal/cell-parser.js +66 -0
  81. package/internal/cell-rewriter.js +3 -677
  82. package/internal/commonjs-export-evidence.js +63 -0
  83. package/internal/commonjs-source-evidence.js +72 -0
  84. package/internal/compiler-amaro.cjs +2 -0
  85. package/internal/compiler-compression.js +12 -0
  86. package/internal/compiler-data.js +58 -0
  87. package/internal/compiler-descriptors.js +54 -0
  88. package/internal/compiler-dynamic-cache.js +48 -0
  89. package/internal/compiler-entry.js +35 -0
  90. package/internal/compiler-generated-names.js +17 -0
  91. package/internal/compiler-intrinsics.js +84 -0
  92. package/internal/compiler-module-links.js +34 -0
  93. package/internal/compiler-operations.js +61 -0
  94. package/internal/compiler-platform-factory.js +84 -0
  95. package/internal/compiler-platform.js +136 -0
  96. package/internal/compiler-record-roles.js +53 -0
  97. package/internal/compiler-region-output.js +259 -0
  98. package/internal/compiler-resource-lowering.js +103 -0
  99. package/internal/compiler-scope-facts.js +115 -0
  100. package/internal/compiler-service.js +109 -0
  101. package/internal/compiler-source-cache.js +32 -0
  102. package/internal/compiler-source-pieces.js +93 -0
  103. package/internal/compiler-source-regions.js +132 -0
  104. package/internal/compiler-storage-source.js +54 -0
  105. package/internal/compiler-text.js +15 -0
  106. package/internal/compiler-typescript.cjs +2 -0
  107. package/internal/config-spec.js +83 -27
  108. package/internal/cordis-tools-owner.js +130 -21
  109. package/internal/diagnostic.js +27 -1
  110. package/internal/direct-surface-owner.js +76 -23
  111. package/internal/dynamic-binding-evidence.js +16 -0
  112. package/internal/dynamic-environment-compiler.js +779 -0
  113. package/internal/dynamic-environment-integration.js +87 -0
  114. package/internal/dynamic-environment-runtime.js +362 -0
  115. package/internal/dynamic-native-calls.js +150 -0
  116. package/internal/dynamic-native-runtime.js +248 -0
  117. package/internal/dynamic-scope-analysis.js +90 -0
  118. package/internal/edit-transport-owner.js +27 -2
  119. package/internal/execution-seam-compat.js +193 -0
  120. package/internal/failure-reporting.js +118 -18
  121. package/internal/host-rpc.js +66 -0
  122. package/internal/isolated-worker.js +548 -0
  123. package/internal/kernel-child.js +139 -0
  124. package/internal/kernel-worker.js +904 -120
  125. package/internal/language-semantics.js +14 -0
  126. package/internal/legacy-binding-catalog.js +48 -0
  127. package/internal/legacy-cell-analysis.js +600 -0
  128. package/internal/legacy-cell-parser.js +50 -0
  129. package/internal/legacy-cell-rewriter.js +631 -0
  130. package/internal/legacy-repl-convenience.js +291 -0
  131. package/internal/managed-module-operations.js +170 -0
  132. package/internal/module-compilation.js +321 -0
  133. package/internal/module-runtime-platform.js +19 -0
  134. package/internal/module-transform-contract.js +12 -0
  135. package/internal/native-await-declarations.js +68 -0
  136. package/internal/native-root-compilation.js +54 -0
  137. package/internal/native-root-dynamic.js +67 -0
  138. package/internal/recovery-tips.js +27 -15
  139. package/internal/rejected-cell-editor.js +13 -8
  140. package/internal/repl-convenience.js +2 -289
  141. package/internal/repl-memory-projection.js +81 -12
  142. package/internal/repl-observation-interest.js +70 -0
  143. package/internal/repl-rewrite-contract.js +6 -0
  144. package/internal/repl-scope-normalizer.js +2091 -0
  145. package/internal/repl-value-observer.js +114 -0
  146. package/internal/rpc-contract.js +52 -0
  147. package/internal/runtime-bridge-owner.js +172 -28
  148. package/internal/runtime-config.js +48 -52
  149. package/internal/runtime-contexts.js +82 -10
  150. package/internal/runtime-messages.js +111 -0
  151. package/internal/session-cell-executor.js +401 -87
  152. package/internal/session-journal-recovery.js +684 -0
  153. package/internal/session-journal-schema.js +106 -0
  154. package/internal/session-journal.js +184 -654
  155. package/internal/session-log-view.js +42 -9
  156. package/internal/session-runtime.js +256 -95
  157. package/internal/session-state.js +247 -71
  158. package/internal/source-position-map.js +211 -71
  159. package/internal/stateful-module-compiler.js +154 -0
  160. package/internal/stateful-module-runtime.js +303 -0
  161. package/internal/stateful-root-compiler.js +598 -0
  162. package/internal/stateful-root-runtime.js +340 -0
  163. package/internal/typert-codec-compat.js +28 -0
  164. package/internal/typescript-transform.js +29 -0
  165. package/internal/user-binding-authoring.js +70 -0
  166. package/internal/user-binding-console-worker.js +184 -0
  167. package/internal/user-binding-console.js +148 -0
  168. package/internal/user-binding-draft-projection.js +335 -0
  169. package/internal/user-binding-model-context.js +31 -0
  170. package/internal/user-binding-runner.js +56 -0
  171. package/internal/user-bindings-owner.js +1065 -0
  172. package/internal/user-bindings-store.js +293 -0
  173. package/internal/user-bindings.js +353 -0
  174. package/internal/value-wire-schema.js +28 -0
  175. package/internal/value-wire.js +29 -20
  176. package/internal/worker-client.js +57 -67
  177. package/internal/worker-environment.js +45 -0
  178. package/internal/worker-output-relay.js +29 -0
  179. package/internal/worker-shutdown.js +14 -0
  180. package/package.json +75 -7
  181. package/src/client-activity.js +88 -53
  182. package/src/client-authoring-view.js +580 -0
  183. package/src/client-binding-review.js +230 -0
  184. package/src/client-bindings-data.js +29 -0
  185. package/src/client-catalog.js +127 -0
  186. package/src/client-code-editor.js +84 -0
  187. package/src/client-console.js +112 -0
  188. package/src/client-copy.js +370 -0
  189. package/src/client-feature-gates.js +62 -0
  190. package/src/client-host-compat.js +150 -0
  191. package/src/client-indicator-view.js +267 -0
  192. package/src/client-repl-view.js +292 -0
  193. package/src/client-rpc.js +20 -0
  194. package/src/client-settings-view.js +221 -0
  195. package/src/client-styles.js +106 -0
  196. package/src/client-tool-view.js +108 -0
  197. package/src/client-transport.js +159 -0
  198. package/src/client-workbench.js +521 -0
  199. package/src/client.js +233 -615
@@ -1,27 +1,50 @@
1
- const JOURNAL_VERSIONS = new Set([1, 2, 3, 4])
2
- const JOURNAL_STATUSES = new Set(['durable', 'volatile', 'discarded', 'noop'])
3
- const BINDING_MODES = new Set(['loose', 'strict'])
4
- const JOURNAL_FIELDS = new Set([
5
- 'version', 'bindingPolicy', 'rewritePolicy', 'moduleSemantics', 'status', 'calls', 'operations',
6
- 'confirms', 'diagnostics', 'completion', 'volatileReason',
7
- ])
8
- const PREDECESSOR_JOURNAL_FIELDS = new Set([
9
- 'version', 'bindingMode', 'rewritePolicy', 'status', 'calls', 'operations',
10
- 'confirms', 'diagnostics', 'completion', 'volatileReason',
11
- ])
12
- const LEGACY_JOURNAL_FIELDS = new Set([...PREDECESSOR_JOURNAL_FIELDS].filter(key => key !== 'rewritePolicy'))
13
- const BINDING_POLICY_FIELDS = new Set(['variableRedeclarations', 'functionClassRedeclarations'])
14
- const REWRITE_POLICY_FIELDS = new Set([
15
- 'autoRewriteImports', 'autoStripExports', 'autoSplitRedeclarations',
16
- ])
17
- const MODULE_SEMANTICS_FIELDS = new Set(['defaultExportBinding'])
18
- const DEFAULT_EXPORT_BINDINGS = new Set(['legacy-variable', 'live-readonly'])
19
- const CALL_SUCCESS_FIELDS = new Set(['global', 'member', 'args', 'ok', 'value', 'settle'])
20
- const CALL_ERROR_FIELDS = new Set(['global', 'member', 'args', 'ok', 'error', 'settle'])
21
- const OPERATION_FIELDS = new Set(['action', 'name'])
22
- const RETURN_FIELDS = new Set(['kind', 'hasValue', 'value'])
23
- const THROW_FIELDS = new Set(['kind', 'error'])
24
- const ERROR_FIELDS = new Set(['kind', 'message'])
1
+ import {
2
+ JOURNAL_VERSIONS,
3
+ STATUSES as JOURNAL_STATUSES,
4
+ BINDING_MODES,
5
+ JOURNAL_FIELDS,
6
+ PER_NAME_JOURNAL_FIELDS,
7
+ LANGUAGE_SEMANTICS_JOURNAL_VERSION,
8
+ WHOLE_ENTRY_JOURNAL_FIELDS,
9
+ PER_NAME_USER_BINDINGS_JOURNAL_VERSION,
10
+ normalizeJournalUserBindingNames,
11
+ FINGERPRINT_REUSE_JOURNAL_FIELDS,
12
+ RELATIONLESS_JOURNAL_FIELDS,
13
+ PREDECESSOR_JOURNAL_FIELDS,
14
+ LEGACY_JOURNAL_FIELDS,
15
+ BINDING_POLICY_FIELDS,
16
+ REWRITE_POLICY_FIELDS,
17
+ MODULE_SEMANTICS_FIELDS,
18
+ LEGACY_MODULE_SEMANTICS_FIELDS,
19
+ VERSIONED_BINDING_REUSE_JOURNAL_VERSION,
20
+ IMPORT_EXPRESSION_BOUNDARIES,
21
+ DEFAULT_EXPORT_BINDINGS,
22
+ CALL_SUCCESS_FIELDS,
23
+ CALL_ERROR_FIELDS,
24
+ OPERATION_FIELDS,
25
+ RETURN_FIELDS,
26
+ THROW_FIELDS,
27
+ ERROR_FIELDS,
28
+ EDIT_TARGET_FIELDS,
29
+ DERIVED_RUN_FIELDS,
30
+ RECOVERY_BOUNDARY_FIELDS,
31
+ REWRITE_FIELDS,
32
+ REWRITE_KINDS,
33
+ USER_BINDINGS_REUSE_POLICIES,
34
+ } from '../internal/session-journal-schema.js'
35
+ import { normalizeLanguageSemantics } from '../internal/language-semantics.js'
36
+ import {
37
+ VALUE_CODEC,
38
+ DEFAULT_VALUE_LIMITS,
39
+ VALUE_ENVELOPE_FIELDS,
40
+ VALUE_OBJECT_FIELDS,
41
+ VALUE_ARRAY_FIELDS,
42
+ VALUE_UNDEFINED_FIELDS,
43
+ VALUE_NUMBER_FIELDS,
44
+ VALUE_BIGINT_FIELDS,
45
+ VALUE_REFERENCE_FIELDS,
46
+ } from '../internal/value-wire-schema.js'
47
+
25
48
  const DIAGNOSTIC_FIELDS = new Set([
26
49
  'code', 'severity', 'phase', 'message', 'stateEffect', 'dispatchState',
27
50
  'source', 'cause', 'help',
@@ -33,8 +56,6 @@ const SEVERITIES = new Set(['error', 'warning', 'note'])
33
56
  const PHASES = new Set(['parse', 'preflight', 'execute', 'tool-dispatch', 'replay', 'recover'])
34
57
  const STATE_EFFECTS = new Set(['unchanged', 'partially-applied', 'rolled-back', 'unknown'])
35
58
  const DISPATCH_STATES = new Set(['not-dispatched', 'dispatched', 'completed', 'unknown'])
36
- const REWRITE_FIELDS = new Set(['kind', 'description', 'source'])
37
- const REWRITE_KINDS = new Set(['import', 'redeclaration', 'export'])
38
59
  const REWRITE_POLICY_BY_KIND = Object.freeze({
39
60
  import: 'autoRewriteImports',
40
61
  export: 'autoStripExports',
@@ -42,21 +63,14 @@ const REWRITE_POLICY_BY_KIND = Object.freeze({
42
63
  const MIXED_REDECLARATION = 'split a mixed top-level declaration while preserving native pattern initialization'
43
64
  const FUNCTION_REDECLARATION = 'reassigned an existing top-level function declaration for REPL continuity'
44
65
  const CLASS_REDECLARATION = 'reassigned an existing top-level class declaration for REPL continuity'
45
- const EDIT_TARGET_FIELDS = new Set(['targetCallSeq'])
46
- const DERIVED_RUN_FIELDS = new Set(['code', 'description'])
47
- const RECOVERY_BOUNDARY_FIELDS = new Set(['failedCallSeq', 'frontierCallSeq'])
48
- const VALUE_ENVELOPE_FIELDS = new Set(['codec', 'root', 'nodes'])
49
- const VALUE_OBJECT_FIELDS = new Set(['type', 'prototype', 'entries'])
50
- const VALUE_ARRAY_FIELDS = new Set(['type', 'length', 'entries'])
51
- const VALUE_UNDEFINED_FIELDS = new Set(['tag'])
52
- const VALUE_NUMBER_FIELDS = new Set(['tag', 'value'])
53
- const VALUE_BIGINT_FIELDS = new Set(['tag', 'value'])
54
- const VALUE_REFERENCE_FIELDS = new Set(['tag', 'index'])
55
- const MAX_VALUE_NODES = 100_000
56
- const MAX_VALUE_EDGES = 1_000_000
57
- const MAX_ARRAY_LENGTH = 1_000_000
58
- const MAX_BIGINT_DIGITS = 100_000
59
- const MAX_STRING_BYTES = 64 * 1024 * 1024
66
+ // Presentation validation stays bounded independently of configured runtime budgets.
67
+ const {
68
+ maxNodes: MAX_VALUE_NODES,
69
+ maxEdges: MAX_VALUE_EDGES,
70
+ maxArrayLength: MAX_ARRAY_LENGTH,
71
+ maxBigIntDigits: MAX_BIGINT_DIGITS,
72
+ maxStringBytes: MAX_STRING_BYTES,
73
+ } = DEFAULT_VALUE_LIMITS
60
74
  const textEncoder = new TextEncoder()
61
75
 
62
76
  function isRecord(value) {
@@ -165,7 +179,7 @@ function isValidValueAtom(value, state) {
165
179
  }
166
180
 
167
181
  function isValidValueWire(value) {
168
- if (!hasExactOrderedFields(value, VALUE_ENVELOPE_FIELDS) || value.codec !== 'ptc-value-graph/v1'
182
+ if (!hasExactOrderedFields(value, VALUE_ENVELOPE_FIELDS) || value.codec !== VALUE_CODEC
169
183
  || !Array.isArray(value.nodes) || value.nodes.length > MAX_VALUE_NODES) return false
170
184
  const state = {
171
185
  nodeCount: value.nodes.length,
@@ -223,9 +237,11 @@ function isValidBindingPolicy(value) {
223
237
  && [...BINDING_POLICY_FIELDS].every(key => typeof value[key] === 'boolean')
224
238
  }
225
239
 
226
- function isValidModuleSemantics(value) {
227
- return hasExactFields(value, MODULE_SEMANTICS_FIELDS)
240
+ function isValidModuleSemantics(value, version) {
241
+ const legacy = version <= VERSIONED_BINDING_REUSE_JOURNAL_VERSION
242
+ return hasExactFields(value, legacy ? LEGACY_MODULE_SEMANTICS_FIELDS : MODULE_SEMANTICS_FIELDS)
228
243
  && DEFAULT_EXPORT_BINDINGS.has(value.defaultExportBinding)
244
+ && (legacy || IMPORT_EXPRESSION_BOUNDARIES.has(value.importExpressionBoundary))
229
245
  }
230
246
 
231
247
  function isValidCall(value) {
@@ -268,16 +284,37 @@ function isReadableJournalUnchecked(value) {
268
284
  if (!isRecord(value) || !JOURNAL_VERSIONS.has(value.version) || !JOURNAL_STATUSES.has(value.status)) {
269
285
  return false
270
286
  }
271
- const predecessor = value.version !== 4
272
- const fields = value.version === 1 ? LEGACY_JOURNAL_FIELDS : predecessor ? PREDECESSOR_JOURNAL_FIELDS : JOURNAL_FIELDS
287
+ const predecessor = value.version < 4
288
+ const fields = value.version === 1
289
+ ? LEGACY_JOURNAL_FIELDS
290
+ : predecessor
291
+ ? PREDECESSOR_JOURNAL_FIELDS
292
+ : value.version === 4 ? RELATIONLESS_JOURNAL_FIELDS
293
+ : value.version === 5 ? FINGERPRINT_REUSE_JOURNAL_FIELDS
294
+ : value.version < PER_NAME_USER_BINDINGS_JOURNAL_VERSION ? WHOLE_ENTRY_JOURNAL_FIELDS
295
+ : value.version < LANGUAGE_SEMANTICS_JOURNAL_VERSION ? PER_NAME_JOURNAL_FIELDS : JOURNAL_FIELDS
273
296
  const required = predecessor
274
297
  ? ['version', 'bindingMode', 'status', 'calls', 'operations', 'diagnostics']
275
298
  : ['version', 'bindingPolicy', 'rewritePolicy', 'moduleSemantics', 'status', 'calls', 'operations', 'diagnostics']
276
- if (value.version !== 1 && value.version !== 4) required.push('rewritePolicy')
299
+ if (value.version !== 1 && value.version < 4) required.push('rewritePolicy')
300
+ if (value.version >= 5) required.push('userBindingsFingerprint')
301
+ if (value.version >= VERSIONED_BINDING_REUSE_JOURNAL_VERSION) required.push('userBindingsReusePolicy')
302
+ if (value.version >= PER_NAME_USER_BINDINGS_JOURNAL_VERSION) {
303
+ required.push('userBindingsShadowPolicy', 'userBindingNames')
304
+ normalizeJournalUserBindingNames(value)
305
+ }
306
+ if (value.version >= LANGUAGE_SEMANTICS_JOURNAL_VERSION) {
307
+ required.push('languageSemantics')
308
+ normalizeLanguageSemantics(value.languageSemantics)
309
+ }
277
310
  if (!hasClosedFields(value, fields, required)
278
311
  || (predecessor && !BINDING_MODES.has(value.bindingMode))
279
- || (value.version === 4 && !isValidBindingPolicy(value.bindingPolicy))
280
- || (value.version === 4 && !isValidModuleSemantics(value.moduleSemantics))
312
+ || (value.version >= 4 && !isValidBindingPolicy(value.bindingPolicy))
313
+ || (value.version >= 4 && !isValidModuleSemantics(value.moduleSemantics, value.version))
314
+ || (value.version >= VERSIONED_BINDING_REUSE_JOURNAL_VERSION && !USER_BINDINGS_REUSE_POLICIES.has(value.userBindingsReusePolicy))
315
+ || (value.version >= 5 && value.userBindingsFingerprint !== null
316
+ && (typeof value.userBindingsFingerprint !== 'string'
317
+ || !/^[a-f0-9]{64}$/.test(value.userBindingsFingerprint)))
281
318
  || (value.version !== 1 && !isValidRewritePolicy(value.rewritePolicy))
282
319
  || !Array.isArray(value.calls) || !value.calls.every(isValidCall)
283
320
  || !Array.isArray(value.operations) || !value.operations.every(isValidOperation)
@@ -303,9 +340,7 @@ function isReadableJournal(value) {
303
340
  }
304
341
  }
305
342
 
306
- // Keep the presentation fold closed over the journal contract. This guard is
307
- // intentionally separate from the schema reader so future counters cannot
308
- // accidentally treat an unknown status or partial arrays as activity.
343
+ // Unknown statuses and incomplete journal arrays cannot establish feature evidence.
309
344
  function isCountableJournal(value) {
310
345
  return isReadableJournal(value)
311
346
  && JOURNAL_STATUSES.has(value.status)
@@ -322,7 +357,7 @@ function isValidRewrites(value, journal) {
322
357
  && REWRITE_KINDS.has(rewrite.kind)
323
358
  && (rewrite.kind === 'redeclaration'
324
359
  ? (rewrite.description === FUNCTION_REDECLARATION || rewrite.description === CLASS_REDECLARATION)
325
- ? journal.version === 4 && isValidBindingPolicy(journal.bindingPolicy)
360
+ ? journal.version >= 4 && isValidBindingPolicy(journal.bindingPolicy)
326
361
  && journal.bindingPolicy.functionClassRedeclarations === true
327
362
  : journal.rewritePolicy.autoSplitRedeclarations === true
328
363
  : journal.rewritePolicy[REWRITE_POLICY_BY_KIND[rewrite.kind]] === true)