@omne-harness/repo-toolchain 0.0.12 → 0.0.14

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/README.md CHANGED
@@ -106,7 +106,7 @@ Schema 2 and 3 source paths start at repository root. Referenced files and Markd
106
106
  IC-1 and IC-5 use adopted roles and actual public exports. Directory names grant no exception.
107
107
  A missing current or BASE input remains unknown or no-data. Current deletion still reports its semantic change.
108
108
  Changes to cited Markdown also trigger the hook. See the [conformance contract](src/arch/CONFORMANCE.md).
109
- The conformance report has [direction rows](src/arch/CONFORMANCE.md#方向行). The rows and the roles come from the runner repository's `constraints.json`, the same file that `omne-deps` reads. The dependency facts come from the dependency graph of the reported version. When that graph is not available, the rows are unknown. When the graph of the baseline is not available, the report does not mark deviations as new or stock, and each row gives the reason. A direction deviation is reported in the loop. It is not a hard line.
109
+ The conformance report has [direction rows](src/arch/CONFORMANCE.md#方向行). The rows and the roles come from the runner repository's `constraints.json`, the same file that `omne-deps` reads. The dependency facts come from the dependency graph of the reported version. When no role that the direction rows reference has a file in that version, the report does not take the graph, and each row is unknown with the same text as with the graph. The [conformance contract](src/arch/CONFORMANCE.md#方向行) gives the rule. When the graph is taken but is not available, the rows are unknown. When the graph of the baseline is not available, the report does not mark deviations as new or stock, and each row gives the reason. A direction deviation is reported in the loop. It is not a hard line.
110
110
  It reports static conformance separately from added, removed and changed assembly facts.
111
111
  Fact counts are neutral. They have no thresholds or trend comparison.
112
112
 
@@ -130,16 +130,22 @@ The acceptance lock preserves original role violations in `LockReport.violations
130
130
  Loop keeps each full report in `auditRanges[].acceptance`. Its acceptance hard line contains only unresolved findings.
131
131
  Both text reports show original violations and approvals. Other Loop hard lines still apply.
132
132
 
133
- The artifact contains only the fixed [D010 decision](https://github.com/nemori-ai/omne-harness-lite/issues/638#issuecomment-6367449357).
134
- It covers commit `48ad37d292796326d65055a75e8a1fde44fe4233` and `packages/agent/agent/acceptance/README.md`.
135
- The tool checks real Git objects, one parent, exact blobs, and all bytes from `git diff --no-ext-diff --no-textconv --no-color --binary -U3 --src-prefix=a/ --dst-prefix=b/ --text`.
133
+ The artifact contains a read-only list of fixed decisions in `src/acceptance/historical-approvals.data.ts`. The checker in `src/acceptance/historical-approvals.ts` reads only this list.
134
+ Each entry covers one commit and one protected path. A commit with more protected paths has one entry for each path.
135
+ The [D010 decision](https://github.com/nemori-ai/omne-harness-lite/issues/638#issuecomment-6367449357) covers commit `48ad37d292796326d65055a75e8a1fde44fe4233` and `packages/agent/agent/acceptance/README.md`.
136
+ The [#769 decision](https://github.com/nemori-ai/omne-harness-lite/issues/769#issuecomment-6411908205) covers 27 paths in commits `19f457a15`, `9f3967cc5`, `69bdedfab`, `837d333fd`, `14b0fcfcb` and `06acd53ca`.
137
+ Without a task context, the lock compares a merge commit with each parent (`git diff-tree -m`) and lists each path that differs from one parent. With a task context it uses `--cc`, which lists only paths that differ from all parents. A clean merge then lists no paths. The six #769 commits contain four such merges.
138
+ By registration convention, a merge entry names the one parent where the path changed. The tool does not check this convention. It checks only that the named parent is one of the parents of the commit.
139
+ The tool checks real Git objects, that the named parent is a parent of the commit, exact blobs, and all bytes from `git diff --no-ext-diff --no-textconv --no-color --binary -U3 --src-prefix=a/ --dst-prefix=b/ --text`.
140
+ For a path that does not exist on one side, the blob is the Git null object ID (40 zeros), as `git diff --raw` shows it. The tool then checks that the tree has no such path.
136
141
  The call fixes `core.abbrev=8`, `diff.noprefix=false`, `diff.mnemonicPrefix=false`, `diff.algorithm=myers`, `diff.indentHeuristic=true`, `diff.context=3`, `diff.interHunkContext=0`, `diff.suppressBlankEmpty=false`, `diff.srcPrefix=a/`, `diff.dstPrefix=b/`, `core.attributesFile=/dev/null`, and `attr.tree` (the empty tree). It removes `GIT_DIFF_OPTS` and `GIT_ATTR_SOURCE` from its environment and sets `GIT_ATTR_NOSYSTEM=1`. Repository size and these settings do not change the bytes.
137
- Known limits: a funcname, xfuncname or `binary` attribute in `info/attributes`, a `.gitattributes` file in the worktree on Git older than 2.43, and an object prefix collision change the bytes. D010 then does not receive approval. These cases fail as a rejection, never as a false approval.
138
- Ordinary documents in that historical commit do not prevent approval. An additional protected path cannot receive this approval.
142
+ Known limits: a funcname, xfuncname or `binary` attribute in `info/attributes`, a `.gitattributes` file in the worktree on Git older than 2.43, and an object prefix collision change the bytes. The entry then does not receive approval. These cases fail as a rejection, never as a false approval.
143
+ Ordinary documents in a historical commit do not prevent approval. The protected paths that the lock lists for a commit must be exactly the paths registered for that commit. One more or one less path gives no approval for that commit.
144
+ When the path sets are equal but the fingerprint of one entry does not match, only that entry gets no approval. The other entries of the commit are approved. The path of the failed entry stays an unresolved violation, so the CLI still exits 1.
139
145
  Uncommitted edits, future developer commits, and fingerprint or decision mismatches still fail.
140
146
  Git read failures remain tool errors. Configuration, environment variables, arguments, and supplied URLs cannot authorize changes.
141
147
  No runtime GitHub request is required. Adoption trusts the reviewed artifact and its npm integrity.
142
148
  Source tests alone do not establish that consumers installed the release.
143
149
 
144
150
  Regression tests are in `tests/acceptance-lock.spec.ts` and `tests/loop-strict.spec.ts`.
145
- The real history cases require this repository's D010 Git objects.
151
+ The real history cases require the Git objects of the registered commits in this repository.
package/README_ZH.md CHANGED
@@ -137,12 +137,16 @@ pnpm run acceptance:lock --base <任务基线提交或分支>
137
137
  Loop 的 `auditRanges[].acceptance` 保留完整报告,`hardLines.acceptanceLock.violations` 只列未解决项。
138
138
  Loop 的 Markdown 同时显示原始违规和批准决定;其他硬线照常判断。
139
139
 
140
- 当前制品只包含 [D010 的固定决定](https://github.com/nemori-ai/omne-harness-lite/issues/638#issuecomment-6367449357)。
141
- 它只批准提交 `48ad37d292796326d65055a75e8a1fde44fe4233` 中的 `packages/agent/agent/acceptance/README.md` 改动。
142
- 工具读取真实 Git 对象,核对完整提交、唯一父提交、受保护路径、旧新 blob 和完整二进制 diff 的 SHA-256。该 diff 使用 `git diff --no-ext-diff --no-textconv --no-color --binary -U3 --src-prefix=a/ --dst-prefix=b/ --text`。
140
+ 固定决定编进 `src/acceptance/historical-approvals.data.ts` 的只读列表(核对器 `src/acceptance/historical-approvals.ts` 只读这份列表),每条对应一个提交里的一个受保护路径;一个提交改了几个受保护路径,就登记几条。
141
+ [D010 的决定](https://github.com/nemori-ai/omne-harness-lite/issues/638#issuecomment-6367449357)批准提交 `48ad37d292796326d65055a75e8a1fde44fe4233` 中的 `packages/agent/agent/acceptance/README.md` 改动。
142
+ [#769 的决定](https://github.com/nemori-ai/omne-harness-lite/issues/769#issuecomment-6411908205)批准提交 `19f457a15`、`9f3967cc5`、`69bdedfab`、`837d333fd`、`14b0fcfcb`、`06acd53ca` 中的 27 个路径改动。
143
+ 没有任务上下文时,验收锁把合并提交与每个父提交分别比较(`git diff-tree -m`),与任一父提交不同的路径都列出。有任务上下文时它用 `--cc`,只列与所有父提交都不同的路径,干净合并因此不列路径。#769 的六个提交里有四个是这样的合并。
144
+ 登记约定是:合并提交的条目写该路径有变化的那一个父提交。工具不核对这条约定,只核对所写父提交是该提交的父提交之一。
145
+ 工具读取真实 Git 对象,核对完整提交、所写父提交确是该提交的父提交、受保护路径、旧新 blob 和完整二进制 diff 的 SHA-256。某一侧没有这个路径时,blob 记为 Git 的空对象号(40 个 0,与 `git diff --raw` 的写法相同),工具核对该侧的树里确实没有这个路径。该 diff 使用 `git diff --no-ext-diff --no-textconv --no-color --binary -U3 --src-prefix=a/ --dst-prefix=b/ --text`。
143
146
  调用固定 `core.abbrev=8`、`diff.noprefix=false`、`diff.mnemonicPrefix=false`、`diff.algorithm=myers`、`diff.indentHeuristic=true`、`diff.context=3`、`diff.interHunkContext=0`、`diff.suppressBlankEmpty=false`、`diff.srcPrefix=a/`、`diff.dstPrefix=b/`、`core.attributesFile=/dev/null` 与 `attr.tree`(空树),从环境中去掉 `GIT_DIFF_OPTS` 与 `GIT_ATTR_SOURCE`,并设 `GIT_ATTR_NOSYSTEM=1`。仓库大小与这些配置不会改变字节。
144
- 已知限制:`info/attributes` 中的 funcname、xfuncname 或 `binary` 属性,Git 2.43 以前版本下工作树里的 `.gitattributes`,以及对象前缀碰撞,会改变字节,D010 因此不获批准。这些情况的失败方向是拒绝,不会误批准。
145
- 其他普通文档可以在原提交中一起修改;多一个受保护验收路径不能命中例外。
147
+ 已知限制:`info/attributes` 中的 funcname、xfuncname 或 `binary` 属性,Git 2.43 以前版本下工作树里的 `.gitattributes`,以及对象前缀碰撞,会改变字节,该条因此不获批准。这些情况的失败方向是拒绝,不会误批准。
148
+ 其他普通文档可以在原提交中一起修改。验收锁为一个提交列出的受保护路径必须恰好等于为它登记的路径,多一个或少一个,这个提交一条都不批准。
149
+ 路径集合相等、但其中一条的指纹不符时,只有那一条不批准,该提交的其他条目照常批准;不符那条的路径仍是未解决违规,CLI 仍退出 1。
146
150
  未提交改动、未来 developer 提交和任一指纹或决定不匹配仍失败。Git 读取失败退出 2。
147
151
  仓库配置、环境变量、CLI 参数和外部 URL 都不能新增批准;运行时不访问 GitHub。
148
152
  批准记录随受审查的工具制品发布,安装版本与 npm integrity 是采用边界,源码测试通过不代表已安装修复。
@@ -389,7 +393,7 @@ CLI 的范围只有 `all` 和 `engineering`,默认 `all`;工程范围必须
389
393
  全局预期归 `docs/architecture/constraints.json`。
390
394
  当前及历史版本分别发现唯一源,同版双源或坏依据拒绝。schema 2 与 3 的依据路径从仓库根解析,文件和Markdown锚点在相同版本校验。IC-1与IC-5沿采用责任及真实公开入口判断,目录名不构成许可。
391
395
  缺当前或BASE输入保留unknown或no-data,删除变化仍可见。只修改依据Markdown也触发收工测量。精确输入、范围和不能证明的性质见[符合性契约](src/arch/CONFORMANCE.md)。
392
- 符合性报告带[方向行](src/arch/CONFORMANCE.md#方向行):方向行与角色读运行检查器仓库的 `constraints.json`(与 `omne-deps` 同一份),依赖事实读本版的依赖图,图不可得时这些行是 unknown;基线的图不可得时偏离行不判新旧,每一行写明原因;方向偏离在回路里只报告,不是硬线。
396
+ 符合性报告带[方向行](src/arch/CONFORMANCE.md#方向行):方向行与角色读运行检查器仓库的 `constraints.json`(与 `omne-deps` 同一份),依赖事实读本版的依赖图,方向行引用的角色在本版里都匹配不到文件时不取图,每一行都是 unknown,文字与取图时相同,规则见[符合性契约](src/arch/CONFORMANCE.md#方向行);取了图但图不可得时这些行是 unknown;基线的图不可得时偏离行不判新旧,每一行写明原因;方向偏离在回路里只报告,不是硬线。
393
397
  集成约定归 [Cordis 集成约定](../../docs/architecture/cordis-integration-conventions.md)。
394
398
  工具不反写预期,也不从目录存在性或手写绑定推断实现状态。
395
399
 
@@ -1,14 +1,21 @@
1
- export interface HistoricalApproval {
2
- readonly commit: string;
3
- readonly parent: string;
4
- readonly path: string;
5
- readonly oldBlob: string;
6
- readonly newBlob: string;
7
- readonly diffSha256: string;
8
- readonly decisionUrl: string;
9
- }
10
- /** Internal matcher: it can recognize the compiled decision, never authorize a new one. */
1
+ import { type HistoricalApproval } from './historical-approvals.data.ts';
2
+ type ApprovalList = readonly HistoricalApproval[];
3
+ /** Internal matcher: it can recognize a compiled decision, never authorize a new one. */
11
4
  export declare function matchHistoricalApproval(candidate: Partial<HistoricalApproval>, protectedPaths: readonly string[]): HistoricalApproval | undefined;
12
- /** Read immutable Git objects; errors propagate to the caller as tool failures. */
13
- export declare function inspectHistoricalApproval(root: string, commit: string, protectedPaths: readonly string[]): HistoricalApproval | undefined;
5
+ /**
6
+ * Read the change of one path between a parent and a commit from immutable Git objects. The
7
+ * compiled constants come from this same function; errors propagate as tool failures.
8
+ */
9
+ export declare function observeHistoricalChange(root: string, commit: string, parent: string, path: string): Pick<HistoricalApproval, 'oldBlob' | 'newBlob' | 'diffSha256'>;
10
+ /**
11
+ * Test seam only: the same check over a given list. Production code calls
12
+ * inspectHistoricalApproval, which always passes the compiled list; no repository input reaches here.
13
+ */
14
+ export declare function inspectAgainst(list: ApprovalList, root: string, commit: string, protectedPaths: readonly string[]): readonly HistoricalApproval[];
15
+ /**
16
+ * The compiled approvals that match this commit's protected paths exactly, one for each path.
17
+ * Read immutable Git objects; errors propagate to the caller as tool failures.
18
+ */
19
+ export declare function inspectHistoricalApproval(root: string, commit: string, protectedPaths: readonly string[]): readonly HistoricalApproval[];
20
+ export {};
14
21
  //# sourceMappingURL=historical-approvals.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"historical-approvals.d.ts","sourceRoot":"","sources":["../../src/acceptance/historical-approvals.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAsED,2FAA2F;AAC3F,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACtC,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,kBAAkB,GAAG,SAAS,CAYhC;AAED,mFAAmF;AACnF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,kBAAkB,GAAG,SAAS,CAqChC"}
1
+ {"version":3,"file":"historical-approvals.d.ts","sourceRoot":"","sources":["../../src/acceptance/historical-approvals.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAA;AA2DvC,KAAK,YAAY,GAAG,SAAS,kBAAkB,EAAE,CAAA;AAqCjD,yFAAyF;AACzF,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACtC,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,kBAAkB,GAAG,SAAS,CAEhC;AAwCD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC,CAWhE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,SAAS,kBAAkB,EAAE,CAyB/B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,SAAS,kBAAkB,EAAE,CAE/B"}
@@ -0,0 +1,22 @@
1
+ export interface HistoricalApproval {
2
+ readonly commit: string;
3
+ /**
4
+ * The parent that the change is registered against. The tool checks only that it is one of the
5
+ * commit's parents. By registration convention a merge entry names the one parent where the path
6
+ * differs. That convention is not checked. The lock lists such a path only in its `-m` listing
7
+ * (no task context); its `--cc` listing (task context) shows no paths for a clean merge.
8
+ */
9
+ readonly parent: string;
10
+ readonly path: string;
11
+ /** NULL_OBJECT_ID when the path does not exist on that side, as `git diff --raw` reports it. */
12
+ readonly oldBlob: string;
13
+ readonly newBlob: string;
14
+ readonly diffSha256: string;
15
+ readonly decisionUrl: string;
16
+ }
17
+ /** Git's null object id: the side of a change where the path does not exist. */
18
+ export declare const NULL_OBJECT_ID = "0000000000000000000000000000000000000000";
19
+ export declare const HISTORICAL_APPROVALS: readonly HistoricalApproval[];
20
+ /** Each (commit, path) has at most one entry; a duplicate is an artifact defect, not a choice. */
21
+ export declare function assertUniqueApprovals(list: readonly HistoricalApproval[]): void;
22
+ //# sourceMappingURL=historical-approvals.data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historical-approvals.data.d.ts","sourceRoot":"","sources":["../../src/acceptance/historical-approvals.data.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,gGAAgG;IAChG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,gFAAgF;AAChF,eAAO,MAAM,cAAc,6CAA6C,CAAA;AAWxE,eAAO,MAAM,oBAAoB,EAAE,SAAS,kBAAkB,EAuQ7D,CAAA;AAED,kGAAkG;AAClG,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE,GAAG,IAAI,CAI/E"}
@@ -0,0 +1,280 @@
1
+ // Compiled historical acceptance-lock approvals. Only the reviewed tool artifact owns this list.
2
+ // Repository inputs, configuration, environment variables and arguments cannot add approvals.
3
+ /** Git's null object id: the side of a change where the path does not exist. */
4
+ export const NULL_OBJECT_ID = '0000000000000000000000000000000000000000';
5
+ const D010_DECISION = 'https://github.com/nemori-ai/omne-harness-lite/issues/638#issuecomment-6367449357';
6
+ const ISSUE_769_DECISION = 'https://github.com/nemori-ai/omne-harness-lite/issues/769#issuecomment-6411908205';
7
+ const MODEL_ACCEPTANCE = 'packages/model/model/acceptance';
8
+ const TRANSPORT_ACCEPTANCE = 'packages/model/pi-ai-transport/acceptance';
9
+ // One entry for each (commit, path). A commit receives approval only when the protected paths that
10
+ // the lock lists for it are exactly the paths registered here for that commit.
11
+ export const HISTORICAL_APPROVALS = Object.freeze([
12
+ // D010.
13
+ {
14
+ commit: '48ad37d292796326d65055a75e8a1fde44fe4233',
15
+ parent: 'e7aab8ec73002713d2ef6486401816850c984fb1',
16
+ path: 'packages/agent/agent/acceptance/README.md',
17
+ oldBlob: 'f7fac2fc21bfceb51c3dd84542b866eb7bb12c89',
18
+ newBlob: 'fbf0d08732f5d2004c3d63cff6c8be11442da99b',
19
+ diffSha256: 'eee5be00ebfdf300db6978cb2981a1b989dcd977846fc3de2669bb835edf3a2c',
20
+ decisionUrl: D010_DECISION,
21
+ },
22
+ // #769: six commits from 2026-10-20 to 10-23 that entered the track through the gate of that time.
23
+ // 19f457a15: #645 sync merge; the path differs only from its first parent.
24
+ {
25
+ commit: '19f457a1501aca70baae7ff573bddb86089c93ae',
26
+ parent: '2726a8c8bd3b04f65bab4785dbcca21e02f87024',
27
+ path: 'packages/agent/agent/acceptance/README.md',
28
+ oldBlob: 'f7fac2fc21bfceb51c3dd84542b866eb7bb12c89',
29
+ newBlob: 'fbf0d08732f5d2004c3d63cff6c8be11442da99b',
30
+ diffSha256: 'eee5be00ebfdf300db6978cb2981a1b989dcd977846fc3de2669bb835edf3a2c',
31
+ decisionUrl: ISSUE_769_DECISION,
32
+ },
33
+ // 9f3967cc5: #461 member documents.
34
+ {
35
+ commit: '9f3967cc5ec8e8eda4febfacaff50f78d5206b2b',
36
+ parent: '26b6c74e1b15f126425e2996475b7ab1fd043d5b',
37
+ path: `${TRANSPORT_ACCEPTANCE}/README.md`,
38
+ oldBlob: '4e52eb364f0a3705da54151aad66f004c2cd81e7',
39
+ newBlob: '7d7ef9306e63e823440f53aa381222b882348908',
40
+ diffSha256: '9c9113dc168f423ebfcaa86610e6af0953accc2be1c306c3170a0fb32041b37c',
41
+ decisionUrl: ISSUE_769_DECISION,
42
+ },
43
+ {
44
+ commit: '9f3967cc5ec8e8eda4febfacaff50f78d5206b2b',
45
+ parent: '26b6c74e1b15f126425e2996475b7ab1fd043d5b',
46
+ path: `${TRANSPORT_ACCEPTANCE}/fixtures/README.md`,
47
+ oldBlob: '794b57ae3902e48c9408080b31ab9f7df82da57d',
48
+ newBlob: '201cd7fd2a5160e3fa13391b77c4f144670a9827',
49
+ diffSha256: '5f8b1849be2b5e6fadc76da56d23f97ad7210987e464cb08e96dc923a8b1bf05',
50
+ decisionUrl: ISSUE_769_DECISION,
51
+ },
52
+ {
53
+ commit: '9f3967cc5ec8e8eda4febfacaff50f78d5206b2b',
54
+ parent: '26b6c74e1b15f126425e2996475b7ab1fd043d5b',
55
+ path: `${TRANSPORT_ACCEPTANCE}/fixtures/index.md`,
56
+ oldBlob: 'ccda51f9fcb999a06188bb3db4738843e85e4785',
57
+ newBlob: '2d59e565bcfde009603448b85ba181f0311aa25e',
58
+ diffSha256: '98fecd235050e1b89b1dfdc0f06531bb8540b2f8842a64e6a3d86ad413368a01',
59
+ decisionUrl: ISSUE_769_DECISION,
60
+ },
61
+ {
62
+ commit: '9f3967cc5ec8e8eda4febfacaff50f78d5206b2b',
63
+ parent: '26b6c74e1b15f126425e2996475b7ab1fd043d5b',
64
+ path: `${TRANSPORT_ACCEPTANCE}/index.md`,
65
+ oldBlob: '4a1bd66b5b76a23377c9664ab5d56cb550899d6e',
66
+ newBlob: '7a62b98257b47f48709a8532222c25d116943ecf',
67
+ diffSha256: '3b449877945335d1a5981587d3b47e0b4798207bb5d6345c6a6a5cca904773f9',
68
+ decisionUrl: ISSUE_769_DECISION,
69
+ },
70
+ // 69bdedfab: toolchain sync merge; the paths differ only from its first parent.
71
+ {
72
+ commit: '69bdedfabc097585cea516ccec8a6ba1d58003ae',
73
+ parent: '3f10ac0d71f69677e6dd4d05def905231a64a298',
74
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.admission-rejection.acceptance.ts`,
75
+ oldBlob: NULL_OBJECT_ID,
76
+ newBlob: 'b551f1a762c9e83840ae998682ba7a39a42d45b4',
77
+ diffSha256: 'f92510e714308d2540480963ba3116ecf81075cfa11163acf822b00be211a3bf',
78
+ decisionUrl: ISSUE_769_DECISION,
79
+ },
80
+ {
81
+ commit: '69bdedfabc097585cea516ccec8a6ba1d58003ae',
82
+ parent: '3f10ac0d71f69677e6dd4d05def905231a64a298',
83
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.credential-denied.acceptance.ts`,
84
+ oldBlob: NULL_OBJECT_ID,
85
+ newBlob: '5d6a46b9b123f1b6e288cfa9a6e641cb4bba62ec',
86
+ diffSha256: '98a4277048d8e2974e1b24b27a626b6e3c44ef676caeb0e34c95b4f695f65a47',
87
+ decisionUrl: ISSUE_769_DECISION,
88
+ },
89
+ {
90
+ commit: '69bdedfabc097585cea516ccec8a6ba1d58003ae',
91
+ parent: '3f10ac0d71f69677e6dd4d05def905231a64a298',
92
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.success.acceptance.ts`,
93
+ oldBlob: NULL_OBJECT_ID,
94
+ newBlob: '6c27d0afec06d242af3ee8b9c5251fe506a28b26',
95
+ diffSha256: 'd65fda5375aeff38adf0f69d74c5afbbe44a4fc5572df73b8655ff683c5003ec',
96
+ decisionUrl: ISSUE_769_DECISION,
97
+ },
98
+ {
99
+ commit: '69bdedfabc097585cea516ccec8a6ba1d58003ae',
100
+ parent: '3f10ac0d71f69677e6dd4d05def905231a64a298',
101
+ path: `${MODEL_ACCEPTANCE}/README.md`,
102
+ oldBlob: 'ccae451371a1a19003fb2199b3dc5378727cceb0',
103
+ newBlob: 'ff535d6769178c43d4d387858b2960dc6d8cb3c2',
104
+ diffSha256: 'dd95dd737a8bda058a4f7bc74e025941127603146e5c38d169eb534511a75870',
105
+ decisionUrl: ISSUE_769_DECISION,
106
+ },
107
+ {
108
+ commit: '69bdedfabc097585cea516ccec8a6ba1d58003ae',
109
+ parent: '3f10ac0d71f69677e6dd4d05def905231a64a298',
110
+ path: `${MODEL_ACCEPTANCE}/fixtures/README.md`,
111
+ oldBlob: '201cd7fd2a5160e3fa13391b77c4f144670a9827',
112
+ newBlob: '4a1b17f21cfbf8fbd8a6cc122ff19f2eae11f7f1',
113
+ diffSha256: '513c5d79ca30afc0dc9554eb2e550ef1418a901e0bff7c862f9427d3a1a0a36b',
114
+ decisionUrl: ISSUE_769_DECISION,
115
+ },
116
+ {
117
+ commit: '69bdedfabc097585cea516ccec8a6ba1d58003ae',
118
+ parent: '3f10ac0d71f69677e6dd4d05def905231a64a298',
119
+ path: `${MODEL_ACCEPTANCE}/fixtures/index.md`,
120
+ oldBlob: '2d59e565bcfde009603448b85ba181f0311aa25e',
121
+ newBlob: 'ed72fe68040bf9c69b89999730e8bf8e80a25527',
122
+ diffSha256: 'a31effc46dc4509db3bb42cfddc602da2a5bb46d4e10136abe9f77000af6a896',
123
+ decisionUrl: ISSUE_769_DECISION,
124
+ },
125
+ {
126
+ commit: '69bdedfabc097585cea516ccec8a6ba1d58003ae',
127
+ parent: '3f10ac0d71f69677e6dd4d05def905231a64a298',
128
+ path: `${MODEL_ACCEPTANCE}/fixtures/runtime.ts`,
129
+ oldBlob: NULL_OBJECT_ID,
130
+ newBlob: '24be28c8765e1be3f2434fda6671733cc9db806b',
131
+ diffSha256: '3f060dd7ca4889d726756752cb48dc2c6e423ef69367030ae0139949b79bbd79',
132
+ decisionUrl: ISSUE_769_DECISION,
133
+ },
134
+ {
135
+ commit: '69bdedfabc097585cea516ccec8a6ba1d58003ae',
136
+ parent: '3f10ac0d71f69677e6dd4d05def905231a64a298',
137
+ path: `${MODEL_ACCEPTANCE}/index.md`,
138
+ oldBlob: '7a62b98257b47f48709a8532222c25d116943ecf',
139
+ newBlob: '83ededfe813614539c63c521f263498ca6a14a6c',
140
+ diffSha256: '0ca167590ccedbff242697ac7f7bb707e9afc57b36ec2a0d5a2a3db360735140',
141
+ decisionUrl: ISSUE_769_DECISION,
142
+ },
143
+ // 837d333fd: toolchain sync merge; the paths differ only from its first parent.
144
+ {
145
+ commit: '837d333fdac65e6d2f7b62f7bd4bf73c066c857d',
146
+ parent: 'cced1ffbfaec385e05d4d8466fea659c4ab8cfbc',
147
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.admission-rejection.acceptance.ts`,
148
+ oldBlob: NULL_OBJECT_ID,
149
+ newBlob: 'b551f1a762c9e83840ae998682ba7a39a42d45b4',
150
+ diffSha256: 'f92510e714308d2540480963ba3116ecf81075cfa11163acf822b00be211a3bf',
151
+ decisionUrl: ISSUE_769_DECISION,
152
+ },
153
+ {
154
+ commit: '837d333fdac65e6d2f7b62f7bd4bf73c066c857d',
155
+ parent: 'cced1ffbfaec385e05d4d8466fea659c4ab8cfbc',
156
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.credential-denied.acceptance.ts`,
157
+ oldBlob: NULL_OBJECT_ID,
158
+ newBlob: '5d6a46b9b123f1b6e288cfa9a6e641cb4bba62ec',
159
+ diffSha256: '98a4277048d8e2974e1b24b27a626b6e3c44ef676caeb0e34c95b4f695f65a47',
160
+ decisionUrl: ISSUE_769_DECISION,
161
+ },
162
+ {
163
+ commit: '837d333fdac65e6d2f7b62f7bd4bf73c066c857d',
164
+ parent: 'cced1ffbfaec385e05d4d8466fea659c4ab8cfbc',
165
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.success.acceptance.ts`,
166
+ oldBlob: NULL_OBJECT_ID,
167
+ newBlob: '6c27d0afec06d242af3ee8b9c5251fe506a28b26',
168
+ diffSha256: 'd65fda5375aeff38adf0f69d74c5afbbe44a4fc5572df73b8655ff683c5003ec',
169
+ decisionUrl: ISSUE_769_DECISION,
170
+ },
171
+ {
172
+ commit: '837d333fdac65e6d2f7b62f7bd4bf73c066c857d',
173
+ parent: 'cced1ffbfaec385e05d4d8466fea659c4ab8cfbc',
174
+ path: `${MODEL_ACCEPTANCE}/README.md`,
175
+ oldBlob: 'ccae451371a1a19003fb2199b3dc5378727cceb0',
176
+ newBlob: 'ff535d6769178c43d4d387858b2960dc6d8cb3c2',
177
+ diffSha256: 'dd95dd737a8bda058a4f7bc74e025941127603146e5c38d169eb534511a75870',
178
+ decisionUrl: ISSUE_769_DECISION,
179
+ },
180
+ {
181
+ commit: '837d333fdac65e6d2f7b62f7bd4bf73c066c857d',
182
+ parent: 'cced1ffbfaec385e05d4d8466fea659c4ab8cfbc',
183
+ path: `${MODEL_ACCEPTANCE}/fixtures/README.md`,
184
+ oldBlob: '201cd7fd2a5160e3fa13391b77c4f144670a9827',
185
+ newBlob: '4a1b17f21cfbf8fbd8a6cc122ff19f2eae11f7f1',
186
+ diffSha256: '513c5d79ca30afc0dc9554eb2e550ef1418a901e0bff7c862f9427d3a1a0a36b',
187
+ decisionUrl: ISSUE_769_DECISION,
188
+ },
189
+ {
190
+ commit: '837d333fdac65e6d2f7b62f7bd4bf73c066c857d',
191
+ parent: 'cced1ffbfaec385e05d4d8466fea659c4ab8cfbc',
192
+ path: `${MODEL_ACCEPTANCE}/fixtures/index.md`,
193
+ oldBlob: '2d59e565bcfde009603448b85ba181f0311aa25e',
194
+ newBlob: 'ed72fe68040bf9c69b89999730e8bf8e80a25527',
195
+ diffSha256: 'a31effc46dc4509db3bb42cfddc602da2a5bb46d4e10136abe9f77000af6a896',
196
+ decisionUrl: ISSUE_769_DECISION,
197
+ },
198
+ {
199
+ commit: '837d333fdac65e6d2f7b62f7bd4bf73c066c857d',
200
+ parent: 'cced1ffbfaec385e05d4d8466fea659c4ab8cfbc',
201
+ path: `${MODEL_ACCEPTANCE}/fixtures/runtime.ts`,
202
+ oldBlob: NULL_OBJECT_ID,
203
+ newBlob: '24be28c8765e1be3f2434fda6671733cc9db806b',
204
+ diffSha256: '3f060dd7ca4889d726756752cb48dc2c6e423ef69367030ae0139949b79bbd79',
205
+ decisionUrl: ISSUE_769_DECISION,
206
+ },
207
+ {
208
+ commit: '837d333fdac65e6d2f7b62f7bd4bf73c066c857d',
209
+ parent: 'cced1ffbfaec385e05d4d8466fea659c4ab8cfbc',
210
+ path: `${MODEL_ACCEPTANCE}/index.md`,
211
+ oldBlob: '7a62b98257b47f48709a8532222c25d116943ecf',
212
+ newBlob: '83ededfe813614539c63c521f263498ca6a14a6c',
213
+ diffSha256: '0ca167590ccedbff242697ac7f7bb707e9afc57b36ec2a0d5a2a3db360735140',
214
+ decisionUrl: ISSUE_769_DECISION,
215
+ },
216
+ // 14b0fcfcb: Node engine merge for #549; the paths differ only from its second parent.
217
+ {
218
+ commit: '14b0fcfcb1effda5d41f40bc5293c51eee5c4b6e',
219
+ parent: '6dd1fefa1dcb6646d4221d01767220e2bfc04b05',
220
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.admission-rejection.acceptance.ts`,
221
+ oldBlob: 'b551f1a762c9e83840ae998682ba7a39a42d45b4',
222
+ newBlob: '7958c50949fd3f71b9a279479d31e2b38410c024',
223
+ diffSha256: 'f6e347c3266316b46a56ad2c722edd5754bc09b6a788ff49ce500d2b5ec4049f',
224
+ decisionUrl: ISSUE_769_DECISION,
225
+ },
226
+ {
227
+ commit: '14b0fcfcb1effda5d41f40bc5293c51eee5c4b6e',
228
+ parent: '6dd1fefa1dcb6646d4221d01767220e2bfc04b05',
229
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.credential-denied.acceptance.ts`,
230
+ oldBlob: '5d6a46b9b123f1b6e288cfa9a6e641cb4bba62ec',
231
+ newBlob: '81292c76bf84dd2bf6537d4750ab695ae531bbf1',
232
+ diffSha256: 'a9d32bea1d10639c350b371383fc238ebece299096566f1df6150e9d09df393f',
233
+ decisionUrl: ISSUE_769_DECISION,
234
+ },
235
+ {
236
+ commit: '14b0fcfcb1effda5d41f40bc5293c51eee5c4b6e',
237
+ parent: '6dd1fefa1dcb6646d4221d01767220e2bfc04b05',
238
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.success.acceptance.ts`,
239
+ oldBlob: '6c27d0afec06d242af3ee8b9c5251fe506a28b26',
240
+ newBlob: '6e9d8a5c0b0758713b2c7e4d670d303fd1f6a5e1',
241
+ diffSha256: '9f70ab6cf123d62b3520e418ff9afc43e46f238e277a74372084c63c20bcf9cd',
242
+ decisionUrl: ISSUE_769_DECISION,
243
+ },
244
+ // 06acd53ca: toolchain merge for #549; the paths differ only from its second parent.
245
+ {
246
+ commit: '06acd53ca13e66fc7867a7daec0ff7683c2ee6ac',
247
+ parent: 'ec0de1dba1f7e02cdbef6f35815c23f41c5a9b68',
248
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.admission-rejection.acceptance.ts`,
249
+ oldBlob: 'b551f1a762c9e83840ae998682ba7a39a42d45b4',
250
+ newBlob: '946519832b6a863cb94ce967f7d07370cfa567d8',
251
+ diffSha256: '810c035f8358fb4a6293d01e9fc4ff95c2cab2e7363592a310038898fda6ad6c',
252
+ decisionUrl: ISSUE_769_DECISION,
253
+ },
254
+ {
255
+ commit: '06acd53ca13e66fc7867a7daec0ff7683c2ee6ac',
256
+ parent: 'ec0de1dba1f7e02cdbef6f35815c23f41c5a9b68',
257
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.credential-denied.acceptance.ts`,
258
+ oldBlob: '5d6a46b9b123f1b6e288cfa9a6e641cb4bba62ec',
259
+ newBlob: '81292c76bf84dd2bf6537d4750ab695ae531bbf1',
260
+ diffSha256: 'a9d32bea1d10639c350b371383fc238ebece299096566f1df6150e9d09df393f',
261
+ decisionUrl: ISSUE_769_DECISION,
262
+ },
263
+ {
264
+ commit: '06acd53ca13e66fc7867a7daec0ff7683c2ee6ac',
265
+ parent: 'ec0de1dba1f7e02cdbef6f35815c23f41c5a9b68',
266
+ path: `${MODEL_ACCEPTANCE}/PD-model-invocation.success.acceptance.ts`,
267
+ oldBlob: '6c27d0afec06d242af3ee8b9c5251fe506a28b26',
268
+ newBlob: '6e9d8a5c0b0758713b2c7e4d670d303fd1f6a5e1',
269
+ diffSha256: '9f70ab6cf123d62b3520e418ff9afc43e46f238e277a74372084c63c20bcf9cd',
270
+ decisionUrl: ISSUE_769_DECISION,
271
+ },
272
+ ].map(approval => Object.freeze(approval)));
273
+ /** Each (commit, path) has at most one entry; a duplicate is an artifact defect, not a choice. */
274
+ export function assertUniqueApprovals(list) {
275
+ const keys = new Set(list.map(item => `${item.commit}\0${item.path}`));
276
+ if (keys.size !== list.length)
277
+ throw new Error('Historical acceptance approvals contain a duplicate (commit, path) entry');
278
+ }
279
+ assertUniqueApprovals(HISTORICAL_APPROVALS);
280
+ //# sourceMappingURL=historical-approvals.data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historical-approvals.data.js","sourceRoot":"","sources":["../../src/acceptance/historical-approvals.data.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,7 @@
1
1
  import { execFileSync } from 'node:child_process';
2
2
  import { createHash } from 'node:crypto';
3
3
  import { repositoryEnv } from '../core/git-environment.js';
4
- // The reviewed tool artifact owns this decision. Repository inputs cannot add approvals.
5
- const D010 = Object.freeze({
6
- commit: '48ad37d292796326d65055a75e8a1fde44fe4233',
7
- parent: 'e7aab8ec73002713d2ef6486401816850c984fb1',
8
- path: 'packages/agent/agent/acceptance/README.md',
9
- oldBlob: 'f7fac2fc21bfceb51c3dd84542b866eb7bb12c89',
10
- newBlob: 'fbf0d08732f5d2004c3d63cff6c8be11442da99b',
11
- diffSha256: 'eee5be00ebfdf300db6978cb2981a1b989dcd977846fc3de2669bb835edf3a2c',
12
- decisionUrl: 'https://github.com/nemori-ai/omne-harness-lite/issues/638#issuecomment-6367449357',
13
- });
4
+ import { HISTORICAL_APPROVALS, NULL_OBJECT_ID, assertUniqueApprovals, } from './historical-approvals.data.js';
14
5
  // Fixed diff settings: the same Git objects must give the same bytes under any user or repository
15
6
  // configuration that these settings cover. core.abbrev=8 matches the abbreviation length at
16
7
  // approval time. Do not use --full-index: it changes the bytes and so the approved digest.
@@ -62,49 +53,112 @@ function fingerprintEnv(base) {
62
53
  const { GIT_DIFF_OPTS: _diffOptions, GIT_ATTR_SOURCE: _attributeSource, ...env } = repositoryEnv(base);
63
54
  return { ...env, GIT_ATTR_NOSYSTEM: '1' };
64
55
  }
65
- /** Internal matcher: it can recognize the compiled decision, never authorize a new one. */
66
- export function matchHistoricalApproval(candidate, protectedPaths) {
67
- return protectedPaths.length === 1 &&
68
- protectedPaths[0] === D010.path &&
69
- candidate.commit === D010.commit &&
70
- candidate.parent === D010.parent &&
71
- candidate.path === D010.path &&
72
- candidate.oldBlob === D010.oldBlob &&
73
- candidate.newBlob === D010.newBlob &&
74
- candidate.diffSha256 === D010.diffSha256 &&
75
- candidate.decisionUrl === D010.decisionUrl
76
- ? D010
56
+ /** The protected paths of the commit are exactly the registered ones: one more or one less fails. */
57
+ function coversExactly(list, commit, protectedPaths) {
58
+ const registered = new Set(list.filter(item => item.commit === commit).map(item => item.path));
59
+ const listed = new Set(protectedPaths);
60
+ return (registered.size > 0 &&
61
+ listed.size === protectedPaths.length &&
62
+ listed.size === registered.size &&
63
+ protectedPaths.every(path => registered.has(path)));
64
+ }
65
+ function matchAgainst(list, candidate, protectedPaths) {
66
+ const approval = list.find(item => item.commit === candidate.commit && item.path === candidate.path);
67
+ return approval !== undefined &&
68
+ coversExactly(list, approval.commit, protectedPaths) &&
69
+ candidate.parent === approval.parent &&
70
+ candidate.oldBlob === approval.oldBlob &&
71
+ candidate.newBlob === approval.newBlob &&
72
+ candidate.diffSha256 === approval.diffSha256 &&
73
+ candidate.decisionUrl === approval.decisionUrl
74
+ ? approval
77
75
  : undefined;
78
76
  }
79
- /** Read immutable Git objects; errors propagate to the caller as tool failures. */
80
- export function inspectHistoricalApproval(root, commit, protectedPaths) {
81
- if (commit !== D010.commit || protectedPaths.length !== 1 || protectedPaths[0] !== D010.path)
82
- return undefined;
83
- const git = (args, env = repositoryEnv(process.env)) => execFileSync('git', args, {
77
+ /** Internal matcher: it can recognize a compiled decision, never authorize a new one. */
78
+ export function matchHistoricalApproval(candidate, protectedPaths) {
79
+ return matchAgainst(HISTORICAL_APPROVALS, candidate, protectedPaths);
80
+ }
81
+ function gitIn(root) {
82
+ return (args, env = repositoryEnv(process.env)) => execFileSync('git', args, {
84
83
  cwd: root,
85
84
  env,
86
85
  maxBuffer: 256 * 1024 * 1024,
87
86
  stdio: ['ignore', 'pipe', 'pipe'],
88
87
  });
89
- const objectId = (type, revision) => {
90
- const bytes = git(['cat-file', type, revision]);
91
- return createHash('sha1').update(`${type} ${bytes.length}\0`).update(bytes).digest('hex');
92
- };
93
- if (objectId('commit', commit) !== D010.commit || objectId('commit', D010.parent) !== D010.parent)
94
- return undefined;
95
- const identity = git(['show', '-s', '--format=%H %P', commit]).toString('utf8').trim();
96
- if (identity !== `${D010.commit} ${D010.parent}`)
88
+ }
89
+ function hashObject(type, bytes) {
90
+ return createHash('sha1').update(`${type} ${bytes.length}\0`).update(bytes).digest('hex');
91
+ }
92
+ /** Hash the object bytes again, so a Git replacement object cannot pass as the original. */
93
+ function objectId(git, type, revision) {
94
+ return hashObject(type, git(['cat-file', type, revision]));
95
+ }
96
+ /** The parents written in the commit object itself, read from bytes whose hash was checked. */
97
+ function verifiedParents(git, commit) {
98
+ const bytes = git(['cat-file', 'commit', commit]);
99
+ if (hashObject('commit', bytes) !== commit)
97
100
  return undefined;
98
- return matchHistoricalApproval({
99
- commit,
100
- parent: D010.parent,
101
- path: D010.path,
102
- oldBlob: objectId('blob', `${D010.parent}:${D010.path}`),
103
- newBlob: objectId('blob', `${commit}:${D010.path}`),
101
+ const header = bytes.toString('utf8').split('\n\n', 1)[0] ?? '';
102
+ return header.split('\n').flatMap(line => {
103
+ const parent = /^parent ([0-9a-f]{40})$/u.exec(line)?.[1];
104
+ return parent === undefined ? [] : [parent];
105
+ });
106
+ }
107
+ /** The blob at `revision:path`, or NULL_OBJECT_ID when the tree has no such path. */
108
+ function blobAt(git, revision, path) {
109
+ if (git(['ls-tree', revision, '--', path]).length === 0)
110
+ return NULL_OBJECT_ID;
111
+ return objectId(git, 'blob', `${revision}:${path}`);
112
+ }
113
+ /**
114
+ * Read the change of one path between a parent and a commit from immutable Git objects. The
115
+ * compiled constants come from this same function; errors propagate as tool failures.
116
+ */
117
+ export function observeHistoricalChange(root, commit, parent, path) {
118
+ const git = gitIn(root);
119
+ return {
120
+ oldBlob: blobAt(git, parent, path),
121
+ newBlob: blobAt(git, commit, path),
104
122
  diffSha256: createHash('sha256')
105
- .update(git([...FINGERPRINT_DIFF_ARGS, D010.parent, commit, '--', D010.path], fingerprintEnv(process.env)))
123
+ .update(git([...FINGERPRINT_DIFF_ARGS, parent, commit, '--', path], fingerprintEnv(process.env)))
106
124
  .digest('hex'),
107
- decisionUrl: D010.decisionUrl,
108
- }, protectedPaths);
125
+ };
126
+ }
127
+ /**
128
+ * Test seam only: the same check over a given list. Production code calls
129
+ * inspectHistoricalApproval, which always passes the compiled list; no repository input reaches here.
130
+ */
131
+ export function inspectAgainst(list, root, commit, protectedPaths) {
132
+ assertUniqueApprovals(list);
133
+ if (!coversExactly(list, commit, protectedPaths))
134
+ return [];
135
+ const git = gitIn(root);
136
+ const parents = verifiedParents(git, commit);
137
+ if (parents === undefined)
138
+ return [];
139
+ return list
140
+ .filter(item => item.commit === commit)
141
+ .flatMap(approval => {
142
+ // The candidate takes the registered parent, so these two checks are the only parent guards.
143
+ if (!parents.includes(approval.parent))
144
+ return [];
145
+ if (objectId(git, 'commit', approval.parent) !== approval.parent)
146
+ return [];
147
+ const matched = matchAgainst(list, {
148
+ commit,
149
+ parent: approval.parent,
150
+ path: approval.path,
151
+ ...observeHistoricalChange(root, commit, approval.parent, approval.path),
152
+ decisionUrl: approval.decisionUrl,
153
+ }, protectedPaths);
154
+ return matched === undefined ? [] : [matched];
155
+ });
156
+ }
157
+ /**
158
+ * The compiled approvals that match this commit's protected paths exactly, one for each path.
159
+ * Read immutable Git objects; errors propagate to the caller as tool failures.
160
+ */
161
+ export function inspectHistoricalApproval(root, commit, protectedPaths) {
162
+ return inspectAgainst(HISTORICAL_APPROVALS, root, commit, protectedPaths);
109
163
  }
110
164
  //# sourceMappingURL=historical-approvals.js.map