@quolu/lattice 0.52.3 → 0.52.4

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 (134) hide show
  1. package/package.json +1 -1
  2. package/src/artifact-contracts-v2.mjs +325 -325
  3. package/src/artifact-contracts.mjs +895 -895
  4. package/src/boundary-compiler.mjs +712 -712
  5. package/src/boundary-observation-compiler-v2.mjs +344 -344
  6. package/src/bounded-seam.mjs +230 -230
  7. package/src/bridge-address.mjs +107 -107
  8. package/src/bridge-cli.mjs +297 -297
  9. package/src/bridge-config.mjs +346 -346
  10. package/src/bridge-daemon.mjs +378 -378
  11. package/src/bridge-hub-protocol.mjs +198 -0
  12. package/src/bridge-launch-agent.mjs +323 -323
  13. package/src/bridge-registrar.mjs +102 -102
  14. package/src/bridge-server.mjs +376 -376
  15. package/src/cli-help.mjs +308 -308
  16. package/src/cli-stdio.mjs +40 -40
  17. package/src/control-compiler.mjs +532 -532
  18. package/src/dag-chain.mjs +261 -261
  19. package/src/factory-diagnostics.mjs +188 -188
  20. package/src/git-process.mjs +72 -0
  21. package/src/hash-chain.mjs +76 -76
  22. package/src/hooks-cli.mjs +1057 -1057
  23. package/src/isolation-runner.mjs +409 -409
  24. package/src/node-version-guard.mjs +44 -44
  25. package/src/project-cli.mjs +3 -3
  26. package/src/project-identity.mjs +130 -130
  27. package/src/rc1-black-box-oracle.mjs +906 -906
  28. package/src/rc1-comparison.mjs +154 -154
  29. package/src/rc1-evidence-bundle.mjs +456 -456
  30. package/src/rc1-v4-campaign.mjs +708 -708
  31. package/src/rc1-v4-transform.mjs +467 -467
  32. package/src/rc1-v5-artifact-set.mjs +855 -855
  33. package/src/rc1-v5-behavior-evidence.mjs +594 -594
  34. package/src/rc1-v5-campaign.mjs +797 -797
  35. package/src/rc1-v5-transform.mjs +421 -421
  36. package/src/rc1-v6-artifact-set.mjs +807 -807
  37. package/src/rc1-v6-behavior-evidence.mjs +273 -273
  38. package/src/rc1-v6-campaign.mjs +623 -623
  39. package/src/rc1-v6-causal-binding.mjs +473 -473
  40. package/src/rc1-v6-measurement.mjs +313 -313
  41. package/src/rc2-artifact-set.mjs +1584 -1584
  42. package/src/rc2-campaign.mjs +1506 -1506
  43. package/src/rc2-delivery-policy-front-end.mjs +1079 -1079
  44. package/src/rc2-delivery-policy-oracle.mjs +134 -134
  45. package/src/rc2-delivery-policy-transform.mjs +1127 -1127
  46. package/src/rc2-rc1-transfer-front-end.mjs +511 -511
  47. package/src/rc3-actual-dogfood.mjs +652 -652
  48. package/src/rc3-dogfood-scaffold.mjs +315 -315
  49. package/src/rc3-scripted-campaign.mjs +1383 -1383
  50. package/src/rc4-stage1-dogfood.mjs +673 -673
  51. package/src/runtime-adapter-registry.mjs +524 -524
  52. package/src/runtime-cli.mjs +4588 -4588
  53. package/src/runtime-contracts.mjs +824 -824
  54. package/src/runtime-control-store.mjs +604 -604
  55. package/src/runtime-controller-protocol.mjs +587 -587
  56. package/src/runtime-decision-verifier.mjs +701 -701
  57. package/src/runtime-diff-observer.mjs +361 -361
  58. package/src/runtime-direct-os-observer.mjs +301 -301
  59. package/src/runtime-driver-state.mjs +166 -166
  60. package/src/runtime-engine.mjs +779 -779
  61. package/src/runtime-errors.mjs +356 -356
  62. package/src/runtime-event-store.mjs +189 -189
  63. package/src/runtime-front-end.mjs +925 -925
  64. package/src/runtime-gate-store.mjs +481 -481
  65. package/src/runtime-hold-recompile.mjs +916 -916
  66. package/src/runtime-io-sentinel.mjs +391 -391
  67. package/src/runtime-lifecycle-lock.mjs +294 -294
  68. package/src/runtime-managed-supervisor.mjs +1490 -1490
  69. package/src/runtime-multi-epoch-store.mjs +838 -838
  70. package/src/runtime-projection.mjs +269 -269
  71. package/src/runtime-pull-intake.mjs +1192 -1192
  72. package/src/runtime-scripted-adapter-controller.mjs +1160 -1160
  73. package/src/runtime-scripted-executor.mjs +163 -163
  74. package/src/runtime-scripted-worktree.mjs +104 -104
  75. package/src/runtime-seam-resolve.mjs +428 -428
  76. package/src/runtime-seam-treatment.mjs +173 -173
  77. package/src/runtime-socket-owner.mjs +125 -125
  78. package/src/runtime-work-order-contracts.mjs +91 -91
  79. package/src/runtime-work-order-controller.mjs +1171 -1171
  80. package/src/runtime-worktree-executor.mjs +199 -199
  81. package/src/schedulability-compiler-v2.mjs +303 -303
  82. package/src/schedulability-verifier-v2.mjs +317 -317
  83. package/src/seam-apply.mjs +549 -549
  84. package/src/seam-commit-shared.mjs +22 -22
  85. package/src/seam-commit-transform.mjs +81 -81
  86. package/src/seam-commit.mjs +18 -18
  87. package/src/seam-cost.mjs +322 -322
  88. package/src/seam-derivation.mjs +188 -188
  89. package/src/seam-gate.mjs +146 -146
  90. package/src/seam-proposal-contracts.mjs +446 -446
  91. package/src/seam-proposal-queries.mjs +521 -521
  92. package/src/seam-proposal.mjs +2011 -2011
  93. package/src/seam-ref.mjs +33 -33
  94. package/src/seam-rewrite.mjs +286 -286
  95. package/src/seam-transform.mjs +554 -554
  96. package/src/seam-verification.mjs +260 -260
  97. package/src/sensor-adapter.mjs +432 -432
  98. package/src/sensor-cli.mjs +139 -139
  99. package/src/sensor-diff.mjs +661 -661
  100. package/src/sensor-node-runtime.mjs +53 -53
  101. package/src/sensor-runtime.mjs +52 -52
  102. package/src/timestamp-contract.mjs +8 -8
  103. package/src/todo-audit-pending.mjs +91 -91
  104. package/src/todo-chain.mjs +178 -178
  105. package/src/todo-cli.mjs +8 -8
  106. package/src/todo-contracts.mjs +728 -728
  107. package/src/todo-dashboard-registry.mjs +573 -573
  108. package/src/todo-dispatch-shape.mjs +190 -190
  109. package/src/todo-gantt-html-independence.mjs +239 -239
  110. package/src/todo-gantt-html-shared.mjs +226 -226
  111. package/src/todo-gantt-html-style.mjs +131 -131
  112. package/src/todo-gantt-html.mjs +248 -248
  113. package/src/todo-gantt-layout.mjs +974 -974
  114. package/src/todo-gantt-live.mjs +361 -361
  115. package/src/todo-gantt-nested.mjs +263 -263
  116. package/src/todo-gantt-presentation.mjs +217 -217
  117. package/src/todo-gantt-scope.mjs +123 -123
  118. package/src/todo-gantt-svg.mjs +353 -353
  119. package/src/todo-independence-contracts.mjs +595 -595
  120. package/src/todo-independence-guidance.mjs +322 -322
  121. package/src/todo-independence.mjs +640 -640
  122. package/src/todo-markdown-renderer.mjs +260 -260
  123. package/src/todo-migration.mjs +448 -448
  124. package/src/todo-narrative-anchor.mjs +130 -130
  125. package/src/todo-note-store.mjs +629 -629
  126. package/src/todo-parallel-candidates.mjs +114 -114
  127. package/src/todo-revision.mjs +995 -995
  128. package/src/todo-split.mjs +472 -472
  129. package/src/todo-status.mjs +690 -690
  130. package/src/todo-store-git-transaction.mjs +418 -418
  131. package/src/todo-store.mjs +42 -21
  132. package/src/treatment-compiler.mjs +728 -728
  133. package/src/treatment-runner.mjs +656 -656
  134. package/src/witness-scaffold.mjs +180 -180
@@ -1,4 +1,3 @@
1
- import { execFileSync } from 'node:child_process';
2
1
  import { randomBytes } from 'node:crypto';
3
2
  import {
4
3
  lstat, mkdir, open, readFile, readdir, realpath, rename, rm, rmdir,
@@ -30,6 +29,7 @@ import {
30
29
  } from './todo-independence-contracts.mjs';
31
30
  import { validateSeamProposal } from './seam-proposal-contracts.mjs';
32
31
  import { sha256Bytes, verifyLinearHashChain } from './hash-chain.mjs';
32
+ import { gitCatFileBatch, gitSync } from './git-process.mjs';
33
33
  import {
34
34
  parseTodoSourceRef,
35
35
  todoCutoverArchiveSourceRef,
@@ -1039,7 +1039,7 @@ function reachableObjects(absoluteRepo) {
1039
1039
  if (cached !== undefined) return cached;
1040
1040
  let set;
1041
1041
  try {
1042
- const stdout = execFileSync('git', ['rev-list', '--objects', '--all'],
1042
+ const stdout = gitSync(['rev-list', '--objects', '--all'],
1043
1043
  { cwd: absoluteRepo, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],
1044
1044
  maxBuffer: 256 * 1024 * 1024 });
1045
1045
  set = new Set();
@@ -1056,6 +1056,27 @@ function reachableObjects(absoluteRepo) {
1056
1056
  return set;
1057
1057
  }
1058
1058
 
1059
+ // blob は内容アドレスなので oid が同じなら bytes は不変。gantt serve 等が store を再読する
1060
+ // たびに同じ evidence blob を git 子起動で読み直すのを避ける(Windows のウィンドウ雪崩と
1061
+ // 走査コストの主犯)。成功した読みだけを覚え、失敗は覚えない(repo 状態は変わりうる)。
1062
+ const EVIDENCE_BLOB_CACHE_LIMIT = 512;
1063
+ const evidenceBlobCache = new Map();
1064
+
1065
+ function readEvidenceBlob(absoluteRepo, oid) {
1066
+ const key = `${absoluteRepo}${oid}`;
1067
+ const cached = evidenceBlobCache.get(key);
1068
+ if (cached !== undefined) return cached;
1069
+ const [entry] = gitCatFileBatch([oid], {
1070
+ cwd: absoluteRepo, maxBodyBytes: TODO_LIMITS.narrativeSectionBytes + 1,
1071
+ });
1072
+ if (entry.missing || entry.type !== 'blob') throw new Error('not blob');
1073
+ if (evidenceBlobCache.size >= EVIDENCE_BLOB_CACHE_LIMIT) {
1074
+ evidenceBlobCache.delete(evidenceBlobCache.keys().next().value);
1075
+ }
1076
+ evidenceBlobCache.set(key, entry.bytes);
1077
+ return entry.bytes;
1078
+ }
1079
+
1059
1080
  function evidenceVerifier(manifest, repoRoot, hard) {
1060
1081
  const repositories = new Map(manifest.repositories.map((repo) => [repo.repo_id, repo.path]));
1061
1082
  return (descriptor, context = {}) => {
@@ -1064,8 +1085,7 @@ function evidenceVerifier(manifest, repoRoot, hard) {
1064
1085
  if (repoRef === undefined) fail('STORE_INCONSISTENT', 'evidence_repo_missing');
1065
1086
  const absoluteRepo = path.resolve(repoRoot, repoRef);
1066
1087
  try {
1067
- const type = execFileSync('git', ['cat-file', '-t', descriptor.git_blob_oid], { cwd: absoluteRepo, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
1068
- if (type !== 'blob') throw new Error('not blob');
1088
+ const bytes = readEvidenceBlob(absoluteRepo, descriptor.git_blob_oid);
1069
1089
  // **objectが在ることと、cloneした人が読めることは別である。** commitやtagから辿れない
1070
1090
  // dangling blobでも`cat-file`は通るので、手元では検証済みに見えるのに、fresh cloneでは
1071
1091
  // 誰も確かめられない証拠が残る。実際に16件そうなっており、公開CIで初めて露見した。
@@ -1077,7 +1097,6 @@ function evidenceVerifier(manifest, repoRoot, hard) {
1077
1097
  if (!hard && !reachableObjects(absoluteRepo).has(descriptor.git_blob_oid)) {
1078
1098
  throw new Error('blob unreachable from refs');
1079
1099
  }
1080
- const bytes = execFileSync('git', ['cat-file', 'blob', descriptor.git_blob_oid], { cwd: absoluteRepo, encoding: 'buffer', stdio: ['ignore', 'pipe', 'ignore'], maxBuffer: TODO_LIMITS.narrativeSectionBytes + 1 });
1081
1100
  if (sha256Bytes(bytes) !== descriptor.content_digest) throw new Error('digest mismatch');
1082
1101
  return true;
1083
1102
  } catch {
@@ -1093,25 +1112,27 @@ function evidenceVerifier(manifest, repoRoot, hard) {
1093
1112
  }
1094
1113
 
1095
1114
  function pinnedSourceLine(repoRoot, source, cache = null) {
1096
- if (cache === null || !cache.commits.has(source.source_commit)) {
1097
- const commitType = execFileSync('git', ['cat-file', '-t', source.source_commit], {
1098
- cwd: repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],
1099
- }).trim();
1100
- if (commitType !== 'commit') throw new Error('not commit');
1101
- cache?.commits.add(source.source_commit);
1102
- }
1115
+ // commit の型検査と blob 読みを 1 回の cat-file --batch へまとめる(object ごとの git
1116
+ // 子起動はWindowsで可視コンソールを開き、起動コストだけで走査を桁で遅くする)。
1103
1117
  const objectSpec = `${source.source_commit}:${source.origin_plan_ref}`;
1118
+ const needCommit = cache === null || !cache.commits.has(source.source_commit);
1104
1119
  let blob = cache?.blobs.get(objectSpec);
1105
- if (blob === undefined) {
1106
- const blobType = execFileSync('git', ['cat-file', '-t', objectSpec], {
1107
- cwd: repoRoot, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'],
1108
- }).trim();
1109
- if (blobType !== 'blob') throw new Error('not blob');
1110
- blob = execFileSync('git', ['cat-file', 'blob', objectSpec], {
1111
- cwd: repoRoot, encoding: 'buffer', stdio: ['ignore', 'pipe', 'ignore'],
1112
- maxBuffer: TODO_LIMITS.narrativeSectionBytes + 1,
1120
+ if (needCommit || blob === undefined) {
1121
+ const names = [...(needCommit ? [source.source_commit] : []), ...(blob === undefined ? [objectSpec] : [])];
1122
+ const entries = gitCatFileBatch(names, {
1123
+ cwd: repoRoot, maxBodyBytes: TODO_LIMITS.narrativeSectionBytes + 1,
1113
1124
  });
1114
- cache?.blobs.set(objectSpec, blob);
1125
+ if (needCommit) {
1126
+ const commitEntry = entries.shift();
1127
+ if (commitEntry.missing || commitEntry.type !== 'commit') throw new Error('not commit');
1128
+ cache?.commits.add(source.source_commit);
1129
+ }
1130
+ if (blob === undefined) {
1131
+ const blobEntry = entries.shift();
1132
+ if (blobEntry.missing || blobEntry.type !== 'blob') throw new Error('not blob');
1133
+ blob = blobEntry.bytes;
1134
+ cache?.blobs.set(objectSpec, blob);
1135
+ }
1115
1136
  }
1116
1137
  let start = 0;
1117
1138
  let line = 1;