Skip to content

feat(identity): add scoped Studio and membership administration - #40

Merged
cemililik merged 874 commits into
mainfrom
development
Nov 4, 2026
Merged

cemililik merged 874 commits into
mainfrom
development

Conversation

@cemililik

@cemililik cemililik commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

A signed-in person can discover their memberships, explicitly choose an institution or branch, and enter the protected Studio. The API checks the provider association, live membership and actual host before publishing scoped session authority.

  • Add bounded member/profile/status/assignment and Role administration, explicit permission-release adoption, and Tenancy organization/default/locale/settings operations with generated SDK contracts.
  • Deliver localized Studio member/Role views, contextual own-profile editing and recovery, with no-store responses and bounded response-owned snapshots.
  • Preserve valid administrator edits during warm seed repeats; separately verify seed prerequisites and complete management-origin adoption.
  • Keep required audit and protected-write replay durable, recheck replay authorization, and own Next response/compression and native-process work until actual retirement.

Tests

Merged2026-11-04 as ef344c0f, from reviewed head b97214e7. Final-head PR attempt1/A passes27/27 jobs. Full A/B/original-archive proof remains bound to parent 620fdaf3; final-head B/archive verification is an open evidence follow-up. Manual accessibility remains deferred and unexecuted.

  • Merged-head CI41826206204 completes27/27 jobs successfully for head b97214e7, tree f8e89aea. Local follow-up checks pass: CI=true Release build with zero warnings/errors,3,434/3,434 unit cases,46/46 real PostgreSQL seed-continuation cases, the one aggregate seed-continuation architecture control,3,322 Markdown fragment links, roadmap structure and all three delivery indexes. The seven previously unstaged files are now reviewed, refined and included; the working tree is clean. No new writer, permission, schema, timeout or completed manual proof is introduced.

  • Correct dirty-session edit loss through explicit localized consent, keep private controls inert during a check, and retain fail-closed expiry/failure behavior. Native profile validation now preserves escaped editable values with field-associated messages and a fresh correction key, including without JavaScript. Recovery language comes from the current actor's API-verified enabled preference.

  • Earlier native-correction validation (parent 620fdaf3): 3,586/3,586 guarded frontend cases (web 3,432/112 files; SDK154/nine), zero skips/todos; typecheck/lint; focused controls 204/204; CI=true Release solution build; 3,434/3,434 unit cases; 105/105 selected PostgreSQL/idempotency HTTP cases; 9/9 Release delivery architecture controls. The actual two-host HTTPS browser Fact passes its positive and counter journeys with the new session-consent/failure/retry and no-JavaScript correction checks.

  • Both independent correction reviews and final dependent-control supplements approve. Small verified backend fixes preserve sentinel refusal, audit argument checking and fixture cleanup. Supplied invalid-factory/null-context/SQL-injection/cleanup claims were reconciled against actual source and contracts; no privilege, endpoint, migration or timeout expansion is bundled.

  • Pre-follow-up full A/B evidence: A attempt1 and whole-run B attempt2 each pass27/27 jobs, bound to head 620fdaf3, tree c4b4258b, base e55aa5d7, executed merge source 76ecd566. All 50 original archives pass API identity/size/SHA-256/ZIP CRC checks; both independently recomputed aggregates reconcile the identical 7,951 backend case IDs. Each frontend guard passes 3,586/3,586 cases (web112 files/3,432; SDK9 files/154), zero skips/todos. Each public-demo invocation has27 exact JSON/HTML report pairs, mandatory budgets and confirmed process/Compose/private-file/environment/lock cleanup; the invocations are distinct. No partial, cancelled or combined-attempt result supplies qualification.

  • The preceding correction A41803770511 finished24/27: real warm-provider profile replay received429; public-demo completed27 budget-passing original report pairs but refused cleanup; the required integration aggregate also failed. All24 published original archives are retained with API size/digest and ZIP CRC checks; no qualification credit.

  • The warm-provider failure reproduces locally and is repaired by moving the existing real visitor-window wait before the unchanged profile/replay journey. The complete real-provider two-host Fact then passes1/1 in296.648s; both independent narrow reviews approve. Production quotas, timers and all commit/replay/audit assertions remain unchanged. The earlier cleanup refusal remains unattributed; both 620fdaf3 attempts independently prove actual cleanup.

  • The predecessor head 537b97c8 passed A/B run41728267483,27/27 jobs each and50 verified original archives; that is historical evidence only and does not qualify this correction head.

  • Post-merge delivery closeout is published on development at e1339a39: P03-3 implementation is complete and merged; remaining evidence boundaries stay explicit; P03-4/G8 invitations are next. The follow-up changes only the two roadmap documents.

Manual keyboard/focus/reflow/contrast/VoiceOver checks remain maintainer-deferred and unexecuted. Automated results do not represent manual accessibility approval.

Migration / Rollback

Native sign-in requires the separate server-only scope credential, stable authority/issuer pairing, exact management origins/callbacks and the documented TLS/DNS configuration. New user creation remains opt-in and grants neither membership nor a tenant session. Shared admission, replay and snapshot budgets refuse work when exhausted.

Apply the forward migrations without resetting existing identities or provider state. New Tenancy capabilities require explicit Role release adoption. Management-origin adoption advances only after qualified completion; subsequent repeats preserve valid administration changes.

Risk

This changes tenant/organization admission and RLS read-scope boundaries. Separate native credentials propose context; current Membership, host, lifecycle and operation authorization remain authoritative. New creation does not imply membership. See ADR-0078/0079 and the separate fixed-seed read authorities in ADR-0080/0081.

The exact Node/pnpm/Next tuple and checked patch carry maintenance obligations. macOS/Linux are supported; native Windows is refused. Uncertain physical ownership retains reservations. Product HTTP/readiness/shutdown policy and cleanup reserves remain unchanged.

A branch administrator's bounded Role-choice UI remains a Phase06 enhancement under the existing Role-read disclosure ceiling. This PR does not add Tenant Role-read authority to branch actors.

Related

Prepared with Codex.


Play the walkthrough    Follow each request

Record two fresh independent source and retained-evidence approvals,
with explicit proof limits and the pending maintainer decision.

ADR: 0063, 0069
Prepare own-record amendments for both inherited CI decisions and scope
feedback cost per running job. Distinguish expected-owner observations
from unchanged operation deadlines without implementing the policy.

ADR: 0062, 0063, 0069
Record independent source and corpus checks of the maintainer review
clarifications, including the justified observation-bound disposition.

ADR: 0062, 0063, 0069
Record fresh source and corpus approvals with explicit execution and
acceptance limits. Keep the policy Proposed for maintainer review.

ADR: 0062, 0063, 0069
Record maintainer acceptance, append each predecessor amendment and
reconcile current carriers before implementing the closed budget policy.
Acceptance and existing catalogue enforcement do not establish new fit.

ADR: 0062, 0063, 0069, 0075
Record independent amendment-byte and carrier-consistency approvals
without claiming executable implementation or hosted fit.

ADR: 0062, 0063, 0069, 0075
Record two fresh second-round approvals and the completed documentation
step before starting dependent budget implementation.

ADR: 0062, 0063, 0069, 0075
Share one closed mode/job/index duration policy across launch, fixture
preparation and independent result validation. Extend only ordinary whole
job and enclosing observation windows while preserving cleanup and
operation caps. Add positive and forged-identity threshold controls.

ADR: 0062, 0063, 0075
Record independent authority-path approval and offline counterfactual
reruns while leaving hosted qualification explicitly pending.

ADR: 0062, 0063, 0069, 0075
Record fresh independent second-round approvals and freeze the reviewed
source for complete same-source A/B qualification without inferred fit.

ADR: 0062, 0063, 0069, 0075
Record two complete same-source hosted assignments, retained original
packages and exact result/lifecycle evidence before independent review.
Keep implementation-source qualification distinct from later doc heads.

ADR: 0062, 0063, 0069, 0075
Record independent original-archive and lifecycle/public audits of both
complete assignments, with explicit source and chronology proof limits.

ADR: 0062, 0063, 0069, 0075
Correct an unshipped evidence-label finding and record independent
second-round audits. Both actual fixture subsets demonstrate distinct
assignments; no execution source or result changes.

ADR: 0062, 0063, 0069, 0075
Record completed acceptance, code and hosted-evidence review cycles with
source-bound full A/B qualification. Keep later documentation identity
and normal protected checks explicit for the PR handoff.

ADR: 0062, 0063, 0069, 0075
Integrate squash merge 012e67c into development without rewriting
published history. The merged main and reviewed PR head have identical
file trees; subsequent closeout work stays on development.
Record PR 38's verified squash merge and source-bound qualification.
Mark P03-1 complete, retain later activation gates, and identify P03-2
as the next packet without starting its implementation.

ADR: 0069, 0072, 0073, 0074, 0075
Resolve the activation gaps against merged identity storage before
implementing live membership, scope and denied evidence. Keep proposed
authority and the minimum useful HTTP consumer behind maintainer review.

ADR: 0033, 0036, 0040, 0044, 0064, 0065, 0072, 0073
Close the first independent proposal review findings before maintainer
acceptance. Separate ordinary grant ceilings from finite adoption and
preserve denial evidence under nested read-only execution.

ADR: 0017, 0033, 0040, 0044, 0064, 0073
Remove obsolete module-loader and registration-time grant sketches so
the next packet follows the accepted scoped definition and manifest
contract. This documentation repair activates no live authorization.

ADR: 0069, 0073
Record the second fresh proposal review and its evidence limits so the
maintainer can approve the coupled authority and evidence contracts
before the first runtime implementation step.

ADR: 0069, 0073
Separate bounded authority and evidence resources from retained business
owners. Require denial durability before outer success and define fixed
occurrence reconciliation without promising restart replay recovery.

ADR: 0033, 0040, 0044, 0047, 0069, 0072, 0073
Retain the independent liveness and durability review boundaries and
require real server-transaction ownership in the pooling proof before
presenting the corrected decision package for acceptance.

ADR: 0040, 0044, 0047, 0069
Record independent second-round approval and the corrected maintainer
findings without treating design review as runtime qualification or
inferring acceptance of the revised contracts.

ADR: 0033, 0040, 0044, 0047, 0069
Record the maintainer's joint approval before runtime implementation.
Reconcile canonical owners, historical decision amendments, source
classification and registered proofs without claiming activation.

ADR: 0033, 0036, 0040, 0044, 0047, 0064, 0065, 0073, 0076, 0077
Module: Identity, Tenancy, Audit, Education
Keep role identity separate from the accepted auxiliary source pair and
make the approved pending setup and scoped-policy workflow discoverable.
Preserve all executable environment values and runtime activation gates.

ADR: 0076, 0077
Record both fresh review rounds and their verified correction so the
accepted candidate-reader implementation can proceed without confusing
contract approval with activation evidence.

ADR: 0076, 0077
Read current scoped authority without borrowing a retained business
connector or publishing tenant context. Keep actual cleanup, role checks
and the total deadline under one bounded owner, with real PostgreSQL and
transaction-pool progress controls before production activation.

ADR: 0003, 0036, 0040, 0047, 0076, 0077
Module: Identity, Tenancy
Reconcile finished job lanes before helper admission and pin the verified
credential witness and corrupt role-bound controls at their exact owners.

ADR: 0076, 0077
Module: Identity, Tenancy
Record the independently checked fixes and both review verdicts before
continuing with the real policy and read-scope consumer.

ADR: 0076, 0077
Bind every declared act to its live source, fresh authorization decision
and one physical read owner. Keep tenant-wide EF and SQL reads aligned
without widening organization writes or activating the HTTP surface.

Add the internal audited membership directory and real owner, lifecycle,
metadata and direct/PgBouncer progress controls. Preserve staged launch
until denial evidence and HTTP activation are qualified.

ADR: 0076, 0077
Module: Identity, Tenancy, Customization, Education
Keep the current package and CI policy while making the remaining provenance
wrapper choice explicit before any setting changes or early draft publication.

ADR: 0089
Use the existing source-bound PR workflow if early draft review is explicitly
authorized, without adding a parallel manual CI run or relaxing qualification.

ADR: 0089
Record both independent reviews and preserve explicit approval for the two
settings and any draft publication before complete qualification.

ADR: 0089
Distinguish discovered files and inner cases, retain the pnpm probes, and
record authorization for parallel draft review using the existing PR CI.

ADR: 0089
Allow the existing setup and 112 serial controls more signal/failure time
without changing command, outcomes, package guards or product policy.

ADR: 0089

@sourcery-ai sourcery-ai 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.

Sorry @cemililik, this pull request is too large to review

It changes 952 files. Sourcery can review pull requests with up to 300 changed files.

@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Walkthrough

Warning

Review details and warnings were omitted to fit the comment limit.

Record both fresh reviews and the complete local guard, and let the PR own
current hosted proof without moving source after its final A/B binding.

ADR: 0089
Keep the same scan, allocation and fail-closed behavior while exposing the
existing closed subprocess failure class instead of losing it at this call.

ADR: 0062
Record the completed PR A and preserve explicit approval for the separately
retained SDK pair while avoiding a duplicate known-incomplete workflow.

ADR: 0090
Distinguish uncached acceptance from cached refusal, name the canonical
carriers, and retain the unchanged aggregate and ownership proof boundaries.

ADR: 0090
Give the existing sequential cold commands more stop-request allowance while
retaining both counterfactuals, actual retirement and the package guard.

ADR: 0090
Record the full stable-source guard and both reviews, keeping product review
and final-source hosted qualification distinct on the existing PR workflow.

ADR: 0090
@cemililik
cemililik marked this pull request as ready for review November 3, 2026 14:48
@coldtea-pr-lens

coldtea-pr-lens Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
  • Redraw · drawn at b53ad49, the branch has moved on

Architecture

Architecture diagram for HodeTech/LearnStack at b53ad49

Play the walkthrough

Inside the changed components — 2 views

Component view — Scope Admission and Entry

Internal modules handling candidate admission and global self entry.

Architecture view of Component view — Scope Admission and Entry in HodeTech/LearnStack

Component view — Identity and Tenancy Controllers

Administrative endpoints and replay protection in the API.

Architecture view of Component view — Identity and Tenancy Controllers in HodeTech/LearnStack

Data flow

Data flow diagram for HodeTech/LearnStack at b53ad49

Follow each request


Data model

Data model diagram for HodeTech/LearnStack at b53ad49

Open the canvas

The other flows — 1 sequence

New User Self-Entry and Discovery

Sequence diagram of New User Self-Entry and Discovery in HodeTech/LearnStack

Review

✨ Nothing flagged · reviewed b53ad49


Tip

Set github.description: false in .github/pr-lens.yml to stop PR Lens adding buttons to your PR descriptions

🪧 More tips
  • Run npx skills add coldteadotai/pr-lens, then tell your coding agent: "Diagram the change you just made with PR Lens and attach it to the pull request."
  • Run npx @coldtea/pr-lens-cli analyze --base origin/main on a branch, then npx @coldtea/pr-lens-cli render .pr-lens/graph.json. Same lenses, your own model key, before the pull request exists
  • Click the link under each diagram to open it on a canvas you can zoom, pan and step through
  • The diagrams are links. Click one to open it on the canvas, then press W or click play to walk through the change
  • Open a diagram on the canvas, then press W or click play to walk through the change one step at a time
  • The CLI's render reads .github/pr-lens.yml and applies your renames, exclusions and lane pins at draw time
  • Set github.comment.collapsed: true in .github/pr-lens.yml to fold the comment behind one View architecture… row. Drawing still runs as before
  • Set github.draw: on-demand in .github/pr-lens.yml and PR Lens stops drawing pull requests on its own. Comment @pr-lens draw on a pull request when you want that one drawn
  • Add .github/workflows/pr-lens.yml with coldteadotai/pr-lens/packages/action@v0 and your model provider's key as its api-key to run PR Lens from your own CI. Any /chat/completions endpoint works
  • After a push, tick Redraw to draw the latest commit
  • Switch GitHub to dark mode and the diagrams follow. The moving dots are this pull request's data in motion

Thanks for using PR Lens! It's free for OSS. If it helped, a star helps other teams find it.  Star PR Lens on GitHub

@sourcery-ai sourcery-ai 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.

Sorry @cemililik, this pull request is too large to review

It changes 953 files. Sourcery can review pull requests with up to 300 changed files.

Keep complete positive image proof and the final cleanup ledger while
making the preflight and metadata allocation choice explicit for review.

ADR: 0091
Name both phases and their shared metadata sublimit explicitly while keeping
the final ledger, positive proof and exact-source qualification requirements.

ADR: 0091
Separate preflight from final inventory and scope metadata sublimits to
the existing positive proof without changing the final reserve ledger.

ADR: 0091
Remove the stale unchanged-native-policy statement while retaining the
SDK aggregate boundary and source-bound implementation review evidence.

ADR: 0091
Record the complete source-bound controls and corrected two-round review,
keeping hosted qualification on the final immutable PR source binding.

ADR: 0091
Record the repeated same-source SDK failure and aggregate expiry,
with one coordinated four-setting proposal and unchanged proof duties.

Keep executable timers pending explicit maintainer approval.
Resolve the paired SDK and package allowance under maintainer closure
delegation, with complete qualification and ownership proof retained.

ADR: 0092
Give the canonical SDK package a coherent inner and aggregate allowance
while preserving discovery, cold commands and actual ownership proof.
Keep the frontend job allowance consistent with both tested packages.

ADR: 0092
Record complete committed-source validation and both fresh reviews,
then hand one fixed final source to the existing PR qualification flow.

ADR: 0092
Support the documented EC2 Nitro VM signature within the existing
exclusive standard-runner contract. Keep exact producer and receipt
validation, container refusal and all authority/ownership checks intact.

ADR: 0062
Make failed session checks an explicit choice for dirty forms and keep
invalid profile submissions correctable in the native response. Select
recovery language from the current actor while preserving bounded
publication, authorization and physical cleanup. Reconcile verified
review findings without expanding privileges or test windows.

ADR: 0070, 0078, 0079, 0083
Module: Identity, Tenancy
I18n: auth.session.extend_unsaved, auth.mutation.validation, profile.invalid_display_name, profile.invalid_preferred_locale
Place the existing real visitor-window wait before profile replay so
recovery preference reads do not exhaust the earlier page journey.
Preserve production limits and all commit, replay and audit assertions.
Record the failed hosted source and successful actual-provider proof.

ADR: 0070, 0078, 0079
Make published seed-child validation explicit while preserving the fixed
writer authority and prerequisite fences. Link delivered transport and
profile behavior to its accepted contracts and keep qualification in the
phase status and PR proof record.

ADR: 0069, 0078, 0079, 0080
Module: Education, Identity
@cemililik
cemililik merged commit ef344c0 into main Nov 4, 2026
29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant