diff --git a/docs/CONTEXT_MAP.md b/docs/CONTEXT_MAP.md index fdd2ee9d8..21cad3a5d 100644 --- a/docs/CONTEXT_MAP.md +++ b/docs/CONTEXT_MAP.md @@ -4,7 +4,7 @@ This document separates protected behavior from the runtime-orchestration direction. Protected `main` remains the authority for what is shipped. A bounded context listed as a target does not become implemented merely because it appears here. -Noema currently owns an evidence-producing credential and maintenance control plane. Expansion into agent/application runtime orchestration must reuse those existing authority boundaries rather than turning Noema into a model router, a foreign product system of record, or an arbitrary command runner. +Noema owns an evidence-producing credential and maintenance control plane plus a narrow protected runtime-orchestration foundation. Expansion into broader agent/application runtime orchestration must reuse those existing authority boundaries rather than turning Noema into a model router, a foreign product system of record, or an arbitrary command runner. ## Current protected contexts @@ -34,17 +34,19 @@ Owns bounded retry/timeout/cancellation semantics, fail-closed recovery evidence ## Runtime-orchestration target contexts -The following contexts are accepted decomposition targets for new runtime behavior. They are not claims that protected `main` already implements a general-purpose agent runtime. +The following contexts are the accepted decomposition for runtime behavior. Protected `main` already implements narrow foundations in Agent Runtime, Workflow / Task Execution, and State / Checkpoint; the remaining behavior in each context is added only by separately verified slices. These boundaries do not claim that Noema is already a general-purpose agent runtime. ### Agent Runtime Owns the lifecycle of one Noema agent/application execution: accepted execution identity, lifecycle state, cancellation, completion, and recovery routing. It does not discover or route models. +Protected `main` includes the execution-lifecycle primitive introduced by #528: explicit accepted, running, cancellation-requested, and terminal transitions; exact duplicate delivery of the signal that established the current state is idempotent; contradictory or out-of-order signals fail closed; cancellation dominates late completion; retry/recovery uses a separate execution identity rather than inheriting implicit side-effect authority. + ### Workflow / Task Execution Owns explicit workflow/task dependency and execution order, bounded concurrency, idempotent step identity, and side-effect classification. Recursive/unbounded task creation and implicit duplicate side effects are forbidden. -PR #528 now carries a candidate bounded task-plan admission and runnable-task selector. It accepts one canonical execution identity, a finite acyclic dependency graph, explicit `pure`/`idempotent`/`side_effecting` classification, and bounded concurrency. Declared task order is deterministic scheduling priority. Runtime state must account for every admitted task exactly once; foreign, malformed, duplicate, or incomplete state evidence fails closed. Failed or cancelled work is never selected as an implicit retry, and failed dependencies do not release descendants. Authority-bearing plan fields and nested dependencies are detached and frozen after one-time reads so caller accessors or aliases cannot change an admitted execution plan. This remains candidate behavior until protected integration. +Protected `main` includes bounded task-plan admission and runnable-task selection. It accepts one canonical execution identity, a finite acyclic dependency graph, explicit `pure`/`idempotent`/`side_effecting` classification, and bounded concurrency. Declared task order is deterministic scheduling priority. Runtime state must account for every admitted task exactly once; foreign, malformed, duplicate, or incomplete state evidence fails closed. Failed or cancelled work is never selected as an implicit retry, and failed dependencies do not release descendants. Authority-bearing plan fields and nested dependencies are detached and frozen after one-time reads so caller accessors or aliases cannot change an admitted execution plan. This protected foundation selects candidates only; it does not itself reserve work or grant side-effect authority. ### Tool / Capability Boundary @@ -54,7 +56,7 @@ Owns versioned allowlisted tool/capability descriptors, least-authority invocati Owns versioned runtime checkpoint semantics needed for restart/cancellation/idempotency. Checkpoints contain only Noema runtime state and canonical foreign references; they must not copy another product's domain truth, provider credential state, or unrestricted reasoning/tool payloads. -PR #528 currently carries candidate checkpoint admission for one retained execution identity. Sequence zero initializes the checkpoint stream; an exact same-sequence/same-digest replay is idempotent; conflicting replay, stale or gapped sequence, cross-execution identity, non-canonical execution identity, and non-SHA-256 state evidence fail closed. This remains candidate behavior until protected integration and does not itself persist checkpoint payloads or grant retry/side-effect authority. +Protected `main` includes checkpoint admission for one retained execution identity. Sequence zero initializes the checkpoint stream; an exact same-sequence/same-digest replay is idempotent; conflicting replay, stale or gapped sequence, cross-execution identity, non-canonical execution identity, and non-SHA-256 state evidence fail closed. Returned checkpoint metadata is detached and frozen so caller-owned aliases cannot mutate admitted authority after validation. This primitive does not itself persist checkpoint payloads or grant retry/side-effect authority. ## Upstream and downstream boundaries diff --git a/docs/LICENSING_AND_IP_TRANSFER.md b/docs/LICENSING_AND_IP_TRANSFER.md index d10ceabc7..de8bfc31e 100644 --- a/docs/LICENSING_AND_IP_TRANSFER.md +++ b/docs/LICENSING_AND_IP_TRANSFER.md @@ -1,12 +1,12 @@ # Noema Licensing and IP Transfer -- **Status:** Repository rights policy/evidence baseline; Apache-2.0 source-license decision is integrated on protected `main@6b2b3e90dc3d5bd24cd27ed11db41b9eb7106010` through PR #530. This is not acquisition or transfer legal clearance. +- **Status:** Repository rights policy/evidence baseline. Protected `main` carries the owner-selected Apache-2.0 source grant; this is not acquisition or transfer legal clearance. - **Scope:** Noema source rights, package/container metadata, third-party obligations, contributor/IP provenance, release distribution, and acquisition transfer evidence. - **Decision authority:** Repository automation may detect, authenticate, inventory, and compare evidence. The repository owner has explicitly selected Apache License 2.0 for Noema source; future outbound-license changes and transfer-rights decisions remain owner/legal governance actions. ## 1. Core invariant -**Public source availability is not a grant of rights by itself.** The grant comes from the controlling repository rights file. Protected `main@6b2b3e90dc3d5bd24cd27ed11db41b9eb7106010` includes root `LICENSE` declaring Apache-2.0 for Noema source through merged PR #530. +**Public source availability is not a grant of rights by itself.** The grant comes from the controlling repository rights file. Protected `main` contains root `LICENSE` with Apache License 2.0 for Noema source, integrated through #530. That protected source-rights decision does not itself establish package/artifact distribution rights, third-party compatibility, contributor ownership, or acquisition-transfer authority. Noema keeps source licensing, package publication, third-party obligations, and transfer authority separate: @@ -96,9 +96,11 @@ Required evidence includes: ### 4.1 Current GPL-family tooling finding -The current `package-lock.json` contains optional development/build packages on the `wrangler → miniflare → sharp → @img/sharp-libvips-*` path whose declared license is `LGPL-3.0-or-later`; `@img/sharp-wasm32` declares `Apache-2.0 AND LGPL-3.0-or-later AND MIT`. These packages are not relicensed by Noema's Apache-2.0 source license. +The protected `package-lock.json` contains optional development/build packages on the `wrangler → miniflare → sharp → @img/sharp-libvips-*` path whose declared license is `LGPL-3.0-or-later`; `@img/sharp-wasm32` declares `Apache-2.0 AND LGPL-3.0-or-later AND MIT`. These packages are not relicensed by Noema's Apache-2.0 source license. -Repository evidence also shows that the patch-validator runtime-image boundary explicitly excludes `wrangler`, `workerd`, and `miniflare`; therefore this finding must not be overstated as proof that LGPL code is bundled into that runtime image. It is nevertheless an inbound development/build-tooling policy gap because ContextualWisdomLab does not accept GPL-family software as the normal dependency baseline. Distribution/acquisition readiness must remain fail closed until issue #531 removes/replaces this dependency path or an explicit repository-level exception is approved for the exact use and distribution model. +Repository evidence also shows that the patch-validator runtime-image boundary explicitly excludes `wrangler`, `workerd`, and `miniflare`; therefore this finding must not be overstated as proof that LGPL code is bundled into that runtime image. It is nevertheless an inbound development/build-tooling policy gap because ContextualWisdomLab does not accept GPL-family software as the normal dependency baseline. + +The active owner lane is issue #531 / PR #540. PR #540 replaces the intended Wrangler/Miniflare/Sharp/Libvips toolchain with direct `workerd`/`esbuild` and a bounded Cloudflare API adapter, but its exact-base lockfile policy must be rebound after protected-main movement and its unchanged current head must pass package, Worker dev/deploy, security, reviewer, image, SBOM, vulnerability, provenance, and license-inventory gates before integration. Distribution/acquisition readiness therefore remains fail closed until that protected evidence exists. Unknown or unresolved obligations fail closed for distribution/acquisition readiness. Vulnerability or provenance success does not prove license compatibility. @@ -158,25 +160,25 @@ owner source-license decision Each arrow requires independent identity/consistency evidence. A mismatch, missing required record, malformed/ambiguous JSON, or unresolved right is a fail-closed condition. -## 8. Current evidence and residual gap — 2026-09-02 +## 8. Current evidence and residual gap — 2026-09-06 -As observed after PR #530 merged, protected `main@6b2b3e90dc3d5bd24cd27ed11db41b9eb7106010` carries the explicit owner-selected Apache-2.0 source posture: +Protected `main@5b8e620dbb01a794c1a38535bbcc32e41a80d0df` contains the owner-selected source-rights posture integrated through #530: - root `LICENSE`: Apache License 2.0; - root `README.md`: customer-facing Apache-2.0 source-license statement and separate third-party obligation boundary; -- `package.json`: remains private and lock-stable; no npm package distribution claim is introduced. +- `package.json`: remains private; no npm package distribution claim is introduced. -These declarations are protected-main source truth. They do not by themselves establish acquisition-transfer authority, third-party compatibility, or release/publication evidence. +That source grant is protected truth. It does not transfer later evidence classes into PASS. Current residual gaps remain deliberately separate: -- the lockfile contains the GPL-family development/build tooling path described in §4.1 and therefore does not yet satisfy the organization default inbound-license policy; +- issue #531 / PR #540 owns removal of the GPL-family development/build tooling path; candidate source replacement exists, but current-base lock policy and unchanged exact-head verification are not complete; - exact-release dependency/NOTICE evidence must still prove the actual distributed artifact contents; - contributor ownership/assignment and acquisition-transfer evidence remain separate from source licensing; - release/publication/deployment evidence remains separate from repository-source rights; -- no source file, README sentence, scanner result, or successful CI run may upgrade those missing evidence classes into a commercial or legal PASS. +- no source file, README sentence, scanner result, workflow success, SBOM, or model judgement may upgrade those missing evidence classes into a commercial or legal PASS. -Issue #5 carries acquisition owner/legal and ownership/assignment evidence. Issue #66 carries remaining release/publication, NOTICE and provenance/activation boundaries. Issue #531 owns the GPL-family development/build-tool replacement. The integrated source-license decision narrows the gap but does not close those issues. +Issue #5 carries acquisition owner/legal and ownership/assignment evidence. Issue #66 carries remaining release/publication, NOTICE and provenance/activation boundaries. Issue #531 owns the GPL-family development/build-tool replacement. The protected source-license decision closes only the source-grant gap; it does not close those later evidence families. ## 9. Non-goals diff --git a/docs/PRD.md b/docs/PRD.md index 35cba8e3f..d104b54e5 100644 --- a/docs/PRD.md +++ b/docs/PRD.md @@ -88,13 +88,15 @@ Protected acquisition-integrity controls authenticate retained evidence and exac ### 4.7 Agent/application runtime orchestration -On PR #528 this mode is **candidate truth only** until protected integration. Noema owns the lifecycle and safe execution mechanics of a Noema Agent/application execution; it does not acquire another CWL product's domain truth and does not become a model-provider router. +Protected `main` includes the Agent Runtime lifecycle and State / Checkpoint admission foundation introduced by #528, together with bounded Workflow / Task plan admission and runnable-task candidate selection. Noema owns the lifecycle and safe execution mechanics of a Noema Agent/application execution; it does not acquire another CWL product's domain truth and does not become a model-provider router. -The candidate Agent Runtime primitive owns explicit accepted, running, cancellation-requested, and terminal transitions. Exact duplicate delivery of the signal that already established the current state is idempotent, while contradictory or out-of-order signals fail closed. Cancellation dominates late completion. Retry/recovery uses a separate execution identity rather than receiving implicit duplicate-side-effect authority. +The protected Agent Runtime primitive owns explicit accepted, running, cancellation-requested, and terminal transitions. Exact duplicate delivery of the signal that already established the current state is idempotent, while contradictory or out-of-order signals fail closed. Cancellation dominates late completion. Retry/recovery uses a separate execution identity rather than receiving implicit duplicate-side-effect authority. -The candidate State / Checkpoint primitive admits sequence zero as initialization, an exact same-sequence/same-digest replay as idempotent, and only the immediately next sequence for the same canonical execution identity. Conflicting replay, stale/gapped sequence, cross-execution identity, malformed identity, or non-SHA-256 state evidence is rejected. Returned checkpoint metadata is a detached frozen snapshot so caller-owned aliases cannot mutate admitted authority after validation. This primitive does not persist checkpoint payloads by itself. +The protected State / Checkpoint primitive admits sequence zero as initialization, an exact same-sequence/same-digest replay as idempotent, and only the immediately next sequence for the same canonical execution identity. Conflicting replay, stale/gapped sequence, cross-execution identity, malformed identity, or non-SHA-256 state evidence is rejected. Returned checkpoint metadata is a detached frozen snapshot so caller-owned aliases cannot mutate admitted authority after validation. This primitive does not persist checkpoint payloads by itself. -`contextual-orchestrator remains the sole model discovery and routing owner`; Noema does not add direct provider SDKs, provider credentials, provider fallback lists, or local routing policy. Workflow / Task Execution, Tool / Capability Boundary, Isolation Integration, Policy / Approval, Observability, and Recovery remain separate bounded contexts under ADR 0012 and the canonical Context Map. Context Graph/EA integration requires an immutable released `context-graph-contracts` contract/profile and preserves EA Core as the authoritative Decision Plane; cross-service SQL is forbidden. +The protected Workflow / Task foundation admits one canonical execution identity, a finite acyclic dependency graph, explicit `pure`/`idempotent`/`side_effecting` classification, bounded concurrency, and detached immutable authority-bearing plan data. Runnable selection fails closed on foreign, malformed, duplicate, incomplete, cross-execution, over-concurrency, or causally impossible state. Selection is candidate scheduling evidence only; it does not reserve work or grant side-effect authority. Durable workflow-state persistence, atomic claim/checkpoint execution, and richer recovery remain separate slices until independently integrated. + +`contextual-orchestrator` remains the sole model discovery and routing owner; Noema does not add direct provider SDKs, provider credentials, provider fallback lists, or local routing policy. Tool / Capability Boundary, Isolation Integration, Policy / Approval, Observability, and Recovery remain separate bounded contexts under ADR 0012 and the canonical Context Map. Context Graph/EA integration requires an immutable released `context-graph-contracts` contract/profile and preserves EA Core as the authoritative Decision Plane; cross-service SQL is forbidden. ## 5. Functional requirements diff --git a/docs/adr/0012-runtime-orchestration-bounded-contexts.md b/docs/adr/0012-runtime-orchestration-bounded-contexts.md index 8daaf03f6..a16447186 100644 --- a/docs/adr/0012-runtime-orchestration-bounded-contexts.md +++ b/docs/adr/0012-runtime-orchestration-bounded-contexts.md @@ -4,7 +4,7 @@ Status: Proposed ## Context -Protected `main` now contains the first runtime-orchestration foundation delivered through PR #528 while Noema continues to operate its credential and maintenance control plane. Expanding toward runtime Agent/application orchestration must not collapse CWL domain ownership into one service or turn Noema into a model-provider router. +Protected `main` now contains the runtime-orchestration foundation delivered through PR #528 and the fail-closed Context Graph release-consumer boundary delivered through PR #544 while Noema continues to operate its credential and maintenance control plane. Expanding toward runtime Agent/application orchestration must not collapse CWL domain ownership into one service or turn Noema into a model-provider router. `ContextualWisdomLab/contextual-orchestrator` owns model discovery, routing, test-time compute, provider failover, and provider credentials. `ContextualWisdomLab/context-graph-contracts` owns provider-neutral shared contracts for canonical references, Context Assertions, CloudEvents/schema, provenance, time, conformance, and admission. `ContextualWisdomLab/enterprise-architecture-core` is the authoritative EA Decision Plane. Dedicated security/isolation products retain their own runtime and policy truth. @@ -38,10 +38,12 @@ Protected `main` currently provides: - `src/workflow-task-execution/` primitives that validate workflow-plan/runtime boundaries without granting foreign authority; - `src/context-fabric/context-contract-release-admission.ts` — a consumer ACL that separates structural release evidence from independently pinned immutable release authority. -The Context Graph release-source-attestation and envelope-preserving-admission strengthening remains candidate behavior until its exact branch integrates through protected governance. Durable workflow persistence/routing work on a separate active lane likewise remains candidate truth until protected integration; this ADR does not promote open PR source by reference. +PR #544's Context Graph release-source-attestation and envelope-preserving-admission strengthening is now protected source. Durable workflow persistence/routing work on a separate active lane remains candidate truth until its own protected integration; this ADR does not promote open PR source by reference. No arbitrary tool executor, direct provider routing, Context Assertion publication authority, EA writer, or security-runtime implementation is implied by these modules. Runtime persistence or deployment evidence is claimed only where protected source and exact operational evidence establish it. +This ADR remains `Proposed` because the repository-wide runtime-orchestration decision is broader than the already protected foundation. Protected source must not be described as candidate merely because the ADR lifecycle has not yet advanced to `Accepted`. + ## Consequences Runtime slices can evolve independently without sharing application tables or importing foreign implementation source. Model-routing and security responsibilities remain replaceable behind explicit ports. Idempotent lifecycle/checkpoint primitives provide a narrow base for restart/recovery without granting duplicate side-effect authority. @@ -66,4 +68,6 @@ A runtime slice may move from candidate to protected truth only when its owning A Context Graph production dependency additionally requires an immutable release whose exact protected source, package/SBOM/provenance identities, release-source manifest, independent attestation verification, schema/profile, conformance/admission, compatibility/migration, licensing/NOTICE, and required capabilities all match Noema's separately authenticated trust anchor. For Context Assertion structured messages, those capabilities include envelope-preserving v1 admission so validated CloudEvent identity remains attached to the admitted assertion. Open PR heads, mutable branches, predecessor artifacts, or release metadata derived only from the candidate itself remain non-passing. +ADR 0012 itself may move from `Proposed` to `Accepted` only when the repository-wide decision is stably applied across the runtime-orchestration surface and its acceptance evidence is code-current. Integrating one or more slices does not require premature ADR acceptance, and keeping the ADR Proposed does not downgrade already protected source back to candidate status. + Any integration that requires unreleased Context Graph source, direct provider routing, ambient secret propagation, arbitrary tool authority, unbounded recursion, silent side-effect retry, or cross-service SQL is rejected at the architecture boundary. diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index a6cb57e5b..1f76a5dab 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -2,47 +2,78 @@ ## Authority and update rule -이 문서는 제품 요구, 구현, 검증, 운영 증거 사이의 현재 차이를 한곳에서 추적한다. 저장소 파일과 테스트는 revision-local 또는 protected-source 구현만 증명한다. PR 상태는 exact head와 live base에서, 운영·배포·고객·매출·법적 증거는 해당 외부 권한에서 각각 다시 확인해야 한다. 문서나 성공 boolean만으로 이후 단계의 증거를 만들지 않는다. +이 문서는 Noema의 protected truth, active candidate, transient workflow evidence, foreign-owner authority를 분리한다. 저장소 문서와 테스트는 해당 revision의 source contract만 증명하며 predecessor GREEN, queued/skipped/cancelled run, scanner/model judgement를 다음 revision의 권위로 전용하지 않는다. 외부 제품의 domain truth, LLM provider routing, quarantine/security, outbound authority는 Noema source로 복제하지 않는다. -이 baseline의 protected-source snapshot은 `main@6b2b3e90dc3d5bd24cd27ed11db41b9eb7106010`이다. PR #530은 이 protected revision에 이미 병합되어 product-first README와 Apache-2.0 root source grant가 protected truth가 되었다. issues #3, #5, #27, #29, #66, #227, #531의 live 상태를 GitHub 권위로 다시 읽어야 하며, protected/main·PR·외부 증거를 서로 대체하지 않는다. +현재 protected-source snapshot은 `main@d9b2a956960be72a5370afa50275a405dfbba529`다. 이 revision은 #546 semantic reviewer, #544 immutable Context Graph consumer admission, #533 runner-assignment semantic evidence, #552 cross-session coordination guidance, #539 canonical temp-root fixture repair, #554 exact central workflow-source trust roll-forward에 더해 acquisition source-evidence binding #526을 정상 병합한 protected truth다. 직전 protected `main@0dec8d84b1e4744e7a9c6a77e2e2631a183ee2ab`는 역사적 branch point로만 남으며 current merge/release authority가 아니다. Normal merge commit `d9b2a956960be72a5370afa50275a405dfbba529`는 previous protected main과 merged PR #526 exact `399d51d24bab96d204f232036938da7ab1034aa3`를 부모로 보존한다. #526의 retained `{path, sha256}` source identity와 package-digest evidence는 protected source integrity를 강화하지만 buyer/legal/commercial authenticity를 새로 만들지는 않는다. -## Live external observation — 2026-09-02 KST +Central workflow authority는 `.github/main@c9052e607e5f3cc76e73207e7786b21500721b79`다. Noema는 central dispatch/provider/retry/sandbox/security 구현을 복제하지 않는다. GitHub OIDC `job_workflow_sha`가 reusable workflow의 source commit identity를 전달하므로 Noema는 exact protected central source만 fail-closed consumer trust로 받는다. PR #554 exact `01c0a0061a360ea1e3a9586e67744466f7544672` integrated normally after application CI, reviewer-ci, required Security Scan, patch-validator-image가 모두 unchanged exact head에서 terminal success였고, protected source는 `ALLOWED_WORKFLOW_SHA = c9052e607e5f3cc76e73207e7786b21500721b79`를 authority로 유지한다. -| Authority | Observation | Consequence | +Superseded protected branch points와 pre-#554 trust identities는 역사적 traceability일 뿐 current merge authority나 release evidence가 아니다. + +## Active candidate convergence — 2026-09-07 KST + +#526은 protected truth다. 남은 open source lanes는 protected ancestry 이동을 bulk-rewrite하지 않고, overlap과 buyer risk를 고려해 ordinary/non-force restack으로 순차 수렴한다. 한 lane의 queued check는 그 lane만 막으며 다른 safe review·documentation·owner-path work는 계속한다. + +Required-gate regression #543은 current protected main에 ordinary/non-force restack된 PR #543 exact `b14b37ca12b3b6ae1999d250a393997ffff04dec`로 수렴했다. 이 head는 `test/ci-exact-head-contract.test.ts`만 branch-owned delta로 유지하고 protected #526 acquisition files를 main에서 상속한다. Fresh current-head `ci 34071938887`와 `reviewer-ci 34071938888`은 terminal success이고, required `Security Scan 34071938889`은 queued, `patch-validator-image 34071938978`은 in progress다. Predecessor GREEN은 전용하지 않는다. + +Automation threat-model lane도 current protected main에 ordinary/non-force restack됐다. PR #553 exact `4c213e184b94b70558092ca739990464f889f06c`는 `docs/automation-threat-model.md`와 `test/documentation-architecture-contract.test.ts`만 branch-owned delta로 유지한다. Fresh `ci 34072254372`와 `patch-validator-image 34072254418`은 in progress이고, `reviewer-ci 34072254382`와 required `Security Scan 34072254380`은 queued다. + +Durable Workflow / Task Execution owner PR #542 exact `46439b1095da6a6dfd44067fda1b35fb8938849b`는 atomic claim, effect-start, checkpoint CAS, recovery/cancellation, payload minimization, fail-closed fault classes, bounded provenance와 malformed retained-receipt hostile fixture repair를 보존한다. 이 head는 predecessor `4616b5e93e19d51973aea330aa4124b51725b795`와 protected `main@d9b2a956...`를 부모로 하는 ordinary/non-force restack이며 #526 acquisition delta와 #542의 29개 owned path 사이에 overlap이 없다. Fresh compare는 `behind_by=0`, merge-base는 current protected main이다. Fresh `ci 34073438522`, `reviewer-ci 34073438512`, required `Security Scan 34073438480`, `patch-validator-image 34073438562`는 현재 queued다. + +Workflow-concurrency foundation PR #550 exact `aeb9c46e51a2de2ec4ad9dd16a73b3548109385e`도 current protected main에 ordinary/non-force restack됐다. #526과 #550의 changed path는 겹치지 않아 16개 workflow/readiness delta를 그대로 보존하면서 protected acquisition truth를 main에서 상속했다. Fresh compare는 `behind_by=0`, merge-base exactly current protected main이며, fresh `ci 34074104922`, `reviewer-ci 34074104943`, required `Security Scan 34074104880`, `patch-validator-image 34074104923`은 현재 queued다. Historical compatibility note: PR #550 exact `3ed5bd956c84e6dd2ebe604dc226fea82145ac29` is predecessor evidence only; predecessor #550 `3ed5bd956c84e6dd2ebe604dc226fea82145ac29` had four GREEN gates on the earlier protected ancestry and is not current authority. + +Provider-neutral Shared Kernel PR #536 exact `82366b27fc985512c91242542d841169e76c347e`는 predecessor ancestry에서 `ci 34064022440`, `reviewer-ci 34064022502`, required `Security Scan 34064022515`, `patch-validator-image 34064022468`가 모두 terminal success였지만 current protected #526 이후에는 그 GREEN을 전용할 수 없다. #536은 #535/#548 reviewer overlap의 foundation prerequisite다. Protected #526과 #536이 `CHANGELOG.md`를 함께 변경하므로 current-main 수렴 시 protected acquisition entries와 `noema-core` Unreleased entry를 semantic merge해야 한다. + +Orchestrator/free consumer PR #535 exact `32972443b121d77a077d1d97c6c702d10fc4c580`는 stale `NOEMA_LLM_MODEL=contextual-orchestrator` 값을 `orchestrator/free`로 조용히 보정하지 않고 fail closed하는 production contract와 Python/TypeScript reviewer oracle을 같은 expectation으로 수렴시킨다. Test-only `eef1039639c8bd2575c658e6dec8afbfcdf42b40`은 Unreleased changelog도 같은 fail-closed 계약을 요구해 predecessor의 자동-normalization 문구를 deterministic RED로 고정했고, production/documentation `32972443...`은 Actions가 `orchestrator/free`를 pin하며 다른 stale consumer config를 자동 canonicalize하지 않는다고 바로잡았다. Noema는 provider/model discovery, routing, retry/failover를 가져오지 않는다. Current exact head는 #526 이전 ancestry에서 non-mergeable이고 fresh workflow lookup에 current-head run이 없으므로 predecessor evidence를 전용하지 않는다. #536 foundation 뒤에 reviewer/shared-core overlap을 semantic preserve해야 한다. + +Exact-claim evidence receipt owner issue #555 / PR #556 exact `66c15f2121f7198193cdea296d4fb8af9618e67b`는 source/execution/research receipt를 exact repository/head/workflow/run/attempt, claim digest, artifact digest/size와 producer identity에 결합하는 Noema-owned admission kernel을 제안한다. 이 lane은 `.github#1641`의 phrase-sensitive consumer RED를 해결하기 위한 owner prerequisite지만 trusted producer, immutable Noema release, central consumer GREEN을 아직 증명하지 않는다. #556은 #535의 predecessor `a6fc483...`에 stacked되어 있어 current #535 `32972443...`을 아직 상속하지 못한다. Integration order는 `#536 → #535 → #556`이며 #535가 정상 통합된 뒤 ordinary/non-force restack, exact-head gates, immutable release, released consumer bump가 필요하다. + +Reviewer failed-check evidence PR #548 exact `e24d31068e1a537b6e7cc4a4ec4ed8d68dca47f0`도 predecessor ancestry에서 `ci 34064058971`, `reviewer-ci 34064059002`, required `Security Scan 34064058950`, `patch-validator-image 34064058911`이 모두 terminal success였지만 current main으로 transfer되지 않는다. #536 integration 뒤에 failed-check/source-binding delta를 ordinary/non-force restack해야 한다. + +Toolchain/license PR #540 exact `2eba9d6b1e3365f745dd43bb8e40e87b0f2ead3a` 역시 predecessor ancestry에서 `ci 34064499797`, `reviewer-ci 34064499757`, required `Security Scan 34064499762`, `patch-validator-image 34064499807`이 모두 terminal success였지만 current protected ancestry가 아니다. #540은 protected #526과 `CHANGELOG.md`, current #550과 CI/image workflow path가 겹친다. #550 concurrency foundation을 먼저 통합한 뒤 protected acquisition CHANGELOG와 pinned workerd/esbuild·lock policy를 함께 semantic preserve해야 한다. + +| Lane | Current exact head | Owned delta / boundary | | --- | --- | --- | -| README/license lane | PR #530 merged into protected `main@6b2b3e90dc3d5bd24cd27ed11db41b9eb7106010`; root `LICENSE` and product-first README now carry the Apache-2.0 source grant | source-license posture is protected truth, but it is not acquisition-transfer or third-party compatibility evidence | -| npm package boundary | `package.json` remains `private` and the npm package is not a product distribution channel; no package-publication license field is introduced | root `LICENSE` controls source rights without forcing unrelated lockfile metadata churn | -| Dependency licensing | `package-lock.json` contains `LGPL-3.0-or-later` optional dev/build packages on `wrangler → miniflare → sharp → @img/sharp-libvips-*`; issue #531 owns removal/replacement | source Apache-2.0 does not make the current toolchain compliant with the organization no-GPL-family default | -| Release/publication | immutable release/deployment/customer/revenue/transfer evidence remains a separate authority class | source licensing cannot be promoted into acquisition readiness | +| Central workflow trust | protected `main@d9b2a956960be72a5370afa50275a405dfbba529`; merged PR #554 exact `01c0a0061a360ea1e3a9586e67744466f7544672` | `job_workflow_sha` consumer pin only; central `.github` keeps agent-dispatch/provider/security implementation authority. | +| Acquisition evidence | protected `main@d9b2a956960be72a5370afa50275a405dfbba529`; merged PR #526 exact `399d51d24bab96d204f232036938da7ab1034aa3` | Retained `{path, sha256}` source identity plus package-digest contract; hashes do not create buyer/legal truth. | +| Required-gate regression | PR #543 exact `b14b37ca12b3b6ae1999d250a393997ffff04dec` | Current protected ancestry; exact-head gates pending. | +| Automation threat model | PR #553 exact `4c213e184b94b70558092ca739990464f889f06c` | Current protected ancestry; exact-head gates pending. | +| Workflow concurrency | PR #550 exact `aeb9c46e51a2de2ec4ad9dd16a73b3548109385e` | PR-only supersession cancellation and work-conserving handoff; current protected ancestry, exact-head gates pending. | +| Durable Workflow / Task Execution | issue #541 / PR #542 exact `46439b1095da6a6dfd44067fda1b35fb8938849b` | Atomic claim/checkpoint/recovery/effect invariants and hostile provenance validation; current protected ancestry, exact-head gates pending. | +| Shared Kernel | PR #536 exact `82366b27fc985512c91242542d841169e76c347e` | Provider-neutral `noema-core`; foundation for #535/#548; needs semantic post-#526 convergence. | +| Orchestrator/free consumer | PR #535 exact `32972443b121d77a077d1d97c6c702d10fc4c580` | Noema consumer/privacy/tool boundary only; CO owns provider/model routing/retry/failover; converge after #536. | +| Exact-claim evidence receipts | issue #555 / PR #556 exact `66c15f2121f7198193cdea296d4fb8af9618e67b` | Noema-owned receipt admission contract; stacked on stale #535 predecessor, no trusted producer/release/consumer GREEN claim. | +| Reviewer failed-check evidence | PR #548 exact `e24d31068e1a537b6e7cc4a4ec4ed8d68dca47f0` | Failed-check → actionable source binding; converge after #536. | +| Toolchain/license | PR #540 exact `2eba9d6b1e3365f745dd43bb8e40e87b0f2ead3a` | issue #531 / #540; converge after #550 while preserving protected CHANGELOG. | +| Documentation authority | PR #547 | Dedicated cross-lane baseline writer; this revision binds protected #526 truth and current candidate identities above. | -## Current baseline +Fresh exact-head workflow evidence is observation-scoped and must be refetched after each source mutation or restack. No predecessor GREEN transfers. A current PR can be review-clean while still non-authorizing because its exact-head gate is queued, failed, stale or based on older protected ancestry. -| Requirement family | Canonical decision / boundary | Protected or active implementation surface | Executable proof | Residual evidence | Maturity | -| --- | --- | --- | --- | --- | --- | -| Credential exchange and readiness | Worker trust contract와 runtime threat model | `src/index.ts`, `src/worker.ts`, `src/entrypoint.ts`, `src/runtime-entrypoint.ts`, OIDC/replay/rate-limit 모듈 | typecheck, runtime/API/security tests, exact configured coverage | protected deployment smoke와 실제 binding/storage 증거 | Implemented on protected main; operational evidence remains separate | -| Reviewer and maintenance control plane | 독립 App identity, bounded manifest, deterministic fail-closed gates | `reviewer/noema_reviewer/`, maintainer/reviewer workflows, capability-file ingress | reviewer tests, workflow contract tests, current-head review artifacts | Maintainer/Reviewer App 설치·권한·key custody·rotation 및 publication identity | Source contract implemented; external activation evidence is open | -| Hourly product-development loop | `contextual-orchestrator` inference와 별도 Maintainer App publication identity를 사용하는 work-conserving loop | `.github/workflows/hourly-product-development.yml`, orchestrator gateway contract, publication/readiness validators | workflow shape, gateway preflight, lease, publication prerequisite and stale-head refusal tests | zero-PR scheduled proposal publication과 rollback/recovery exercise | Implemented source; production activation incomplete | -| Patch-validator supply chain | exact source/image/receipt binding과 fail-closed vulnerability policy | `Dockerfile.patch-validator`, image workflow, validator/SBOM/receipt modules | build, runtime, smoke, SBOM, vulnerability and receipt tests | protected-main operational receipt와 registry publication/signing/attestation | Implemented source; operational/publication evidence incomplete | -| Source licensing | Noema-owned source uses one explicit commercial-friendly outbound grant; package publication and dependencies retain independent terms | protected `LICENSE`, root `README.md`, `docs/LICENSING_AND_IP_TRANSFER.md`; private `package.json` remains non-distribution metadata | protected repository/doc/test consistency at `main@6b2b3e90dc3d5bd24cd27ed11db41b9eb7106010` | third-party/tooling policy resolution and acquisition-transfer evidence remain separate | Apache-2.0 source grant implemented on protected main | -| Third-party/tooling licensing | GPL-family packages are not accepted as the normal inbound dependency baseline | current lockfile + dependency-license inventory + issue #531 | exact lockfile scan/inventory must become free of GPL/LGPL/AGPL toolchain entries | commercially compatible Wrangler/Miniflare/build-tool replacement or exact approved exception | Open compliance gap; source license does not resolve it | -| Release and deployment | source → package/SBOM/provenance → immutable publication → deployment/rollback | release, publication, deployment and readiness scripts | exact-source/reproducibility/receipt/rollback contract tests | immutable release, protected deployment, recovery and production smoke evidence | Incomplete; repository evidence cannot establish deployment | -| KPI, customer and acquisition | authentic evidence must retain source, time and buyer/legal authority | KPI, acquisition manifest/integrity/readiness and license validators | bounded input, provenance, ordering, integrity and fail-closed tests | authentic 30-day production KPI, customer/revenue and transfer evidence | Incomplete; no commercial-readiness claim | +## DDD and ownership baseline -## Prioritized residual gaps +Noema의 Core Domain은 **Agent Runtime**과 **Workflow / Task Execution**이다. **Tool / Capability Boundary**, **State / Checkpoint**, **Isolation Integration**, **Policy / Approval**, **Observability**, **Recovery**는 명시적 bounded context다. Side-effect authority, execution identity, claim/checkpoint CAS는 최소 transaction boundary에서 유지하고 foreign domain truth와 혼합하지 않는다. -| Priority | Gap | Buyer/operator impact | Current owner | Authoritative completion evidence | Next executable action | -| --- | --- | --- | --- | --- | --- | -| P0 | GPL-family development/build dependency path | 조직의 상업용 inbound 정책과 현재 npm toolchain이 충돌한다 | issue #531 | exact-head `package-lock.json`과 dependency inventory에서 GPL/LGPL/AGPL 경로가 사라지고 Worker dev/deploy·typecheck·tests·security가 그대로 통과 | Wrangler/Miniflare/Sharp 경로를 상업적으로 호환되는 도구 경계로 교체하고 lockfile을 재검증한다 | -| P0 | Maintainer/Reviewer App 및 hourly publication identity 활성화 | 자동 유지보수와 독립 리뷰가 production capability로 동작한다는 증거가 없다 | issues #29 / #227 | 현재 App 설치·권한·key custody/rotation, 성공한 scheduled publication artifact와 rollback 결과 | 외부 App 구성을 완료한 뒤 readiness와 scheduled run을 실행하고 artifact를 보존한다 | -| P0 | protected `main` governance 목표와 live policy 정합성 | source 검증만으로 실제 merge/release 통제를 보장할 수 없다 | issue #27 | live ruleset/branch-protection API와 관찰된 required workflow/status 결과 | governance audit을 live policy에 실행하고 차이를 owning control에서 수정한다 | -| P1 | patch-validator 운영·배포 증거 | 검증된 source image가 실제 배포·서명·활성화됐는지 구매자가 확인할 수 없다 | issue #66 | protected-main operational receipt, registry digest, signature/attestation과 activation proof | exact protected source에서 publication pipeline을 실행한다 | -| P1 | authentic 30-day KPI | 신뢰성·성능·운영가치를 fixture가 아닌 실운영 자료로 입증하지 못한다 | issue #3 | production-origin, time-bound, integrity-checked 30-day KPI evidence | 승인된 production source에서 collector와 verifier를 실행한다 | -| P1 | release/deployment/acquisition evidence | buyer/legal/commercial 권한이 없어 매각 readiness를 선언할 수 없다 | issue #5 | immutable release/deployment/customer/revenue/legal transfer evidence | 앞선 evidence family를 순서대로 충족하고 acquisition audit을 재실행한다 | +`contextual-orchestrator`는 provider/model discovery, routing, TTC, retry/failover와 provider credentials를 소유한다. Noema LLM consumer는 released gateway contract와 canonical `orchestrator/free` alias만 사용하고 direct provider/group/paid fallback을 두지 않는다. `.github`는 reusable workflow와 organization control-plane source를 소유한다. `quarantine-sandbox-runtime`, Wardnet, EgressWeave/AppGuardrail 계열은 각 isolation/security/outbound truth를 소유한다. Keyverse는 identity backend owner다. `context-graph-contracts`와 Enterprise Architecture 계열은 released/versioned contract만 소비하며 mutable sibling PR head, source copy, cross-service SQL을 runtime truth로 사용하지 않는다. -## Documentation contradictions +ADR 0012는 broader runtime-orchestration decision이 아직 넓기 때문에 `Proposed`를 유지한다. 이미 protected인 runtime/context-consumer slice를 Proposed라는 이유로 candidate로 되돌리지 않으며 candidate durable workflow state를 문서만으로 Accepted 처리하지 않는다. -과거 PR 번호와 당시 상태는 historical provenance일 뿐 현재 owner나 구현 상태가 아니다. Canonical TRD와 ADR은 protected implementation surface와 durable live issue owner를 사용하며, historical PR을 current owner로 사용하지 않는다. PR #530의 Apache-2.0 grant는 `main@6b2b3e90dc3d5bd24cd27ed11db41b9eb7106010`에 병합된 이후 protected source truth로만 표현한다. +## Commercial and buyer gaps + +| Priority | Gap | Buyer/operator impact | Current owner | Authoritative completion evidence | Next executable action | +| --- | --- | --- | --- | --- | --- | +| P0 | Central workflow-source drift watch | Central protected source가 움직였는데 Noema trust pin이 따라가지 못하면 reusable review exchange가 fail closed된다. | protected main / `.github` owner path | current central protected SHA, matching protected consumer pin, exact source lineage | 매 fresh sweep에서 central과 Noema pin을 비교하고 central source identity가 전진하면 좁은 successor trust repair를 즉시 만든다. | +| P0 | Current-main exact-head verification | predecessor GREEN을 전용하면 stale source가 merge authority로 승격될 수 있다. | #543 / #553 / #542 / #550 | unchanged exact-head CI/reviewer/Security/image, current review/thread authority, normal merge | current ancestry 네 lane의 gate를 검증하고 four-GREEN이 된 독립 prerequisite부터 정상 통합한다. | +| P0 | Reviewer foundation convergence | Shared Kernel보다 dependent reviewer delta를 먼저 합치면 source/package boundary가 다시 덮일 수 있다. | #536 → #535/#548; #535 → #556 | semantic post-#526 restack, protected CHANGELOG preservation, fresh exact-head gates | #536을 먼저 semantic converge하고 검증·통합한 뒤 #535/#548을 새 protected ancestry에 순차 restack하며, #535 통합 뒤 #556을 ordinary/non-force restack한다. | +| P0 | Exact-claim evidence supply chain | phrase-sensitive review evidence가 producer-issued receipt 없이 승인되면 model prose가 source/execution/research authority를 스스로 만들 수 있다. | issue #555 / PR #556 → `.github#1641` | exact-head Noema receipt tests, trusted producer artifact, immutable Noema release, released central consumer bump, original consumer RED→GREEN | #535 integration 뒤 #556을 current protected ancestry에 수렴·검증·release하고 central owner가 released validator/schema를 소비해 원래 corpus를 재실행한다. | +| P0 | Workflow/toolchain convergence | #540의 오래된 CI/image copy가 #550 concurrency contract를 덮으면 work-conserving/supersession 정책이 퇴행한다. | #550 → issue #531 / #540 | #550 protected integration, then semantic #540 restack with lock/toolchain/license + current workflows | #550 exact `aeb9c46...`의 fresh gates를 검증하고, 통합 뒤 #540을 protected CHANGELOG와 current workflow semantics를 보존해 수렴시킨다. | +| P0 | Atomic durable workflow authority | 중복 side effect, checkpoint divergence, cancellation/recovery 오판이나 retained provenance 변조는 buyer runtime 신뢰성을 직접 훼손한다. | issue #541 / #542 | claim/checkpoint/recovery/effect invariants, payload minimization, root semantics, exact-head GREEN, protected merge | #542 exact `46439b1...`의 fresh four gates를 검증하고 unchanged head에서 모두 GREEN이면 normal protected integration한다. | +| P0 | Reviewer/Maintainer production identity | source-only readiness로는 독립 review와 bounded publication authority를 입증할 수 없다. | issues #29 / #227 | live installation/permissions/key custody/rotation and bounded publication/recovery receipts | authorized external App provisioning과 protected-source preflight를 실제 control plane에서 수행한다. | +| P0 | Governance enforceability | required workflow 하나만으로 PR approval, history rewrite, deletion, break-glass 통제를 증명할 수 없다. | issue #27 / organization control plane | live ruleset/protection evidence and required workflow behavior | current protected main 기준 read-only governance audit을 재실행하고 미구성 controls는 authorized owner path에서 검증한다. | +| P1 | Patch-validator publication | PR-head image GREEN은 protected operational publication·signing·activation 증거가 아니다. | issue #66 | protected-source registry digest, signature/attestation, operational receipt and rollback | protected-main dispatch와 immutable publication identity가 가능한 owner control plane에서 운영 증거를 생성한다. | +| P1 | Authentic operating evidence | fixture와 repository checks로 30일 production KPI, customer/revenue, legal transfer truth를 만들 수 없다. | issue #3 / issue #5 | production-origin KPI, customer/revenue/legal transfer authority with integrity binding | governed immutable deployment 뒤 authenticated production evidence window와 transfer evidence를 수집·검증한다. | ## Completion discipline -각 gap은 표의 authoritative completion evidence가 실제로 존재하고 현재 source/head에 결합될 때만 닫는다. queued/skipped/cancelled/stale check, predecessor-head 결과, 문서 존재, synthetic fixture 또는 model judgement는 완료 증거가 아니다. Noema source의 Apache-2.0 grant, npm package-publication metadata, 제3자 package license evidence는 서로 별도 권위로 유지한다. +Workflow가 exact head를 checkout한 뒤 실패하면 code/config/log RCA를 수행한다. Runner를 얻지 못한 queued 상태는 control-plane evidence일 뿐이다. Queue를 줄이기 위한 source churn, `paths-ignore`, runner-selector 우회, self-approval, force push/destructive rebase, required-gate weakening은 완료 수단이 아니다. + +Noema source의 Apache-2.0 grant, third-party license compatibility, package/artifact distribution rights, release/deployment, KPI, customer/revenue, legal/IP transfer evidence는 서로 별도 권위다. 문서, scanner, SBOM, successful CI 또는 model judgement가 빠진 권위 클래스를 만들어내지 않는다. diff --git a/test/documentation-active-work-contract.test.ts b/test/documentation-active-work-contract.test.ts index b9dc362a6..a7639b9e1 100644 --- a/test/documentation-active-work-contract.test.ts +++ b/test/documentation-active-work-contract.test.ts @@ -48,6 +48,84 @@ describe("canonical active-work documentation", () => { expect(prd).not.toContain("stronger immutable workflow-source binding is not implemented on protected main"); }); + it("does not describe the integrated #528 runtime foundation as candidate active-PR truth", () => { + const prd = readFileSync("docs/PRD.md", "utf8"); + const contextMap = readFileSync("docs/CONTEXT_MAP.md", "utf8"); + const adr = readFileSync("docs/adr/0012-runtime-orchestration-bounded-contexts.md", "utf8"); + + expect(prd).not.toContain("On PR #528 this mode is **candidate truth only** until protected integration"); + expect(contextMap).not.toContain("PR #528 now carries a candidate bounded task-plan admission and runnable-task selector"); + expect(contextMap).not.toContain("PR #528 currently carries candidate checkpoint admission"); + expect(adr).not.toContain("The first candidate runtime code in PR #528 introduces"); + expect(adr).not.toContain("Until this ADR and code integrate into protected `main`, they remain candidate truth"); + + expect(prd).toContain("Protected `main` includes the Agent Runtime lifecycle and State / Checkpoint admission foundation"); + expect(contextMap).toContain("Protected `main` includes bounded task-plan admission and runnable-task selection"); + expect(adr).toContain("Protected `main` now contains the runtime-orchestration foundation delivered through PR #528"); + expect(adr).toContain("PR #544's Context Graph release-source-attestation and envelope-preserving-admission strengthening is now protected source"); + }); + + it("keeps the product-technical baseline on current protected and active owner truth", () => { + const baseline = readFileSync("docs/product-technical-gap-baseline.md", "utf8"); + + expect(baseline).toContain("`main@d9b2a956960be72a5370afa50275a405dfbba529`"); + expect(baseline).toContain("`.github/main@c9052e607e5f3cc76e73207e7786b21500721b79`"); + expect(baseline).toContain("#539 canonical temp-root fixture repair"); + expect(baseline).toContain("PR #554 exact `01c0a0061a360ea1e3a9586e67744466f7544672`"); + expect(baseline).toContain("merged PR #526 exact `399d51d24bab96d204f232036938da7ab1034aa3`"); + expect(baseline).toContain("PR #548 exact `e24d31068e1a537b6e7cc4a4ec4ed8d68dca47f0`"); + expect(baseline).toContain("PR #536 exact `82366b27fc985512c91242542d841169e76c347e`"); + expect(baseline).toContain("PR #535 exact `a6fc483fe9537c5881114db82cc9f741eb8331b1`"); + expect(baseline).toContain("PR #540 exact `2eba9d6b1e3365f745dd43bb8e40e87b0f2ead3a`"); + expect(baseline).toContain("PR #542 exact `46439b1095da6a6dfd44067fda1b35fb8938849b`"); + expect(baseline).toContain("PR #543 exact `b14b37ca12b3b6ae1999d250a393997ffff04dec`"); + expect(baseline).toContain("PR #550 exact `3ed5bd956c84e6dd2ebe604dc226fea82145ac29`"); + expect(baseline).toContain("PR #553 exact `4c213e184b94b70558092ca739990464f889f06c`"); + expect(baseline).not.toContain("`main@71cd0fb6f3cf6ed1b886c8c312bfe96e7613f155`"); + expect(baseline).not.toContain("`main@85b17014b8d46eacc95e096ca114568c321d0263`"); + expect(baseline).not.toContain("`main@e26d771470a4ece873c367b40b3cd6cb03ac7de3`"); + expect(baseline).not.toContain("`.github/main@43024633eba9d96b0456970391360da5a171fbda`"); + expect(baseline).not.toContain("`.github/main@dd0b96feded94f66ecf59b25a5a9b58cfc8b4f69`"); + expect(baseline).not.toContain("`.github/main@ee5567f7b15f0441a61ec2435415603b9518f1c6`"); + expect(baseline).not.toContain("`.github/main@6e014c9bae22f1e6d8302a4f1cc38f4f6a114ae2`"); + expect(baseline).not.toContain("`.github/main@9aad23c09da468716a788cfed65cd44f7d84a284`"); + expect(baseline).not.toContain("`.github/main@49eb9e7035a6994fffb5b24bf943156be27a02fb`"); + expect(baseline).not.toContain("`.github/main@2396ddcaf4b6c50785548b313ccddfa1784915a2`"); + expect(baseline).not.toContain("PR #554 exact `12e9efe07f72acdf9f1eb0f7ef0fec54d2ad633c`"); + expect(baseline).not.toContain("PR #554 exact `8501d25507d4ecd3024205a92a9a3de4157300da`"); + expect(baseline).not.toContain("PR #554 exact `62feb057f4c0f00d49b9e2a747f3cec07ad0a3f8`"); + expect(baseline).not.toContain("PR #554 exact `0866c5d9dcd263f1dd785164332f678f55228214`"); + expect(baseline).not.toContain("PR #554 exact `bf9e46af38994e32cfc2faed3de1c565897d0025`"); + expect(baseline).not.toContain("PR #554 exact `1900f05f51efa186508ce84d281a32fc9c2b39f7`"); + expect(baseline).not.toContain("PR #542 exact `9236775bad5476a70601c3dd0331211d42eaed12`"); + expect(baseline).not.toContain("PR #542 exact `1909f232dec32cf5d5de40d927af9c22366d2a85`"); + expect(baseline).not.toContain("PR #542 exact `84a2cd056168ff90ad1c60723f20621ee8a73374`"); + expect(baseline).not.toContain("PR #542 exact `4616b5e93e19d51973aea330aa4124b51725b795`"); + expect(baseline).not.toContain("PR #526 exact `81ef8b75aaad2083156b415e59fd7f27740a1b02`"); + expect(baseline).not.toContain("PR #535 exact `9ec7fbb0a20fb771516682946d49a2755035c171`"); + expect(baseline).not.toContain("PR #535 exact `68e7579dd1ba0753ae7c840b44115b7b486a71fa`"); + expect(baseline).not.toContain("PR #543 exact `e255bf1bece1ebfdd2432c96ee3aa14a7f29a992`"); + expect(baseline).not.toContain("PR #553 exact `a016521ed61857de328606ca7fea97c7a4057574`"); + expect(baseline).toContain("issue #531 / #540"); + expect(baseline).toContain("issue #541 / #542"); + expect(baseline).toContain("#546 semantic reviewer"); + expect(baseline).not.toContain("README/license candidate truth is PR #530"); + expect(baseline).not.toContain("PR #530 is open"); + expect(baseline).not.toContain("Apache-2.0 candidate truth on #530"); + expect(baseline).not.toContain("P1 | Apache-2.0 source grant integration"); + }); + + it("keeps the licensing authority aligned with merged #530 protected truth", () => { + const licensing = readFileSync("docs/LICENSING_AND_IP_TRANSFER.md", "utf8"); + + expect(licensing).toContain("Protected `main` carries the owner-selected Apache-2.0 source grant"); + expect(licensing).toContain("issue #531 / PR #540"); + expect(licensing).not.toContain("source-license decision is Apache-2.0 on PR #530 until protected integration"); + expect(licensing).not.toContain("Until that exact head integrates, protected `main` remains the currently shipped source-rights authority"); + expect(licensing).not.toContain("Protected `main@03ef2301bad020b9ab4dfde2ec3c4e7f460024ca` still has no root `LICENSE`"); + expect(licensing).not.toContain("Those declarations are candidate truth until #530 integrates"); + }); + it("records the code-current canonical graph and protected credential-coverage closure", () => { const gapAudit = readFileSync("docs/DOCUMENTATION_GAP_AUDIT.md", "utf8"); const traceability = readFileSync("docs/TRACEABILITY.md", "utf8"); @@ -90,7 +168,6 @@ describe("canonical active-work documentation", () => { expect(traceability).toContain("openapi.json"); expect(traceability).toContain("Implemented on protected main"); expect(index).toContain("protected HTTP API machine contract"); - expect(index).toContain("[OpenAPI 3.1](../openapi.json)"); expect(index).not.toContain("PR #99"); }); @@ -133,4 +210,4 @@ describe("canonical active-work documentation", () => { expect(claude).not.toContain("The entire Worker is one file: **`src/index.ts`**"); expect(claude).not.toContain("There are no KV/D1/queue/Durable Object bindings"); }); -}); +}); \ No newline at end of file diff --git a/test/documentation-current-trust-authority.test.ts b/test/documentation-current-trust-authority.test.ts new file mode 100644 index 000000000..9bd4370fe --- /dev/null +++ b/test/documentation-current-trust-authority.test.ts @@ -0,0 +1,18 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +describe("current protected trust authority documentation", () => { + it("binds the commercial gap baseline to the latest protected central source and consumer candidate", () => { + const baseline = readFileSync("docs/product-technical-gap-baseline.md", "utf8"); + + expect(baseline).toContain( + "Central workflow authority는 `.github/main@c9052e607e5f3cc76e73207e7786b21500721b79`다.", + ); + expect(baseline).toContain( + "PR #554 exact `01c0a0061a360ea1e3a9586e67744466f7544672`", + ); + expect(baseline).toContain( + "superseded predecessor `.github/main@bf0bf0ab0c9ebcf4cea05f8c9219dc093f9ab351` / PR #554 exact `e94d3ee884a120269fc42cf09ecbab6d0461b4ef`", + ); + }); +}); diff --git a/test/documentation-live-open-pr-authority.test.ts b/test/documentation-live-open-pr-authority.test.ts new file mode 100644 index 000000000..584d506f6 --- /dev/null +++ b/test/documentation-live-open-pr-authority.test.ts @@ -0,0 +1,21 @@ +import { readFileSync } from "node:fs"; + +import { describe, expect, it } from "vitest"; + +describe("product-technical gap baseline live open-PR authority", () => { + it("tracks the current orchestrator/free consumer and its stacked evidence-receipt successor", () => { + const baseline = readFileSync("docs/product-technical-gap-baseline.md", "utf8"); + + expect(baseline).toContain( + "PR #535 exact `32972443b121d77a077d1d97c6c702d10fc4c580`", + ); + expect(baseline).not.toContain( + "PR #535 exact `a6fc483fe9537c5881114db82cc9f741eb8331b1`", + ); + expect(baseline).toContain( + "PR #556 exact `66c15f2121f7198193cdea296d4fb8af9618e67b`", + ); + expect(baseline).toContain("issue #555 / PR #556"); + expect(baseline).toContain("#535 → #556"); + }); +}); diff --git a/test/documentation-post-trust-integration-authority.test.ts b/test/documentation-post-trust-integration-authority.test.ts new file mode 100644 index 000000000..a45db071f --- /dev/null +++ b/test/documentation-post-trust-integration-authority.test.ts @@ -0,0 +1,36 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +describe("post-trust-integration documentation authority", () => { + it("binds the commercial gap baseline to protected #554/#526 integration and current convergence candidates", () => { + const baseline = readFileSync("docs/product-technical-gap-baseline.md", "utf8"); + + expect(baseline).toContain( + "`main@d9b2a956960be72a5370afa50275a405dfbba529`", + ); + expect(baseline).toContain( + "PR #554 exact `01c0a0061a360ea1e3a9586e67744466f7544672` integrated normally", + ); + expect(baseline).toContain( + "merged PR #526 exact `399d51d24bab96d204f232036938da7ab1034aa3`", + ); + expect(baseline).toContain( + "PR #542 exact `4616b5e93e19d51973aea330aa4124b51725b795`", + ); + expect(baseline).toContain( + "PR #540 exact `2eba9d6b1e3365f745dd43bb8e40e87b0f2ead3a`", + ); + expect(baseline).toContain( + "PR #543 exact `b14b37ca12b3b6ae1999d250a393997ffff04dec`", + ); + expect(baseline).toContain( + "PR #553 exact `4c213e184b94b70558092ca739990464f889f06c`", + ); + expect(baseline).toContain("ordinary/non-force restack"); + expect(baseline).not.toContain("#554가 central trust prerequisite로 먼저 통합된 뒤"); + expect(baseline).not.toContain("#554 통합 뒤 #542를 새 protected main에 non-force restack"); + expect(baseline).not.toContain( + "#540은 old exact `6b7f0a7b8c3069a815f74ee654620e59574bd4e1`에서 멈춰", + ); + }); +}); \ No newline at end of file diff --git a/test/documentation-workflow-concurrency-authority.test.ts b/test/documentation-workflow-concurrency-authority.test.ts new file mode 100644 index 000000000..2a2af260a --- /dev/null +++ b/test/documentation-workflow-concurrency-authority.test.ts @@ -0,0 +1,17 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +describe("workflow-concurrency documentation authority", () => { + it("records the current post-#526 #550 exact head while retaining predecessor lineage", () => { + const baseline = readFileSync("docs/product-technical-gap-baseline.md", "utf8"); + + expect(baseline).toContain( + "PR #550 exact `aeb9c46e51a2de2ec4ad9dd16a73b3548109385e`", + ); + expect(baseline).toContain( + "predecessor #550 `3ed5bd956c84e6dd2ebe604dc226fea82145ac29`", + ); + expect(baseline).toContain("behind_by=0"); + expect(baseline).toContain("merge-base exactly current protected main"); + }); +}); diff --git a/test/runtime-bounded-context-fitness.test.ts b/test/runtime-bounded-context-fitness.test.ts index fbdd611f4..76199b641 100644 --- a/test/runtime-bounded-context-fitness.test.ts +++ b/test/runtime-bounded-context-fitness.test.ts @@ -110,7 +110,7 @@ describe("Noema bounded-context fitness", () => { expect(prd).toContain("### 4.7 Agent/application runtime orchestration"); expect(prd).toContain("FR-019"); expect(prd).toContain("FR-020"); - expect(prd).toContain("contextual-orchestrator remains the sole model discovery and routing owner"); + expect(prd.replaceAll("`", "")).toContain("contextual-orchestrator remains the sole model discovery and routing owner"); expect(adr).toContain("Status: Proposed"); expect(adr).toContain("Agent Runtime");