Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
576 commits
Select commit Hold shift + click to select a range
d9f21dd
fix(ci): accept native child status in diagnostic types
cemililik Oct 19, 2026
9aad55b
docs(roadmap): record hosted authentication qualification
cemililik Oct 19, 2026
9d4ec0e
docs(standards): Mark ADR-0065 diagnostic controls as implemented
coderabbitai[bot] Oct 20, 2026
15c2f49
fix(auth): close review privacy and proof gaps
cemililik Oct 20, 2026
653404a
fix(tests): close cross-assembly and middleware proof gaps
cemililik Oct 20, 2026
8f2ebb9
fix(tests): reject hidden fluent middleware registrations
cemililik Oct 20, 2026
09e1a16
docs(roadmap): record verified second review corrections
cemililik Oct 20, 2026
ed21d9f
docs(decisions): clarify subject admission fault ownership
cemililik Oct 20, 2026
4b4a9ac
docs(decisions): complete admission retry contract inventory
cemililik Oct 20, 2026
453d5c3
docs(roadmap): record subject admission revision reviews
cemililik Oct 20, 2026
c8b9d89
docs(decisions): accept bounded subject admission contract
cemililik Oct 20, 2026
0179955
feat(auth): own bounded subject admission cleanup
cemililik Oct 20, 2026
082a658
fix(auth): preserve no-store on every subject refusal
cemililik Oct 20, 2026
5daee8a
docs(roadmap): close subject admission implementation reviews
cemililik Oct 20, 2026
57f49ce
fix(auth): close HTTP boundary proofs and receipt chronology
cemililik Oct 20, 2026
6380fcc
test(auth): close provider and anonymous metadata escape paths
cemililik Oct 20, 2026
09dcb11
test(auth): pin effective action filters and authorization metadata
cemililik Oct 20, 2026
09fdf8a
docs(roadmap): close backend correction review rounds
cemililik Oct 20, 2026
8f433a7
fix(web): bind demo receipts and preserve failure ownership
cemililik Oct 20, 2026
9d08070
fix(web): retain the first owned demo failure
cemililik Oct 20, 2026
9b6794d
fix(web): observe failing native exits before output closure
cemililik Oct 20, 2026
49c2c43
fix(web): publish every unexpected daemon exit
cemililik Oct 20, 2026
00a7877
docs(roadmap): close systematic correction review rounds
cemililik Oct 20, 2026
9014ec6
fix(ci): refresh architecture weights from complete hosted receipts
cemililik Oct 20, 2026
b3abbce
docs(roadmap): close measured timing correction reviews
cemililik Oct 20, 2026
dbb2e9f
fix(ci): require identified hosted timing sources
cemililik Oct 20, 2026
419e456
docs(roadmap): close provenance guard reviews
cemililik Oct 20, 2026
b494570
docs(roadmap): close P02b-5 after PR 33 merge
cemililik Oct 20, 2026
6d75e53
docs(roadmap): propose P02b-6 realm and seed decision package
cemililik Oct 20, 2026
285db56
docs(roadmap): accept P02b-6 realm and seed decisions
cemililik Oct 20, 2026
8bd0990
feat(identity): declare executable development realm identities
cemililik Oct 20, 2026
0b6ce0a
fix(identity): close realm and vocabulary review gaps
cemililik Oct 20, 2026
95d0a0c
fix(identity): qualify client-role claim interpolation
cemililik Oct 20, 2026
8011c00
docs(roadmap): propose bounded server information read
cemililik Oct 20, 2026
ff8a8f1
feat(identity): bound development realm transport and ownership
cemililik Oct 20, 2026
fbd9e7d
docs(roadmap): compare authenticated version probe alternatives
cemililik Oct 20, 2026
7c66885
docs(roadmap): accept fixed server information response allowance
cemililik Oct 20, 2026
a261905
fix(identity): confine server information response allowance
cemililik Oct 20, 2026
3776947
feat(identity): reconcile owned development realm state safely
cemililik Oct 20, 2026
29735c7
fix(identity): qualify stored identity visibility before reconciliation
cemililik Oct 21, 2026
b94f6a2
fix(identity): qualify inherited claims and preserve projected users
cemililik Oct 21, 2026
2ef1e14
docs(roadmap): close realm review and qualify account self-service
cemililik Oct 21, 2026
ce05931
feat(identity): share realm convergence across seed and demo
cemililik Oct 21, 2026
9b51a0b
docs(roadmap): record first seed lifecycle review
cemililik Oct 21, 2026
29bb18d
fix(identity): confine seed preparation credentials
cemililik Oct 21, 2026
1f5cc04
fix(identity): keep readiness under one seed owner
cemililik Oct 21, 2026
1488814
test(identity): retain process absence witnesses in seed proofs
cemililik Oct 21, 2026
ea0363e
feat(identity): qualify realm self-service and real token admission
cemililik Oct 21, 2026
4a3173d
fix(ci): require executed realm cases alongside JUnit reports
cemililik Oct 21, 2026
1f0a8d0
fix(tests): classify the offline realm gate control source
cemililik Oct 21, 2026
bf9e689
docs(roadmap): close P02b-6 implementation and review steps
cemililik Oct 21, 2026
204a103
docs(roadmap): identify the live PR qualification owner
cemililik Oct 21, 2026
e0f9798
fix(identity): preserve setup prerequisites and failure cleanup
cemililik Oct 21, 2026
eb707ee
docs(roadmap): record verified PR identity corrections
cemililik Oct 21, 2026
d2d9b28
fix(identity): reject false convergence and close proof gaps
cemililik Oct 21, 2026
d8139de
style: align correction whitespace
cemililik Oct 21, 2026
837d9d5
fix(identity): validate first reads and complete fixture census
cemililik Oct 21, 2026
f09b16d
fix(identity): bind Docker preflight to the selected environment
cemililik Oct 21, 2026
0c9d287
docs(roadmap): close independent correction reviews
cemililik Oct 21, 2026
5fbbf09
fix(identity): keep seed authority generic and retain startup faults
cemililik Oct 21, 2026
6109268
docs(roadmap): record startup diagnosis correction reviews
cemililik Oct 21, 2026
57ff585
test(identity): distinguish bounded provider startup failure families
cemililik Oct 21, 2026
dc25ebb
test(identity): isolate pure startup diagnostics from fixture ownership
cemililik Oct 21, 2026
fddfc26
docs(roadmap): close provider classification correction reviews
cemililik Oct 21, 2026
9bbf2a3
fix(ci): retain closed Docker startup failure families
cemililik Oct 21, 2026
fb4ab5e
fix(ci): contain malformed diagnostic Unicode
cemililik Oct 21, 2026
4467492
docs(roadmap): record daemon diagnosis correction reviews
cemililik Oct 21, 2026
1bf18b8
fix(testing): align fixture publishers and browser readiness
cemililik Oct 21, 2026
faa8c2b
docs(roadmap): record publication correction first reviews
cemililik Oct 21, 2026
abd4561
docs(roadmap): complete publication correction reviews
cemililik Oct 21, 2026
47069be
fix(identity): clarify private setup and realm proof failures
cemililik Oct 21, 2026
d246754
docs(testing): preserve provider-only fixture boundaries
cemililik Oct 21, 2026
61924f0
docs(roadmap): complete setup correction reviews
cemililik Oct 21, 2026
d0528d1
fix(identity): prove coupled development token expiration
cemililik Oct 21, 2026
7bb9a3e
docs(roadmap): record first issuance correction review
cemililik Oct 21, 2026
c33e529
docs(roadmap): complete issuance correction reviews
cemililik Oct 21, 2026
03ebd77
docs(identity): accept development issuance decision
cemililik Oct 21, 2026
9461801
docs(roadmap): record first issuance acceptance review
cemililik Oct 21, 2026
330a8e2
docs(roadmap): complete issuance acceptance reviews
cemililik Oct 21, 2026
4cb6946
fix(ci): retain closed causal restart failure locations
cemililik Oct 21, 2026
e7a5bf0
docs(roadmap): record closed diagnostic correction review
cemililik Oct 21, 2026
57772a2
docs(roadmap): complete closed diagnostic correction reviews
cemililik Oct 21, 2026
7e8c54f
fix(tooling): preserve safe development lifecycle operations
cemililik Oct 21, 2026
dbc8e02
test(identity): strengthen convergence and CI gate counterexamples
cemililik Oct 21, 2026
3d1bd0e
docs(decisions): propose development identity visibility preparation
cemililik Oct 21, 2026
2ef9cf9
docs(identity): bound historical realm upgrade qualification
cemililik Oct 21, 2026
55ff0fe
test(tooling): declare isolated child test environments
cemililik Oct 21, 2026
8e914a8
docs(roadmap): record final correction and proposal reviews
cemililik Oct 21, 2026
25de7a6
fix(identity): resolve assigned console scopes by bound ID
cemililik Oct 21, 2026
2c06b4a
docs(decisions): qualify preparation authority and console evidence
cemililik Oct 21, 2026
d3e69b7
fix(ci): retain closed native settlement failure locations
cemililik Oct 21, 2026
02b886f
docs(roadmap): record revised decision inspection and failure limits
cemililik Oct 21, 2026
db3778c
docs(decisions): accept bounded warm-realm qualification
cemililik Oct 21, 2026
57497f0
feat(identity): qualify stock console assignment normalization
cemililik Oct 21, 2026
72ee83a
test(identity): cover every interrupted console assignment
cemililik Oct 21, 2026
52c73e6
docs(roadmap): close the first warm-realm correction step
cemililik Oct 21, 2026
8b99de3
feat(identity): prepare warm-realm identities before fresh planning
cemililik Oct 21, 2026
16771fc
fix(identity): qualify visible facts before warm-realm preparation
cemililik Oct 22, 2026
3810b07
docs(roadmap): record verified warm-preparation corrections
cemililik Oct 22, 2026
f714a5a
docs(roadmap): close reviewed warm-realm preparation step
cemililik Oct 22, 2026
ca3560d
test(identity): prove historical realm credentials and API
cemililik Oct 22, 2026
61e47ff
docs(roadmap): record warm qualification and Step 3 reviews
cemililik Oct 22, 2026
87ecc11
test(ci): bound ingress lookup and retain settlement facts
cemililik Oct 22, 2026
8ae35ec
docs(roadmap): record first CI correction review
cemililik Oct 22, 2026
7b0fd1b
docs(roadmap): close independent CI correction reviews
cemililik Oct 22, 2026
9adba27
test(jobs): attribute settlement loss to its execution
cemililik Oct 22, 2026
c9abc97
test(jobs): join issued settlement flights before cleanup
cemililik Oct 22, 2026
4e06ffa
docs(roadmap): close independent attribution reviews
cemililik Oct 22, 2026
55dfeae
test(jobs): preserve recurrence failure and cleanup observations
cemililik Oct 22, 2026
196a5b4
docs(roadmap): record recurrence diagnostic first reviews
cemililik Oct 22, 2026
dbfad06
docs(roadmap): close recurrence diagnostic review rounds
cemililik Oct 22, 2026
0dc962d
test(jobs): isolate settlement proofs from pre-ack renewal races
cemililik Oct 22, 2026
c971f4c
docs(roadmap): record first settlement scheduling reviews
cemililik Oct 22, 2026
c618414
test(jobs): arm settlement deadlines before publication holds
cemililik Oct 22, 2026
c1238ff
docs(roadmap): record independent deadline fix verification
cemililik Oct 22, 2026
2fdf31e
chore: reconcile merged main with development
cemililik Oct 22, 2026
e2a476c
fix(ci): audit links against immutable event commits
cemililik Oct 22, 2026
ecc9f92
docs(roadmap): record link audit correction review
cemililik Oct 22, 2026
b25c1c4
docs(roadmap): close link audit correction reviews
cemililik Oct 22, 2026
36adb3a
fix(ci): classify Markdown audit regression tooling
cemililik Oct 22, 2026
76ca3ad
docs(roadmap): record tooling census correction review
cemililik Oct 22, 2026
d2a32c9
docs(roadmap): close tooling census correction reviews
cemililik Oct 22, 2026
f3ca5c4
test(jobs): preserve native wait failure attribution
cemililik Oct 22, 2026
8234856
docs(roadmap): record native wait diagnostic review
cemililik Oct 22, 2026
12d4f08
docs(roadmap): close native wait diagnostic reviews
cemililik Oct 22, 2026
87ac371
test(jobs): wait for actual cleanup before fixture hints
cemililik Oct 22, 2026
9d1ba8c
test(jobs): retain cancellation before fixture hint emission
cemililik Oct 22, 2026
9eecf96
docs(roadmap): close fixture handoff correction reviews
cemililik Oct 22, 2026
b25d00a
fix(ci): bound browser dependency mirror waits
cemililik Oct 22, 2026
6027530
test(ci): exercise partial browser setup writes
cemililik Oct 22, 2026
e2954be
docs(ci): record browser acquisition review closeout
cemililik Oct 22, 2026
d5f1982
fix(ci): reserve bounded public demo completion time
cemililik Oct 22, 2026
2dc9d74
docs(roadmap): record first outer-budget correction reviews
cemililik Oct 22, 2026
58d9ecd
docs(roadmap): close outer-budget correction reviews
cemililik Oct 22, 2026
f5696ec
fix(ci): join maintenance in OpenAPI control repositories
cemililik Oct 22, 2026
ace2a77
test(ci): require successful owned Git maintenance proof
cemililik Oct 22, 2026
979750c
docs(roadmap): close Git maintenance fixture reviews
cemililik Oct 22, 2026
5bce55d
fix(ci): retain closed producer gate refusal diagnostics
cemililik Oct 22, 2026
84f681a
docs(roadmap): record gate diagnostic review evidence
cemililik Oct 22, 2026
95edb21
docs(roadmap): close producer gate diagnostic reviews
cemililik Oct 22, 2026
8231d17
fix(ci): own Outbox startup and attribute producer refusal
cemililik Oct 22, 2026
0fa8e64
docs(roadmap): record Outbox correction first review
cemililik Oct 22, 2026
ed223ac
docs(roadmap): record independent Outbox correction approval
cemililik Oct 22, 2026
4834e0c
fix(ci): bound pending producer metadata acquisition
cemililik Oct 22, 2026
8e437c3
fix(ci): validate creation times before metadata settlement
cemililik Oct 22, 2026
dada277
docs(roadmap): record independent metadata acquisition reviews
cemililik Oct 22, 2026
8a04bc5
docs(decisions): accept ADR-0069 phase documents and delivery logs
cemililik Oct 22, 2026
f5a4382
docs(roadmap): split Phase 02b and 02d records into delivery logs
cemililik Oct 22, 2026
34c6be9
docs: hold packet status once and record the delivery log rule
cemililik Oct 22, 2026
1b6107c
ci(meta): guard link fragments and roadmap structure
cemililik Oct 22, 2026
81cedbb
docs(decisions): amend ADR-0069 with generated delivery log indexes
cemililik Oct 22, 2026
fa32c0c
docs(roadmap): open each delivery log with a generated index
cemililik Oct 22, 2026
395d078
fix(ci): install Chromium without the APT mirror
cemililik Oct 23, 2026
baeb32f
docs(decisions): propose owned tenant BFF sessions
cemililik Oct 23, 2026
30933cb
docs(decisions): resolve BFF session proposal review findings
cemililik Oct 23, 2026
7474015
docs(roadmap): finish the BFF decision pass and prior closeout
cemililik Oct 23, 2026
325558e
docs(decisions): revise BFF ownership after maintainer review
cemililik Oct 23, 2026
ecb34b5
docs(decisions): retain logout owners in subject admission
cemililik Oct 23, 2026
d3033f3
docs(roadmap): complete revised BFF proposal review
cemililik Oct 23, 2026
eb91186
docs(decisions): accept native tenant BFF session ownership
cemililik Oct 23, 2026
1d51393
feat(identity): add inactive BFF RP and provider event policy
cemililik Oct 23, 2026
26ccc73
fix(identity): qualify logout and event response boundaries
cemililik Oct 23, 2026
fd70846
fix(identity): preserve provider defaults and closed network reasons
cemililik Oct 23, 2026
11cd37d
feat(identity): own bounded native BFF session lifecycles
cemililik Oct 23, 2026
47ffca7
fix(identity): preserve current callback visitor attribution
cemililik Oct 23, 2026
2ebae0c
docs(roadmap): close native BFF ownership reviews
cemililik Oct 23, 2026
3279258
feat(web): implement closed BFF HTTP and request projections
cemililik Oct 23, 2026
7fded69
fix(web): retain native RSC activity through Next middleware
cemililik Oct 23, 2026
e91cf15
docs(roadmap): close P02b-7 HTTP protocol review rounds
cemililik Oct 23, 2026
09b3aa6
feat(web): activate optional tenant BFF and localized session UI
cemililik Oct 23, 2026
2cf2a25
fix(web): close development auth traces and add skip links
cemililik Oct 23, 2026
a48011c
fix(web): preserve focus through session recovery transitions
cemililik Oct 23, 2026
5efecf7
test(identity): prove native BFF lifecycle and browser isolation
cemililik Oct 23, 2026
83858d1
fix(identity): join BFF proof owners before reporting success
cemililik Oct 23, 2026
b600a0f
fix(identity): observe parent EOF throughout BFF acquisition
cemililik Oct 23, 2026
fedffbe
chore: synchronize merged main history
cemililik Oct 23, 2026
d3d7c04
test(web): expect closed shells when tenant sign-in is disabled
cemililik Oct 23, 2026
19cd810
test(ci): isolate held-constructor cancellation and copied ingress
cemililik Oct 23, 2026
1784507
test(jobs): preserve the handoff control before constructor entry
cemililik Oct 24, 2026
c245afc
test(web): distinguish closed browser readiness failures
cemililik Oct 24, 2026
f2a3814
test(jobs): retain the first source-contention failure
cemililik Oct 24, 2026
419a8d9
test(jobs): accept lawful finalizer retries in causal restart
cemililik Oct 24, 2026
4ce7d4d
test(web): retain closed browser failure and cleanup evidence
cemililik Oct 24, 2026
5fc18ce
docs(roadmap): close P02b-7 implementation qualification
cemililik Oct 24, 2026
903ed92
fix(web): preserve anonymous reads and BFF failure ownership
cemililik Oct 24, 2026
a8ee8ba
docs(roadmap): record the reviewed BFF correction handoff
cemililik Oct 24, 2026
5e07cce
test(web): retain startup evidence until child absence
cemililik Oct 24, 2026
268e30c
test(jobs): distinguish recovery renewal from initial timer setup
cemililik Oct 24, 2026
c2a7e97
docs(roadmap): refresh the recovery follow-up index
cemililik Oct 24, 2026
c12f4ee
fix(ci): classify private fixture image preparation failures
cemililik Oct 24, 2026
f712fad
docs(auth): propose uncertain AccountSite refusal policy
cemililik Oct 24, 2026
e782f97
docs(auth): accept explicit AccountSite refusal decision
cemililik Oct 24, 2026
0fa1afe
fix(auth): bind closed BFF boundaries and lifecycle proofs
cemililik Oct 24, 2026
9a32318
test(auth): close configuration and scoped dependency escapes
cemililik Oct 24, 2026
7133f8a
fix(auth): retain ordinary sessions on uncertain API refusal
cemililik Oct 24, 2026
4dbb1d5
test(auth): pin the checked configuration plugin binding
cemililik Oct 24, 2026
31a2754
fix(auth): preserve accessible recovery and proof observations
cemililik Oct 24, 2026
18f3c70
test(auth): bind provider and CI proof failure boundaries
cemililik Oct 24, 2026
4ead28c
fix(auth): reconcile current session proof carriers
cemililik Oct 24, 2026
f64c51f
docs(auth): distinguish verified callback authority
cemililik Oct 24, 2026
9fb1cf3
test(auth): observe provider time and actual HTML refusal
cemililik Oct 24, 2026
4b7f01a
test(auth): bind authenticated SDK result boundaries
cemililik Oct 24, 2026
abdd5da
docs(auth): record SDK counterfactual review evidence
cemililik Oct 24, 2026
e42cc55
docs(auth): hand off the reviewed correction source
cemililik Oct 24, 2026
d380aa6
test(jobs): retain closed recurrence wait observations
cemililik Oct 24, 2026
43b12c7
test(ci): bind both recurrence observation cases independently
cemililik Oct 24, 2026
dd57d53
test(auth): preserve closed browser launch observations
cemililik Oct 24, 2026
aeeea13
test(auth): report browser liveness without inferring exit
cemililik Oct 24, 2026
ae2f7f7
test(jobs): isolate causal stop after actual provider acceptance
cemililik Oct 24, 2026
a286950
docs(roadmap): record final BFF correction qualification
cemililik Oct 24, 2026
cac786d
fix(auth): close review proof and recovery gaps
cemililik Oct 24, 2026
86598f7
docs(roadmap): retain first correction review receipts
cemililik Oct 24, 2026
806d6ba
docs(roadmap): record independent correction recheck
cemililik Oct 24, 2026
3dedda8
test(auth): delimit opaque observer child arguments
cemililik Oct 24, 2026
5748dbb
docs(roadmap): record observer argument review evidence
cemililik Oct 24, 2026
0bde36f
docs(roadmap): freeze reviewed observer correction
cemililik Oct 24, 2026
6b6f062
docs(roadmap): record reviewed BFF correction qualification
cemililik Oct 24, 2026
0d0696a
docs(roadmap): close merged tenant BFF delivery
cemililik Oct 24, 2026
c0261ca
docs(roadmap): propose phase exit enforcement decisions
cemililik Oct 24, 2026
7e6e61f
docs(roadmap): refine phase exit proposal after review
cemililik Oct 24, 2026
49b541c
docs(roadmap): require canonical inventory before gate acceptance
cemililik Oct 24, 2026
486588d
docs(roadmap): record phase exit proposal review verification
cemililik Oct 24, 2026
4b29ea7
docs(decisions): accept phase exit enforcement package
cemililik Oct 24, 2026
212ec0f
feat(kernel): guard sensitive exception messages at compile time
cemililik Oct 24, 2026
4682e26
fix(kernel): analyze dynamically bound exception constructors
cemililik Oct 24, 2026
fa56aac
docs(roadmap): close first phase exit implementation step
cemililik Oct 24, 2026
b20ffae
test(kernel): verify durable asynchronous inventory coverage
cemililik Oct 24, 2026
c241301
fix(kernel): refuse unsupported inventory table creation
cemililik Oct 24, 2026
bfa6ec8
fix(kernel): close inventory schema resolution bypasses
cemililik Oct 24, 2026
3a56444
docs(roadmap): close asynchronous inventory verification
cemililik Oct 24, 2026
1231aed
fix(kernel): reconcile delivered phase contract carriers
cemililik Oct 24, 2026
4d242bc
docs(roadmap): record carrier reconciliation review
cemililik Oct 24, 2026
63a4b52
docs(roadmap): close phase carrier reconciliation
cemililik Oct 24, 2026
c5847a9
chore(repo): merge current main into development
cemililik Oct 24, 2026
6224bd9
test(kernel): bind phase exit criteria to actual proof owners
cemililik Oct 25, 2026
7ae3d8f
docs(roadmap): record exit source review boundary
cemililik Oct 25, 2026
f5e73a1
docs(roadmap): record the second exit source review
cemililik Oct 25, 2026
141592f
docs(roadmap): close source-bound Phase 02b exit qualification
cemililik Oct 25, 2026
60a9721
fix(kernel): close exit guard and evidence review gaps
cemililik Oct 25, 2026
b4b85de
test(kernel): reject opaque SQL routine storage creation
cemililik Oct 25, 2026
5da6bab
test(kernel): validate complete SQL routine declaration boundaries
cemililik Oct 25, 2026
0d9dea4
docs(roadmap): record verified exit correction review boundaries
cemililik Oct 25, 2026
c399ba5
test(ci): include the new PostgreSQL fixture in the plan witness
cemililik Oct 25, 2026
93ef4b1
test(kernel): bind retry fairness and SQL literal proof to durable facts
cemililik Oct 25, 2026
ec03861
docs(roadmap): record the reviewed CI correction source
cemililik Oct 25, 2026
0d60980
test(kernel): qualify completion after acknowledged skipped wakeups
cemililik Oct 25, 2026
d6462dc
docs(roadmap): freeze the reviewed native completion correction
cemililik Oct 25, 2026
65f3283
test(frontend): own Playwright artifacts through fixture cleanup
cemililik Oct 25, 2026
7a2ef1d
docs(roadmap): freeze reviewed fixture ownership and carrier fixes
cemililik Oct 25, 2026
b1f19f5
docs(roadmap): close qualified PR corrections and exit evidence
cemililik Oct 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/add-architecture-test/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ them.
|-----------|----------|
| **NetArchTest** | Project-graph reference bans, naming conventions on types / namespaces. |
| **Mono.Cecil (IL scan)** | What a method body does — a constructor called, a member read — which NetArchTest's type-level rules cannot express. It ships with NetArchTest; there is no ArchUnitNET in this repository. |
| **Roslyn analyzer** | A syntactic pattern the build itself should fail on — `throw new DomainException(...)` outside an invariant guard is `LS0001`. |
| **Roslyn analyzer** | A compiler diagnostic over source; configured severity controls build failure. `LS0001` flags direct `throw new DomainException(...)`, including invariant guards whose justified local suppressions are checked separately. `LS0002` has its bounded sensitive-name scope in the catalogue. |
| **Migration scan** | SQL patterns in `.cs` migration files (RLS-enable, policy presence, partition declaration). |
| **Reflection over conventions** | Marker-attribute presence + matching property / migration shape. |
| **String / regex scan** | When all else fails — explicit "no file under `Verticals/`", "no `english.*` permission key". |
Expand Down
22 changes: 16 additions & 6 deletions .claude/skills/add-backend-module/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ backend/src/Modules/<Name>/
LearnStack.Modules.<Name>.Infrastructure.csproj
```

All four projects inherit the analyzer from `backend/src/Directory.Build.props`;
do not duplicate its project reference or add `LS0001`/`LS0002` to `NoWarn`.
[The catalogue](../../../docs/standards/21-architecture-tests-catalogue.md#learnstackexception-sensitiveexceptionmessage-roslyn-analyzer)
owns their distinct scopes and escalation contract.

Project references follow the strict graph in
[01-architecture-standards.md § Dependency Direction](../../../docs/standards/01-architecture-standards.md):

Expand Down Expand Up @@ -109,10 +114,11 @@ Forbidden references (architecture test will catch them):
> entry describes an intended shape; do not write code against it. Two real seams
> replace it:
>
> - **Handlers and validators** are registered today by passing the module's assembly
> marker to `AddLearnStackMediatRPipeline(params Assembly[])` from the composition
> root — one call, all modules, and it registers the validators from the same
> assemblies.
> - **Handlers and validators** use the shared
> `AddLearnStackMediatRPipeline(params Assembly[])` helper. The API's one
> `AddLearnStackCrossCuttingFoundation` call invokes it with all module assemblies;
> the Seeder calls the helper in its own composition. Both register validators
> and the scoped execution coordinators with the same behavior chain.
> - **The audit catalogue** is a module-owned `IAuditCatalogSource` discovered from DI,
> shipped in Phase 02a Packet 9 per
> [ADR-0044 § 6](../../../docs/decisions/0044-audit-write-path.md). Register it at both
Expand All @@ -129,8 +135,9 @@ Forbidden references (architecture test will catch them):
Composition root (`LearnStack.Api/Program.cs` and its `Composition/` extensions):

```csharp
// Handlers + validators for every module, one call.
services.AddLearnStackMediatRPipeline(
// Extend the existing API foundation call; retain every other module marker.
builder.AddLearnStackCrossCuttingFoundation(
deploymentMode,
typeof(LearnStack.Modules.<Name>.Application.AssemblyMarker).Assembly,
/* … the other module markers … */);

Expand All @@ -139,6 +146,9 @@ services.AddLearnStackMediatRPipeline(
// services.AddScoped<I<Name>Provider, <Name>Provider>();
```

Do not add a second pipeline registration in the API. Extend the Seeder's
existing `AddLearnStackMediatRPipeline` call separately with the same assembly.

And, from Packet 9, the module's audit catalogue — one class in the module's
`Application` project, registered like any other DI service
(see [add-audit-coverage](../add-audit-coverage/SKILL.md)):
Expand Down
72 changes: 41 additions & 31 deletions .claude/skills/wire-cross-cutting-foundation/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: >
(`LearnStack.Api`, worker, background-service host) — `IExceptionHandler`,
8-step MediatR pipeline, `Result<T>.ToActionResult()`, Serilog + OTel,
`TenantContextSpanProcessor`, `IErrorTrackingProvider`,
`IProviderResilience<TPort>`, Roslyn analyzer for `DomainException`. USE
`IProviderResilience<TPort>`, and the scoped exception analyzers. USE
FOR: standing up the foundation in Phase 02a (one-time wiring per host
process), or restoring it after a composition-root refactor. DO NOT USE
FOR: adding a new provider adapter ([add-provider-adapter](../add-provider-adapter/SKILL.md)),
Expand All @@ -21,7 +21,7 @@ description: >
Bring up the LearnStack error-handling + logging + observability foundation
in a backend host. The contract is bound by
[ADR-0032](../../../docs/decisions/0032-exception-handling-logging-and-observability.md).
This skill walks the canonical wiring step by step so the eight binding
This skill walks the canonical wiring step by step so the binding
sub-decisions land in the right composition-root order and the architecture
tests pass.

Expand Down Expand Up @@ -69,8 +69,11 @@ and
[33-cross-cutting-concerns.md](../../../docs/architecture/33-cross-cutting-concerns.md).
You should be able to recite, before you write a line of code:

- The eight pipeline behaviors and their order
- The eight pipeline stages (seven behaviors plus the handler) and their order
(`Validation → Logging → AuditLog → TenantContext → Authorization → Transaction → OutboxFlush → Handler`).
- Step 7's historical name denotes the producer enrollment/invariant guard,
not a buffered flush. Enqueue inserts immediately in the ambient transaction;
its owner drains domain events before MUST audit/commit under ADR-0057.
- The Sentry-vs-OTel boundary (`ShouldCapture(ex)` table).
- The Serilog + OTLP wiring rule (no `AddOpenTelemetry().WithLogging()` alongside).
- The composition-root branching for `IErrorTrackingProvider`.
Expand Down Expand Up @@ -208,24 +211,18 @@ and dispatches to `IErrorTrackingProvider.CaptureAsync` only when
`ShouldCapture(ex)` returns true (see
[09-error-handling.md § Sentry vs OpenTelemetry — Error Capture Boundary](../../../docs/standards/09-error-handling.md)).

### Step 8: Register the MediatR pipeline (8 behaviors in order)
### Step 8: Use the shared MediatR registration (7 behaviors plus handler)

```csharp
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssemblyContaining<AssemblyMarker>();

// Order matters — outermost first, innermost last.
// Architecture test MediatR_Pipeline_Order_Matches_Canonical_Sequence enforces this.
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(AuditLogBehavior<,>));
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(TenantContextBehavior<,>));
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(AuthorizationBehavior<,>));
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(TransactionBehavior<,>));
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(OutboxFlushBehavior<,>));
});
```
The foundation call in Step 12 invokes
`services.AddLearnStackMediatRPipeline(handlerAssemblies)` once. That shared
helper registers the audit, producer and transaction coordinators, validators
and `MediatRPipelineRegistration.CanonicalBehaviorOrder`. Do not reconstruct
the behavior chain with a separate `AddMediatR` call or call the helper again
after the foundation. A separate registration path can bypass shared services;
repeating the shared helper is idempotent but needlessly obscures ownership.
`Registering_The_Pipeline_Twice_Registers_It_Once` protects that idempotency.
`MediatR_Pipeline_Order_Matches_Canonical_Sequence` verifies
the actual order, including `OutboxFlushBehavior` at position seven.

Do **not** add an `ExceptionHandlingBehavior`. The `AuditLogBehavior` catches
handler exceptions, writes the failure audit, and rethrows via
Expand Down Expand Up @@ -298,24 +295,37 @@ public async Task<IActionResult> Create(CreateCourseCommand cmd, CancellationTok

No action filter, no `ResultUnwrapBehavior`. Explicit beats magic.

### Step 11: Add the Roslyn analyzer
### Step 11: Preserve automatic analyzer wiring

`backend/src/Directory.Build.props` automatically references the in-tree
`backend/analyzers/LearnStack.Analyzers` project with
`OutputItemType="Analyzer"` and `ReferenceOutputAssembly="false"`. It is not
a NuGet package. New production C# projects inherit this wiring. Do not add
project-level
analyzer references or suppress these diagnostics with `NoWarn`.

- `LS0001` (`LearnStackException-DomainExceptionThrow`) retains its
Domain/Application scope through the compiler-visible scope property.
- `LS0002` (`LearnStackException-SensitiveExceptionMessage`) covers bounded
sensitive-name exception expressions in every production C# project. It is
not data-flow analysis and covers no JavaScript/TypeScript.
- Both remain Warning, including CI, in `WarningsNotAsErrors` rather than
`NoWarn`. Phase 03 exit promotes them to Error and removes that exemption.

The `LearnStackException-DomainExceptionThrow` analyzer lives in
`backend/analyzers/` and ships as a NuGet package referenced by
`Domain` + `Application` projects via
`<PackageReference Include="LearnStack.Analyzers" ... />`. Severity:
Warning in Phase 02a, escalates to Error after Phase 03 exit.
[ADR-0032 Amendment 6](../../../docs/decisions/0032-exception-handling-logging-and-observability.md#amendment-6--sensitive-exception-message-diagnostic-2026-10-25)
and the [catalogue](../../../docs/standards/21-architecture-tests-catalogue.md#learnstackexception-sensitiveexceptionmessage-roslyn-analyzer)
own the exact scope, expression limits and proof obligations.

### Step 12: Register module services last
### Step 12: Pass all module assemblies to the host foundation

Module assemblies reach the foundation as arguments, not as separate registration
calls. `AddLearnStackCrossCuttingFoundation` discovers their integration-event
handlers and hands the same assemblies to `AddLearnStackMediatRPipeline` as its
**last** statement, so behaviors and instrumentation are already wired before any
module handler is registered:
handlers and then hands the same assemblies to `AddLearnStackMediatRPipeline`
for the shared execution services, behavior chain and validator discovery. Keep
the complete assembly set in this one host call:

```csharp
// The shipped entry point, and the only one: AddLearnStackCrossCuttingFoundation
// The shipped host entry point, called once: AddLearnStackCrossCuttingFoundation
// on the WebApplicationBuilder, taking the deployment mode and the assemblies whose
// integration-event handlers should be discovered.
builder.AddLearnStackCrossCuttingFoundation(
Expand Down
6 changes: 4 additions & 2 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,10 @@ it.
`make test` starts Testcontainers since Phase 02a Packet 6, so it needs a Docker
socket and takes noticeably longer than it did. The Docker-bound cases are split
out by `[Trait("Requires","Docker")]`; to skip them, run
`dotnet test backend/LearnStack.slnx --filter "Requires!=Docker"`, which is
exactly what CI's `backend` job runs.
`dotnet test backend/LearnStack.slnx --filter "Requires!=Docker"` locally.
CI partitions that population into base and architecture producers, with exact
coverage checked by the required backend aggregate under
[ADR-0063](../docs/decisions/0063-complete-bounded-ci-test-shards.md).

The pre-commit hook (activated by `make install`) runs, on staged files only:
`dotnet format` on `*.cs`; prettier on JS / TS / JSON / Markdown **under
Expand Down
4 changes: 4 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,10 @@ rules:
The Roslyn analyzer `LearnStackException-DomainExceptionThrow` flags
violations; full catalogue entry in
[docs/standards/21-architecture-tests-catalogue.md](docs/standards/21-architecture-tests-catalogue.md).
- Silence the production `LS0002` sensitive-exception-message guard project-wide.
Its automatic wiring and bounded scope are in the
[same catalogue](docs/standards/21-architecture-tests-catalogue.md#learnstackexception-sensitiveexceptionmessage-roslyn-analyzer).
A clean report is not data-flow secrecy or a redaction guarantee.
- Throw `FluentValidation.ValidationException` from `ValidationBehavior` —
the behavior returns `Result.Fail(validation_failed)` and never throws.
- Reference `Sentry.SentrySdk` directly from any module assembly — error
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ skeleton. Current packet state lives in the
| **Customization** | Content types, level taxonomies, exact-definition and generation-cached batched display readers, text-card metadata validation, create-only provisioning defaults and semantic built-in seed verification | Remaining authoring capabilities across [Phases 04–08a](docs/roadmap/README.md) |
| **Audit** | Classified write path and transactional durability for business changes | Operational hardening in [Phase 11](docs/roadmap/phase-11-production-hardening.md) |
| **Education** | Course and Lesson aggregates, translations, protected-content policy, scoped authoring commands, complete demo seeds and isolated public GET/HEAD reads | Full versioned curriculum in [Phase 05](docs/roadmap/phase-05-education-learning-content.md) |
| **API foundation** | Error contracts, validation, tenancy, concurrency, observability, durable events/subscriber delivery, background jobs, the closed tenant bearer/AccountSite boundary and development realm reconciliation | Phase-exit enforcement in [Phase 02b](docs/roadmap/phase-02b-events-auth.md) |
| **API foundation** | Error contracts, validation, tenancy, concurrency, observability, durable events/subscriber delivery, background jobs, the closed tenant bearer/AccountSite boundary and development realm reconciliation | Membership and permissions in [Phase 03](docs/roadmap/phase-03-identity-admin.md); current exit state in [Phase 02b](docs/roadmap/phase-02b-events-auth.md) |
| **Frontend** | Native TLS ingress, live locale entry, trusted server caller, localized catalog/course/lesson pages, safe themes, accessibility controls/manual smoke, generated typed SDK and optional bounded native BFF session scaffolds | Full renderer/Studio and Playwright Test/axe in [Phase 06](docs/roadmap/phase-06-renderer-admin-studio.md) |

**Four modules contain domain implementations:** Tenancy, Customization, Audit and
Expand Down
12 changes: 4 additions & 8 deletions backend/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,11 @@
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors Condition="'$(CI)' == 'true'">true</TreatWarningsAsErrors>
<!--
LS0001 ("LearnStackException-DomainExceptionThrow", ADR-0032
§ Sub-decision 4 + Amendment 1) is a Warning until the Phase 03 exit
gate, then escalates to Error. Keep it OUT of TreatWarningsAsErrors
until then so a legitimate aggregate-invariant `throw new
DomainException(...)` does not break CI before the documented
escalation point. Remove LS0001 from this list when the analyzer's
default severity flips to Error after Phase 03 exit.
ADR-0032 Amendments 1/6 keep LS0001 and LS0002 as Warnings until
Phase 03 exit, including CI. They remain visible, not suppressed.
Remove both exemptions when their default severities become Error.
-->
<WarningsNotAsErrors>$(WarningsNotAsErrors);LS0001</WarningsNotAsErrors>
<WarningsNotAsErrors>$(WarningsNotAsErrors);LS0001;LS0002</WarningsNotAsErrors>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<AnalysisLevel>latest</AnalysisLevel>
<!--
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@
Rule ID | Category | Severity | Notes
--------|----------|----------|------------
LS0001 | Design | Warning | Rule "LearnStackException-DomainExceptionThrow" (ADR-0032 § Sub-decision 4 + Amendment 1). DomainException is reserved for programmer errors; expected business-rule violations return Result.Fail(business_rule_violation, ...). Roslyn diagnostic ids must be valid identifiers, so the wire id is LS0001; the hyphenated string is the human-readable rule name. Severity escalates to Error after Phase 03 exit.
LS0002 | Security | Warning | Rule "LearnStackException-SensitiveExceptionMessage" (ADR-0032 Amendment 6). Bounded sensitive-name checks on directly thrown exception string arguments across production C# projects. Severity escalates to Error after Phase 03 exit.
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,19 @@ namespace LearnStack.Analyzers;
/// help text; the wire-level id is <c>LS0001</c>. See ADR-0032 Amendment 1.
/// </para>
/// <para>
/// Severity: <see cref="DiagnosticSeverity.Warning"/> in Phase 02a. Per
/// Severity: <see cref="DiagnosticSeverity.Warning"/> until Phase 03 exit. Per
/// ADR-0032 the severity escalates to <see cref="DiagnosticSeverity.Error"/>
/// after Phase 03 exit when every existing call site has been migrated.
/// Until then <c>LS0001</c> is listed in <c>WarningsNotAsErrors</c>
/// (Directory.Build.props) so a legitimate aggregate-invariant throw does
/// not break CI under <c>TreatWarningsAsErrors</c> before the documented
/// escalation point.
/// </para>
/// <para>
/// The assembly also carries LS0002 and is loaded by every production project.
/// The compiler-visible LearnStackAnalyzeDomainExceptionThrow property keeps
/// this rule scoped to Domain / Application (ADR-0032 Amendment 6).
/// </para>
/// </remarks>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class DomainExceptionThrowAnalyzer : DiagnosticAnalyzer
Expand Down Expand Up @@ -71,8 +76,18 @@ public override void Initialize(AnalysisContext context)
if (context is null) throw new System.ArgumentNullException(nameof(context));
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.EnableConcurrentExecution();
context.RegisterSyntaxNodeAction(AnalyzeThrowExpression, SyntaxKind.ThrowExpression);
context.RegisterSyntaxNodeAction(AnalyzeThrowStatement, SyntaxKind.ThrowStatement);
context.RegisterCompilationStartAction(start =>
{
if (start.Options.AnalyzerConfigOptionsProvider.GlobalOptions.TryGetValue(
"build_property.LearnStackAnalyzeDomainExceptionThrow", out var enabled)
&& string.Equals(enabled, "false", System.StringComparison.OrdinalIgnoreCase))
{
return;
}

start.RegisterSyntaxNodeAction(AnalyzeThrowExpression, SyntaxKind.ThrowExpression);
start.RegisterSyntaxNodeAction(AnalyzeThrowStatement, SyntaxKind.ThrowStatement);
});
}

private static void AnalyzeThrowStatement(SyntaxNodeAnalysisContext context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@
</PackageReference>
</ItemGroup>

<ItemGroup>
<!-- Compile the canonical matcher without a runtime SharedKernel dependency. -->
<Compile Include="..\..\src\LearnStack.SharedKernel\Secrets\SensitiveTokenMatcher.cs"
Link="Secrets\SensitiveTokenMatcher.cs" />
</ItemGroup>

<ItemGroup>
<!-- Roslyn release-tracking rule (RS2008) requires these markdown files
to live alongside the analyzer assembly. -->
Expand Down
Loading
Loading