@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.
- package/package.json +1 -1
- package/src/artifact-contracts-v2.mjs +325 -325
- package/src/artifact-contracts.mjs +895 -895
- package/src/boundary-compiler.mjs +712 -712
- package/src/boundary-observation-compiler-v2.mjs +344 -344
- package/src/bounded-seam.mjs +230 -230
- package/src/bridge-address.mjs +107 -107
- package/src/bridge-cli.mjs +297 -297
- package/src/bridge-config.mjs +346 -346
- package/src/bridge-daemon.mjs +378 -378
- package/src/bridge-hub-protocol.mjs +198 -0
- package/src/bridge-launch-agent.mjs +323 -323
- package/src/bridge-registrar.mjs +102 -102
- package/src/bridge-server.mjs +376 -376
- package/src/cli-help.mjs +308 -308
- package/src/cli-stdio.mjs +40 -40
- package/src/control-compiler.mjs +532 -532
- package/src/dag-chain.mjs +261 -261
- package/src/factory-diagnostics.mjs +188 -188
- package/src/git-process.mjs +72 -0
- package/src/hash-chain.mjs +76 -76
- package/src/hooks-cli.mjs +1057 -1057
- package/src/isolation-runner.mjs +409 -409
- package/src/node-version-guard.mjs +44 -44
- package/src/project-cli.mjs +3 -3
- package/src/project-identity.mjs +130 -130
- package/src/rc1-black-box-oracle.mjs +906 -906
- package/src/rc1-comparison.mjs +154 -154
- package/src/rc1-evidence-bundle.mjs +456 -456
- package/src/rc1-v4-campaign.mjs +708 -708
- package/src/rc1-v4-transform.mjs +467 -467
- package/src/rc1-v5-artifact-set.mjs +855 -855
- package/src/rc1-v5-behavior-evidence.mjs +594 -594
- package/src/rc1-v5-campaign.mjs +797 -797
- package/src/rc1-v5-transform.mjs +421 -421
- package/src/rc1-v6-artifact-set.mjs +807 -807
- package/src/rc1-v6-behavior-evidence.mjs +273 -273
- package/src/rc1-v6-campaign.mjs +623 -623
- package/src/rc1-v6-causal-binding.mjs +473 -473
- package/src/rc1-v6-measurement.mjs +313 -313
- package/src/rc2-artifact-set.mjs +1584 -1584
- package/src/rc2-campaign.mjs +1506 -1506
- package/src/rc2-delivery-policy-front-end.mjs +1079 -1079
- package/src/rc2-delivery-policy-oracle.mjs +134 -134
- package/src/rc2-delivery-policy-transform.mjs +1127 -1127
- package/src/rc2-rc1-transfer-front-end.mjs +511 -511
- package/src/rc3-actual-dogfood.mjs +652 -652
- package/src/rc3-dogfood-scaffold.mjs +315 -315
- package/src/rc3-scripted-campaign.mjs +1383 -1383
- package/src/rc4-stage1-dogfood.mjs +673 -673
- package/src/runtime-adapter-registry.mjs +524 -524
- package/src/runtime-cli.mjs +4588 -4588
- package/src/runtime-contracts.mjs +824 -824
- package/src/runtime-control-store.mjs +604 -604
- package/src/runtime-controller-protocol.mjs +587 -587
- package/src/runtime-decision-verifier.mjs +701 -701
- package/src/runtime-diff-observer.mjs +361 -361
- package/src/runtime-direct-os-observer.mjs +301 -301
- package/src/runtime-driver-state.mjs +166 -166
- package/src/runtime-engine.mjs +779 -779
- package/src/runtime-errors.mjs +356 -356
- package/src/runtime-event-store.mjs +189 -189
- package/src/runtime-front-end.mjs +925 -925
- package/src/runtime-gate-store.mjs +481 -481
- package/src/runtime-hold-recompile.mjs +916 -916
- package/src/runtime-io-sentinel.mjs +391 -391
- package/src/runtime-lifecycle-lock.mjs +294 -294
- package/src/runtime-managed-supervisor.mjs +1490 -1490
- package/src/runtime-multi-epoch-store.mjs +838 -838
- package/src/runtime-projection.mjs +269 -269
- package/src/runtime-pull-intake.mjs +1192 -1192
- package/src/runtime-scripted-adapter-controller.mjs +1160 -1160
- package/src/runtime-scripted-executor.mjs +163 -163
- package/src/runtime-scripted-worktree.mjs +104 -104
- package/src/runtime-seam-resolve.mjs +428 -428
- package/src/runtime-seam-treatment.mjs +173 -173
- package/src/runtime-socket-owner.mjs +125 -125
- package/src/runtime-work-order-contracts.mjs +91 -91
- package/src/runtime-work-order-controller.mjs +1171 -1171
- package/src/runtime-worktree-executor.mjs +199 -199
- package/src/schedulability-compiler-v2.mjs +303 -303
- package/src/schedulability-verifier-v2.mjs +317 -317
- package/src/seam-apply.mjs +549 -549
- package/src/seam-commit-shared.mjs +22 -22
- package/src/seam-commit-transform.mjs +81 -81
- package/src/seam-commit.mjs +18 -18
- package/src/seam-cost.mjs +322 -322
- package/src/seam-derivation.mjs +188 -188
- package/src/seam-gate.mjs +146 -146
- package/src/seam-proposal-contracts.mjs +446 -446
- package/src/seam-proposal-queries.mjs +521 -521
- package/src/seam-proposal.mjs +2011 -2011
- package/src/seam-ref.mjs +33 -33
- package/src/seam-rewrite.mjs +286 -286
- package/src/seam-transform.mjs +554 -554
- package/src/seam-verification.mjs +260 -260
- package/src/sensor-adapter.mjs +432 -432
- package/src/sensor-cli.mjs +139 -139
- package/src/sensor-diff.mjs +661 -661
- package/src/sensor-node-runtime.mjs +53 -53
- package/src/sensor-runtime.mjs +52 -52
- package/src/timestamp-contract.mjs +8 -8
- package/src/todo-audit-pending.mjs +91 -91
- package/src/todo-chain.mjs +178 -178
- package/src/todo-cli.mjs +8 -8
- package/src/todo-contracts.mjs +728 -728
- package/src/todo-dashboard-registry.mjs +573 -573
- package/src/todo-dispatch-shape.mjs +190 -190
- package/src/todo-gantt-html-independence.mjs +239 -239
- package/src/todo-gantt-html-shared.mjs +226 -226
- package/src/todo-gantt-html-style.mjs +131 -131
- package/src/todo-gantt-html.mjs +248 -248
- package/src/todo-gantt-layout.mjs +974 -974
- package/src/todo-gantt-live.mjs +361 -361
- package/src/todo-gantt-nested.mjs +263 -263
- package/src/todo-gantt-presentation.mjs +217 -217
- package/src/todo-gantt-scope.mjs +123 -123
- package/src/todo-gantt-svg.mjs +353 -353
- package/src/todo-independence-contracts.mjs +595 -595
- package/src/todo-independence-guidance.mjs +322 -322
- package/src/todo-independence.mjs +640 -640
- package/src/todo-markdown-renderer.mjs +260 -260
- package/src/todo-migration.mjs +448 -448
- package/src/todo-narrative-anchor.mjs +130 -130
- package/src/todo-note-store.mjs +629 -629
- package/src/todo-parallel-candidates.mjs +114 -114
- package/src/todo-revision.mjs +995 -995
- package/src/todo-split.mjs +472 -472
- package/src/todo-status.mjs +690 -690
- package/src/todo-store-git-transaction.mjs +418 -418
- package/src/todo-store.mjs +42 -21
- package/src/treatment-compiler.mjs +728 -728
- package/src/treatment-runner.mjs +656 -656
- package/src/witness-scaffold.mjs +180 -180
package/src/todo-store.mjs
CHANGED
|
@@ -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 =
|
|
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
|
|
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
|
-
|
|
1097
|
-
|
|
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
|
|
1107
|
-
|
|
1108
|
-
|
|
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
|
-
|
|
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;
|