You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 8edbb03
Browse filesBrowse the repository at this point in the historyBrowse files
and contextual seed verification queries; both review rounds passed. Step 2 adds
78
+
locale/branding writers and whole-value setting audit redaction; both review rounds
79
+
passed.
80
+
Step 3 adds Education writers; both review rounds and a fresh focused fix review
81
+
passed. Step 4 completes convergent seed execution after both review rounds.
82
+
P02d-2 implementation and final verification are complete; PR review/merge remains
83
+
pending. P02d-3 read internals are next; public reads belong to P02d-4.
67
84
68
85
**Phase 01** shipped the .NET 10 solution scaffold under `backend/`
69
86
(core + 7 modules × 4 projects + 4 test projects including the
@@ -242,8 +259,9 @@ and `Organization` aggregates and `TenancyDbContext`; Customization —
242
259
`CustomizationDbContext`; Audit — `AuditEntry`, `AuditConfig` and `AuditDbContext`;
243
260
and Education — separate `Course` and `Lesson` roots, their contained translations
244
261
and `EducationDbContext`. Content, Identity and Media remain scaffolded.
245
-
P02d-1's implementation, agent reviews and required PR checks are complete.
246
-
Command and public-read surfaces belong to the later packets. Other module-level references
262
+
P02d-1 is merged; its implementation, agent reviews and required PR checks are complete.
263
+
P02d-2 supplies unrouted authoring commands and seeded content; public reads belong
264
+
to P02d-4. Other module-level references
247
265
in the docs (e.g. `ILiveClassProvider`, `ITenantSearch`) still describe intended
248
266
shape owned by their named phases.
249
267
@@ -318,7 +336,13 @@ let the entry point pick it.
318
336
-**No → ship the port now, the adapter on a named trigger.** Dapr pub/sub, Kafka, Valkey-backed cache, Vault, APISIX, the Hub entitlement source, signed licence keys, custom-domain TLS automation, `audit_log` partitioning. Each has a port in `LearnStack.SharedKernel` wherever [ADR-0035 § The gated set](docs/decisions/0035-demand-gated-infrastructure.md#the-gated-set) names one, a working default implementation (`InProcessEventBus`, `InMemoryCacheService`, `ConfigurationSecretProvider`, `NullEntitlementProvider`), an owning phase, and a written trigger condition. A building block missing any of those, other than a port that table records as absent, is not demand-gated — it is missing.
319
337
-**Provider adapters everywhere.** Payments, auth, storage, search, live classroom, notifications, **event bus, cache, secrets, Hub contract, entitlement source, host resolver** — all sit behind interfaces. No SaaS lock-in in `Domain` or `Application`. See [20-infrastructure-stack.md](docs/standards/20-infrastructure-stack.md).
320
338
-**The Hub contract is governed by two invariants, not by a count** ([ADR-0034](docs/decisions/0034-hub-contract-surface-invariant.md)): (1) the Hub stores **no tenant content** — courses, lessons, learners, enrollments, sessions and media live only in LearnStack, and the Hub holds tenant *metadata* only; (2) **every LearnStack↔Hub crossing goes through a named adapter** — `IEntitlementProvider`, `IUsageReporter`, `IHubTenantSync`, and nothing else may hold a Hub client. Adding an endpoint still requires an ADR, because the surface is a cross-repository contract both repositories have to agree on.
321
-
-**One binary, five `DeploymentMode` values, two of them wired.** Selection happens at the composition root; module code never branches on the mode ([ADR-0020](docs/decisions/0020-triple-deployment-hybrid-license.md), enforced by `Modules_Do_Not_Reference_DeploymentMode`). `Development` and `SaaS` are wired end to end; `Dedicated`, `SelfHostedOnline` and `SelfHostedAirGapped` are **prepared seams, not supported deployments**, until [Phase 11](docs/roadmap/phase-11-production-hardening.md) builds their adapters and integration suites.
339
+
-**One binary, five `DeploymentMode` values.** Selection happens at the composition
340
+
root; module code never branches on the mode
341
+
([ADR-0020](docs/decisions/0020-triple-deployment-hybrid-license.md), enforced by
342
+
`Modules_Do_Not_Reference_DeploymentMode`).
343
+
[Deployment Models § Supported today versus prepared seam](docs/architecture/25-deployment-models.md#supported-today-versus-prepared-seam)
344
+
owns the current foundation wiring, remaining adapters and production-readiness
345
+
boundary; a selectable enum value is not a supported deployment.
The [platform vision](docs/architecture/01-platform-vision.md) defines the scope and
@@ -37,16 +43,17 @@ the boundary between customization and capabilities that require platform code.
37
43
## What it does
38
44
39
45
The product vision connects discovery, course content and live teaching in one place.
40
-
Three surfaces serve the people on each side of that experience:
46
+
The planned surfaces serve the people on each side of that experience:
41
47
42
48
| Surface | Who it serves | Intended experience |
43
49
|---|---|---|
44
50
|**Public site**| Visitors and prospective learners | Discover a school, browse its catalog and explore its content. |
45
51
|**Admin Studio**| Institution staff and instructors | Author content, manage people and organize teaching. |
46
52
|**Learner portal**| Enrolled learners | Work through lessons, track progress and join live sessions. |
53
+
|**Optional Course Marketplace**| Learners and participating institutions | Shared discovery and central checkout; endorsed target, architecture approval pending. |
47
54
48
55
These are planned product capabilities. Today, the frontend contains route scaffolds
49
-
for all three surfaces; the status below separates delivered foundations from the
56
+
for the first three surfaces; the status below separates delivered foundations from the
50
57
remaining product work.
51
58
52
59
**Built for different ways of teaching.** Content types and level taxonomies already
@@ -58,17 +65,25 @@ items, rules, custom fields and notification templates; their delivery is tracke
58
65
## Where it is today
59
66
60
67
**Phase 01 and Phase 02a are complete. Phase 02d is in progress.**
61
-
[P02d-1](docs/roadmap/phase-02d-walking-skeleton.md) delivers the Education domain,
62
-
schema and isolation proofs. **P02d-2** owns course and lesson command handlers and
63
-
seed writes; **P02d-4** owns anonymous public API reads. Browser rendering follows
64
-
in P02d-5–7.
68
+
[P02d-1](docs/roadmap/phase-02d-walking-skeleton.md#merge-and-closeout-2026-09-14) is
69
+
**complete and merged**: Education domain, schema and isolation proofs.
70
+
**P02d-2's decision package and ADR-0050/0051 are Accepted** as of 2026-10-02,
71
+
with four implementation steps. Step 1 implements the access policy, exact
72
+
definition/locale readers, text-card metadata validation and seed verification queries.
73
+
Both Step 1 review rounds passed. Step 2 adds locale/branding writers and JSON audit
74
+
redaction; both review rounds passed. Step 3 adds Education writers; both review
75
+
rounds and the focused fix review passed. Step 4 completes convergent seed
76
+
execution after both review rounds. P02d-2 is verified and ready for PR review;
77
+
merge remains pending. P02d-3 read internals are next.
78
+
**P02d-4** owns anonymous public API reads. Browser rendering follows
79
+
in P02d-5–7; none of these later packets has started.
65
80
66
81
| Area | Delivered now | Next milestone |
67
82
|---|---|---|
68
-
|**Tenancy**| Tenant provisioning, organizations, host resolution and database isolation | User membership and permissions in [Phase 03](docs/roadmap/phase-03-identity-admin.md)|
69
-
|**Customization**| Content types, level taxonomies, payload validation and built-in seeds | Remaining authoring capabilities across [Phases 04–08a](docs/roadmap/README.md)|
83
+
|**Tenancy**| Tenant provisioning, organizations, locales, branding, host resolution and database isolation | User membership and permissions in [Phase 03](docs/roadmap/phase-03-identity-admin.md)|
84
+
|**Customization**| Content types, level taxonomies, exact-definition readers, text-card metadata validation and tenant-authored seeds | Remaining authoring capabilities across [Phases 04–08a](docs/roadmap/README.md)|
70
85
|**Audit**| Classified write path and transactional durability for business changes | Operational hardening in [Phase 11](docs/roadmap/phase-11-production-hardening.md)|
71
-
|**Education**| Course and Lesson aggregates, translations, migrations and isolation tests | Commands, seeded content and public reading in [P02d-2–4](docs/roadmap/phase-02d-walking-skeleton.md)|
86
+
|**Education**| Course and Lesson aggregates, translations, protected-content policy, scoped authoring commands, complete demo seeds and isolation tests | Public reading in [P02d-4](docs/roadmap/phase-02d-walking-skeleton.md)|
72
87
|**API foundation**| Error contracts, validation, tenancy, concurrency and observability infrastructure | Authentication and durable event processing in [Phase 02b](docs/roadmap/phase-02b-events-auth.md)|
73
88
|**Frontend**| Next.js app and public / studio / portal route scaffolds | First two-tenant browser demo in [P02d-5–7](docs/roadmap/phase-02d-walking-skeleton.md)|
74
89
@@ -106,8 +121,10 @@ make seed # start infrastructure, apply migrations, seed two demo tenants
106
121
```
107
122
108
123
The seed provisions `demo-english` and `demo-yoga`, their organizations and host
109
-
mappings, plus built-in content-type and taxonomy definitions. **It does not yet seed
110
-
courses or lessons**; P02d-2 owns those writes.
124
+
mappings, enabled locales, distinct branding, built-in and tenant-authored definitions,
125
+
and eight scoped courses, ten lessons and twenty-seven translations. It uses the
126
+
ordinary authoring pipeline and verifies completed acts before skipping them on rerun.
127
+
[SeedData](backend/src/LearnStack.Tools.Seeder/SeedData.cs) owns the complete inventory.
111
128
112
129
### 3. Start the applications in separate terminals
0 commit comments