From d22f6eb48550b50abed8e19bc17ca884a62727cf Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 13 Sep 2026 03:43:19 +0900 Subject: [PATCH 1/4] test: require #687 rate-limit reader authority docs --- ...tion-codegraph-locked-body-current.test.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/documentation-codegraph-locked-body-current.test.ts b/test/documentation-codegraph-locked-body-current.test.ts index 8c5e949be..91e415964 100644 --- a/test/documentation-codegraph-locked-body-current.test.ts +++ b/test/documentation-codegraph-locked-body-current.test.ts @@ -85,4 +85,28 @@ describe("protected #681/#678 documentation authority", () => { ); expect(baseline).not.toContain("#685 transfers OIDC/GitHub identity or provider authority to Noema"); }); + + it("records locked distributed rate-limit reader acquisition without importing foreign authority", () => { + const baseline = readFileSync("docs/product-technical-gap-baseline.md", "utf8"); + const changelog = readFileSync("CHANGELOG.md", "utf8"); + const source = readFileSync("src/rate-limit.ts", "utf8"); + + expect(baseline).toContain( + "merged PR #687 exact `98ec07552f4081bd4ff6b25f1f3ed691c0f3f2b9`", + ); + expect(baseline).toContain("256-byte request"); + expect(baseline).toContain("4,096-byte decision"); + expect(baseline).toContain("locked"); + expect(baseline).toContain("immutable release"); + expect(changelog).toContain("PR #687"); + expect(changelog).toContain("rate-limit"); + expect(changelog).toContain("decision body could not be read"); + expect(source).toMatch( + /try \{\s*reader = request\.body\.getReader\(\);\s*\} catch \{\s*return \{ ok: false, status: 400, error: "malformed_json" \};/, + ); + expect(source).toMatch( + /try \{\s*reader = response\.body\.getReader\(\);\s*\} catch \{\s*throw new DistributedRateLimitUnavailable\(\s*"rate-limit Durable Object decision body could not be read"/, + ); + expect(baseline).not.toContain("#687 transfers provider routing, outbound, credential, or quarantine/security authority to Noema"); + }); }); From 6bebda71edf707435a2639e019fdd8b18a6b3ddb Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 13 Sep 2026 03:47:20 +0900 Subject: [PATCH 2/4] docs: record #687 rate-limit reader authority --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a5c5fa96..1573ab8a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - Add a Noema-owned exact-claim evidence receipt contract whose execution and research producers serialize one canonical artifact that binds every receipt semantic field, including command/result/isolation/network or source revision/excerpt/retrieval policy. Admission accepts only a receipt ID from untrusted model output. The owner API first verifies the exact authenticated OpenCode-handoff manifest digest, canonical envelope bytes, reviewed producer-to-kind policy, and repository/head/workflow/run/attempt identity before it can construct an immutable typed index; admission then reconstructs each canonical artifact and verifies time/claim/artifact identity. The version-2 manifest now binds a separate producer-authenticated `ClaimEvidenceRequirement` containing the exact claim, independently required evidence kind, and `context` or `finding` publication authority. Raw current-head source lines are context only: they are withheld from finding-reference prompts and cannot publish a finding or `request_changes`; an explicitly producer-authorized source finding remains usable and retains exact path/line checks. Finding-free model `request_changes` and `blocked` verdicts cannot bypass receipt admission to publish a vacuous blocking review. Requirement/receipt kind mismatch, fixed-artifact semantic substitution, caller-supplied receipt dictionaries, model self-classification, stale identities, cross-kind receipts, marker-only sandbox output, noncanonical artifact bytes, and expired receipts fail closed before the GitHub publisher. This remains the owner prerequisite for ContextualWisdomLab/.github#1641 and issue #555. The reviewed `sandboxed_verify` adapter exists in owner source, but its actual central stdout/stderr/marker-to-manifest wiring and the trusted research producer are not yet integrated; exact-head hosted GREEN, immutable release, and the verified central consumer bump remain required. ## Unreleased +- Protected #687 normalizes reader acquisition on the distributed `/exchange` private Durable Object rate-limit transport. If an already locked/non-stream-readable 256-byte internal request makes `request.body.getReader()` throw synchronously, it returns the established `400 malformed_json` contract before storage authority; a locked 4,096-byte decision response fails closed with the stable `rate-limit Durable Object decision body could not be read` diagnostic. Existing fixed retained buffers, byte ceilings, best-effort cancellation, reader-lock release after successful acquisition, fatal UTF-8·duplicate-key·JSON admission, and bucket/identity/Durable Object authority remain unchanged. Provider/model routing, destination/outbound policy, credential authority, quarantine/security authority, release/deployment authority, and foreign-domain truth remain with their existing owners; this protected source is not an immutable release or deployed recovery/p95/heap evidence. PR #687. - Protected #685 normalizes reader acquisition on Noema's OIDC replay guard bounded transport. If an already locked/non-stream-readable 4,096-byte decision response makes `response.body.getReader()` throw synchronously, the reader now fails closed with the stable `OIDC replay guard decision body could not be read` diagnostic; a locked 512-byte internal claim request returns the established `400 malformed_json` contract before Durable Object storage authority. Existing fixed retained buffers, byte ceilings, best-effort cancellation, reader-lock release after successful acquisition, fatal UTF-8·duplicate-key·JSON admission, and replay/storage authority remain unchanged. OIDC/GitHub identity, provider/model routing, destination/outbound policy, credential, quarantine/security, release/deployment, and foreign-domain authority remain with their existing owners; this protected source is not an immutable release or deployed recovery/p95/heap evidence. PR #685. - Protected #683 normalizes reader acquisition on the 1 MiB bounded Cloudflare production control-plane deploy/status/recovery response transport. If a locked Cloudflare control-plane response body makes `body.getReader()` throw synchronously, the reader now fails closed with the stable `${operation} response body is not stream-readable` diagnostic instead of leaking the raw stream exception; the existing fixed retained buffer, byte ceiling, timeout, cancellation-liveness, reader-lock, fatal UTF-8/JSON and provider-error semantics remain unchanged. This repair does not transfer Cloudflare/provider authority, destination/outbound policy, credential authority, quarantine/security authority, release/deployment authority or foreign domain truth into Noema, and protected source is not an immutable release, controlled production recovery rehearsal or deployed p95/heap evidence. PR #683. - Protected #681 keeps the authenticated Distroless Debian 13 CodeGraph sandbox and existing Trivy MEDIUM/HIGH/CRITICAL fail-closed scan while repairing the reviewed glibc substrate at `2.41-12+deb13u4`. The shared preparation contract uses authenticated Debian snapshot `20260711T202405Z`, admits only the exact Debian 12 and Debian 13 automatic archive primary keys needed for that signed historical transition, verifies `InRelease`→`Packages.xz`→exact package digests, and accepts the derived local immutable image ID only after the same Trivy gate. This reviewer-isolation integration does not transfer quarantine/security verdict, provider/model routing, outbound authority, release/deployment authority, or foreign domain truth into Noema, and the ephemeral CI image is not an immutable release. PR #681. From f8d0e776175e883a6f663cf5ee7fa7f1158beac3 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 13 Sep 2026 03:48:33 +0900 Subject: [PATCH 3/4] docs: converge #687 product gap authority --- docs/product-technical-gap-baseline.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index afd005c13..8c83432c5 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -4,11 +4,11 @@ 이 문서는 protected source, active candidate, transient workflow evidence와 foreign-owner authority를 분리한다. Open PR exact head, protected base, required workflow, review thread, release와 central dependency는 mutation·merge·release 직전에 다시 읽는다. predecessor GREEN, queued/pending/in_progress/skipped/cancelled run, 오래된 PR base snapshot과 scanner/model judgement는 다음 revision의 merge authority로 전용하지 않는다. queued는 GREEN이 아니다. -Current protected source는 mutation·merge·release 시점에 live protected `main`을 다시 조회해 결정한다. 이 문서 안의 exact source SHA는 dated observation 또는 protected history일 뿐 future merge 뒤 evergreen current authority로 사용하지 않는다. Dated protected observation for this repair는 `main@0ba3fe2f484cbd8e6f6f8b32df4768cba9a8baa2`이다. #681의 GitHub-verified normal merge identity `1fd5d80018837d374bb3776f46ebed54db4dc6af`, #678의 GitHub-verified normal merge identity `a49d8532df6ac4d2eead11867047c1c4d0fa3359`, #683의 GitHub-verified normal merge identity `20452140e6d6f91e92f2491c15f53e8eef0dc6f8`, 그리고 #685의 GitHub-verified normal merge identity `0ba3fe2f484cbd8e6f6f8b32df4768cba9a8baa2`는 protected history에 포함되며, 이후 protected-main 전진을 이 문서의 evergreen authority로 전용하지 않는다. +Current protected source는 mutation·merge·release 시점에 live protected `main`을 다시 조회해 결정한다. 이 문서 안의 exact source SHA는 dated observation 또는 protected history일 뿐 future merge 뒤 evergreen current authority로 사용하지 않는다. Dated protected observation for this repair는 `main@f9d08f4a78f55989b58eb8b12d152933e40cc807`이다. #681의 GitHub-verified normal merge identity `1fd5d80018837d374bb3776f46ebed54db4dc6af`, #678의 GitHub-verified normal merge identity `a49d8532df6ac4d2eead11867047c1c4d0fa3359`, #683의 GitHub-verified normal merge identity `20452140e6d6f91e92f2491c15f53e8eef0dc6f8`, #685의 GitHub-verified normal merge identity `0ba3fe2f484cbd8e6f6f8b32df4768cba9a8baa2`, 그리고 #687의 GitHub-verified normal merge identity `f9d08f4a78f55989b58eb8b12d152933e40cc807`는 protected history에 포함되며, 이후 protected-main 전진을 이 문서의 evergreen authority로 전용하지 않는다. Dated central control-plane observation for this repair는 central `.github/main@cb0872c9a20d5584703dffacca65c096fc034c6c`다. Noema runtime의 reviewed immutable central consumer pin은 `c9052e607e5f3cc76e73207e7786b21500721b79`이고 runtime authority 표현은 `ALLOWED_WORKFLOW_SHA = c9052e607e5f3cc76e73207e7786b21500721b79`다. Moving foreign head와 reviewed immutable pin을 같은 권위로 취급하지 않으며 central moving head가 전진했다고 consumer pin을 자동 승격하지 않는다. -Protected history에는 merged PR #535 exact `82b20b293f0a5f0ac0e69857c1b61dddfe478491`, merged PR #540 exact `05bc2d47c3899ebe17538070f9a30172f90307ac`, merged PR #542 exact `ca839298fcaeec409091dc909789b6f87eb67fdc`, merged PR #547 exact `30b7e7e5cdab8de65715834a16f994b2047eafa6`, merged PR #550 exact `f2ec2dc6709814070cc3e3d6932ce280aee966db`, merged PR #553 exact `3bd9f543e97ce856f78b1c608141436298ce9e74`, merged PR #558 exact `2f91bf8641212ecae435b5fbcc9084cc0acd6295`, merged PR #556 exact `860714cba46dba06260a5dce09d0e9152fcb0a8c`, merged PR #560 exact `5aab7c098f3478069127f34e398326415ec599a4`, merged PR #582 exact `0f20a4dc78e423fd5df49e137a4eb286c7075ea4`, documentation-authority integration #583, protected procedural graph source #585/#586, documentation convergence #587/#588/#590/#595, workflow-backed current-state integration #589, procedural decision/evaluation/authentication integrations #591/#592/#593/#594/#596, State / Checkpoint history #597, Policy / Approval CAS #601, publication preflight #603, Workflow / Task exact-object operability integration #605, documentation-authority convergence #606, merged PR #607 exact `0afd68d2e33b7fd9be2307ba78b370b534cc0f54`, merged PR #610 exact `0a516bc54d682817ffea3206ec8b24b214aa94ea`, merged PR #612 exact `a919be3bc2a04068e25a4592e0c9c26f8e63534b`, merged PR #614 exact `77c5116a2e58e8a154ee893a3825da19c9c1f357`, merged PR #616 exact `da8461f1f5a6d02d926dd295fc88abe2c6167dfa`, documentation-authority convergence PR #617 exact `38b3b56837d875d19ae458f3f5491951ad7afb1c`, merged PR #618 exact `fb166ec6ecc769a19fd4ae4502f6d0994fc89e33`, merged PR #620 exact `b746846e4890c84b568bb29937594e1b17364fa1`, documentation-authority convergence #639, merged PR #640 exact `72ff4897822b5a8122540509346be4f3278a1379`, merged PR #641 exact `73f13b3a3826c5d6f7aafc89d1ff23747f8cf8e9`, merged PR #642 exact `3427e5a66d7a0ea9379ddc7915ba2b3d1872c492`, merged PR #643 exact `b13903e3208232086871d7f117f8f20e753eb583`, merged PR #644 exact `79a89f5775d0fb56de9f1908c1927df0b498b70f`, merged PR #645 exact `1b4dc38581e99b92342769dd03059f5015ee9f04`, merged PR #646 exact `3005086fca2c6376fae951b774230fa1c06ba587`, merged PR #647 exact `ea3a36bc65df88153aa69a05e3144f0b5352b5a6`, merged PR #648 exact `133ce20c4bb7fb9ba05e3e4bedeb0492334faf38`, merged PR #649 exact `f334f40193da8811a6e15efcb2d589aa80104931`, merged PR #650 exact `f59fce008a4da70f89e9927f692b823506594ed5`, documentation-authority convergence #651, merged PR #652 exact `23fabd95f3ef886c6bef0ae9ff6ead50dc0ce342`, documentation-authority convergence PR #653 exact `41ff085c89e27a97a00ce85ced968931f506a147`, merged PR #654 exact `f8d4b6b6b095c7674037a9ea5281b9ffa2f0f864`, merged PR #655 exact `dc851fc9ea67e38799e8c30cf4916a31c9e9661e`, merged PR #657 exact `fa4a2ab25231fa4c8b9a8451a4da6f29e04abaf7`, documentation-authority convergence PR #658 exact `5fe54442068646ad9581d39b23dd6d60a737aa66`, merged PR #659 exact `6357ac65db6a0db9f3bbb3f82196853b787f33cc`, merged PR #661 exact `5a5e147c5a7168277332eb828652b4aea4f7f2ba`, merged PR #663 exact `29dfa79692ec55cdc23ed892081425630ac916b5`, merged PR #665 exact `592ae00f090f642e8cb71ffb132d4a8b7bfe993a`, merged PR #668 exact `efaaebae161a71b1274f5aa0f26e27376a3edb3a`, merged PR #670 exact `14b4c9a46692df0084a03b9a3b2ae4acf1178a83`, merged PR #673 exact `6f9dc4ca047817e4c9ef5ae8a55816493b1c558d`, merged PR #676 exact `f8de7fc27d475c76477271fa50dd7032afd82a6c`, merged PR #681 exact `7072822253b1975cea76dcd7922e1a01d67e7681`, merged PR #678 exact `ac367cb535525742a1b6f3682d3ab5b14ef66f23`, merged PR #683 exact `01adb5af3d26788926164003bc44a761f5ff3654`, 그리고 merged PR #685 exact `93dcf4c50018ce051e3ca917a4e1d63cbca3102d`가 포함돼 있다. 이 식별자는 역사 증거이지 open-candidate authority가 아니다. +Protected history에는 merged PR #535 exact `82b20b293f0a5f0ac0e69857c1b61dddfe478491`, merged PR #540 exact `05bc2d47c3899ebe17538070f9a30172f90307ac`, merged PR #542 exact `ca839298fcaeec409091dc909789b6f87eb67fdc`, merged PR #547 exact `30b7e7e5cdab8de65715834a16f994b2047eafa6`, merged PR #550 exact `f2ec2dc6709814070cc3e3d6932ce280aee966db`, merged PR #553 exact `3bd9f543e97ce856f78b1c608141436298ce9e74`, merged PR #558 exact `2f91bf8641212ecae435b5fbcc9084cc0acd6295`, merged PR #556 exact `860714cba46dba06260a5dce09d0e9152fcb0a8c`, merged PR #560 exact `5aab7c098f3478069127f34e398326415ec599a4`, merged PR #582 exact `0f20a4dc78e423fd5df49e137a4eb286c7075ea4`, documentation-authority integration #583, protected procedural graph source #585/#586, documentation convergence #587/#588/#590/#595, workflow-backed current-state integration #589, procedural decision/evaluation/authentication integrations #591/#592/#593/#594/#596, State / Checkpoint history #597, Policy / Approval CAS #601, publication preflight #603, Workflow / Task exact-object operability integration #605, documentation-authority convergence #606, merged PR #607 exact `0afd68d2e33b7fd9be2307ba78b370b534cc0f54`, merged PR #610 exact `0a516bc54d682817ffea3206ec8b24b214aa94ea`, merged PR #612 exact `a919be3bc2a04068e25a4592e0c9c26f8e63534b`, merged PR #614 exact `77c5116a2e58e8a154ee893a3825da19c9c1f357`, merged PR #616 exact `da8461f1f5a6d02d926dd295fc88abe2c6167dfa`, documentation-authority convergence PR #617 exact `38b3b56837d875d19ae458f3f5491951ad7afb1c`, merged PR #618 exact `fb166ec6ecc769a19fd4ae4502f6d0994fc89e33`, merged PR #620 exact `b746846e4890c84b568bb29937594e1b17364fa1`, documentation-authority convergence #639, merged PR #640 exact `72ff4897822b5a8122540509346be4f3278a1379`, merged PR #641 exact `73f13b3a3826c5d6f7aafc89d1ff23747f8cf8e9`, merged PR #642 exact `3427e5a66d7a0ea9379ddc7915ba2b3d1872c492`, merged PR #643 exact `b13903e3208232086871d7f117f8f20e753eb583`, merged PR #644 exact `79a89f5775d0fb56de9f1908c1927df0b498b70f`, merged PR #645 exact `1b4dc38581e99b92342769dd03059f5015ee9f04`, merged PR #646 exact `3005086fca2c6376fae951b774230fa1c06ba587`, merged PR #647 exact `ea3a36bc65df88153aa69a05e3144f0b5352b5a6`, merged PR #648 exact `133ce20c4bb7fb9ba05e3e4bedeb0492334faf38`, merged PR #649 exact `f334f40193da8811a6e15efcb2d589aa80104931`, merged PR #650 exact `f59fce008a4da70f89e9927f692b823506594ed5`, documentation-authority convergence #651, merged PR #652 exact `23fabd95f3ef886c6bef0ae9ff6ead50dc0ce342`, documentation-authority convergence PR #653 exact `41ff085c89e27a97a00ce85ced968931f506a147`, merged PR #654 exact `f8d4b6b6b095c7674037a9ea5281b9ffa2f0f864`, merged PR #655 exact `dc851fc9ea67e38799e8c30cf4916a31c9e9661e`, merged PR #657 exact `fa4a2ab25231fa4c8b9a8451a4da6f29e04abaf7`, documentation-authority convergence PR #658 exact `5fe54442068646ad9581d39b23dd6d60a737aa66`, merged PR #659 exact `6357ac65db6a0db9f3bbb3f82196853b787f33cc`, merged PR #661 exact `5a5e147c5a7168277332eb828652b4aea4f7f2ba`, merged PR #663 exact `29dfa79692ec55cdc23ed892081425630ac916b5`, merged PR #665 exact `592ae00f090f642e8cb71ffb132d4a8b7bfe993a`, merged PR #668 exact `efaaebae161a71b1274f5aa0f26e27376a3edb3a`, merged PR #670 exact `14b4c9a46692df0084a03b9a3b2ae4acf1178a83`, merged PR #673 exact `6f9dc4ca047817e4c9ef5ae8a55816493b1c558d`, merged PR #676 exact `f8de7fc27d475c76477271fa50dd7032afd82a6c`, merged PR #681 exact `7072822253b1975cea76dcd7922e1a01d67e7681`, merged PR #678 exact `ac367cb535525742a1b6f3682d3ab5b14ef66f23`, merged PR #683 exact `01adb5af3d26788926164003bc44a761f5ff3654`, merged PR #685 exact `93dcf4c50018ce051e3ca917a4e1d63cbca3102d`, 그리고 merged PR #687 exact `98ec07552f4081bd4ff6b25f1f3ed691c0f3f2b9`가 포함돼 있다. 이 식별자는 역사 증거이지 open-candidate authority가 아니다. 이 baseline과 executable documentation-authority test는 active documentation-authority lane 하나만 write한다. mutation 직전 open PR/Issue/branch를 fresh-read해 writer를 결정하며 merged/closed historical PR 번호를 active sole writer로 고정하지 않는다. 다른 feature lane의 과거 baseline blob은 ordinary/non-force semantic convergence 때 current authority로 승계하지 않는다. @@ -24,6 +24,8 @@ Protected #683 exact `01adb5af3d26788926164003bc44a761f5ff3654`은 production de Protected #685 exact `93dcf4c50018ce051e3ca917a4e1d63cbca3102d`은 Noema-owned OIDC replay guard의 reader acquisition을 fail-closed transport boundary로 완성한다. 이미 locked/non-stream-readable **4,096-byte decision response**에서 `response.body.getReader()`가 동기적으로 실패하면 안정적인 `OIDC replay guard decision body could not be read` 진단으로 정규화하고, 이미 locked **512-byte internal claim request**는 Durable Object storage authority에 도달하기 전에 기존 `400 malformed_json` 계약으로 거부한다. 기존 fixed retained buffers, byte ceilings, best-effort cancellation, reader acquisition 이후 terminal lock release, fatal UTF-8·duplicate-key·JSON admission과 replay/storage semantics는 유지된다. OIDC/GitHub identity와 provider authority는 기존 owner에 남으며 Noema는 replay transport/error admission만 수리했다. 이 protected source/test authority는 immutable release, deployed Durable Object recovery, production p95/heap 또는 production outcome evidence를 대신하지 않는다. +Protected #687 exact `98ec07552f4081bd4ff6b25f1f3ed691c0f3f2b9`은 distributed `/exchange` private Durable Object rate-limit transport의 reader acquisition을 fail-closed boundary로 완성한다. 이미 locked/non-stream-readable **256-byte request**에서 `request.body.getReader()`가 동기적으로 실패하면 Durable Object storage authority 전에 기존 `400 malformed_json` 계약으로 거부하고, 이미 locked **4,096-byte decision** response에서 `response.body.getReader()`가 동기적으로 실패하면 안정적인 `rate-limit Durable Object decision body could not be read` 진단으로 정규화한다. 기존 fixed retained buffers, byte ceilings, best-effort cancellation, reader acquisition 이후 terminal lock release, fatal UTF-8·duplicate-key·JSON admission과 bucket/identity/Durable Object semantics는 유지된다. #687 transfers provider routing, outbound, credential, or quarantine/security authority to Noema 같은 권위 이전은 허용하지 않으며 provider/model routing, destination/outbound policy, credential, quarantine/security, release/deployment 및 foreign-domain authority는 기존 owner에 남는다. 이 protected source/test authority는 immutable release, deployed Durable Object recovery, production p95/heap 또는 production outcome evidence를 대신하지 않는다. + Baseline의 요구·설계·데이터·경계 authority는 `docs/PRD.md`, `docs/TRD.md`, `docs/UML.md`, `docs/ERD.md`, `docs/CONTEXT_MAP.md`다. 이 register는 그 문서와 ADR을 대체하지 않고 current Gap/Action/Status를 exact source·PR·workflow evidence에 결합한다. ADR 0015는 protected source에 포함됐지만 상태는 `Proposed`이며 production activation-authority integration, deployed lifecycle operability/recovery evidence, immutable shared-contract consumption, live pilot와 release evidence가 남아 있다. ADR 0017도 `Proposed`다. ADR 0018도 `Proposed`이며 protected #612/#614/#616/#618/#620/#665/#683 source는 recovery command semantics, provider-state verification, bounded Cloudflare control-plane response transport·retained-heap bound·oversize cancellation-liveness·locked-reader acquisition normalization을 보호하지만 controlled production recovery rehearsal, immutable release, SLO 또는 production outcome의 증거가 아니다. Protected #585/#586은 bounded Noema Agent Runtime advisory graph/session mechanics를 구현했고 protected #585/#586/#589 lineage는 기존 Workflow / Task Execution authority를 current-state ACL로 재사용한다. Protected #603 + #652 + #663 + #678 lineage에서 #603 publication preflight는 current State / Checkpoint와 Policy / Approval을 안정적인 double-read window에서 다시 읽고 exact graph/history/evaluator/signer/approval identity를 결합하고, #652는 그 Agent Runtime current-state ACL의 private Workflow / Task Execution response를 **fixed 1 MiB retained buffer**로 제한한다. #663은 oversize chunk를 copy 전에 실패-폐쇄하는 경계를 유지하면서 cancellation completion is best-effort cleanup으로 분리해 stalled cancellation이 안정적인 거부 결정을 지연하지 않게 하고, reader lock은 cleanup 성공과 독립적으로 terminal path에서 해제한다. #678은 reader acquisition 자체를 untrusted response boundary로 다뤄 이미 locked response body에서 `getReader()`가 동기 예외를 내도 안정적인 `invalid_workflow_state_response`로 실패-폐쇄한다. 이 transport hardening은 Workflow / Task lifecycle, graph publication 또는 activation authority를 추가하지 않는다. Protected #597은 bounded durable evaluation/rejection history를 기존 State / Checkpoint에 추가했고 #601은 별도 Noema Policy / Approval CAS를 추가했다. #603 preflight는 `publicationAuthorized:false`와 `activationAuthorized:false`를 유지한다. 실제 graph publication, current non-workflow lifecycle/revocation, live Keyverse/owner signer trust, released wire contract, deployed p95/recovery evidence, canary/rollback과 product outcome은 별도 authority다. @@ -91,7 +93,7 @@ Protected #641–#650 remove a repeated bounded-bytes-but-unbounded-fragment-car The protected lineage covers contextual-orchestrator health response consumption (#641), CodeGraph command-output capture (#642), hourly proposal path counting/isolation (#643), stable release/dependency-evidence file readers (#644), workflow-registry GitHub response readers (#645), external OIDC/GitHub JSON response consumption (#646), credential-egress response consumption (#647), public `/exchange` request-body admission (#648), OIDC replay request/decision transport (#649), and distributed rate-limit request/decision transport (#650). #640 separately keeps reviewer documentation aligned with the already-protected rule that Noema does not own model timeout/retry/failover attempt allocation. -Protected #654, #655, #657, #659, #661, #663, #665, #668, #670, #673, #676, #678, #683 and #685 add bounded-reader lifecycle/liveness/acquisition closure after retained-byte admission. #654 returns the 65,536-byte external OIDC discovery/JWKS and GitHub API JSON reader lock after success, timeout, read failure or fail-closed admission cleanup. #655 does the same for the OIDC replay guard's 4,096-byte decision response and 512-byte internal claim request readers, including failure-path cancellation. #657 returns the distributed `/exchange` private Durable Object 256-byte request and 4,096-byte decision reader lock on every terminal path after reader acquisition. Declared-length overflow and null-body validation occur before reader acquisition and therefore hold no reader lock. #659 returns the already-authorized bounded outbound response reader lock after reader acquisition on success, oversize and read-failure terminal paths while retaining the existing 1 MiB fixed buffer, timeout/cancellation and fail-closed response semantics. #661 returns the public `/exchange` JSON request body reader lock after reader acquisition on terminal paths while retaining the existing 8 KiB body ceiling and 10-second absolute deadline. #663 retains #652's 1 MiB private current-state buffer and copy-before-reject ceiling but makes cancellation completion is best-effort cleanup: cancellation is requested before an over-limit chunk is copied, stalled/rejected cleanup cannot delay or replace the stable fail-closed diagnostic, and the reader lock is released independently on the terminal path. #665 applies the same liveness separation to the shared Cloudflare control-plane response reader used by deploy/status/recovery while preserving its 1 MiB fixed retained buffer and terminal reader-lock cleanup. Protected #668 closes the external OIDC/GitHub JSON response cancellation-liveness gap: after the 65,536-byte reader detects an oversize chunk, stalled/rejected cleanup cannot delay or replace the stable failure, and the reader lock is released independently. Protected #670 closes the contextual-orchestrator health response cancellation-liveness gap: after either advertised Content-Length or streamed bytes exceed the 65,536-byte ceiling, stalled/rejected or synchronously throwing cleanup cannot delay or replace the stable failure, and the consumed reader lock is released independently. Protected #673 preserves the private-vulnerability-reporting response size-limit classification when cancellation cleanup fails synchronously: after the 16 KiB ceiling is exceeded, synchronous cleanup faults cannot replace the stable size-limit failure, asynchronous cancellation rejection remains best-effort cleanup, and the consumed reader lock is released independently on the terminal path. Protected #676 closes the synchronous external JSON cancellation-fault gap. The external OIDC discovery/JWKS·GitHub API bounded JSON response reader keeps its 65,536-byte ceiling, 10-second absolute deadline, fixed retained buffer, fatal UTF-8·duplicate-key·JSON admission and independent terminal reader-lock cleanup; synchronous `reader.cancel()` throw cannot replace an already-established deadline or oversize decision, and asynchronous rejection/non-settling cancellation completion remains best-effort cleanup rather than decision authority. #678 closes reader-acquisition failure on the 1 MiB private Agent Runtime current-state response path: a locked response body no longer leaks a raw `getReader()` exception and instead returns the same stable `invalid_workflow_state_response` fail-closed classification. #683 closes the corresponding reader-acquisition failure on the 1 MiB Cloudflare deploy/status/recovery control-plane response path: a locked Cloudflare control-plane response body now fails closed with `${operation} response body is not stream-readable` while all existing bounded-transport and provider-authority semantics remain intact. #685 closes the remaining OIDC replay reader-acquisition gap: a locked 4,096-byte decision response yields the stable `OIDC replay guard decision body could not be read` failure, while a locked 512-byte internal claim request returns `400 malformed_json` before storage authority. #676 does not transfer OIDC/GitHub identity, provider routing, destination/outbound policy, credential authority, quarantine/security authority, release/deployment authority, or foreign domain truth to Noema. Protected #676 remains source/test authority; immutable release and deployed heap/p95 evidence remain separate. The cleanup does not relax byte ceilings, fixed retained buffers, fatal UTF-8/duplicate-key/JSON admission, replay/storage authority, bucket/identity/Durable Object authority, credential authority, provider routing or outbound/quarantine ownership. #659 does not transfer destination policy or foreign outbound authority to Noema. #661 does not transfer provider routing, destination policy or foreign outbound authority, credential authority, quarantine/security verdicts, or foreign domain truth to Noema. #663 does not transfer Workflow / Task lifecycle truth, procedural graph publication/activation, provider routing, destination/outbound authority, credential authority, quarantine/security verdicts, or foreign domain truth into Agent Runtime. #665 does not transfer Cloudflare/provider authority, destination/outbound policy, credential authority, quarantine/security authority, or foreign domain truth to Noema. #668 does not transfer OIDC/GitHub identity, credential, provider-routing, destination/outbound, quarantine/security, or foreign domain authority to Noema. #670 does not transfer contextual-orchestrator service, provider/model routing, credential, outbound, quarantine/security, or foreign domain authority to Noema. #670 remains protected source evidence; immutable release and deployed availability/p95 evidence remain separate. #673 does not transfer private-vulnerability-reporting setting authority, GitHub identity, provider routing, outbound policy, quarantine/security, or foreign domain authority to Noema. #673 remains protected source evidence; immutable release, deployment, and production outcome evidence remain separate. #678 does not transfer Workflow / Task lifecycle authority to Agent Runtime and remains protected source/test authority; immutable release, deployed Durable Object recovery and production p95 evidence remain separate. #683 does not transfer Cloudflare/provider authority to Noema and remains protected source/test authority; immutable release, controlled production recovery rehearsal and deployed p95/heap evidence remain separate. #685 retains OIDC/GitHub identity, provider routing, credential, destination/outbound and quarantine/security authority with their existing owners; it changes only Noema's replay transport error admission. Across the bounded-reader lineage, immutable release and deployed heap/p95 evidence remain separate. +Protected #654, #655, #657, #659, #661, #663, #665, #668, #670, #673, #676, #678, #683, #685 and #687 add bounded-reader lifecycle/liveness/acquisition closure after retained-byte admission. #654 returns the 65,536-byte external OIDC discovery/JWKS and GitHub API JSON reader lock after success, timeout, read failure or fail-closed admission cleanup. #655 does the same for the OIDC replay guard's 4,096-byte decision response and 512-byte internal claim request readers, including failure-path cancellation. #657 returns the distributed `/exchange` private Durable Object 256-byte request and 4,096-byte decision reader lock on every terminal path after reader acquisition. Declared-length overflow and null-body validation occur before reader acquisition and therefore hold no reader lock. #659 returns the already-authorized bounded outbound response reader lock after reader acquisition on success, oversize and read-failure terminal paths while retaining the existing 1 MiB fixed buffer, timeout/cancellation and fail-closed response semantics. #661 returns the public `/exchange` JSON request body reader lock after reader acquisition on terminal paths while retaining the existing 8 KiB body ceiling and 10-second absolute deadline. #663 retains #652's 1 MiB private current-state buffer and copy-before-reject ceiling but makes cancellation completion is best-effort cleanup: cancellation is requested before an over-limit chunk is copied, stalled/rejected cleanup cannot delay or replace the stable fail-closed diagnostic, and the reader lock is released independently on the terminal path. #665 applies the same liveness separation to the shared Cloudflare control-plane response reader used by deploy/status/recovery while preserving its 1 MiB fixed retained buffer and terminal reader-lock cleanup. Protected #668 closes the external OIDC/GitHub JSON response cancellation-liveness gap: after the 65,536-byte reader detects an oversize chunk, stalled/rejected cleanup cannot delay or replace the stable failure, and the reader lock is released independently. Protected #670 closes the contextual-orchestrator health response cancellation-liveness gap: after either advertised Content-Length or streamed bytes exceed the 65,536-byte ceiling, stalled/rejected or synchronously throwing cleanup cannot delay or replace the stable failure, and the consumed reader lock is released independently. Protected #673 preserves the private-vulnerability-reporting response size-limit classification when cancellation cleanup fails synchronously: after the 16 KiB ceiling is exceeded, synchronous cleanup faults cannot replace the stable size-limit failure, asynchronous cancellation rejection remains best-effort cleanup, and the consumed reader lock is released independently on the terminal path. Protected #676 closes the synchronous external JSON cancellation-fault gap. The external OIDC discovery/JWKS·GitHub API bounded JSON response reader keeps its 65,536-byte ceiling, 10-second absolute deadline, fixed retained buffer, fatal UTF-8·duplicate-key·JSON admission and independent terminal reader-lock cleanup; synchronous `reader.cancel()` throw cannot replace an already-established deadline or oversize decision, and asynchronous rejection/non-settling cancellation completion remains best-effort cleanup rather than decision authority. #678 closes reader-acquisition failure on the 1 MiB private Agent Runtime current-state response path: a locked response body no longer leaks a raw `getReader()` exception and instead returns the same stable `invalid_workflow_state_response` fail-closed classification. #683 closes the corresponding reader-acquisition failure on the 1 MiB Cloudflare deploy/status/recovery control-plane response path: a locked Cloudflare control-plane response body now fails closed with `${operation} response body is not stream-readable` while all existing bounded-transport and provider-authority semantics remain intact. #685 closes the remaining OIDC replay reader-acquisition gap: a locked 4,096-byte decision response yields the stable `OIDC replay guard decision body could not be read` failure, while a locked 512-byte internal claim request returns `400 malformed_json` before storage authority. #687 closes the distributed `/exchange` private rate-limit reader-acquisition gap: a locked 256-byte request returns `400 malformed_json` before Durable Object storage authority, while a locked 4,096-byte decision response yields the stable `rate-limit Durable Object decision body could not be read` failure. #676 does not transfer OIDC/GitHub identity, provider routing, destination/outbound policy, credential authority, quarantine/security authority, release/deployment authority, or foreign domain truth to Noema. Protected #676 remains source/test authority; immutable release and deployed heap/p95 evidence remain separate. The cleanup does not relax byte ceilings, fixed retained buffers, fatal UTF-8/duplicate-key/JSON admission, replay/storage authority, bucket/identity/Durable Object authority, credential authority, provider routing or outbound/quarantine ownership. #659 does not transfer destination policy or foreign outbound authority to Noema. #661 does not transfer provider routing, destination policy or foreign outbound authority, credential authority, quarantine/security verdicts, or foreign domain truth to Noema. #663 does not transfer Workflow / Task lifecycle truth, procedural graph publication/activation, provider routing, destination/outbound authority, credential authority, quarantine/security verdicts, or foreign domain truth into Agent Runtime. #665 does not transfer Cloudflare/provider authority, destination/outbound policy, credential authority, quarantine/security authority, or foreign domain truth to Noema. #668 does not transfer OIDC/GitHub identity, credential, provider-routing, destination/outbound, quarantine/security, or foreign domain authority to Noema. #670 does not transfer contextual-orchestrator service, provider/model routing, credential, outbound, quarantine/security, or foreign domain authority to Noema. #670 remains protected source evidence; immutable release and deployed availability/p95 evidence remain separate. #673 does not transfer private-vulnerability-reporting setting authority, GitHub identity, provider routing, outbound policy, quarantine/security, or foreign domain authority to Noema. #673 remains protected source evidence; immutable release, deployment, and production outcome evidence remain separate. #678 does not transfer Workflow / Task lifecycle authority to Agent Runtime and remains protected source/test authority; immutable release, deployed Durable Object recovery and production p95 evidence remain separate. #683 does not transfer Cloudflare/provider authority to Noema and remains protected source/test authority; immutable release, controlled production recovery rehearsal and deployed p95/heap evidence remain separate. #685 retains OIDC/GitHub identity, provider routing, credential, destination/outbound and quarantine/security authority with their existing owners; it changes only Noema's replay transport error admission. #687 retains provider/model routing, destination/outbound policy, credential, quarantine/security, release/deployment, and foreign-domain authority with their existing owners; it changes only the Noema-owned distributed rate-limit transport error admission. Across the bounded-reader lineage, immutable release and deployed heap/p95 evidence remain separate. These integrations are source/test/documentation authority only. They do not create new provider/model routing, foreign outbound or quarantine authority, release/deployment authority, or production performance evidence. `deployed heap/p95 evidence remains separate`: representative deployed workload, allocation/GC observation and applicable p95 must still be measured against an immutable deployed release before buyer-facing runtime-performance claims are admissible. From 3633647b5531bad3649c62751c1b5a40356b94f7 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 13 Sep 2026 03:49:04 +0900 Subject: [PATCH 4/4] test: keep #687 authority assertion semantic --- test/documentation-codegraph-locked-body-current.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/documentation-codegraph-locked-body-current.test.ts b/test/documentation-codegraph-locked-body-current.test.ts index 91e415964..2a23fdc20 100644 --- a/test/documentation-codegraph-locked-body-current.test.ts +++ b/test/documentation-codegraph-locked-body-current.test.ts @@ -98,6 +98,9 @@ describe("protected #681/#678 documentation authority", () => { expect(baseline).toContain("4,096-byte decision"); expect(baseline).toContain("locked"); expect(baseline).toContain("immutable release"); + expect(baseline).toContain( + "#687 retains provider/model routing, destination/outbound policy, credential, quarantine/security, release/deployment, and foreign-domain authority with their existing owners", + ); expect(changelog).toContain("PR #687"); expect(changelog).toContain("rate-limit"); expect(changelog).toContain("decision body could not be read"); @@ -107,6 +110,6 @@ describe("protected #681/#678 documentation authority", () => { expect(source).toMatch( /try \{\s*reader = response\.body\.getReader\(\);\s*\} catch \{\s*throw new DistributedRateLimitUnavailable\(\s*"rate-limit Durable Object decision body could not be read"/, ); - expect(baseline).not.toContain("#687 transfers provider routing, outbound, credential, or quarantine/security authority to Noema"); + expect(baseline).not.toContain("#687 transfers provider/model routing authority to Noema"); }); });