Skip to content
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
177 commits
Select commit Hold shift + click to select a range
8ce8883
test(acquisition): define fail-closed data-room integrity boundary
seonghobae Aug 6, 2026
4ad83d5
feat(acquisition): recompute bounded data-room evidence integrity
seonghobae Aug 6, 2026
75d8545
feat(acquisition): bind generated manifests to exact source evidence
seonghobae Aug 6, 2026
91c7a02
feat(acquisition): add fail-closed manifest integrity pre-gate
seonghobae Aug 6, 2026
582ae63
refactor(acquisition): route manifest generation through integrity po…
seonghobae Aug 6, 2026
6d53b07
feat(acquisition): require manifest integrity before readiness audit
seonghobae Aug 6, 2026
1f0455e
fix(release): verify generated acquisition evidence integrity
seonghobae Aug 6, 2026
6025af7
docs(acquisition): define authenticated buyer data-room boundary
seonghobae Aug 6, 2026
8d91395
docs(doctoring): ground acquisition evidence integrity in current sta…
seonghobae Aug 6, 2026
ad80bc6
docs(acquisition): make manifest integrity explicit to buyers
seonghobae Aug 6, 2026
6504620
test(acquisition): exercise forged npm gate and evidence substitutions
seonghobae Aug 6, 2026
65302b0
test(acquisition): enforce 100% integrity-module coverage
seonghobae Aug 6, 2026
25ac96d
docs(changelog): record fail-closed acquisition manifest integrity
seonghobae Aug 6, 2026
3a6a8e5
test(acquisition): pin external evidence to reviewed retained path
seonghobae Aug 6, 2026
195b394
fix(acquisition): pin external retained artifact paths
seonghobae Aug 6, 2026
0eb48bd
test(acquisition): bind external evidence fixtures to reviewed paths
seonghobae Aug 6, 2026
89505ca
test(acquisition): cover reviewed external artifact path policy
seonghobae Aug 6, 2026
923fe5b
docs(acquisition): document catalog-pinned external artifacts
seonghobae Aug 6, 2026
2836f59
docs(acquisition): index pinned FigJam export evidence
seonghobae Aug 6, 2026
e76d51a
docs(doctoring): bind external evidence identity to reviewed paths
seonghobae Aug 6, 2026
9abe3be
test(acquisition): keep unsafe catalog fixture type-safe
seonghobae Aug 6, 2026
77f7994
test(acquisition): refuse dirty tracked exact-head evidence
seonghobae Aug 6, 2026
f30c94e
feat(acquisition): authenticate tracked checkout before evidence use
seonghobae Aug 6, 2026
279ba50
fix(acquisition): preflight exact tracked source before manifest load
seonghobae Aug 6, 2026
217c390
fix(acquisition): preflight exact tracked source before integrity audit
seonghobae Aug 6, 2026
8993aa2
test(acquisition): cover isolated exact-Git preflight policy
seonghobae Aug 6, 2026
0756d39
test(acquisition): enforce 100% Git preflight coverage
seonghobae Aug 6, 2026
5a1baac
docs(acquisition): define exact tracked-checkout trust root
seonghobae Aug 6, 2026
110f2db
docs(doctoring): record exact-checkout preflight trust root
seonghobae Aug 6, 2026
87f8e2e
test(acquisition): close Git preflight environment branches
seonghobae Aug 6, 2026
17b1987
docs(changelog): record exact tracked-checkout acquisition preflight
seonghobae Aug 6, 2026
19d45a2
test(acquisition): expose index-flag hidden tracked drift
seonghobae Aug 6, 2026
ed16763
fix(acquisition): reject hidden index-state drift
seonghobae Aug 6, 2026
212c391
test(acquisition): cover bounded index-hint refusal
seonghobae Aug 6, 2026
780b9a3
docs(acquisition): document unsafe Git index-hint refusal
seonghobae Aug 6, 2026
dab40d8
docs(doctoring): ground index-hint refusal in Git semantics
seonghobae Aug 6, 2026
7832a74
docs(changelog): record unsafe Git index-hint refusal
seonghobae Aug 6, 2026
5f13030
test(acquisition): add review regression coverage
seonghobae Aug 6, 2026
a3e82b7
fix(acquisition): fail closed on catalog and empty-file edge cases
seonghobae Aug 6, 2026
b5468d2
fix(acquisition): admit exact CI checkout as safe directory
seonghobae Aug 6, 2026
da159ce
test(acquisition): fix empty-evidence fixture setup
seonghobae Aug 6, 2026
299549d
fix(acquisition): enforce private manifest permissions
seonghobae Aug 6, 2026
b0e50f2
fix(acquisition): enforce private audit permissions
seonghobae Aug 6, 2026
2baabd6
test(acquisition): cover remaining integrity and path regressions
seonghobae Aug 6, 2026
0a02464
fix(acquisition): bind default manifest path to exact head
seonghobae Aug 6, 2026
f7ba213
fix(acquisition): bind integrity audit to shared exact-head path
seonghobae Aug 6, 2026
ef108d9
test(acquisition): make integrity entrypoint test portable
seonghobae Aug 6, 2026
e84802d
test(acquisition): isolate clean-checkout default coverage
seonghobae Aug 6, 2026
ce5f8b8
test(acquisition): isolate Git-binding fixture environment
seonghobae Aug 6, 2026
9e6ff1b
docs(doctoring): correct evidence-integrity standards and path binding
seonghobae Aug 6, 2026
a1e1783
refactor(acquisition): remove unreachable path-normalization branch
seonghobae Aug 6, 2026
18f08ed
docs(acquisition): document exact-head data-room hardening
seonghobae Aug 6, 2026
6b42ee7
docs(acquisition): bind buyer data-room path to exact head
seonghobae Aug 6, 2026
c815c69
fix(acquisition): preserve manifest compatibility contract markers
seonghobae Aug 6, 2026
8f74e7a
test(acquisition): close integrity branch coverage gaps
seonghobae Aug 6, 2026
c6d46cc
test(acquisition): cover fail-closed integrity branches
seonghobae Aug 7, 2026
30ac811
test(acquisition): close remaining branch coverage gaps
seonghobae Aug 7, 2026
e7fc2d1
test(acquisition): fail closed on Git status probe errors
seonghobae Aug 7, 2026
eaf7120
test(acquisition): assert audit exit contracts
seonghobae Aug 7, 2026
5e84f60
test(acquisition): reject symlink output targets
seonghobae Aug 7, 2026
cd749f1
fix(acquisition): add no-follow private output writer
seonghobae Aug 7, 2026
387056f
fix(acquisition): refuse unsafe manifest output targets
seonghobae Aug 7, 2026
3d17eb9
fix(acquisition): refuse unsafe audit output targets
seonghobae Aug 7, 2026
bb2ab1a
test(acquisition): cover private output trust boundary
seonghobae Aug 7, 2026
9815b6f
test(acquisition): enforce private output coverage
seonghobae Aug 7, 2026
dba2365
docs(acquisition): document no-follow output boundary
seonghobae Aug 7, 2026
77acf18
docs(doctoring): justify no-follow evidence outputs
seonghobae Aug 7, 2026
7a76f63
docs(doctoring): keep repository citations portable
seonghobae Aug 7, 2026
7af1ee5
docs(changelog): record safe acquisition output writes
seonghobae Aug 7, 2026
b5fc412
test(acquisition): expose local worktree redirection
seonghobae Aug 7, 2026
9ed61f1
fix(acquisition): bind Git preflight worktree
seonghobae Aug 7, 2026
e6855c5
docs(acquisition): bind audited Git worktree
seonghobae Aug 7, 2026
721d60b
docs(changelog): record Git worktree binding
seonghobae Aug 7, 2026
5c656a5
docs(doctoring): justify Git worktree binding
seonghobae Aug 7, 2026
e7675ef
test(acquisition): expose clean-filter trust bypass
seonghobae Aug 7, 2026
df7498b
fix(acquisition): isolate tracked comparisons from filters
seonghobae Aug 7, 2026
4b2e7bb
test(acquisition): cover split tracked comparisons
seonghobae Aug 7, 2026
397ee32
test(acquisition): reproduce parent symlink output escape
seonghobae Aug 7, 2026
53799ea
docs(acquisition): isolate source checks from clean filters
seonghobae Aug 7, 2026
eb231f4
test(acquisition): cover parent symlink entrypoint escapes
seonghobae Aug 7, 2026
b6658e6
fix(acquisition): reject symbolic-link output parents
seonghobae Aug 7, 2026
26fae39
fix(acquisition): validate manifest output parents before mkdir
seonghobae Aug 7, 2026
ed1eeeb
fix(acquisition): validate audit output parents before mkdir
seonghobae Aug 7, 2026
df1b873
test(acquisition): cover parent-chain validation branches
seonghobae Aug 7, 2026
cac170d
docs(doctoring): localize acquisition worktree binding
seonghobae Aug 7, 2026
26994d2
docs(acquisition): document parent symlink output boundary
seonghobae Aug 7, 2026
e0cb239
docs(doctoring): record output parent path integrity rationale
seonghobae Aug 7, 2026
65eac8d
docs(changelog): record parent symlink output hardening
seonghobae Aug 7, 2026
869a72c
test(acquisition): require permission hardening before content mutation
seonghobae Aug 7, 2026
4b33e1d
fix(acquisition): harden output permissions before content mutation
seonghobae Aug 7, 2026
7c92c05
test(acquisition): preserve content when permission hardening fails
seonghobae Aug 7, 2026
1bfc200
docs(acquisition): harden permissions before output mutation
seonghobae Aug 7, 2026
4bbfe1d
docs(doctoring): bind output mutation to prior permission hardening
seonghobae Aug 7, 2026
fcfcd3f
docs(changelog): record permission-before-mutation output hardening
seonghobae Aug 7, 2026
07e8e91
test(ci): require exact live pull-request head verification
seonghobae Aug 7, 2026
1a663f1
fix(ci): verify the exact live pull-request head
seonghobae Aug 7, 2026
37bbe30
fix(ci): bind reviewer verification to the live PR head
seonghobae Aug 7, 2026
b59a020
docs(ci): define exact-head pull-request verification
seonghobae Aug 7, 2026
491044d
docs(doctoring): justify exact-head CI binding
seonghobae Aug 7, 2026
a750d38
docs(changelog): record exact-head CI binding
seonghobae Aug 7, 2026
1b9f0ec
test(ci): keep PR metadata token out of untrusted test steps
seonghobae Aug 7, 2026
8e2aeb9
fix(ci): scope PR metadata token to stale-head checks
seonghobae Aug 7, 2026
0e323d2
fix(ci): isolate PR metadata token from reviewer execution
seonghobae Aug 7, 2026
a1228ba
docs(ci): keep metadata token out of PR-controlled execution
seonghobae Aug 7, 2026
f58fa99
docs(doctoring): scope metadata token away from PR code
seonghobae Aug 7, 2026
a71c206
test(acquisition): expose repository stat-cache drift bypass
seonghobae Aug 7, 2026
57a1dd8
fix(acquisition): override Git stat-cache trust settings
seonghobae Aug 7, 2026
8b8134b
test(acquisition): require raw tracked-byte authentication
seonghobae Aug 7, 2026
8cab30f
test(acquisition): require strict Git stat policy
seonghobae Aug 7, 2026
bd46741
fix(acquisition): authenticate raw tracked Git blob bytes
seonghobae Aug 7, 2026
834b4ba
test(acquisition): cover tracked-byte index refusal paths
seonghobae Aug 7, 2026
38b59e4
test(acquisition): cover raw tracked-byte verifier
seonghobae Aug 7, 2026
52ec38b
test(acquisition): cover tracked-object hashing failures
seonghobae Aug 7, 2026
89c168f
test(acquisition): enforce byte budget before hashing
seonghobae Aug 7, 2026
5d87c73
fix(acquisition): enforce byte budgets before blob hashing
seonghobae Aug 7, 2026
52cb39b
docs(acquisition): document raw tracked-byte authentication
seonghobae Aug 7, 2026
8dd6c89
docs(doctoring): justify raw Git content authentication
seonghobae Aug 7, 2026
788d79d
test(acquisition): require descriptor-bound raw byte verification
seonghobae Aug 7, 2026
38957d5
fix(acquisition): bind raw Git hashing to no-follow descriptors
seonghobae Aug 7, 2026
29d0a88
test(acquisition): consolidate descriptor-bound blob coverage
seonghobae Aug 7, 2026
5af3fc2
test(acquisition): fold byte budgets into descriptor tests
seonghobae Aug 7, 2026
cde92c5
test(acquisition): consolidate descriptor-bound content coverage
seonghobae Aug 7, 2026
f732327
test(acquisition): reach invalid executable-mode metadata branch
seonghobae Aug 7, 2026
69f2e27
docs(acquisition): align raw-byte authentication with descriptors
seonghobae Aug 7, 2026
38aa07f
docs(doctoring): bind Git content evidence to descriptors
seonghobae Aug 7, 2026
a8f8033
test(acquisition): cover empty path and malformed index header
seonghobae Aug 7, 2026
4148919
docs(changelog): record descriptor-bound Git byte authentication
seonghobae Aug 7, 2026
c0de3ab
test: reject index rewrite against exact acquisition tree
seonghobae Aug 7, 2026
56d8a8c
fix: bind acquisition raw-byte inventory to exact HEAD tree
seonghobae Aug 7, 2026
9c6e593
docs: bind acquisition bytes to immutable exact tree
seonghobae Aug 7, 2026
fe3a12e
docs: doctor immutable exact-tree acquisition authority
seonghobae Aug 7, 2026
e7581cf
test: cover clean and malformed exact-tree identities
seonghobae Aug 7, 2026
6ec5a2c
test: align tracked-source failure contract
seonghobae Aug 7, 2026
55f360f
test: require exact tree for production byte authentication
seonghobae Aug 7, 2026
5c58dae
fix: require immutable tree identity for production byte reads
seonghobae Aug 7, 2026
11cae5b
test: bind racy Git regression to immutable exact tree
seonghobae Aug 7, 2026
b630fbf
test(acquisition): bind changelog to exact-tree authority
seonghobae Aug 7, 2026
3a4500d
docs(acquisition): correct exact-tree byte authority
seonghobae Aug 7, 2026
2077f78
test(docs): require integrity in buyer release gate
seonghobae Aug 7, 2026
bf41d7d
docs(acquisition): include integrity in release gate
seonghobae Aug 7, 2026
9400b2c
test(acquisition): reject unbound transfer rights evidence
seonghobae Aug 9, 2026
478b1b8
fix(acquisition): bind transfer pass to licensing and IP evidence
seonghobae Aug 9, 2026
9355e50
docs(acquisition): define transfer rights evidence schema
seonghobae Aug 9, 2026
eff3a08
test(acquisition): prove transfer rights binding green path
seonghobae Aug 9, 2026
83d77cf
test(acquisition): isolate audit rights fixtures from repository state
seonghobae Aug 9, 2026
5be57fb
test(acquisition): require exact release artifact digest binding
seonghobae Aug 9, 2026
44c7f32
fix(acquisition): authenticate exact release artifact digests
seonghobae Aug 9, 2026
58d75e3
test(acquisition): retain exact release fixture artifacts
seonghobae Aug 9, 2026
4e4c894
test(security): reject symlinked acquisition rights evidence
seonghobae Aug 9, 2026
390f483
fix(security): bind acquisition reads to real repository paths
seonghobae Aug 9, 2026
3e9ff42
test(acquisition): isolate transfer audit environment
seonghobae Aug 9, 2026
5a75250
test(acquisition): isolate readiness audit environment
seonghobae Aug 9, 2026
01e7a7c
test(acquisition): require exact artifact rights metadata
seonghobae Aug 10, 2026
ebd0ea2
fix(acquisition): authenticate release artifact rights metadata
seonghobae Aug 10, 2026
0b61f2f
test(acquisition): add passing artifact rights receipt
seonghobae Aug 10, 2026
497e400
docs(acquisition): require artifact rights receipt binding
seonghobae Aug 10, 2026
b4a9009
docs(acquisition): add artifact rights metadata template
seonghobae Aug 10, 2026
f62a9ac
test(acquisition): cover approved OCI SPDX rights
seonghobae Aug 10, 2026
cfd3e4e
docs(acquisition): index exact artifact rights evidence
seonghobae Aug 10, 2026
86df271
test(acquisition): reject duplicate artifact-rights keys
seonghobae Aug 10, 2026
3acadd1
fix(acquisition): reject ambiguous artifact-rights JSON
seonghobae Aug 10, 2026
4ff607b
test(acquisition): reject duplicate top-level evidence keys
seonghobae Aug 10, 2026
0689fa6
fix(acquisition): reject duplicate top-level JSON evidence
seonghobae Aug 10, 2026
d21af72
merge: reconstruct acquisition data-room integrity on current main
seonghobae Aug 16, 2026
b16fc32
test(acquisition): restore transfer-rights RED contract
seonghobae Aug 16, 2026
af590da
fix(acquisition): bind transfer readiness to retained licensing evidence
seonghobae Aug 16, 2026
7157723
test(acquisition): preserve strict JSON evidence boundaries
seonghobae Aug 16, 2026
afa4741
test(acquisition): restore end-to-end readiness regressions
seonghobae Aug 16, 2026
3dc2a31
docs(acquisition): restore placeholder-safe rights evidence templates
seonghobae Aug 16, 2026
4a4f08f
test(acquisition): retain resolved review regressions
seonghobae Aug 16, 2026
732295b
merge(main): refresh acquisition integrity onto current protected base
seonghobae Aug 16, 2026
91513f0
fix(stack): preserve protected #400 security contract
seonghobae Aug 16, 2026
88a374e
test(acquisition): reject symlinked top-level evidence
seonghobae Aug 16, 2026
09fb39a
fix(acquisition): read top-level JSON evidence fail-closed
seonghobae Aug 16, 2026
820711b
test(acquisition): align unsafe-object evidence classification
seonghobae Aug 16, 2026
a5f7000
test(acquisition): bound full entrypoint integration time
seonghobae Aug 16, 2026
9050194
test(acquisition): bound multi-entrypoint integration time
seonghobae Aug 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Changelog

## Unreleased
- buyer data-room manifest를 authorization input이 아닌 untrusted evidence index로 강화. schema/repository/objective/exact source commit/optional immutable release를 binding하고, reviewed catalog의 exact entry set을 강제하며, local evidence를 bounded `O_NOFOLLOW` descriptor로 pre/post device·inode·size·mtime·ctime stability와 실제 SHA-256/byte size까지 재검증한다. persisted `passed`/`finalGatePassed`/gap list는 recomputation과 일치할 때만 유효하며 arbitrary HTTPS external entry는 immutable local export와 source URL·collection time·collector·provenance·artifact digest receipt가 없으면 declared/non-verifying으로 유지한다. `npm run acquisition:integrity`를 acquisition/release gate 앞에 추가하고 buyer 문서·APA 7th doctoring·test-first regressions를 갱신한다. 실제 KPI·deployment·governance·revenue·transfer evidence는 독립 gate가 통과하기 전까지 RED/NOT_READY로 유지하며 version/release는 변경하지 않는다.
- `hourly-product-development`가 `NVIDIA_NIM_API_KEY`뿐 아니라 `NOEMA_MAINTAINER_APP_CLIENT_ID`와 `NOEMA_MAINTAINER_APP_PRIVATE_KEY` 존재를 checkout·OpenCode 설치·NVIDIA 호출 전에 검증한다. 게시 경로가 준비되지 않았으면 `maintainer_app_unavailable`로 실패 폐쇄하여 알려진 실패에 추론 비용을 쓰지 않으며, `dry_run`은 credential 없이 queue와 task contract를 검토하는 경로로 유지한다. 기존 reviewer App 및 `NOEMA_LLM_API_KEY`·`contextual-orchestrator` reviewer credential 경계는 변경하지 않는다.
- zero open pull requests일 때만 `NVIDIA_NIM_API_KEY` 전용 OpenCode 1.17.13 세션을 실행하는 proposal-only `hourly-product-development` 루프를 추가. minute-47 schedule·non-cancelling single flight·OpenCode binary SHA-256 pin·NVIDIA NIM model fallback·후보 실패 시 clean reset·GitHub/OIDC credential 제거·reviewer key 비참조·full release verification·40-file/500,000-byte proposal budget·trusted one-PR packaging을 강제한다. 각 후보 실행은 900초와 30초 kill grace로 제한하고, 실패 후 `npm ci --ignore-scripts` 재설치는 별도 60초와 10초 kill grace로 제한한다. 재설치가 실패하거나 시간 초과되면 불완전한 dependency tree로 다음 후보를 실행하지 않고 실패 폐쇄한다. 세 후보의 실행·종료 2,790초, 두 번의 후보 간 재설치 140초, 300초 setup/diagnostic reserve를 합친 3,230초가 55분(3,300초) job budget에 들어가며 70초 여유를 남긴다. 마지막 후보가 실패하면 불필요한 reset·clean·재설치를 생략하고 안정적인 전체 후보 실패 진단으로 곧바로 종료한다. 모델 실행, 제안 코드 검증, publication credential을 각각 별도의 GitHub-hosted runner로 분리하고, immutable artifact의 exact ID·workflow-run ID·archive digest와 patch SHA-256·base SHA·file/byte count를 교차 검증하며 symlink(`120000`)와 gitlink(`160000`)를 세 경계 모두에서 차단한다. 제안 코드를 실행한 runner에는 Maintainer App secret/token을 절대 제공하지 않고, 세 번째 non-executing publisher에서만 late-bound repository-scoped App token을 발급한다. merge/release/deploy authority는 기존 `hourly-commercial-readiness` exact-head governance에 유지하며, 운영 Runbook과 OpenCode/NVIDIA/GitHub Actions/NIST SP 800-218 근거를 APA 7th doctoring에 기록했다. package version은 release·deployment·production KPI evidence를 발행하지 않으므로 유지한다.
- `/health` liveness와 분리된 unauthenticated `GET`/`HEAD /ready` runtime readiness endpoint를 추가. GitHub Actions OIDC issuer·audience·organization/workflow binding·exact workflow ref·GitHub Cloud API origin·GitHub App identifiers·PKCS#8 private key를 외부 호출 없이 검증하며, 불완전한 설정은 secret/config value를 반사하지 않는 deterministic failure codes와 `503 ERR_SERVICE_NOT_READY`, `Retry-After`, no-store/nosniff/trace/latency headers로 실패-폐쇄한다. exact workflow named ref는 Git `check-ref-format`의 모호성·유효성 경계(`..`, `//`, dot-leading/`.lock` component, revision-expression 문자, trailing dot/slash 등)를 만족해야 하므로 GitHub가 실제로 표현할 수 없는 ref에서 false-ready가 발생하지 않는다. 배포 smoke contract가 liveness·runtime readiness·unauthenticated exchange challenge를 모두 요구하도록 확장하고 Kubernetes probe separation, RFC 9110, NIST SSDF, Git ref-format 근거를 APA 7th doctoring에 기록했다.
Expand Down
110 changes: 110 additions & 0 deletions docs/acquisition-data-room-integrity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# Acquisition Data-Room Integrity

Noema의 buyer data room은 `data-room-manifest.json`을 **신뢰할 수 있는 판정 결과가 아니라 검증 대상인 색인**으로 취급한다. 매각·인수 readiness 판단은 저장된 `passed`, `finalGatePassed`, `missingRequired`, `missingFinalGate` 값을 그대로 사용하지 않는다. `npm run acquisition:integrity`가 현재 checkout의 정확한 Git commit과 retained evidence bytes에서 이를 다시 계산해야 한다.

## Authoritative commands

```bash
npm run acquisition:manifest
npm run acquisition:integrity
npm run acquisition:audit
```

`npm run acquisition:audit`은 integrity pre-gate를 먼저 실행한다. 따라서 모든 다른 commercial evidence가 green이어도 위조되거나 오래된 manifest는 acquisition readiness를 통과시킬 수 없다. `release:verify`와 `release:verify:strict`도 manifest 생성 직후 동일한 integrity gate를 실행한다.

## Exact source and release binding

생성된 manifest는 다음 identity를 포함한다.

- `schemaVersion: 1`
- `repository: ContextualWisdomLab/noema`
- `objective: NOEMA-GOAL-ACQUISITION-2B-2026-07-02`
- `source.commitSha`: manifest를 생성한 checkout의 정확한 40자리 Git commit
- 선택된 release가 있을 때 `release.tag`와 그 tag가 실제로 가리키는 `release.commitSha`

`NOEMA_DATA_ROOM_SOURCE_COMMIT`을 지정하면 현재 checkout `HEAD`와 정확히 같아야 한다. `NOEMA_RELEASE_UNDER_DILIGENCE_TAG`를 지정하면 immutable SemVer tag가 로컬 Git object database에서 exact commit으로 해석되어야 한다. 불일치하거나 해석할 수 없는 identity는 fail-closed이다.

## Local evidence verification

각 file entry는 reviewed catalog의 고정된 repository-relative path만 사용할 수 있다. verifier는 다음 절차를 독립적으로 수행한다.

1. traversal, absolute path, backslash alias, 빈 path component, `.`/`..`, control character를 거부한다.
2. `lstat`으로 regular file인지 확인하고 symlink를 거부한다.
3. `O_NOFOLLOW | O_RDONLY` descriptor로 파일을 연다.
4. path metadata와 opened descriptor의 device, inode, size, modification/change time을 비교한다.
5. 최대 32 MiB까지 bounded read한다.
6. read 후 descriptor와 path identity를 다시 비교하여 replacement 또는 in-place metadata drift를 거부한다.
7. 실제 bytes에서 SHA-256과 byte size를 다시 계산해 manifest의 stored digest/size와 대조한다.

Manifest와 external verification receipt JSON은 최대 2 MiB이며 fatal UTF-8 decode와 duplicate-object-key 검사를 통과해야 한다. 이 경계는 path replacement, symlink substitution, oversized evidence, truncated read, duplicate-key ambiguity를 authorization 전에 거부한다.

## External evidence is declaration-only by default

`https://` URL은 evidence 존재 증명이 아니다. 예를 들어 FigJam value map URL은 immutable local verification receipt가 없으면 `declared` 상태이며 final gate를 충족하지 않는다.

외부 evidence가 final gate를 충족하려면 reviewed catalog가 **receipt path와 retained artifact path를 둘 다 고정**해야 한다. Receipt는 catalog의 `receiptPath`에 있어야 하며 `artifact.path`는 catalog의 `artifactPath`와 정확히 같아야 한다. 단순히 canonical한 repository-relative path라는 이유만으로 다른 파일을 선택할 수 없다. 예를 들어 동일한 digest metadata를 갖춘 receipt가 `README.md`나 다른 정상 파일을 가리켜도 reviewed artifact path와 다르면 즉시 거부한다.

Receipt는 다음을 모두 충족해야 한다.

```json
{
"schemaVersion": 1,
"repository": "ContextualWisdomLab/noema",
"source": { "commitSha": "<exact 40-character commit>" },
"sourceUrl": "<exact catalog URL>",
"collectedAt": "<canonical UTC timestamp>",
"collector": "<producer or collector identity>",
"provenance": "<how the immutable export was collected>",
"artifact": {
"path": "<exact reviewed catalog artifactPath>",
"bytes": 123,
"sha256": "<64 lowercase/uppercase hex characters>"
}
}
```

Verifier는 receipt가 선언한 임의 경로를 신뢰하지 않고 catalog에 고정된 `artifactPath`만 같은 bounded no-follow 정책으로 읽는다. Retained artifact의 실제 byte size 및 SHA-256을 다시 계산하고 receipt의 값과 비교한다. Receipt의 URL syntax만 맞거나 remote endpoint가 현재 접근 가능하다는 사실만으로는 final gate를 통과하지 않는다. 최종 audit은 네트워크 요청을 하지 않는다.

현재 FigJam entry의 reviewed paths는 다음과 같다.

```text
receiptPath: artifacts/acquisition/figjam-value-map-verification.json
artifactPath: artifacts/acquisition/figjam-value-map-export.json
```

실제 immutable export가 정확한 `artifactPath`에 보존되고 위 receipt가 이를 정확히 인증하기 전까지 이 entry는 `declared`이며 `missingFinalGate`에 남는다.

## Persisted claims are cross-checks, not authority

Verifier는 reviewed catalog를 기준으로 entry ID set을 정확히 비교하고 duplicate/unknown/missing entry를 거부한다. 각 entry의 `id`, `category`, `kind`, `required`, `requiredForFinalGate`, path/command/URL/receipt path/artifact path, validator metadata가 catalog와 동일해야 한다.

그 다음 실제 retained evidence에서 `passed`, `finalGatePassed`, `missingRequired`, `missingFinalGate`를 다시 계산한다. 저장된 값은 trusted recomputation과 정확히 일치해야 하며, 다른 경우 manifest integrity 자체가 실패한다. 따라서 `finalGatePassed: true`를 수동으로 적거나 gap list를 삭제해도 readiness를 만들 수 없다.

## Separation of evidence planes

Data-room integrity PASS는 다음을 의미하지 않는다.

- CI/check run 성공
- GitHub commit status 성공
- human 또는 independent review approval
- CodeRabbit/OpenCode/model judgement 승인
- branch protection 충족
- release acceptance
- production deployment acceptance
- revenue, transfer, production KPI 또는 governance evidence 충족

Integrity gate는 **색인이 주장하는 evidence가 현재 retained bytes와 exact source/release identity에 맞는지**만 검증한다. 실제 KPI·배포·보안·매출·이관 evidence가 없으면 해당 독립 gate는 계속 RED/NOT_READY여야 한다.

## Failure handling

Integrity failure를 해결하기 위해 다음을 해서는 안 된다.

- stored Boolean이나 gap list를 수동으로 green으로 변경
- symlink 또는 alternate path로 evidence 대체
- external receipt가 catalog에 고정되지 않은 임의의 retained path를 선택하게 허용
- arbitrary HTTPS URL을 verified evidence로 분류
- remote fetch를 final audit 안에 삽입
- branch protection, independent approval, security gate 우회
- self-modifying/repair GitHub Actions 추가

Evidence를 다시 수집하거나 올바른 retained artifact를 복구한 뒤 `npm run acquisition:manifest`를 새 exact checkout에서 다시 생성하고 `npm run acquisition:integrity`를 실행한다.
15 changes: 12 additions & 3 deletions docs/buyer-due-diligence-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,13 @@ npm run acquisition:manifest
```

기본 출력은 `artifacts/acquisition-readiness/<YYYYMMDD>/data-room-manifest.json`이다.
Manifest의 최종 evidence 항목은 파일 존재와 SHA-256 색인을 남긴다.
증빙 내용의 유효성은 각 entry의 `validatedBy`에 적힌 명령, 현재는 `npm run acquisition:audit`, 이 통과해야 인정한다.
Manifest는 buyer-readiness authority가 아니라 검증 대상인 색인이다. 생성 직후 다음 명령이 exact checkout의 retained bytes에서 file digest/size, catalog identity, exact source commit, optional release identity, external verification receipt와 모든 gate/gap 값을 다시 계산해야 한다.

```bash
npm run acquisition:integrity
```

Manifest의 최종 evidence 항목은 파일 존재와 SHA-256 색인을 남긴다. 저장된 `passed`, `finalGatePassed`, `missingRequired`, `missingFinalGate`는 authorization input이 아니며 trusted recomputation과 불일치하면 integrity gate가 실패한다. 증빙 내용의 유효성은 각 entry의 `validatedBy`에 적힌 명령, 현재는 `npm run acquisition:audit`, 이 통과해야 인정한다. 상세 contract는 `docs/acquisition-data-room-integrity.md`를 따른다.

## Product

Expand All @@ -20,7 +25,9 @@ Manifest의 최종 evidence 항목은 파일 존재와 SHA-256 색인을 남긴
| API 명세 | `docs/api-spec.md`, `docs/api-stability-contract.md` | ready |
| 온보딩 | `docs/onboarding.md`, `docs/pilot-readiness-checklist.md` | ready |
| 가격/계약 | `docs/pricing-draft.md`, `docs/terms-draft.md`, `docs/sla-and-support.md` | draft |
| Figma/FigJam 구매자 설명 자산 | `https://www.figma.com/board/8l2fELfENAABNhDTMEVJKt` (Figma Code Connect 미사용) | ready |
| Figma/FigJam 구매자 설명 자산 | `https://www.figma.com/board/8l2fELfENAABNhDTMEVJKt`, `artifacts/acquisition/figjam-value-map-verification.json`, `artifacts/acquisition/figjam-value-map-export.json` | declared; catalog-pinned immutable local export + receipt pending |

외부 URL은 그 자체로 final-gate evidence가 아니다. FigJam 자산은 source URL, canonical collection time, collector identity, provenance, retained artifact bytes/SHA-256을 담은 bounded local receipt와 실제 retained artifact가 함께 검증되어야 `present`가 된다. Receipt path는 `artifacts/acquisition/figjam-value-map-verification.json`, retained artifact path는 `artifacts/acquisition/figjam-value-map-export.json`으로 reviewed catalog에 각각 고정된다. Receipt가 canonical하더라도 다른 repository file을 `artifact.path`로 선택하면 검증에 실패한다. 그 전에는 `declared`이며 final gate를 충족하지 않는다.

## Technical

Expand All @@ -30,6 +37,7 @@ Manifest의 최종 evidence 항목은 파일 존재와 SHA-256 색인을 남긴
| CD gate | `.github/workflows/cd.yml` | ready; production evidence required |
| Readiness scan | `.github/workflows/readiness-scan.yml` | ready |
| Acquisition readiness scan | `.github/workflows/acquisition-readiness-scan.yml` | ready |
| Acquisition data-room integrity | `scripts/acquisition-data-room-integrity-audit.mjs`, `scripts/lib/acquisition-data-room-integrity.mjs`, `npm run acquisition:integrity` | ready; retained evidence still independently gated |
| Signed release supply chain | `.github/workflows/release-evidence.yml`, `scripts/release-evidence.mjs`, `docs/release-supply-chain.md`, `test/release-evidence.test.ts` | ready; per-tag artifact required |
| Attested production deployment | `.github/workflows/cd.yml`, `scripts/deployment-evidence.mjs`, `scripts/acquisition-deployment-evidence-audit.mjs`, `docs/deployment-provenance.md` | ready; per-release production artifact required |
| Production environment governance | `scripts/production-environment-governance-audit.mjs`, `artifacts/acquisition/production-environment-governance.json` | pending live evidence |
Expand Down Expand Up @@ -119,6 +127,7 @@ Production 파일럿 로그는 `npm run acquisition:audit`에서도 직접 검
npm run release:verify:strict
npm run readiness:audit
npm run acquisition:manifest
npm run acquisition:integrity
NOEMA_RELEASE_UNDER_DILIGENCE_TAG=v0.1.0 npm run acquisition:audit
```

Expand Down
Loading
Loading