Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
441 commits
Select commit Hold shift + click to select a range
a99e6a8
feat(kernel): submit recipient jobs on the existing owner
cemililik Oct 17, 2026
f08f8bf
feat(kernel): reconcile recipient receipts after actual cleanup
cemililik Oct 17, 2026
35c3e0d
test(kernel): qualify recipient admission fault boundaries
cemililik Oct 17, 2026
c4a93de
fix(kernel): fence native recurring writes against supersession
cemililik Oct 17, 2026
c500bcb
feat(kernel): own recurrence runtime and quarantine observation
cemililik Oct 17, 2026
dd600e8
test(kernel): prove retained recurrence native ownership
cemililik Oct 17, 2026
b72ce6c
test(kernel): prove retained recipient progress and source pins
cemililik Oct 18, 2026
59a19e1
test(kernel): close recurrence core capability identities
cemililik Oct 18, 2026
332e7a4
test(kernel): close recurrence ownership and hint boundaries
cemililik Oct 18, 2026
f687924
fix(kernel): contain invalid recurrence facts and late setup
cemililik Oct 18, 2026
390515b
fix(kernel): close recurrence drain and parent stop qualification
cemililik Oct 18, 2026
215b98e
test(kernel): tighten recurrence guards and scope metadata scans
cemililik Oct 18, 2026
921e78f
test(kernel): defer orchestration identity formatting
cemililik Oct 18, 2026
02f99f2
test(kernel): bound parallel census mutation collections
cemililik Oct 18, 2026
54816f8
feat(kernel): observe durable job obligations across restarts
cemililik Oct 18, 2026
09ffcab
feat(kernel): project confirmed native job observation facts
cemililik Oct 18, 2026
08000fd
feat(kernel): expose bounded memory-only job metrics
cemililik Oct 18, 2026
bd7030d
feat(kernel): record actual job stage outcomes after owned cleanup
cemililik Oct 18, 2026
531bc6e
feat(kernel): preserve owned job tracing across observer faults
cemililik Oct 18, 2026
c581f79
fix(kernel): count confirmed job control transitions
cemililik Oct 18, 2026
c5a8cd1
test(kernel): qualify job control transition observations
cemililik Oct 18, 2026
aaf1f8d
feat(kernel): observe acknowledged recurrence progress
cemililik Oct 18, 2026
74fab4a
fix(kernel): count fenced bridge repairs and deferrals
cemililik Oct 18, 2026
4dcd5e8
feat(kernel): observe first acknowledged job lease loss
cemililik Oct 18, 2026
3137a0f
feat(kernel): observe actual late job settlement
cemililik Oct 18, 2026
dba8738
docs: add the shared background job workflow
cemililik Oct 18, 2026
538a2c8
test(kernel): close job manifest and route census gaps
cemililik Oct 18, 2026
35e2f45
test(kernel): verify context before actual job construction
cemililik Oct 18, 2026
3837a8f
ci: qualify the published Hangfire distribution
cemililik Oct 18, 2026
97896ff
test(kernel): align job obligation owners with the catalogue
cemililik Oct 18, 2026
d2bb2ee
test(kernel): qualify combined privileged connection ownership
cemililik Oct 18, 2026
c176dd8
test(kernel): correct final regression fixture boundaries
cemililik Oct 18, 2026
720fca1
docs(standards): record enforced background job obligations
cemililik Oct 18, 2026
199b033
test(kernel): qualify P02b-4 completion and closeout
cemililik Oct 18, 2026
2e1d227
docs(roadmap): link P02b-4 PR and live CI ownership
cemililik Oct 18, 2026
aeec7fd
docs(decisions): propose isolated native CI prerequisites
cemililik Oct 18, 2026
aa5f705
docs(decisions): reserve native CI finalization margin
cemililik Oct 18, 2026
bc3691f
fix(dev): reuse one fresh migration and demo build
cemililik Oct 18, 2026
6d33306
test(kernel): avoid repeated CI census and database setup
cemililik Oct 18, 2026
0fe0db2
test(ci): observe native prerequisites and completed cases
cemililik Oct 18, 2026
641ba36
fix(web): classify read-only CI diagnostic sources
cemililik Oct 18, 2026
5134637
docs(decisions): revise native CI authority and qualification
cemililik Oct 18, 2026
82d5307
test(kernel): defer capacity and recipient owner formatting
cemililik Oct 18, 2026
e406b70
test(kernel): index concrete task owner writes
cemililik Oct 18, 2026
c4e64b5
docs(decisions): accept bounded native CI provisioning
cemililik Oct 18, 2026
ee11bc9
ci: isolate and qualify complete native crash proofs
cemililik Oct 18, 2026
779b600
fix(ci): preserve exact interrupted test evidence
cemililik Oct 18, 2026
6daa9a1
fix(ci): align native proof context and compiler census
cemililik Oct 18, 2026
1458401
fix(ci): publish synthetic cgroup snapshots atomically
cemililik Oct 18, 2026
37ff4c5
fix(ci): retain closed crash inventory refusal details
cemililik Oct 18, 2026
3f5f09e
docs(decisions): propose complete bounded CI test shards
cemililik Oct 18, 2026
b4ee65b
fix(ci): classify crash candidates without disclosing contents
cemililik Oct 18, 2026
d39233d
fix(ci): distinguish bounded Docker inventory observations
cemililik Oct 18, 2026
f53c36f
fix(ci): retain closed image and workload failure facts
cemililik Oct 18, 2026
7cd07a1
fix(ci): qualify image layer scope in crash inventory
cemililik Oct 18, 2026
e710bb6
fix(ci): classify unexpected workload faults without provider text
cemililik Oct 18, 2026
9aad3c5
fix(ci): retain result evidence across diagnostic rotation
cemililik Oct 18, 2026
3553ff1
docs(roadmap): record native proof and rotation review
cemililik Oct 18, 2026
b3ee4ea
docs(decisions): revise bounded CI shard qualification
cemililik Oct 18, 2026
2e1fedc
docs(roadmap): record revised shard proposal reviews
cemililik Oct 18, 2026
94f201a
docs(decisions): accept complete bounded CI shard plan
cemililik Oct 18, 2026
480fb1b
feat(ci): add complete selector assignment and bounded shard plan
cemililik Oct 18, 2026
0c97dd2
fix(ci): refuse selectors shared across trait partitions
cemililik Oct 18, 2026
357b97f
docs(roadmap): close selector plan reviews and begin execution
cemililik Oct 18, 2026
17f9cd4
feat(ci): add bounded shard execution and scoped resource receipts
cemililik Oct 18, 2026
9d3c7b4
docs(roadmap): record bounded execution first review
cemililik Oct 18, 2026
fc67d1f
fix(ci): bound startup and surface pre-ready worker refusals
cemililik Oct 18, 2026
83be42d
docs(roadmap): close bounded execution reviews and correction
cemililik Oct 18, 2026
10e1b16
feat(ci): enforce complete attempt-bound shard results
cemililik Oct 18, 2026
98ae41a
fix(ci): join aggregate manifests and preserve rerun identity
cemililik Oct 18, 2026
70c8fde
fix(ci): retain image identity and deterministic interruption proof
cemililik Oct 18, 2026
4a14a81
fix(ci): retain closed failure locations for hosted diagnosis
cemililik Oct 18, 2026
ec5b045
docs(roadmap): record hosted diagnostic correction approval
cemililik Oct 18, 2026
2b8d6cb
fix(ci): expose finite heartbeat and public proof failure facts
cemililik Oct 18, 2026
30ef90d
fix(ci): match actual generation record diagnostic shape
cemililik Oct 18, 2026
e0124ba
docs(roadmap): record reviewed finite hosted failure diagnosis
cemililik Oct 18, 2026
2c7d430
fix(jobs): observe native heartbeat lifecycle progress
cemililik Oct 18, 2026
89fd845
docs(roadmap): record heartbeat diagnostic reviews
cemililik Oct 18, 2026
15d5161
fix(kernel): qualify native starts after committed handoff
cemililik Oct 18, 2026
6f5025c
test(kernel): qualify adjacent native execution premises
cemililik Oct 19, 2026
c3564e0
docs(roadmap): record native correction review approvals
cemililik Oct 19, 2026
78c5132
fix(kernel): join asynchronous vendor connection acquisition
cemililik Oct 19, 2026
da8a595
fix(kernel): share bounded privileged connection acquisition
cemililik Oct 19, 2026
0634280
docs(roadmap): record acquisition correction reviews
cemililik Oct 19, 2026
65afb4d
test(kernel): qualify remaining native execution entry premises
cemililik Oct 19, 2026
39adff2
docs(roadmap): record native entry correction reviews
cemililik Oct 19, 2026
18ba170
test(kernel): join actual pool and native wrapper completion
cemililik Oct 19, 2026
1dbde1a
docs(roadmap): record owned completion correction reviews
cemililik Oct 19, 2026
df6e276
fix(kernel): close verified job runtime review gaps
cemililik Oct 19, 2026
bc5bf1c
docs(standards): finish job authority reconciliation
cemililik Oct 19, 2026
8cd789d
docs(roadmap): record completed correction reviews
cemililik Oct 19, 2026
6bcc2b9
test(kernel): preserve observation hash projection controls
cemililik Oct 19, 2026
12c79f3
docs(roadmap): record projection correction reviews
cemililik Oct 19, 2026
f8c003a
test(kernel): isolate final fence from retry hint diagnostics
cemililik Oct 19, 2026
2b62623
test(kernel): order native staging after bridge acknowledgement
cemililik Oct 19, 2026
62ad318
docs(roadmap): close native fence correction reviews
cemililik Oct 19, 2026
cd69bbc
fix(kernel): tighten verified review safeguards
cemililik Oct 19, 2026
abd5320
docs(standards): clarify retry hint default after review
cemililik Oct 19, 2026
617ed08
docs(roadmap): record completed safeguard correction reviews
cemililik Oct 19, 2026
466d88e
docs(architecture): accept content type quota accounting
cemililik Oct 19, 2026
04b4e78
fix(customization): enforce approved content type quota
cemililik Oct 19, 2026
d2c414e
docs(roadmap): record first quota correction review
cemililik Oct 19, 2026
1261c38
docs(roadmap): close quota correction reviews for qualification
cemililik Oct 19, 2026
e95d67e
docs(roadmap): close merged P02b-4 and name the next packet
cemililik Oct 19, 2026
0e23cb1
chore: sync merged P02b-4 into development
cemililik Oct 19, 2026
5bfe3c3
docs(decisions): propose the P02b-5 authentication boundary
cemililik Oct 19, 2026
c94abe1
docs(roadmap): record P02b-5 decision reviews
cemililik Oct 19, 2026
5e8539c
docs(decisions): resolve tenant authentication review gaps
cemililik Oct 19, 2026
9ff8c8a
docs(roadmap): record first authentication revision reviews
cemililik Oct 19, 2026
945f7ba
docs(roadmap): close authentication proposal revision reviews
cemililik Oct 19, 2026
493d7f9
docs(decisions): accept the tenant authentication boundary
cemililik Oct 19, 2026
6526362
feat(kernel): add the isolated tenant token foundation
cemililik Oct 19, 2026
c6108bf
fix(kernel): keep metadata hosts out of native HTTP metrics
cemililik Oct 19, 2026
e67c329
docs(roadmap): close both token foundation review rounds
cemililik Oct 19, 2026
a736edb
feat(tenancy): add the host-bounded read-only account query
cemililik Oct 19, 2026
e36d47c
docs(tenancy): record account query review and implementation
cemililik Oct 19, 2026
8f9ecff
docs(roadmap): close both account query review rounds
cemililik Oct 19, 2026
c090970
feat(kernel): attribute tenant refusals and add subject admission
cemililik Oct 19, 2026
90724a5
docs(roadmap): record the first admission review round
cemililik Oct 19, 2026
40fe1ee
fix(kernel): export actor UUIDs at rejection log boundaries
cemililik Oct 19, 2026
6686d01
docs(roadmap): wrap the admission closeout pointer
cemililik Oct 19, 2026
0be26ab
feat(api): activate the closed tenant authentication boundary
cemililik Oct 19, 2026
746c0cd
fix(api): document the early request body refusal
cemililik Oct 19, 2026
a7c9d5a
docs(roadmap): close both HTTP activation review rounds
cemililik Oct 19, 2026
d463952
test(kernel): enforce closed tenant authentication authority
cemililik Oct 19, 2026
1942662
fix(kernel): close alternate authentication authority paths
cemililik Oct 19, 2026
e20b607
fix(kernel): close identity exports and inherited role metadata
cemililik Oct 19, 2026
b79acc8
docs(roadmap): close tenant API implementation and reviews
cemililik Oct 19, 2026
5676c75
docs(roadmap): link tenant authentication review handoff
cemililik Oct 19, 2026
afa8481
docs(decisions): fix punctuation in ADR index summaries
coderabbitai[bot] Oct 19, 2026
d335f2b
docs(decisions): accept bounded tenant assertion diagnostics
cemililik Oct 19, 2026
8a3892d
fix(kernel): close tenant authentication review gaps
cemililik Oct 19, 2026
ac82ca6
docs(roadmap): record authentication review corrections
cemililik Oct 19, 2026
f5befc9
fix(ci): retain closed public demo failure phases
cemililik Oct 19, 2026
ce2b746
fix(ci): recognize signalled browser startup exits
cemililik Oct 19, 2026
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
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
13 changes: 9 additions & 4 deletions .claude/skills/add-ef-migration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -326,10 +326,15 @@ dotnet ef migrations script \
# FORCE ROW LEVEL SECURITY exists to defeat. ConnectionStrings:Migration must never
# appear in API or worker runtime configuration
# (docs/standards/05-database.md § Database roles).
dotnet ef database update \
--project backend/src/Modules/<Module>/LearnStack.Modules.<Module>.Infrastructure \
--startup-project backend/src/LearnStack.Api \
--connection "$ConnectionStrings__Migration"
(
migration_cs="$ConnectionStrings__Migration"
unset ConnectionStrings__Migration
dotnet build backend/src/LearnStack.Api --configuration Release --nologo || exit "$?"
ConnectionStrings__Migration="$migration_cs" dotnet ef database update \
--project backend/src/Modules/<Module>/LearnStack.Modules.<Module>.Infrastructure \
--startup-project backend/src/LearnStack.Api \
--configuration Release --no-build
)
```

`ConnectionStrings__Migration` is the environment spelling of
Expand Down
28 changes: 24 additions & 4 deletions .claude/skills/add-integration-test/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ architecture test) plus any other invariant the change touches. See
|-------|----------|-------------|
| Scenario | Yes | A short name + setup + act + assert. |
| Seed | Yes | Minimum tenants / orgs / users / customization data the scenario needs. |
| Required containers | Yes | **Postgres, always and only.** Not Valkey, not Kafka — nothing the backend runs calls them. Meilisearch / LiveKit / SeaweedFS only for a provider-contract test, and only from the phase that ships the adapter. |
| Required containers | Yes | PostgreSQL for application data; pinned Keycloak with its separate PostgreSQL for actual identity-provider proofs. Other providers require a shipping adapter consumer under ADR-0035. |
| Tenant context | Yes | Which tenant + org the act phase runs as. |

## Workflow
Expand Down Expand Up @@ -85,9 +85,29 @@ architecture test) plus any other invariant the change touches. See
> Anything touching either carries `[Trait(RequiresDocker.Key, RequiresDocker.Value)]`,
> which is how CI routes it to `backend-integration` rather than `backend`.

What the fixtures do today:

- Spin **Postgres only** via Testcontainers. Not Valkey, not Kafka — nothing the
**P02b-6 provider fixture.** Real issuance uses
[`TenancyIdentity/KeycloakFixture`](../../../backend/tests/LearnStack.Tests.Integration/TenancyIdentity/KeycloakFixture.cs)
with pinned Keycloak and its own PostgreSQL database. Share read-only provider
state through `SharedKeycloakRealm`; mutating classes and variants own separate
providers and restore case-owned changes before returning.
Its generated CA is trusted only by the fixture's HTTPS clients, with normal
hostname validation and a wrong-root refusal control. Never install a fixture CA
in the host trust store or bypass TLS/cookie rules to get a passing login.
Use real code/S256 authentication, keep credentials/tokens out of assertions and
logs, and never follow the unimplemented BFF callback to claim session coverage.
This fixture does not replace application-role isolation proofs. Every consuming
test class has the Docker trait, including classes outside `Database/`.
Real-token API qualification uses the separate nonparallel
`TenantRealmApiTestGroup`, combining this provider with `PublicReadFixture` while
retaining the existing physical read-only/application-role observer. Do not add
an application database to the provider-only collection. Profile protection uses
a separate class fixture, with serialized cases and owned restoration. Do not
mutate the shared read-only provider. No fixture-only grant or mapper may supply
a delivered self-service baseline that the committed import/reconciler lacks.

What the database fixtures do today:

- Spin **Postgres** via Testcontainers. Not Valkey, not Kafka — nothing the
backend runs today calls either, and both sit behind the `gated` compose profile
per [ADR-0035](../../../docs/decisions/0035-demand-gated-infrastructure.md).
- Provision the **four database roles** by running the same script the compose
Expand Down
25 changes: 19 additions & 6 deletions .claude/skills/local-dev-setup/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ the backend runs today calls them, so `make dev` starts 7 services and
| OpenSSL CLI | Yes for frontend tests | Isolated TLS fixtures generate temporary certificates without installing trust. |
| Node >=22.23.1 + pnpm | Yes | For the frontend; `frontend/package.json` sets the floor and CI pins `22.23.1`. |
| Deployment mode | Yes | `Development` (default) / `SaaS` / `Dedicated` / `SelfHostedOnline` / `SelfHostedAirGapped` (per [Standards 12 § Deployment Modes](../../../docs/standards/12-infrastructure.md)). |
| `.env` (gitignored) | Optional | Local overrides; `.env.example` is the source of truth. |
| Selected private `.env` (gitignored) | Yes before stack startup | `.env.example` is the template; preserve existing secrets and private file permissions. |

## Workflow

Expand All @@ -81,13 +81,21 @@ If any of these is missing, install:
git clone <repo> learnstack
cd learnstack

cp .env.example .env # creates the local-only file (gitignored)
# Edit .env to override any defaults; for first-run, leave as-is.
make .env # creates a missing local-only file with private permissions
# Before make dev, prepare KEYCLOAK_WEB_CLIENT_SECRET in that private file.

(cd backend && dotnet restore LearnStack.slnx --locked-mode)
(cd frontend && pnpm install --frozen-lockfile)
```

Never overwrite an existing private source or regenerate its BFF secret on a
routine rerun. For a legacy source, first verify it is your regular, nonsymlink,
single-link file, then explicitly set `chmod 600 .env` and add a missing key.
The tool refuses shared permissions; Makefile creation does not repair them.
Follow [secret continuity and recovery](../../../infra/keycloak/README.md#secret-continuity-and-recovery)
if the selected source disagrees with an existing confidential client. Keep its
contents out of tool output, command arguments and committed files.

### Step 3: Bring up the stack

```bash
Expand Down Expand Up @@ -178,12 +186,15 @@ Three properties of that inventory matter while you are setting up:
loopback HTTP through `make public-api` (5080), and the native web listener runs
on loopback HTTPS through `make public-web` (3000).

To read the resolved truth rather than any document, ask the stack:
To inspect selected services without printing resolved credentials, ask the stack:

```bash
docker compose --env-file .env -f infra/compose/dev.yml config --format json
docker compose --env-file .env -f infra/compose/dev.yml config --services
```

Do not publish complete resolved Compose configuration: it contains private
environment values.

### Step 4: First-run bootstrap

`make seed` starts the selected stack, waits for PostgreSQL before migrations,
Expand Down Expand Up @@ -283,7 +294,9 @@ make public-api
| `Bind for 127.0.0.1:5432 failed: port is already allocated` | Stop your local Postgres, or stop the other compose project holding the port — host ports are fixed in `dev.yml`, so two projects cannot both bind them. |
| `relation "tenants" does not exist` | The owning Tenancy migrations have not landed or were not applied; check the active phase plan before adding an ad-hoc target. |
| `unable to read app.tenant_id` | The `DbCommandInterceptor` tenant-context guard is unwired, or `TransactionBehavior` did not issue the `SET LOCAL` pair. It is deliberately **not** a connection-checkout interceptor — checkout precedes `BEGIN`. |
| Keycloak realm not found | Recreate local data with destructive `make clean`, then `make seed`. The realms are imported at compose boot from `infra/keycloak/realms/`, not by the seeder. |
| Keycloak realm not found | Verify the selected project, private source and Keycloak health/import. Fresh realms import on provider startup; a populated realm needs the shared bounded reconciliation from `make seed`. Follow the [realm guide](../../../infra/keycloak/README.md#fresh-import-and-warm-upgrade); do not wipe data as upgrade recovery. |
| `missing_web_secret` / `secret_conflict` | Follow [secret continuity and recovery](../../../infra/keycloak/README.md#secret-continuity-and-recovery); preserve the confidential client and existing accounts. |
| `lock_busy` | Follow [lock recovery](../../../infra/keycloak/README.md#lock-recovery); never delete a lock solely because it is old. |
| A non-Development mode fails startup | Check that mode's required Sentry/telemetry configuration and [current readiness](../../../docs/architecture/25-deployment-models.md#supported-today-versus-prepared-seam). Every mode currently uses `NullEntitlementProvider`; starting Hub does not supply the Phase 02c adapter. |
| LiveKit join fails with TURN error | coturn not reachable from the browser; check firewall + container network. |

Expand Down
19 changes: 10 additions & 9 deletions .claude/skills/run-tests-locally/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ flags, and a triage map for the most common failure shapes.
|-------|----------|-------------|
| Suite | Yes | `unit` / `integration` / `architecture` / `contract` / `frontend` / `public-demo` (P02d-7). Phase 06 owns the broader Playwright Test/axe suite. |
| Filter | No | `--filter <expr>` to run a subset. |
| Docker available? | Integration (`Requires=Docker`) | A running daemon. Postgres only — no Valkey, no Kafka. |
| Docker available? | Integration (`Requires=Docker`) | A running daemon for PostgreSQL and the pinned Keycloak/PostgreSQL provider fixture. Other adapters retain their named triggers. |

## Workflow

Expand All @@ -55,7 +55,7 @@ pnpm --version
(cd backend && dotnet restore LearnStack.slnx)
(cd frontend && pnpm install --frozen-lockfile)

# Docker must be running for the integration suite's Database/ cases
# Docker must be running for Database/ and TenancyIdentity/ provider cases
docker info >/dev/null && echo "docker OK"
```

Expand All @@ -66,8 +66,8 @@ backend/tests/
LearnStack.Tests.Unit/ # No DB, no Docker. Pure unit tests.
LearnStack.Tests.Architecture/ # Reflection + Roslyn + migration-scan rules.
LearnStack.Tests.Integration/ # WebApplicationFactory HTTP tests (no Docker) AND the
# Testcontainers Postgres suite under Database/ (as
# learnstack_app), split by [Trait("Requires","Docker")].
# Postgres (learnstack_app) and TenancyIdentity/
# Keycloak/Postgres, split by [Trait("Requires","Docker")].
LearnStack.Tests.Contract/ # OpenAPI / SDK contract assertions.

frontend/apps/web/ # Guarded Vitest unit/component/control suites.
Expand Down Expand Up @@ -118,15 +118,16 @@ before concluding a net is under you.
| `MediatR_Pipeline_Order_Matches_Canonical_Sequence` | A behavior moved; the eight-step order is fixed by [ADR-0032](../../../docs/decisions/0032-exception-handling-logging-and-observability.md). |
| `Integration_Event_TopicNames_FollowConvention` | Topic isn't `learnstack.{module}.{aggregate}`. |
| `No_Source_Folder_Named_Verticals` | A `Verticals/` folder exists; ADR-0018 forbids it. |
| `Every_Database_Test_Carries_The_Docker_Trait` | A test class under `Database/`, or one anywhere that takes a database fixture, is missing `[Trait(RequiresDocker.Key, RequiresDocker.Value)]` and would run in the wrong CI job. |
| `Every_Database_Test_Carries_The_Docker_Trait` | A test class under `Database/`, or one anywhere referencing a database/Keycloak fixture or collection, is missing `[Trait(RequiresDocker.Key, RequiresDocker.Value)]` and would run in the wrong CI job. |
| `Migrate_Target_Covers_Every_Migration_Chain` | A new chain exists that `make migrate` does not apply. |

### Step 5: Run integration tests

The assembly holds two kinds. The `WebApplicationFactory` HTTP tests need no
Docker; everything under `Database/` does, and **a running Docker daemon is
required** for it — Postgres only, no Valkey and no Kafka, because nothing the
backend runs calls either
The assembly holds Docker-free HTTP/offline tests and Docker-backed proofs.
Everything under `Database/` requires PostgreSQL; `TenancyIdentity/` also includes
the pinned Keycloak fixture with its separate PostgreSQL database. **A running
Docker daemon is required** for both provider populations. Neither needs Valkey
or Kafka, because nothing the backend runs calls either
([ADR-0035](../../../docs/decisions/0035-demand-gated-infrastructure.md)). The two
are split by `[Trait("Requires","Docker")]`; CI further partitions Docker tests
into native/ordinary execution jobs behind the required integration aggregate. Locally
Expand Down
36 changes: 31 additions & 5 deletions .claude/skills/seed-tenant/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ description: >
fixtures and data-only showcases. P02d-2 includes enabled locales, built-in and
tenant-specific definitions, complete branding and scoped Course/Lesson content.
DO NOT USE FOR: production provisioning, production reseeding, Hub licensing,
identity setup or domain-specific application branches.
production identity provisioning or domain-specific application branches.
---

# Seeding a tenant
Expand Down Expand Up @@ -56,20 +56,38 @@ to a BYPASSRLS/superuser role on every physical connection.

### 1. Check the environment and migrations

Prepare the selected private source before `make dev` or `make seed`: it must
include `KEYCLOAK_WEB_CLIENT_SECRET`, retain an existing confidential secret,
and be a current-user-owned regular, nonsymlink, single-link file without
group/other permissions. For a verified legacy file, explicitly run
`chmod 600 .env` (or the selected path); Makefile creation does not repair it.
Follow [secret continuity and recovery](../../../infra/keycloak/README.md#secret-continuity-and-recovery)
on mismatch. Do not read secrets into an agent transcript or place them on argv.

```bash
make seed
```

This target starts the selected stack and waits for PostgreSQL before migration.
`scripts/seed.sh` then checks full Compose health and both realm issuers before
running the .NET tool. `scripts/compose.mjs` shares project/files/env selection
with the demo lifecycle; inherited Compose profiles cannot widen its default set.
running the fresh Release Seeder DLL and then the shared development-only realm
reconciler. Both combined entries reject an incomplete selected private realm
source before infrastructure work; older files must explicitly add the BFF
secret key. The [realm guide](../../../infra/keycloak/README.md) owns the exact
contract and delivery status. `scripts/compose.mjs` shares project/files/env
selection with the demo lifecycle; inherited Compose profiles cannot widen its
default set.
It verifies the effective Docker context before starting the selected stack.
Seed preparation reports fixed stage progress and closed failure reasons rather
than forwarding potentially sensitive child output. On cancellation/failure,
wait for owned cleanup; follow [lock recovery](../../../infra/keycloak/README.md#lock-recovery)
if the previous realm owner left its exclusive lock.
The direct tool runs
from `backend/`, where `global.json` pins the SDK:

```bash
(cd backend && ConnectionStrings__Default="<learnstack_app connection string>" \
dotnet run --project src/LearnStack.Tools.Seeder --nologo)
dotnet run --project src/LearnStack.Tools.Seeder --configuration Release)
```

Do not put a real connection string on `argv` or print it. The script reads the
Expand Down Expand Up @@ -223,4 +241,12 @@ localized schemas/bodies/pins supported by shipped contracts. Derive inventory a
test expectations from the declaration. A new locale must be enabled before its
translation is written. Domain-specific application behavior requires the owning
phase's platform-feature decision; it cannot be hidden inside seed orchestration.
Keycloak users still come from compose realm imports, not this tool.
P02b-6 Step 1 declares development authentication personas in `SeedData.IdentityUsers`
and exposes credential-free `--identity-manifest`; that mode opens no data source.
Fresh Keycloak accounts come from the checked realm import. The accepted
[P02b-6 package](../../../docs/roadmap/phase-02b-events-auth.md#p02b-6-decision-package-2026-10-20)
owns the separate development reconciler, awaited by both combined seed/demo
entries after application seed convergence. Its
[Step 4 record](../../../docs/roadmap/phase-02b-events-auth.md#p02b-6-step-4--real-identity-qualification-and-closeout-2026-10-21)
owns real account/API qualification and the completed independent reviews.
Direct .NET seeding creates no provider account or application membership.
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ ConnectionStrings__OutboxDispatcher='Host=localhost;Port=5432;Database=learnstac
# Authentication__Tenant__Issuer=https://identity.example/realms/learnstack
KEYCLOAK_ADMIN=admin
KEYCLOAK_ADMIN_PASSWORD=admin-dev-secret
# Server-only BFF client source. Old local .env files must add it explicitly;
# reconciliation verifies an existing confidential secret and never rotates it.
# Never pass this value to the API, public renderer or .NET Seeder.
KEYCLOAK_WEB_CLIENT_SECRET=learnstack-web-dev-secret

# ─── Vault (-dev mode; token shared with Dapr secret-store component) ────
# Boots the `vault` compose service via `-dev-root-token-id` AND is passed
Expand Down
24 changes: 21 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,10 @@ jobs:
working-directory: frontend
run: pnpm install --frozen-lockfile

- name: Prepare pinned provider fixture images within the whole-job budget
timeout-minutes: 2
run: python3 scripts/ci-test-shards.py prepare-fixtures

- name: Verify stock browser for admission navigation proof
run: |
test -x /usr/bin/google-chrome
Expand Down Expand Up @@ -656,7 +660,7 @@ jobs:
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: openapi-comparison
name: openapi-comparison-${{ github.run_id }}-${{ github.run_attempt }}
path: artifacts/openapi
if-no-files-found: error

Expand Down Expand Up @@ -763,7 +767,7 @@ jobs:
timeout-minutes: 1
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: public-demo-lighthouse
name: public-demo-lighthouse-${{ github.run_id }}-${{ github.run_attempt }}
path: |
artifacts/public-demo/receipt.json
artifacts/public-demo/audit-*.json
Expand All @@ -785,6 +789,16 @@ jobs:
fetch-depth: 0 # link audit walks the full tree
persist-credentials: false

- name: Set up pinned Node.js for offline realm controls
timeout-minutes: 1
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: ${{ env.NODE_VERSION }}

- name: Development realm transport, ownership and convergence controls
timeout-minutes: 1
run: python3 scripts/run-realm-node-tests.py

- name: Compose stack validates, with and without the gated profile
run: |
# Nothing validated these files before, and the profile they now carry
Expand All @@ -796,6 +810,7 @@ jobs:
# local development loop stops, for every developer, on a one-line edit.
# The default projection is therefore the one that must be checked; the
# gated one is checked too, since a broken edge there is invisible to it.
trap 'rm -f .env' EXIT
cp .env.example .env
for profile in "" "gated"; do
label="${profile:-<default>}"
Expand Down Expand Up @@ -955,6 +970,9 @@ jobs:
- name: CI supply-chain controls
run: python3 scripts/test-ci-supply-chain.py

- name: Realm Node executed-case and JUnit gate controls
run: python3 scripts/test-realm-node-gate.py

- name: Read-only native environment and duration logging controls
run: python3 scripts/test-ci-native-environment.py

Expand Down Expand Up @@ -1108,6 +1126,6 @@ jobs:
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: leakwatch-results
name: leakwatch-results-${{ github.run_id }}-${{ github.run_attempt }}
path: results.sarif
if-no-files-found: error
Loading
Loading