Skip to content

docs: maintain durable product-technical gap baseline - #100

Draft
seonghobae wants to merge 204 commits into
developfrom
docs/product-technical-gap-baseline
Draft

docs: maintain durable product-technical gap baseline#100
seonghobae wants to merge 204 commits into
developfrom
docs/product-technical-gap-baseline

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Scope

Canonical single-writer lane for docs/product-technical-gap-baseline.md. The baseline records durable product/domain/control-plane truth and causal dependency order; it is not merge authorization and does not freeze volatile PR heads, run IDs, queue snapshots, or review state into the document.

Current durable baseline

The baseline at c0a40a4d598635cc1056a29451a4707d00c613c5 remains code-current at the durable-contract level after workflow owner #161 integrated as protected develop@eb9757f8649aaad026a9865508d9aad50c1a7a4f. It already records #63 shared HRIS-kernel ownership, #64-before-#65 owner order, protected-owner adoption before consumer evidence, Assignment dependency order, ruleset controls, and the release gate.

#211#214 refine the shared trust boundary. #215#228 refine durable People/hire scalar/container and command/result boundaries. #229 requires ordinary generic People results and confirmed-hire results to remain bound to authoritative pre-port target identities. #246 records the necessary idempotent-replay qualification for generic Employment/Position/Assignment: their published semantic digest deliberately excludes generated record IDs, so an identical same-key retry may return the first committed identity instead of the retry's fresh generated identity only when the persistence result carries exact replay evidence and the application independently recomputes the same semantic command digest. Unexplained foreign results remain fail-closed; confirmed-hire remains exact-identity-bound because its materialization identities are part of that route's command contract. #230 detaches direct PostgreSQL commands; #231 completes application-input ownership before purpose-bound authorization; #232 requires exact built-in Assignment allocation text. #233 closes a public-contract inconsistency by making the parser and published OpenAPI reject zero while retaining the authoritative Assignment allocation domain (0, 1.0000]; deterministic manifest evidence is resealed. These are refinements of the existing durable application/API trust-boundary and idempotency invariants, not new HR aggregates, so leaf SHAs and run IDs remain PR/Issue metadata rather than baseline-body data.

A distinct durable buyer/scientific gap remains #234: protected architecture assigns validity-study registry/scientific evidence ownership to workforce_validation, while protected implementation still lacks the complete owner API and durable owner-table adoption. Draft #235 establishes the independent owner application read boundary from protected develop; #236 makes retained persisted study evidence structurally immutable; #237 applies the same structural-immutability requirement to authenticated principal evidence before purpose-bound authorization. #238 corrects the PostgreSQL role-isolation model: a NOLOGIN schema owner cannot rely on ALTER ROLE ... SET search_path for later SET ROLE runtime isolation, because PostgreSQL applies role defaults at login. #239 adds the complementary constructor-bypass invariant for identity evidence: exact tuple-backed principal type alone is insufficient because low-level tuple.__new__ can bypass ValidationPrincipal.__new__; the owner read boundary must reconstruct/revalidate stored tenant/actor/scope evidence before Keyverse request construction/evaluation. #240 adds the repository-capability invariant exposed by the earlier review graph: runtime Protocol shape alone is not proof of a callable repository dependency, and dependency checking itself must not execute a caller-controlled descriptor before authorization. #241 extends retained-evidence hardening to the data projection by making ValidityStudyView structurally immutable. #242 narrows the ordinary public constructor surface, but does not treat constructor exclusivity or the Python runtime type as proof that authorization occurred; low-level tuple fabrication remains possible and consequential consumers must re-authorize and re-resolve authoritative state. #243 adds the nested-identity invariant: an immutable outer value object is still unsafe if it retains a mutable UUID object alias. Canonical identity authority must be reduced to interpreter-immutable scalar evidence, public UUIDs reconstructed fresh, and executable repository calls must receive detached UUID objects while post-port target verification remains bound to an immutable pre-port snapshot. #244 adds the ingress-scalar invariant: exact UUID outer type is still insufficient if its internal int slot was forged; the boundary must read the payload once, prove exact built-in int before any sentinel/range/equality behavior, and only then store the validated scalar. #245 completes the ordinary issuance-surface cleanup by removing an unconditional module-level projection issuer. #249 closes the remaining checked-versus-used capability gap: inertly validating a repository member before authorization is insufficient if the authorized path later performs a fresh dynamic attribute lookup. The exact ordinary repository function accepted before authorization must be the same function directly invoked afterward; caller-controlled __getattribute__ or descriptor machinery cannot be allowed to substitute a new executable capability after the access decision. #253 completes the concrete-dependency side of that rule: an inherited Protocol/interface declaration is still a runtime function and can satisfy a function-type gate even though no repository implementation exists, so the canonical interface placeholder itself must be rejected before authorization rather than treated as a concrete executable dependency.

#254 adds the Foundation provenance invariant exposed by a real hosted RED: executing a root PostgreSQL acceptance contract from the canonical Foundation workflow is not enough. Every such executable contract must also be registered in both canonical required-file inventories—Node REQUIRED_FILES and Python REQUIRED—and appear in the deterministic manifest.json exact path/hash/bytes/lines seal. A missing inventory entry or stale seal is a real acceptance failure; the repair is to register and reseal the exact artifact, not exempt discovery, remove execution, weaken the manifest path-set equality check, or lower coverage/security gates. #255 adds the complementary exact retained-policy-scalar coverage invariant: an immutable frozenset is not sufficient if one contained field is a caller-defined executable str subtype. The Workforce Validation boundary must reject non-exact policy-field strings before authorization comparison/hashing/persistence, and 100% coverage must execute that fail-closed branch rather than delete or weaken it. Volatile commit/run identifiers remain in #235/#254/#255 metadata rather than the baseline body.

#235 keeps workforce_validation_role as deny-default migration/schema-owner authority only, proves actual SET ROLE behavior in PostgreSQL acceptance, revalidates principal storage before authorization, binds the exact validated owner repository function across authorization, rejects the inherited Protocol declaration as a non-concrete capability, stores UUID authority without retained mutable aliases, validates UUID internal payloads before executable comparison, exposes no ordinary unconditional view issuer, and explicitly treats the returned ValidityStudyView as data rather than reusable authority. A distinct least-privilege runtime role plus schema-qualified relations/function-level search-path controls remain part of the durable adapter increment. The service test lane and owner-schema PostgreSQL contract are admitted to canonical Foundation without weakening hash/coverage controls, and #254 requires the executable contract to be represented in both provenance inventories plus the exact manifest seal. Current #235 exact head is dd95dd7256f37aab2c4f26aa1fb43e8c867f4e4d: Foundation and SAST are terminal GREEN, including owned coverage and isolated PostgreSQL acceptance. Security remains terminal non-passing only at the central Dependency Review availability probe tracked by .github#810; CodeQL remains terminal non-passing only after current-head dispatch succeeds and the central verdict handoff fails, tracked by .github#1927/#1929. These foreign control-plane failures are not leaf source defects and do not authorize no-op churn, synthetic verdicts, gate weakening, or mutable-source adoption. A qualifying independent approval is still absent.

Dependency-first Draft #248 / Issue #247 contains the next forward-only owner-table adoption, least-privilege runtime role and schema-qualified PostgreSQL read adapter. #250 adds the durable dependency-ownership invariant that a validated connection factory must be structurally bound against retained-reference replacement. #251 adds the migration-integrity invariant exposed by the owner-schema move: preserving a table OID, FKs, RLS and triggers is insufficient when an existing trigger/function body embeds a schema-qualified reference to the old relation. A forward owner migration must repair that dependent executable SQL in place while preserving function signature/trigger attachment and governance semantics; it must not paper over the defect with a compatibility copy/view or rewrite protected global migration history. #252 completes the adapter-side checked-versus-used rule: storing an executable connection capability immutably is insufficient if the read path later resolves a subclass-overridable property; execution must consume the exact structurally stored capability rather than perform a fresh dynamic lookup. #248 remains exact d54d44d795444df572efbb301a667d74ac574d58 on stale mutable-parent snapshot 656a0c41c06bc517b2cf7c554e35a6fb4f8c4f4b; it must not absorb mutable #235 source merely to restore mechanical mergeability. #235 integrates normally first; then #248 non-force adopts protected owner truth—including #249/#253/#254/#255—and reacquires exact-head coverage, PostgreSQL, security and review evidence before integration.

The durable follow-on after #248 integration is idempotent registration → explicit predictor/sample/decision-policy/analysis-protocol model → versioned scientific adapters/API/performance evidence. This independent lane does not change the People/Assignment owner order and must not copy mutable #63/#64/#65 source.

#63 exact Foundation CI is terminal success after its predecessor real RED (218 tests passed, 99.43% coverage) and three-branch test repair; SAST and Security are also terminal success. CodeQL remains failed in the central exact-head handoff state and qualifying approval is still absent, so normal integration remains blocked without an Orgmetra no-op retrigger or gate bypass. #64 owns #229#233 plus #246's replay-result reconciliation; its current exact head is 4be7f1681959e43d32c8e85a8f2660da36ff6d9c. Foundation, Security and SAST are terminal GREEN on that head; People API is 239/239 with 1472 statements / 482 branches at 100.00% statement/branch coverage and isolated PostgreSQL acceptance. CodeQL remains terminal FAILURE only at the same shared current-head verdict handoff after both compatibility jobs successfully request dispatch; no qualifying independent approval exists. #65 owns validate_authorization_decision(...) and purpose-bound durable-consumer validation. They overlap on People files, so #65 must non-force adopt protected #64 after normal #64 integration and preserve both invariant sets.

A further owner relationship is explicit: #141 contains a valid employing-legal-Organization HRIS feature but is Draft/non-mergeable on an old base and overlaps #64/#65 on People, authorization, and OpenAPI files. It must follow #65, non-force adopting protected owner truth while preserving its legal-employer feature. Assignment #163/#165 remain downstream consumers and must not adopt mutable sibling source.

Canonical People/Assignment durable order is #63#64#65#141#163#165, each through normal protected integration and non-force protected adoption where required. The independent workforce_validation order is #235#248 → later scientific/API increments, with mutable-parent source never treated as protected dependency evidence.

Writer branch repair finding

PR #100 remains Draft and non-mergeable because its long-lived branch is based on predecessor protected develop@ef1b143368cb6249c9520ca8cae10ebe844a5aa1. This is a repair finding, not a close condition. Its valid baseline delta is preserved; no force-push/destructive rebase is allowed. Safe non-force adoption of current protected truth must preserve valid doctoring while resolving real conflicts and reacquiring exact-head checks/review.

No self-approval, routine administrator bypass, gate weakening, predecessor-evidence substitution, mutable-owner source copy, or release claim is authorized by this PR.

@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6266320a-d62c-4576-9ff6-4ac7ecbbcc6a

📥 Commits

Reviewing files that changed from the base of the PR and between c3289c8 and 4a07d0d.

📒 Files selected for processing (1)
  • docs/product-technical-gap-baseline.md

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

제품·기술 격차 기준 문서를 2026-08-26 기준으로 갱신했다. 조직 ruleset, control anchor, 활성 capability, 구매자 격차, 실행 검증 조건과 운영 진단을 최신 상태로 변경했다.

Changes

제품·기술 격차 기준

Layer / File(s) Summary
저장소 보호 및 실행 기준
docs/product-technical-gap-baseline.md
조직 ruleset 18156473과 PR #119 control anchor를 기록했다. Issue #89의 상업 통제 격차를 3건으로 확장했다. 실행 루프가 유효 ruleset과 현재 PR 그래프를 재조회하도록 갱신했다.
기능 상태 및 주요 격차
docs/product-technical-gap-baseline.md
PR #116–#119의 활성 capability를 추가했다. 목적 바운드 HR 반출, 권위적 성과목표, 접근성, 권위적 릴리스 운영을 최고 가치 구매자 격차로 정의했다.
운영 진단 및 참고문헌
docs/product-technical-gap-baseline.md
리뷰 트리아지와 제공자 복구 진행을 2026-08-25/26 기준 네 가지 항목으로 재작성했다. References (APA 7th) 제목과 목록은 유지했다.

Estimated code review effort: 2 (간단) | ~10분

Merge Risk: 🟡 Moderate · up to 4a07d

The baseline still contains an inaccurate section heading, a conflicting open-PR count, and unclear workflow rerun instructions. These can mislead readers about repository status and recovery steps, so the PR needs follow-up before merge.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 제품·기술 격차 기준 문서를 갱신하는 PR의 주요 변경 사항을 정확하고 간결하게 설명합니다.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/product-technical-gap-baseline

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

This report is out of date. Scroll down for Devin Review's latest report on this PR.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

chatgpt-codex-connector[bot]

This comment was marked as resolved.

@seonghobae
seonghobae marked this pull request as draft August 23, 2026 15:03
@seonghobae
seonghobae marked this pull request as ready for review August 23, 2026 15:35
@seonghobae

Copy link
Copy Markdown
Contributor Author

@opencode-agent Please review the current unchanged head against protected develop. Local exact-head verification: all owned package suites pass at 100% statement/branch coverage.

@seonghobae
seonghobae marked this pull request as draft August 24, 2026 20:04
@seonghobae
seonghobae marked this pull request as ready for review August 24, 2026 20:07
coderabbitai[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

@seonghobae
seonghobae marked this pull request as draft August 25, 2026 08:07
@seonghobae
seonghobae marked this pull request as ready for review August 25, 2026 10:26
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@seonghobae
seonghobae marked this pull request as draft August 25, 2026 20:55

Copy link
Copy Markdown
Contributor Author

Additional durable #274/#275 operability invariant: cross-context People calls must never run inside the Organization Position-root DB transaction/row-lock lifetime. PostgreSQL row locks last until local transaction end; holding them across People/network I/O would turn a local aggregate lock into an implicit distributed lock and couple lock duration to remote latency/failure. Conflicting Position status/version mutation must fail closed locally with audit/outbox evidence, end the transaction, then a governed workflow resolves/terminalizes People state outside the lock. Terminal receipts are applied by new idempotent Organization transactions and the exact Position mutation is retried against current version/digest evidence. Acceptance must inject remote delay/crash and prove it cannot extend Position lock lifetime; original Position eligibility + reservation fence remains authoritative through orchestration failure. Preserve as DDD/OPERABILITY/TEST_STRATEGY baseline truth without volatile PR/run identifiers.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from #274/#275 only; please keep volatile PR SHA/run IDs out of docs/product-technical-gap-baseline.md.

Position ownership extraction now has three code-current invariants that should enter the canonical baseline when #100 is restacked:

  1. Linearized cutover: the legacy People Position/Assignment-capacity writer needs a durable admission epoch and transaction-lifetime receipts. After intake is fenced, migration snapshot/projection waits until every pre-fence admitted transaction has committed or rolled back; time sleeps, request counters, or one activity sample are not drain proof.
  2. Deterministic legacy projection: each tenant-qualified legacy Assignment deterministically maps, under a versioned algorithm, to one migration attempt/reservation identity, terminal People committed evidence, and a confirmed Organization reservation. The same authoritative snapshot must reproduce identical identifiers and manifest/digests; rollback uses the same single-writer barrier.
  3. Eligibility is interval-union evidence: protected Assignment validation can be covered by a union of multiple visible staffable Position versions. The future Organization receipt therefore preserves a normalized PositionEligibilityCoverage set/digest for the whole effective interval rather than one arbitrary Position-version ID. Capacity and every covered eligibility slice remain fenced together.

These are Proposed #274 design/acceptance invariants, not protected runtime truth and not proof that service extraction is complete. #100 remains the sole baseline writer.

Copy link
Copy Markdown
Contributor Author

Additional durable #274/#275 baseline handoff; keep volatile PR SHA/run IDs out of docs/product-technical-gap-baseline.md and preserve #100 as the sole baseline writer.

Migration cannot manufacture target validity. After the legacy writer barrier is fully drained, any authoritative Assignment/Position occupancy that cannot be represented losslessly under the target invariants must block cutover. Examples include overlapping allocation above 1.0000, incomplete staffable Position coverage, or ambiguous tenant/identity mapping. The migration must emit deterministic immutable discrepancy evidence and keep the current owner authoritative; it must not drop, clamp, split, round, synthesize, or silently rewrite source facts merely to make the new ledger pass. Governed correction occurs under the still-authoritative legacy owner, then the complete projection/equivalence process is rerun before any authority switch.

This remains a Proposed design/acceptance invariant until executable migration failure/recovery evidence exists.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from #274/#275 self-review; no volatile head/run IDs belong in the baseline body.

Add the Position/Assignment extraction invariant that confirmed capacity adjustment requires terminal People revision evidence, not a mutable current read. Each capacity-affecting Assignment create/revise/move/end has a unique terminal mutation attempt bound to exact prior Assignment and Organization reservation versions/digests. Capacity-increasing revisions must fence the positive Position/time-slice delta before People commits; Position moves must fence/then confirm target occupancy before source release. Capacity-decreasing revisions/end may commit in People first, but old confirmed capacity remains until immutable terminal People committed revision evidence is applied. Stale/duplicate/out-of-order receipts must replay equivalently or fail closed. Failure recovery therefore prefers temporary over-reservation to under-reservation/overbooking.

Keep this as durable DDD/consistency/operability truth alongside #274 causal order; do not copy #275 mutable source or freeze its SHA/check state into docs/product-technical-gap-baseline.md.

Copy link
Copy Markdown
Contributor Author

Additional durable #274 baseline handoff: capacity evidence alone does not serialize the People Assignment lineage. Distinct revision attempts can each hold valid delta fences while both target the same prior Assignment version. Every capacity-affecting revise/move/shorten/end therefore needs stable Assignment-root serialization plus exact expected-prior-version compare-and-set inside the People transaction. At most one attempt advances a given predecessor; a stale-predecessor loser is terminally non-committing and its unused delta fences can be released only from that exact terminal abort/conflict evidence. Retry of the business intent starts a new attempt against current authoritative Assignment/reservation evidence.

Keep this as durable DDD/consistency truth without copying the active #275 branch or recording its volatile SHAs/checks in docs/product-technical-gap-baseline.md.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from #274/#275 review repair; do not copy volatile head/run IDs into docs/product-technical-gap-baseline.md.

Add the following durable Position/Assignment boundary invariants when this canonical baseline writer is repaired/restacked onto protected truth:

  • Position-capacity idempotency is bound to semantic intent and exact assignment_attempt_id; one idempotency key may not alias a different attempt, and commit-fence transition validates the exact expected reservation version/attempt/digest.
  • A cross-context capacity or terminal-outcome receipt is durable write authority, not merely transport data. Persisted/replayed receipts require versioned cryptographic source/integrity proof plus issuer/audience, tenant, contract version, owner authority/rollback epoch, replay-safe receipt identity, exact Assignment/reservation target version/digest and per-fence consumed vs unused_releasable disposition.
  • Equivalent authenticated replay is idempotent; forged, cross-tenant, wrong-audience, stale/superseded epoch, same-receipt-ID/different-payload, wrong target/version/digest/disposition evidence fails closed before domain mutation. Confirm/release/apply-revision uses exact expected reservation-version CAS.
  • Cutover/rollback changes writer authority epochs so receipts from superseded authority cannot authorize post-switch mutations; no TTL/current absence/network delivery observation substitutes for terminal owner evidence.

These refine the existing #274 single-writer/capacity-fence/recovery gap; they do not make ADR 0274 Accepted or authorize source extraction before #64 -> #96 -> #119 protected adoption and executable two-service security/concurrency evidence.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from the Position-capacity owner lane: the migration/cutover invariant needs one correction before #100 next ordinary adoption.

Protected docs/TRD.md permits retroactive correction of bitemporal HR facts. Therefore a future Organization capacity ledger cannot treat cutover time as an effective-time retention boundary. The cutover projection must include every currently recorded-visible Assignment across the complete effective-time domain, including wholly past intervals that may still participate in a later retroactive create/correction. Superseded recorded-history versions remain People/audit provenance and must not be duplicated as simultaneously live capacity debits.

Acceptance implication: after cutover, a retroactive write against a past Position/time slice must see migrated historical capacity and active|open coverage exactly as current protected semantics require; omitting past-effective current truth could falsely expose capacity and permit historical allocation above 1.0000. Migration/rollback equivalence must therefore cover past/present/future effective slices, not only current/future staffing.

Please record that durable invariant when the #100 single-writer branch next adopts current protected truth. Do not copy volatile PR heads/run IDs into the baseline body.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from #274/#275: authority/rollback epoch transition requires protocol quiescence, not only database transaction drain. Before retiring an epoch, freeze new reservation/fence admissions under it and settle every nonterminal cross-context write-authority state: held must be safely reclaimed/released, every commit_fenced attempt must have terminal People evidence applied, and committed revision/confirm/release receipts must be reflected so Organization capacity state and People Assignment truth are equivalent at the projection cutoff. Only then may the migration/rollback snapshot be taken and the epoch superseded. Otherwise a valid old-epoch fence can have no lossless legacy projection while a delayed People mutation still races the switch; stale-epoch rejection alone can strand an unresolved debit or permit an after-snapshot mutation during non-atomic consumer epoch adoption. Alternative carry-forward requires an explicit successor-epoch re-attestation/handoff manifest with exact authority semantics. Keep volatile #275 SHAs/run IDs out of the durable baseline.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from #275/#274: live authority/rollback epoch retirement must not treat Organization enters draining(E) as proof that Organization-side writes are drained. Persist one transition acquired by exact source epoch-pair CAS; every Organization reservation/fence transaction admitted before that transition carries a transaction-lifetime receipt and must terminally commit/rollback before settlement, quiescence manifest, or snapshot. The same transition must serialize rollover activation: expected transition version + still-current source (authority_epoch, rollback_epoch) CAS yields exactly one activation receipt and target writer; equivalent duplicate intent is idempotent, contradictory target intent fails closed or retries from refreshed authority. Baseline should keep this as a durable recovery/single-writer invariant without volatile PR/run SHAs.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff only; docs/product-technical-gap-baseline.md single-writer를 침범하지 않습니다. Live authority/rollback recovery에서 aborted transition은 source epoch pair의 unique lineage를 계속 소유하며, retry는 replacement transition 생성이 아니라 same transition의 fresh retry generation으로만 진행되어야 합니다. 이전 generation의 admission/manifest evidence는 audit provenance로 보존하되 다음 generation의 quiescence proof로 재사용하지 않습니다. Durable baseline에는 volatile PR/run SHA 없이 ‘one source epoch pair -> one transition lineage across abort/retry -> generation-scoped drain/quiescence evidence -> at most one activated target writer’ invariant만 반영해 주세요.

Copy link
Copy Markdown
Contributor Author

Durable baseline invariant handoff from #275 only; do not copy volatile PR/run SHA into docs/product-technical-gap-baseline.md.

When the Position-capacity ownership gap is represented in the canonical baseline, preserve these domain/recovery/security requirements: (1) all Assignment allocation changes serialize one Employment-root portfolio so distinct Positions/Assignment roots cannot exceed Employment allocation 1.0000; (2) a capacity-affecting successor revision waits for exact predecessor Organization settlement equivalence rather than calculating delta from a lagging ledger; (3) cross-context signing-key versions are authorized for exact issuer/authority+rollback epoch/write purpose, while retired keys are audit-only; (4) epoch-retirement transition creation atomically closes owner admissions and captures pre-existing owner-local admission-sequence high-water marks, so pre-transition receipts are drain obligations without retroactive transition metadata; (5) abort/retry is blocked until both captured owner drains and all capacity-changing settlement obligations are terminal. Keep these as buyer-visible correctness/recovery gaps until executable owner evidence exists; ADR documentation alone is not GREEN.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from #275; no volatile PR/run state needs to enter docs/product-technical-gap-baseline.md.

Add when this single-writer lane next reconciles protected truth: epoch retirement must separate ordinary business-mutation admission from transition-scoped reconciliation admission. Closing old-epoch business admission cannot also close the exact terminalize/confirm/release/apply/settle operations required to resolve already-captured old-epoch work, or a commit_fenced obligation can deadlock retirement. The recovery lane is transition/retry-generation-bound and limited to a deterministic retiring-epoch obligation ledger; it cannot create new reservations/fences, Assignment versions, or unrelated Position mutations. Before quiescence/snapshot/activation, close that recovery lane, capture its admission high-water, drain every recovery receipt through the mark, prove the obligation ledger exhausted, and re-establish cross-owner equivalence. Abort/retry is likewise blocked by any nonterminal recovery receipt.

This refines the existing protocol-quiescence invariant; it does not change HR bounded-context ownership or authorize source extraction.

Copy link
Copy Markdown
Contributor Author

Baseline에 승계할 durable recovery invariant입니다. Live protocol epoch retirement에서 두 bounded-context owner의 business-admission close/high-water capture를 하나의 cross-service atomic transaction으로 가정하지 않습니다. Source-pair-unique transition lineage를 먼저 고정한 뒤 각 owner가 자기 admission gate를 owner-local CAS로 닫고 local high-water를 capture하며, transition/generation/source-pair에 결합된 authenticated closure receipt를 남깁니다. 두 owner closure receipt가 모두 존재하기 전에는 recovery freeze, quiescence, abort, snapshot, activation을 허용하지 않습니다. 한 owner가 먼저 닫힌 뒤 다른 owner가 닫히기 전 admission된 work는 늦게 닫힌 owner의 captured high-water에 포함해 drain하고, 먼저 닫힌 owner는 즉시 새 old-epoch admission을 거절합니다. 이 invariant는 cross-service SQL/distributed ACID 없이 검증 가능해야 합니다.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff for the existing docs/product-technical-gap-baseline.md single writer: an authority-transition design must not make permanent rollout cancellation equivalent to indefinite HR write unavailability. If a drained/unactivated rollover is abandoned rather than retried, the source writer must resume under a fresh authority/rollback epoch boundary; do not reopen the old source-pair admission gate. Both owners must adopt the fresh source authority before business admission reopens, and all receipts/closure/quiescence evidence from the old source pair must become audit-only so it cannot authorize writes or satisfy a later retirement boundary. The abandoned transition becomes terminal and non-retryable; any later rollout starts a new transition from the fresh source pair. Please carry this as a recovery/operability gap without copying volatile PR/run identifiers into the durable baseline.

seonghobae commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from the Position-capacity owner lane; no competing edit to docs/product-technical-gap-baseline.md. The decision is now Proposed ADR 0275 rather than a second file claiming ADR number 0274.

Recovery gap/invariant to preserve when #100 next refreshes the canonical baseline: a retryable aborted writer transition may intentionally keep the retired source-pair gates closed, but permanent rollout abandonment must not strand HR business mutations. The source writer may resume only under a fresh authority boundary (authority_epoch=E, rollback_epoch=R+1) after both owners' captured ordinary drains, transition-scoped reconciliation, capacity settlement and equivalence/quiescence are complete and no target activation exists. Organization and People must independently adopt the fresh pair and publish authenticated adoption evidence before business admission reopens. Never reopen (E,R); prior closure/quiescence evidence becomes audit-only and cannot satisfy a later transition. The abandoned lineage terminates as source_resumed and cannot retry or activate; later migration starts a new lineage from the fresh source pair. Acceptance requires no old-epoch write, no one-sided reopen, no dual writer/target activation, crash-safe partial adoption, and restored HR mutation availability.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from the Position-capacity owner path: governed permanent cancellation of an unactivated writer rollover needs a transition-level source-resume linearization state before any owner-local fresh-authority adoption. Retry and cancellation must CAS the same transition version; owner adoption is allowed only after cancellation wins. After any owner adopts the fresh rollback/authority generation, recovery is roll-forward only to terminal source resume: retry, target activation, old-pair reopening/reversion, and successor transition creation from a partially resumed pair fail closed. A later transition may start only after terminal source resume and both source-owner business gates are durably open on the fresh pair, with new closure/high-water evidence. Permanent-cancel admission itself must be purpose/policy/actor/transition/digest bound. Please incorporate this invariant through #100's existing single-writer baseline when reconciling the current branch; no volatile run/check state needs to enter the baseline.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from the Position-capacity/source-resume owner lane: terminal source-resume evidence must be modeled as write authority, not informational recovery metadata. After permanent cancellation, both owners may reopen HR mutation admission under fresh (authority_epoch=E, rollback_epoch=R+1) only from a signed, purpose-bound terminal resume receipt whose authority is tied to the exact transition/source pair, source-resume/cancellation decision, both owner adoption receipts, authorized verification key, and audience/tenant boundary.

A second durable invariant is stale-capability fencing: owner gate reopening must use the exact gate version installed by source adoption. A later transition that closes/advances the fresh-pair gate permanently invalidates replay of the earlier resume receipt; implementations must not re-read/refresh the expected gate version and reopen from old evidence. Forged/unsigned, wrong-audience/pair/purpose/digest, or audit-only-key terminal receipts fail before gate mutation.

Keep this as durable recovery/security truth in the baseline when #100 next repairs/restacks its single-writer branch. Do not freeze #275 commit SHAs, run IDs, queue state, or review state into docs/product-technical-gap-baseline.md.

Copy link
Copy Markdown
Contributor Author

Durable single-writer handoff from People-read owner #55 / Issue #276: the existing #249/#253 checked-versus-used repository-capability invariant now has a second concrete Orgmetra application in the People bounded context. read_worker_people_record() must inertly resolve a concrete ordinary PeopleReadPort.read_worker function before purpose-bound authorization, reject the inherited Protocol declaration as a non-concrete dependency, and invoke that same captured function after the access decision without a fresh descriptor/__getattribute__ lookup. This preserves People domain truth in Orgmetra and does not authorize copying Workforce Validation source. The durable baseline should record the cross-context invariant/application when this canonical baseline branch is safely repaired against current protected develop; do not freeze volatile #55 SHAs/runs into the baseline body. #100 remains the only writer for docs/product-technical-gap-baseline.md, so no competing baseline edit was made from #55.

Copy link
Copy Markdown
Contributor Author

Durable baseline handoff from shared HRIS-kernel owner #63: the #244 nested-identity invariant has now been verified independently in Job Analysis and audit evidence. Exact outer UUID type is insufficient when the retained .int payload can be low-level replaced or when a frozen value object retains the caller's UUID alias. Canonical boundaries must capture .int once, require exact built-in int before equality/sentinel/range behavior, validate 128-bit/nil/max constraints, and reconstruct owned UUID values before storing canonical evidence. Job Analysis repair is tracked by #277; the analogous manifest-sealed audit slice is #278 and must include exact manifest reseal rather than a hidden source-only change. This is a durable trust-boundary refinement only; do not freeze leaf SHAs/run IDs into docs/product-technical-gap-baseline.md. #100 remains the single writer.

Copy link
Copy Markdown
Contributor Author

#96에서 durable baseline 후보 invariant가 추가됐습니다. OrganizationHierarchyChangeReviewPacket은 scalar primitive만 exact runtime type으로 제한해도 충분하지 않았습니다. caller-defined packet subclass가 __getattribute__를 바꾸면 동일 trust-bearing field가 validation 때와 canonical emission 때 서로 다른 값으로 관측될 수 있었습니다. #96은 test-only regression 24697ccdf475acf791fce6484692cdf2727ed455 뒤 canonical owner source에서 __post_init__의 첫 trust-field read 전에 exact packet runtime type을 강제했고, 현재 ordinary-forward head 5f1fd9776f46f1650571efe38f4db148a8797515에 ADR/TRACEABILITY/README/CHANGELOG까지 반영했습니다.

#100 baseline에는 SHA/run 같은 휘발성 상태가 아니라 다음 invariant만 승계해 주세요: 신뢰 증거 컨테이너 자체가 caller polymorphism을 허용한다면 field-level exact-type validation만으로 checked-vs-emitted 동일성을 보장할 수 없다. 컨테이너 runtime type 또는 동등한 inert snapshot boundary를 첫 trust-bearing field read 전에 고정해야 한다. #96 protected integration 전에는 active-PR evidence로 분류하고 protected truth로 승격하지 마십시오.

Copy link
Copy Markdown
Contributor Author

#96 후속 RED에서 앞선 container-type 수리가 한 단계 더 강화됐습니다. Base __post_init__ 시작부의 type(self) is OrganizationHierarchyChangeReviewPacket만으로는 충분하지 않습니다. Python의 inherited dataclass __init__self.__post_init__()를 동적 dispatch하므로, 허용된 subclass가 __post_init__ 자체를 no-op으로 override하면 base exact-type check를 통째로 건너뛸 수 있습니다.

#96은 test-only 22a995022b5093fce85cce544f60a0960c51ebd4에서 attribute-substitution subclass와 __post_init__ bypass subclass를 class-creation RED로 고정하고, 061814858879b18020fa822439a7462f4bceaede에서 __init_subclass__ fail-closed를 추가했습니다. Base __post_init__ exact-type 검사는 defense in depth로 유지했습니다. 이후 ADR/TRACEABILITY/README/CHANGELOG도 이 hook-override 경계를 current하게 갱신했습니다.

Baseline durable invariant은 다음으로 보강해 주세요: validation이 overridable lifecycle hook에서 시작되는 evidence container는 그 hook 내부의 runtime-type check만으로 finality를 보장하지 못한다. caller subclass가 validation hook 자체를 대체할 수 없도록 subclass creation을 차단하거나, constructor/factory가 non-overridable inert boundary에서 exact container를 생성·검증해야 한다. #96이 protected integration되기 전까지는 active-PR evidence로 유지하십시오.

Copy link
Copy Markdown
Contributor Author

#96 Organization hierarchy-change review produced a new durable runtime-integrity invariant for the canonical product/technical baseline. An issued frozen evidence object can still be modified with low-level Python primitives; therefore an issuance digest alone is insufficient when a caller-defined scalar subtype preserves the same JSON primitive bytes. Exact evidence export must revalidate trust-bearing scalar runtime representation before serialization, while same-type value mutation remains sealed by the issuance digest. Orgmetra canary: issue #279, test-only f952154921c43d323085aa34d88eae36f0846220, causal repair 204695c7c32f5bc209fda4fb0afebde5df2c504e, docs-aligned descendant 9791f1b2f0455b75e3852e006d096338f5bfa987. Please preserve this as a durable boundary invariant when #100 is non-force reconciled; do not copy #96 mutable source.

Copy link
Copy Markdown
Contributor Author

#96/#279의 기존 post-issuance representation-integrity handoff를 한 단계 보강합니다. 이전 invariant처럼 exact scalar runtime representation을 export 전에 검증하는 것만으로는 충분하지 않습니다. 검증 단계가 live evidence object를 읽고 canonical payload 생성 단계가 같은 object를 다시 읽으면, 두 단계 사이의 low-level concurrent mutation으로 checked observation과 used/emitted observation이 달라질 수 있습니다. Durable baseline invariant은 canonical evidence export가 모든 trust-bearing field를 한 번만 local snapshot으로 capture하고, exact runtime-type validation과 canonical serialization이 반드시 그 동일 snapshot을 소비해야 하며, issuance digest는 별도로 semantic mutation을 봉인한다로 유지해 주세요. Orgmetra canary lineage: concurrent regression c8266fd9e98324ff54f25406567aeb1442f8333b → causal one-snapshot repair a98066f95ed43dbca722976619dd9603b60c6a2f → ADR/TRACEABILITY/README/CHANGELOG alignment f0caa7fb32d722fff23180bb3bd713fca15a4dc6. #100은 기존 single-writer를 유지하고 #96 mutable source는 복사하지 마십시오.

Copy link
Copy Markdown
Contributor Author

#96에서 export 이후의 one-snapshot invariant과 별개로 issuance semantic checked-versus-used 결함도 확인되어 #280으로 분리했습니다. Durable baseline에는 다음 경계를 추가해 주세요: evidence object의 creation/issuance 단계는 trust-bearing field를 한 번 local snapshot으로 capture한 뒤 그 동일 snapshot에 전체 semantic validation을 적용하고, canonical creation bytes/digest 및 correlation/live-reference key도 그 snapshot에서만 도출해야 합니다. live object를 semantic validation에서 읽고 sealing 단계에서 다시 읽으면, 저수준 concurrent mutation이 이미 검증이 끝난 뒤 바뀐 exact-built-in 값을 검증 없이 creation evidence로 봉인할 수 있습니다. Orgmetra canary: finalized regression 261a67d56e0c235b29b070afbe6ea4b2b99ab02a → causal repair 08ff578c7a8fb659bd3a4824e439d0360b2a1963 → ADR/TRACEABILITY/README/package CHANGELOG alignment 8243383ef33e9c75ce6232c0d06209186e4c08ca, issue #280. #100 single-writer를 유지하고 #96 mutable source는 복사하지 마십시오.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation priority: medium status: draft type: docs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant