dsh-ptc-plus 0.3.1 → 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 (200) hide show
  1. package/README.en.md +66 -73
  2. package/README.md +66 -73
  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 +30610 -722
  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 +6 -4
  25. package/docs/adr/0007-separate-worker-transport-from-session-semantics.md +15 -3
  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 +9 -3
  31. package/docs/adr/0014-persist-cell-rewrite-policy.md +11 -5
  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 +8 -6
  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 +17 -3
  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 +82 -22
  48. package/docs/binding-review-placement-design.md +200 -0
  49. package/docs/capability-projection.md +1 -1
  50. package/docs/client-ui.md +96 -20
  51. package/docs/durability-design.md +61 -24
  52. package/docs/evaluation.md +78 -6
  53. package/docs/installation.md +41 -6
  54. package/docs/program-data-plane.md +6 -0
  55. package/docs/publishing.md +5 -3
  56. package/docs/runtime-reference.md +79 -25
  57. package/docs/semantic-validation.md +29 -0
  58. package/docs/stateful-binding-updates-proposal.md +755 -0
  59. package/docs/user-bindings.en.md +64 -0
  60. package/docs/user-bindings.md +64 -0
  61. package/docs/value-wire.md +3 -3
  62. package/docs/verification.md +57 -0
  63. package/index.js +374 -92
  64. package/internal/ast-traversal.js +5 -2
  65. package/internal/binding-descriptors.js +1 -0
  66. package/internal/binding-pattern-traversal.js +25 -0
  67. package/internal/binding-pattern.js +26 -29
  68. package/internal/binding-source-analysis.js +391 -0
  69. package/internal/binding-update-policy.js +66 -0
  70. package/internal/bounded-worker-round.js +56 -0
  71. package/internal/callable-definition-environment.js +42 -0
  72. package/internal/callable-source-catalog.js +129 -0
  73. package/internal/callable-source-encoding.js +47 -0
  74. package/internal/callable-source-facts.js +459 -0
  75. package/internal/callable-source-format.js +2 -0
  76. package/internal/callable-source-lowering.js +123 -0
  77. package/internal/cell-analysis-contract.js +25 -0
  78. package/internal/cell-analysis.js +252 -242
  79. package/internal/cell-completion.js +15 -0
  80. package/internal/cell-error.js +7 -0
  81. package/internal/cell-parser.js +66 -0
  82. package/internal/cell-rewriter.js +3 -553
  83. package/internal/commonjs-export-evidence.js +63 -0
  84. package/internal/commonjs-source-evidence.js +72 -0
  85. package/internal/compiler-amaro.cjs +2 -0
  86. package/internal/compiler-compression.js +12 -0
  87. package/internal/compiler-data.js +58 -0
  88. package/internal/compiler-descriptors.js +54 -0
  89. package/internal/compiler-dynamic-cache.js +48 -0
  90. package/internal/compiler-entry.js +35 -0
  91. package/internal/compiler-generated-names.js +17 -0
  92. package/internal/compiler-intrinsics.js +84 -0
  93. package/internal/compiler-module-links.js +34 -0
  94. package/internal/compiler-operations.js +61 -0
  95. package/internal/compiler-platform-factory.js +84 -0
  96. package/internal/compiler-platform.js +136 -0
  97. package/internal/compiler-record-roles.js +53 -0
  98. package/internal/compiler-region-output.js +259 -0
  99. package/internal/compiler-resource-lowering.js +103 -0
  100. package/internal/compiler-scope-facts.js +115 -0
  101. package/internal/compiler-service.js +109 -0
  102. package/internal/compiler-source-cache.js +32 -0
  103. package/internal/compiler-source-pieces.js +93 -0
  104. package/internal/compiler-source-regions.js +132 -0
  105. package/internal/compiler-storage-source.js +54 -0
  106. package/internal/compiler-text.js +15 -0
  107. package/internal/compiler-typescript.cjs +2 -0
  108. package/internal/config-spec.js +91 -25
  109. package/internal/cordis-tools-owner.js +130 -21
  110. package/internal/diagnostic.js +27 -1
  111. package/internal/direct-surface-owner.js +76 -23
  112. package/internal/dynamic-binding-evidence.js +16 -0
  113. package/internal/dynamic-environment-compiler.js +779 -0
  114. package/internal/dynamic-environment-integration.js +87 -0
  115. package/internal/dynamic-environment-runtime.js +362 -0
  116. package/internal/dynamic-native-calls.js +150 -0
  117. package/internal/dynamic-native-runtime.js +248 -0
  118. package/internal/dynamic-scope-analysis.js +90 -0
  119. package/internal/edit-transport-owner.js +28 -3
  120. package/internal/execution-seam-compat.js +193 -0
  121. package/internal/failure-reporting.js +118 -18
  122. package/internal/host-rpc.js +66 -0
  123. package/internal/isolated-worker.js +548 -0
  124. package/internal/kernel-child.js +139 -0
  125. package/internal/kernel-worker.js +911 -116
  126. package/internal/language-semantics.js +14 -0
  127. package/internal/legacy-binding-catalog.js +48 -0
  128. package/internal/legacy-cell-analysis.js +600 -0
  129. package/internal/legacy-cell-parser.js +50 -0
  130. package/internal/legacy-cell-rewriter.js +631 -0
  131. package/internal/legacy-repl-convenience.js +291 -0
  132. package/internal/managed-module-operations.js +170 -0
  133. package/internal/module-compilation.js +321 -0
  134. package/internal/module-runtime-platform.js +19 -0
  135. package/internal/module-transform-contract.js +12 -0
  136. package/internal/native-await-declarations.js +68 -0
  137. package/internal/native-root-compilation.js +54 -0
  138. package/internal/native-root-dynamic.js +67 -0
  139. package/internal/recovery-tips.js +27 -15
  140. package/internal/rejected-cell-editor.js +13 -8
  141. package/internal/repl-convenience.js +2 -201
  142. package/internal/repl-memory-projection.js +81 -12
  143. package/internal/repl-observation-interest.js +70 -0
  144. package/internal/repl-rewrite-contract.js +21 -0
  145. package/internal/repl-scope-normalizer.js +2091 -0
  146. package/internal/repl-value-observer.js +114 -0
  147. package/internal/rpc-contract.js +52 -0
  148. package/internal/runtime-bridge-owner.js +172 -28
  149. package/internal/runtime-config.js +48 -51
  150. package/internal/runtime-contexts.js +82 -10
  151. package/internal/runtime-messages.js +111 -0
  152. package/internal/session-cell-executor.js +455 -91
  153. package/internal/session-journal-recovery.js +684 -0
  154. package/internal/session-journal-schema.js +106 -0
  155. package/internal/session-journal.js +237 -440
  156. package/internal/session-log-view.js +42 -9
  157. package/internal/session-runtime.js +325 -80
  158. package/internal/session-state.js +249 -40
  159. package/internal/source-position-map.js +211 -71
  160. package/internal/stateful-module-compiler.js +154 -0
  161. package/internal/stateful-module-runtime.js +303 -0
  162. package/internal/stateful-root-compiler.js +598 -0
  163. package/internal/stateful-root-runtime.js +340 -0
  164. package/internal/typert-codec-compat.js +28 -0
  165. package/internal/typescript-transform.js +29 -0
  166. package/internal/user-binding-authoring.js +70 -0
  167. package/internal/user-binding-console-worker.js +184 -0
  168. package/internal/user-binding-console.js +148 -0
  169. package/internal/user-binding-draft-projection.js +335 -0
  170. package/internal/user-binding-model-context.js +31 -0
  171. package/internal/user-binding-runner.js +56 -0
  172. package/internal/user-bindings-owner.js +1065 -0
  173. package/internal/user-bindings-store.js +293 -0
  174. package/internal/user-bindings.js +353 -0
  175. package/internal/value-wire-schema.js +28 -0
  176. package/internal/value-wire.js +29 -20
  177. package/internal/worker-client.js +57 -67
  178. package/internal/worker-environment.js +45 -0
  179. package/internal/worker-output-relay.js +29 -0
  180. package/internal/worker-shutdown.js +14 -0
  181. package/package.json +81 -11
  182. package/src/client-activity.js +109 -45
  183. package/src/client-authoring-view.js +580 -0
  184. package/src/client-binding-review.js +230 -0
  185. package/src/client-bindings-data.js +29 -0
  186. package/src/client-catalog.js +127 -0
  187. package/src/client-code-editor.js +84 -0
  188. package/src/client-console.js +112 -0
  189. package/src/client-copy.js +370 -0
  190. package/src/client-feature-gates.js +62 -0
  191. package/src/client-host-compat.js +150 -0
  192. package/src/client-indicator-view.js +267 -0
  193. package/src/client-repl-view.js +292 -0
  194. package/src/client-rpc.js +20 -0
  195. package/src/client-settings-view.js +221 -0
  196. package/src/client-styles.js +106 -0
  197. package/src/client-tool-view.js +108 -0
  198. package/src/client-transport.js +159 -0
  199. package/src/client-workbench.js +521 -0
  200. package/src/client.js +233 -615
@@ -1,20 +1,50 @@
1
- const JOURNAL_VERSIONS = new Set([1, 2, 3])
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', 'bindingMode', 'rewritePolicy', 'status', 'calls', 'operations',
6
- 'confirms', 'diagnostics', 'completion', 'volatileReason',
7
- ])
8
- const LEGACY_JOURNAL_FIELDS = new Set([...JOURNAL_FIELDS].filter(key => key !== 'rewritePolicy'))
9
- const REWRITE_POLICY_FIELDS = new Set([
10
- 'autoRewriteImports', 'autoStripExports', 'autoSplitRedeclarations',
11
- ])
12
- const CALL_SUCCESS_FIELDS = new Set(['global', 'member', 'args', 'ok', 'value', 'settle'])
13
- const CALL_ERROR_FIELDS = new Set(['global', 'member', 'args', 'ok', 'error', 'settle'])
14
- const OPERATION_FIELDS = new Set(['action', 'name'])
15
- const RETURN_FIELDS = new Set(['kind', 'hasValue', 'value'])
16
- const THROW_FIELDS = new Set(['kind', 'error'])
17
- 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
+
18
48
  const DIAGNOSTIC_FIELDS = new Set([
19
49
  'code', 'severity', 'phase', 'message', 'stateEffect', 'dispatchState',
20
50
  'source', 'cause', 'help',
@@ -26,28 +56,21 @@ const SEVERITIES = new Set(['error', 'warning', 'note'])
26
56
  const PHASES = new Set(['parse', 'preflight', 'execute', 'tool-dispatch', 'replay', 'recover'])
27
57
  const STATE_EFFECTS = new Set(['unchanged', 'partially-applied', 'rolled-back', 'unknown'])
28
58
  const DISPATCH_STATES = new Set(['not-dispatched', 'dispatched', 'completed', 'unknown'])
29
- const REWRITE_FIELDS = new Set(['kind', 'description', 'source'])
30
- const REWRITE_KINDS = new Set(['import', 'redeclaration', 'export'])
31
59
  const REWRITE_POLICY_BY_KIND = Object.freeze({
32
60
  import: 'autoRewriteImports',
33
- redeclaration: 'autoSplitRedeclarations',
34
61
  export: 'autoStripExports',
35
62
  })
36
- const EDIT_TARGET_FIELDS = new Set(['targetCallSeq'])
37
- const DERIVED_RUN_FIELDS = new Set(['code', 'description'])
38
- const RECOVERY_BOUNDARY_FIELDS = new Set(['failedCallSeq', 'frontierCallSeq'])
39
- const VALUE_ENVELOPE_FIELDS = new Set(['codec', 'root', 'nodes'])
40
- const VALUE_OBJECT_FIELDS = new Set(['type', 'prototype', 'entries'])
41
- const VALUE_ARRAY_FIELDS = new Set(['type', 'length', 'entries'])
42
- const VALUE_UNDEFINED_FIELDS = new Set(['tag'])
43
- const VALUE_NUMBER_FIELDS = new Set(['tag', 'value'])
44
- const VALUE_BIGINT_FIELDS = new Set(['tag', 'value'])
45
- const VALUE_REFERENCE_FIELDS = new Set(['tag', 'index'])
46
- const MAX_VALUE_NODES = 100_000
47
- const MAX_VALUE_EDGES = 1_000_000
48
- const MAX_ARRAY_LENGTH = 1_000_000
49
- const MAX_BIGINT_DIGITS = 100_000
50
- const MAX_STRING_BYTES = 64 * 1024 * 1024
63
+ const MIXED_REDECLARATION = 'split a mixed top-level declaration while preserving native pattern initialization'
64
+ const FUNCTION_REDECLARATION = 'reassigned an existing top-level function declaration for REPL continuity'
65
+ const CLASS_REDECLARATION = 'reassigned an existing top-level class declaration for REPL continuity'
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
51
74
  const textEncoder = new TextEncoder()
52
75
 
53
76
  function isRecord(value) {
@@ -156,7 +179,7 @@ function isValidValueAtom(value, state) {
156
179
  }
157
180
 
158
181
  function isValidValueWire(value) {
159
- if (!hasExactOrderedFields(value, VALUE_ENVELOPE_FIELDS) || value.codec !== 'ptc-value-graph/v1'
182
+ if (!hasExactOrderedFields(value, VALUE_ENVELOPE_FIELDS) || value.codec !== VALUE_CODEC
160
183
  || !Array.isArray(value.nodes) || value.nodes.length > MAX_VALUE_NODES) return false
161
184
  const state = {
162
185
  nodeCount: value.nodes.length,
@@ -209,6 +232,18 @@ function isValidRewritePolicy(value) {
209
232
  && [...REWRITE_POLICY_FIELDS].every(key => typeof value[key] === 'boolean')
210
233
  }
211
234
 
235
+ function isValidBindingPolicy(value) {
236
+ return hasExactFields(value, BINDING_POLICY_FIELDS)
237
+ && [...BINDING_POLICY_FIELDS].every(key => typeof value[key] === 'boolean')
238
+ }
239
+
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)
243
+ && DEFAULT_EXPORT_BINDINGS.has(value.defaultExportBinding)
244
+ && (legacy || IMPORT_EXPRESSION_BOUNDARIES.has(value.importExpressionBoundary))
245
+ }
246
+
212
247
  function isValidCall(value) {
213
248
  if (!isRecord(value) || (value.ok !== true && value.ok !== false)) return false
214
249
  const fields = value.ok ? CALL_SUCCESS_FIELDS : CALL_ERROR_FIELDS
@@ -249,10 +284,37 @@ function isReadableJournalUnchecked(value) {
249
284
  if (!isRecord(value) || !JOURNAL_VERSIONS.has(value.version) || !JOURNAL_STATUSES.has(value.status)) {
250
285
  return false
251
286
  }
252
- const fields = value.version === 1 ? LEGACY_JOURNAL_FIELDS : JOURNAL_FIELDS
253
- const required = ['version', 'bindingMode', 'status', 'calls', 'operations', 'diagnostics']
254
- if (value.version !== 1) required.push('rewritePolicy')
255
- if (!hasClosedFields(value, fields, required) || !BINDING_MODES.has(value.bindingMode)
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
296
+ const required = predecessor
297
+ ? ['version', 'bindingMode', 'status', 'calls', 'operations', 'diagnostics']
298
+ : ['version', 'bindingPolicy', 'rewritePolicy', 'moduleSemantics', 'status', 'calls', 'operations', 'diagnostics']
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
+ }
310
+ if (!hasClosedFields(value, fields, required)
311
+ || (predecessor && !BINDING_MODES.has(value.bindingMode))
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)))
256
318
  || (value.version !== 1 && !isValidRewritePolicy(value.rewritePolicy))
257
319
  || !Array.isArray(value.calls) || !value.calls.every(isValidCall)
258
320
  || !Array.isArray(value.operations) || !value.operations.every(isValidOperation)
@@ -278,9 +340,7 @@ function isReadableJournal(value) {
278
340
  }
279
341
  }
280
342
 
281
- // Keep the presentation fold closed over the journal contract. This guard is
282
- // intentionally separate from the schema reader so future counters cannot
283
- // accidentally treat an unknown status or partial arrays as activity.
343
+ // Unknown statuses and incomplete journal arrays cannot establish feature evidence.
284
344
  function isCountableJournal(value) {
285
345
  return isReadableJournal(value)
286
346
  && JOURNAL_STATUSES.has(value.status)
@@ -295,7 +355,12 @@ function isValidRewrites(value, journal) {
295
355
  && Array.isArray(value) && value.every(rewrite => (
296
356
  hasClosedFields(rewrite, REWRITE_FIELDS, ['kind', 'description'])
297
357
  && REWRITE_KINDS.has(rewrite.kind)
298
- && journal.rewritePolicy[REWRITE_POLICY_BY_KIND[rewrite.kind]] === true
358
+ && (rewrite.kind === 'redeclaration'
359
+ ? (rewrite.description === FUNCTION_REDECLARATION || rewrite.description === CLASS_REDECLARATION)
360
+ ? journal.version >= 4 && isValidBindingPolicy(journal.bindingPolicy)
361
+ && journal.bindingPolicy.functionClassRedeclarations === true
362
+ : journal.rewritePolicy.autoSplitRedeclarations === true
363
+ : journal.rewritePolicy[REWRITE_POLICY_BY_KIND[rewrite.kind]] === true)
299
364
  && typeof rewrite.description === 'string' && rewrite.description.length > 0
300
365
  && (rewrite.source === undefined || typeof rewrite.source === 'string')
301
366
  ))
@@ -377,7 +442,6 @@ function resultText(block) {
377
442
  }
378
443
  }
379
444
 
380
- const MIXED_REDECLARATION = 'split a mixed top-level declaration while preserving native pattern initialization'
381
445
  const GENERATED_RUN_CODE_DESCRIPTION_KEY = 'dshPtcPlusRunCodeDescription'
382
446
 
383
447
  function rewriteFeature(rewrites, predicate, key) {