Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
294 commits
Select commit Hold shift + click to select a range
db882e0
feat(kernel): persist outbox events in the admitted transaction
cemililik Oct 12, 2026
37d95bd
docs(events): reconcile the delivered outbox entry baseline
cemililik Oct 12, 2026
937e36a
test(kernel): prove enqueue and completion never publish
cemililik Oct 12, 2026
d6fbd85
feat(kernel): complete saved domain facts before commit
cemililik Oct 12, 2026
3473843
docs(events): close domain completion review rounds
cemililik Oct 12, 2026
b6e3932
test(events): enforce producer contracts across production code
cemililik Oct 12, 2026
98c22a8
test(events): cover abstract and virtual helper dispatch
cemililik Oct 12, 2026
1e799a8
docs(roadmap): close P02b-1 implementation and review rounds
cemililik Oct 12, 2026
11871a2
test(web): expose bounded browser admission failure phases
cemililik Oct 12, 2026
471d0a0
docs(events): reconcile producer and pending delivery guarantees
cemililik Oct 12, 2026
d5afc66
docs(architecture): distinguish local event invocation ordering
cemililik Oct 12, 2026
d38b0c5
docs(events): align transport comments with ordering ownership
cemililik Oct 12, 2026
a903b53
test(web): preserve the first admission proof failure
cemililik Oct 12, 2026
cb2bb6d
docs(roadmap): record P02b-1 CI follow-up verification
cemililik Oct 12, 2026
d8fd919
test(kernel): strengthen producer and audit proof controls
cemililik Oct 12, 2026
75fc79b
docs(roadmap): record external producer proof review
cemililik Oct 12, 2026
c7dae0c
fix(kernel): distinguish frame refusal from indeterminate commit
cemililik Oct 12, 2026
3f4c121
fix(kernel): bound shared execution proofs and reconcile review records
cemililik Oct 12, 2026
9b2fcf6
fix(web): authenticate sanitized browser proof failures
cemililik Oct 12, 2026
b561c8f
docs(roadmap): record verified PR29 remediation and reviews
cemililik Oct 12, 2026
96e6f4d
fix(kernel): poison the unit after a failed outbox insert
cemililik Oct 12, 2026
8a97cd2
docs(roadmap): record outbox failure and ownership verification
cemililik Oct 12, 2026
b1f6df3
docs(roadmap): close P02b-1 after PR 29 merge
cemililik Oct 12, 2026
cc5de26
docs(decisions): propose P02b-2 delivery and recovery
cemililik Oct 12, 2026
4b010ef
docs(decisions): tighten P02b-2 recovery and audit contracts
cemililik Oct 12, 2026
192810b
docs(decisions): accept P02b-2 durable delivery contracts
cemililik Oct 12, 2026
d9bc77b
feat(kernel): add confined outbox dispatch foundation
cemililik Oct 12, 2026
6a13455
fix(docs): reconcile remaining shared inbox guidance
cemililik Oct 12, 2026
b6fc714
fix(kernel): refuse open generic active outbox handlers
cemililik Oct 12, 2026
c6ceaa9
docs(roadmap): close P02b-2 foundation review rounds
cemililik Oct 12, 2026
7976113
feat(kernel): add fenced outbox transitions and terminal audit
cemililik Oct 12, 2026
ffce05f
fix(kernel): validate persisted outbox routing fields
cemililik Oct 12, 2026
d4c06a4
docs(roadmap): close P02b-2 transition review rounds
cemililik Oct 12, 2026
756c852
feat(kernel): host bounded outbox dispatch and observation
cemililik Oct 12, 2026
da637e3
fix(dev): confine dispatcher credentials to the API host
cemililik Oct 12, 2026
02540d0
fix(kernel): clarify dispatcher boot refusal and close step 3
cemililik Oct 12, 2026
d2531f2
test(kernel): enforce confined outbox dispatch boundaries
cemililik Oct 12, 2026
2f8693e
fix(kernel): close dispatcher census mutation gaps
cemililik Oct 12, 2026
606362b
fix(kernel): pin dispatcher authority and observation bindings
cemililik Oct 12, 2026
7bf14a0
docs(roadmap): close P02b-2 implementation and review rounds
cemililik Oct 12, 2026
a80e06d
docs(roadmap): link P02b-2 PR and live verification ownership
cemililik Oct 12, 2026
a851b7c
fix(dev): reject paired missing demo role passwords
cemililik Oct 12, 2026
4408970
docs(roadmap): record demo password correction reviews
cemililik Oct 12, 2026
13cd632
fix(kernel): align recovery selection and preserve commit faults
cemililik Oct 12, 2026
41ac292
docs(kernel): reconcile integration contract delivery remarks
cemililik Oct 12, 2026
3531a2e
docs(roadmap): record external correction reviews and verification
cemililik Oct 12, 2026
a5b1e72
fix(kernel): close dispatcher membership and credential census gaps
cemililik Oct 13, 2026
3620b42
docs(roadmap): record dispatcher guard follow-up verification
cemililik Oct 13, 2026
3baf3a2
fix(kernel): respect the outbox snapshot refresh interval
cemililik Oct 13, 2026
4b4e3e4
docs(roadmap): record snapshot cadence correction reviews
cemililik Oct 13, 2026
d0b67e5
chore: sync development after PR 30 merge
cemililik Oct 13, 2026
6520042
docs(roadmap): close P02b-2 after PR 30 merge
cemililik Oct 13, 2026
6a214e8
docs(roadmap): prepare the P02b-3 decision package
cemililik Oct 13, 2026
63363ac
docs(decisions): accept the P02b-3 implementation package
cemililik Oct 13, 2026
6b1efef
feat(kernel): add shared delivery and inbox storage
cemililik Oct 13, 2026
ad57a1b
style(kernel): remove blank SQL lines with trailing whitespace
cemililik Oct 13, 2026
fe6f9c7
test(kernel): prove ledger organization scope boundaries
cemililik Oct 13, 2026
80a3261
docs(roadmap): close both P02b-3 storage review rounds
cemililik Oct 13, 2026
78992fc
feat(kernel): accept integration events durably per subscription
cemililik Oct 13, 2026
bce0bc7
docs(standards): align the durable acceptance proof reference
cemililik Oct 13, 2026
81ab105
docs(roadmap): close both durable acceptance review rounds
cemililik Oct 13, 2026
77890ea
feat(kernel): own subscriber business completion and commit admission
cemililik Oct 13, 2026
5a8b85d
docs(roadmap): record subscriber owner review and regression evidence
cemililik Oct 13, 2026
3411424
docs(roadmap): close both subscriber business owner reviews
cemililik Oct 13, 2026
262d4b2
feat(kernel): schedule independent subscriber delivery and replay
cemililik Oct 13, 2026
14d5f93
fix(kernel): isolate acceptance from subscriber execution lanes
cemililik Oct 13, 2026
94d7d6b
docs(roadmap): close subscriber scheduler review rounds
cemililik Oct 13, 2026
d53ae27
feat(customization): initialize preserved defaults and hand off seed
cemililik Oct 13, 2026
0302d8a
docs(architecture): align current default delivery guidance
cemililik Oct 13, 2026
ac7bbee
docs(roadmap): close default delivery and seed review rounds
cemililik Oct 13, 2026
82623d8
test(kernel): enforce production subscription delivery boundaries
cemililik Oct 13, 2026
84995d3
fix(kernel): close typed delivery enforcement escapes
cemililik Oct 13, 2026
a8e9c9d
docs(roadmap): close all subscriber delivery review rounds
cemililik Oct 13, 2026
683ea53
docs(roadmap): link subscriber delivery PR handoff
cemililik Oct 13, 2026
586ed75
fix(kernel): close subscriber delivery review gaps
cemililik Oct 15, 2026
a393a4b
docs: align delivery review guidance with accepted ownership
cemililik Oct 15, 2026
d8c766f
docs(standards): wrap tenant announcement guidance
cemililik Oct 15, 2026
b681edb
fix(standards): count both implemented isolation rules
cemililik Oct 15, 2026
92e296e
fix(kernel): preserve delivery progress and compatible acceptance
cemililik Oct 15, 2026
a95ae2e
docs(roadmap): record delivery remediation review round one
cemililik Oct 15, 2026
bd51a97
fix(kernel): preserve producer progress during terminal audit faults
cemililik Oct 15, 2026
0fa7dc8
docs(roadmap): close verified delivery and producer review fixes
cemililik Oct 15, 2026
fc1e821
chore: sync development after PR 31 merge
cemililik Oct 15, 2026
71568e7
docs(roadmap): close P02b-3 after PR 31 merge
cemililik Oct 15, 2026
266a46d
docs(decisions): propose P02b-4 transactional job runtime
cemililik Oct 15, 2026
46ca923
docs(decisions): expand Hangfire runtime alternatives
cemililik Oct 15, 2026
ec1a552
docs(decisions): clarify job workloads before runtime selection
cemililik Oct 15, 2026
dae3ea4
docs(decisions): correct job carrier locator and record reviews
cemililik Oct 15, 2026
fa53917
docs(decisions): propose expanded H1 background job contract
cemililik Oct 15, 2026
29cc4c1
docs(decisions): refine H1 proposal after first review
cemililik Oct 15, 2026
40c9f9b
docs(decisions): reconcile concurrent H1 overrun bounds
cemililik Oct 15, 2026
fe274ce
docs(roadmap): record final H1 proposal review readiness
cemililik Oct 15, 2026
affa0ac
docs(decisions): accept expanded H1 background job runtime
cemililik Oct 15, 2026
94b126b
feat(kernel): add typed job contracts and ordinary authority guards
cemililik Oct 15, 2026
bf43308
fix(kernel): close job ancestry and identifier lifetime gaps
cemililik Oct 15, 2026
1b4ec7f
docs(roadmap): record completed job contract review rounds
cemililik Oct 15, 2026
f5dd3a4
docs(decisions): propose bounded stock counter maintenance
cemililik Oct 15, 2026
446d0a5
docs(decisions): qualify selective Hangfire maintenance
cemililik Oct 15, 2026
fcab1e0
docs(roadmap): close revised maintenance proposal reviews
cemililik Oct 15, 2026
14bf9c4
docs(decisions): accept bounded stock maintenance policy
cemililik Oct 15, 2026
583374f
feat(kernel): add guarded job and Hangfire storage
cemililik Oct 15, 2026
a593cd2
fix(kernel): close storage bootstrap review gaps
cemililik Oct 15, 2026
5d55ee7
fix(kernel): preserve known and unknown job outcomes
cemililik Oct 16, 2026
483463f
docs(roadmap): close reviewed job storage step
cemililik Oct 16, 2026
63a7f4a
feat(kernel): add transactional job submission and admission
cemililik Oct 16, 2026
0ddcb3e
fix(kernel): bound job submission and admission SQL waits
cemililik Oct 16, 2026
def48a1
docs(roadmap): close reviewed job submission and admission step
cemililik Oct 16, 2026
f8ff691
docs(decisions): propose owned Hangfire server generations
cemililik Oct 16, 2026
2103f05
docs(decisions): qualify shared maintenance and process exit
cemililik Oct 16, 2026
878bcd4
docs(roadmap): expose pending server lifecycle decision
cemililik Oct 16, 2026
b49998d
docs(roadmap): record reviewed server lifecycle proposal
cemililik Oct 16, 2026
1853b48
docs(decisions): close server lifecycle review gaps
cemililik Oct 16, 2026
b4a6fec
docs(roadmap): record lifecycle revision reviews and correction
cemililik Oct 16, 2026
7122179
docs(decisions): name bounded pool availability supersession
cemililik Oct 16, 2026
35b6985
docs(decisions): preserve retention beyond the stop threshold
cemililik Oct 16, 2026
0db27eb
docs(roadmap): record revised lifecycle proposal closeout
cemililik Oct 16, 2026
6c52eaa
docs(decisions): accept owned Hangfire server generations
cemililik Oct 16, 2026
34be14e
docs(decisions): propose fatal required-startup boundary
cemililik Oct 16, 2026
ac5a1cd
docs(decisions): record required-startup proposal reviews
cemililik Oct 16, 2026
1b6baa0
docs(decisions): record required-startup second reviews
cemililik Oct 16, 2026
422519b
feat(kernel): add confined Hangfire bridge and storage boundary
cemililik Oct 16, 2026
9db4822
fix(kernel): preserve retry precedence and bridge credential bounds
cemililik Oct 16, 2026
189f3bc
docs(decisions): revise fatal startup policy after external review
cemililik Oct 16, 2026
e0d39bf
docs(decisions): accept ADR-0060 before lifecycle implementation
cemililik Oct 16, 2026
e1e6db4
feat(kernel): own Hangfire generation and fatal lifecycle boundaries
cemililik Oct 16, 2026
28433f2
fix(kernel): preserve fetched-heartbeat storage failure health
cemililik Oct 16, 2026
d9fda17
feat(kernel): own pool replacement and private job cleanup
cemililik Oct 16, 2026
a1832c6
feat(kernel): compose owned job runtime and source lifetime
cemililik Oct 16, 2026
53ec8a4
fix(kernel): bound framework waits and report lifecycle health
cemililik Oct 16, 2026
4826b7d
test(kernel): qualify heartbeat outage and close Step 4
cemililik Oct 16, 2026
9b63440
feat(kernel): execute transactional background jobs
cemililik Oct 16, 2026
9dbea7b
fix(kernel): join actual auxiliary cleanup before job release
cemililik Oct 16, 2026
6a2ded9
fix(kernel): retain job decisions and bounded cleanup signals
cemililik Oct 16, 2026
89d2ec7
docs(roadmap): close job owner reviews and start capacity work
cemililik Oct 16, 2026
8e0f982
docs(decisions): propose known external job failure policy
cemililik Oct 16, 2026
1b55e60
docs(decisions): refine external failure policy proposal
cemililik Oct 16, 2026
8295666
docs(decisions): accept known external job failure policy
cemililik Oct 16, 2026
caf5129
feat(kernel): enforce tenant-wide job capacity reservations
cemililik Oct 17, 2026
d387f71
fix(kernel): settle capacity cleanup after peer recovery
cemililik Oct 17, 2026
0ea50b1
fix(kernel): reconcile original capacity admission history
cemililik Oct 17, 2026
6e90a52
feat(kernel): execute and recover staged external jobs
cemililik Oct 17, 2026
ef3cf7b
fix(kernel): defer external jobs when tenant capacity is full
cemililik Oct 17, 2026
1ef18e6
fix(kernel): bound terminal cleanup candidate scans
cemililik Oct 17, 2026
d0eb759
test(kernel): verify external cancellation across restart
cemililik Oct 17, 2026
69405b1
test(jobs): qualify recovered external failure policies
cemililik Oct 17, 2026
69c3998
feat(kernel): add durable recurrence and bounded recipient pages
cemililik Oct 17, 2026
2059a7e
feat(kernel): add acknowledged recipient routing claims
cemililik Oct 17, 2026
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
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .claude/skills/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ index plus the relevant [Architecture](../../docs/architecture/) doc.
| [add-tenant-owned-entity](add-tenant-owned-entity/SKILL.md) | Adding a `[TenantOwned]` / `[OrganizationScoped]` aggregate with EF filter + RLS migration + isolation tests. |
| [add-mediatr-handler](add-mediatr-handler/SKILL.md) | Adding a command or query handler that participates in the MediatR pipeline (Result, FluentValidation, audit). |
| [add-integration-event](add-integration-event/SKILL.md) | Publishing or consuming an integration event (outbox + inbox guard + Dapr topic). |
| [add-background-job](add-background-job/SKILL.md) | Adding module-owned transactional/external jobs, delayed submissions, capacity declarations or durable recurrence through the typed H1 runtime. |
| [add-ef-migration](add-ef-migration/SKILL.md) | Producing an EF Core migration with RLS-aware patterns and the project naming convention. |
| [add-permission](add-permission/SKILL.md) | Registering a permission key with the closed action set and scope (Platform / Tenant / Organization). |
| [add-feature-key](add-feature-key/SKILL.md) | Adding a `FeatureKey` / `LimitKey` to the typed registry and wiring entitlement-projection reads. |
Expand Down
179 changes: 179 additions & 0 deletions .claude/skills/add-background-job/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
---
name: add-background-job
description: >
Add a module-owned transactional or external background-job definition, delayed
submission, or durable recurrence using LearnStack's typed scheduler and H1
runtime. USE FOR: job parameters/roots, prepare-execute-finalize adapters,
capacity declarations, recurrence manifests and their proofs. DO NOT USE FOR:
direct Hangfire calls, operator replay, privileged maintenance, or changing
runtime ownership/storage policy without its decision pass.
---

# Adding a background job

## Purpose

Deliver a feature's job through the existing trusted submission, ordinary
transaction owner and retained-work boundaries. The architecture is decided in
[ADR-0047](../../../docs/decisions/0047-transactional-background-job-runtime.md),
with lifecycle refinements in ADR-0058/0059/0060 and known external failure policy
in [ADR-0061](../../../docs/decisions/0061-known-external-job-failure-policy.md).
Use [implement-task](../implement-task/SKILL.md) as the substantive entry point.

## When to use

- Add a feature-owned transactional or external definition and its request metadata.
- Schedule an ordinary job or declare a code-owned recurring manifest.
- Bind a feature's external operation port, dedicated capacity group or worker queue.

## When not to use

- Publish cross-module facts: use [add-integration-event](../add-integration-event/SKILL.md).
- Change the scheduler, credential grants, transaction owner, quiescence policy or
native invocation contract: run the owning decision pass first.
- Add operator replay, privileged maintenance or a cancellation/rescheduling API:
verify the named feature phase's accepted contract before implementation.

## Inputs

| Input | Required | Description |
|-------|----------|-------------|
| Owning feature phase/module | Yes | Confirm this is the phase that delivers the business definition. |
| Profile and scope | Yes | Transactional/external; TenantWide/Organization. |
| Typed parameter and request contracts | Yes | Exact module Contracts/Application types and all allowed nested requests. |
| Queue/capacity declaration | Yes | Compatible pool; external work requires its declared capacity group. |
| External evidence contract | External | Stable logical operation, Execute/Reconcile, known outcome and positive quiescence. |
| Recurrence manifest | Recurring | Monotonic revision, UTC schedule, target and closed lifecycle recipient policy. |

## Workflow

### 1. Check the delivered boundary

Read the feature roadmap and current
[P02b-4 record](../../../docs/roadmap/phase-02b-events-auth.md#p02b-4-decision-package-2026-10-15).
P02b-4 intentionally carries no production business definitions or recurrence
manifests. The first feature must explicitly reconcile that infrastructure-only
census when its own accepted phase delivers real definitions.

Read the relevant [glossary](../../../docs/glossary.md),
[Events and Outbox architecture](../../../docs/architecture/15-event-and-outbox.md),
[Database Standards](../../../docs/standards/05-database.md#background-jobs), and
[Observability Standards](../../../docs/standards/10-observability.md#required-metrics).
Verify new capabilities have an owning decision rather than inventing a new entry
path, general tenant selector or platform authority.

### 2. Declare inert types and exact request metadata

Use the actual contracts in
[`SharedKernel/Jobs`](../../../backend/src/LearnStack.SharedKernel/Jobs).
Put a sealed, init-only identifier parameter record implementing
`IBackgroundJobParameters` in the owning `Application.Contracts`. Follow the
payload guards for identifier types and size; custom getters, plaintext business
content and mutable object graphs are refused.

Declare the module's code-owned definition in `Application`, with its exact
`BackgroundJobKey<TParameters>`, scope, readiness and profile. List every allowed
root/nested request with positive `Ordinary` scope metadata. Roots belong to the
owning Application assembly; nested cross-module work uses the existing Contracts
mechanism. Use [add-mediatr-handler](../add-mediatr-handler/SKILL.md) and
[add-audit-coverage](../add-audit-coverage/SKILL.md) for each actual handler.

Wire declarations through the existing module/definition/infrastructure registries
and API composition; inspect their current constructors and validation instead of
copying a stale registration example. Verify root parameter constructors, queue
profile, module ownership and scope before constructing any handler. Add an
explicit retired tombstone for an intentionally retired identity; unknown and
Pending definitions preserve work for a compatible deployment.
Composition is explicit: preserve `BackgroundJobFrameworkRequests.All` and the
catalog aliases when supplying feature registries. Verify the resolved API
registry and every submitting composition root, including Seeder when applicable.

### 3. Submit on the owning transaction

Inject only `IBackgroundJobScheduler` into feature code. Its real methods are
`EnqueueAsync(key, parameters, ct)` and `ScheduleAsync(key, parameters, dueAt, ct)`.
Submit inside the existing enrolled writable module transaction. Tenant,
organization, producer and causal metadata come from trusted enrollment; a key or
payload cannot supply them. The returned identity does not commit the owner.

Keep schedule/business changes and the job INSERT atomic. Prove commit and
rollback, including an absorbed refusal after produced work. An org-bound context
cannot submit a TenantWide definition by relabeling the input. Never write job
rows, call a Hangfire client or mint routing/start/recipient receipts in a module.

### 4. Implement the selected execution profile

**Transactional:** use the ordinary MediatR root and its existing owner. Do not
open another transaction, change tenant context or acknowledge the job directly.
Completion, outbox and MUST audit remain one owned transaction.

**External:** define identifier-only `IBackgroundJobPlan` and
`IBackgroundJobOutcome` records in Contracts. Its module Contracts port inherits
one closed `IBackgroundJobExternalOperation<TPlan,TOutcome>`; the concrete adapter
lives in the same module's Infrastructure. Prepare/finalize are ordinary typed
requests; Execute/Reconcile hold no business transaction or sender/service locator.

Qualify stable logical-operation deduplication and positive provider/supervisor
quiescence. A timeout, cancellation, missing process or NotFound after ExecuteIntent
is not proof that effects stopped. Use the explicit Succeeded/Failed/Cancelled
factories and the actual three-state failure policy. Cancelled cannot be Permanent;
nonrepeatable outcomes are not silently retried. Preserve selected durable facts
across restart and conflicting later reports. Finalization must not repeat Execute.

Declare the module's tenant-wide `BackgroundJobCapacityGroupRegistration` through
the infrastructure registry. Use [add-feature-key](../add-feature-key/SKILL.md) for
any optional registered Hard `LimitKey`. An unknown external effect keeps its
reservation; expiry, host exit or replacement never frees capacity.

### 5. Declare recurrence through the existing manifest path

Use `BackgroundJobRecurrenceRegistration` and its actual registry validation.
The target belongs to the same module, accepts `BackgroundJobOccurrenceParameters`
and matches the selected recipient scope. That input deliberately does not
implement `IBackgroundJobParameters`; recurrence does not call the ordinary
submission port directly.

Preserve revision/hash compatibility, UTC CoalesceLatest and bounded lifecycle
paging. Native ticks are opaque hints; the durable occurrence/recipient records
own progress. Do not add a module tenant-list reader or a per-route scheduler loop.
Prove duplicate/late ticks, mixed revisions, tenant/org eligibility, bounded raw
paging and one reciprocal accepted child receipt. No recurring tick grants
business execution authority.

### 6. Validate and reconcile carriers

Run [run-tests-locally](../run-tests-locally/SKILL.md) for affected Unit,
Architecture and real PostgreSQL suites, using the nonempty/zero-skip runner.
Use [add-integration-test](../add-integration-test/SKILL.md) for tenant/org pairs
as `learnstack_app`; independently verify the dispatcher's narrow status grants.

Exercise actual registrations and dirty controls. Include rollback, hidden/cross-org
input, Pending/unknown identities, current/stale ownership, duplicate wakeups and
confirmed failure versus unknown COMMIT. External definitions additionally need
accepted-before-ACK, restart reconciliation, retained cleanup, no-effect restart
proof and reservation retention/release. Recurrence needs actual held-control
progress and late native duplicates, not only a mocked tick.

Update the owning roadmap, module audit/permission matrices and applicable feature
handoffs. Standards 05 owns schema/grants, Standards 10 instruments and Standards 21
the canonical obligations. Preserve Accepted ADR bodies; new decisions follow
[write-adr](../write-adr/SKILL.md). Commit with
[commit-and-pr](../commit-and-pr/SKILL.md) and perform the requested review rounds.

## Validation

- Production registration is nonempty for the feature and matches its owner/scope.
- Submission is atomic; execution uses the existing ordinary transaction owner.
- Failure, uncertainty, cancellation and quiescence remain distinct in actual tests.
- Finite registered metric dimensions contain no tenant/org/job/occurrence identities.
- All touched rules and handoffs describe delivered behavior and actual evidence.

## Common pitfalls

- Treating a definition key, tick, lease expiry or cleanup timeout as authority.
- Calling Hangfire or selecting all tenants from feature code.
- Moving long external I/O into a database transaction.
- Releasing capacity without verified positive completion/no-start/quiescence evidence,
or retrying a nonrepeatable effect.
- Losing prior selected outcome facts while retrying finalization.
- Inventing cancel, replace, dedup or replay semantics absent from the owning contract.
13 changes: 8 additions & 5 deletions .claude/skills/add-ef-migration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ and survive forward-only deploy rules
- Adding monthly partition for an append-only table (`audit_log`, future event
tables).
- Backfilling data alongside a schema change (use an idempotent SQL block or a
Hangfire job).
deployment-owned backfill).

## When not to use

Expand All @@ -44,7 +44,7 @@ and survive forward-only deploy rules
| Module | Yes | The module's `Infrastructure` project hosts the migration. |
| Touches RLS? | Yes | New table → yes. Column add on existing tenant-owned table → no. |
| Destructive? | Yes | Drop, rename, type-change — requires two-step plan. |
| Backfill? | No | If data must be populated, prefer an idempotent Hangfire job. |
| Backfill? | No | Use an idempotent deployment-owned backfill when inline SQL is too large. |

## Workflow

Expand Down Expand Up @@ -260,9 +260,12 @@ migrationBuilder.DropColumn(name: "source_legacy", table: "enrollments");

### Step 7: Data migration

Small data migrations live inline as SQL. Larger migrations live as **idempotent
Hangfire jobs** triggered by the migration. The job sets `app.tenant_id` per tenant
before mutating data, on the **migration** connection:
Small data migrations live inline as SQL. Larger backfills remain idempotent,
deployment-owned migration work under
[ADR-0047](../../../docs/decisions/0047-transactional-background-job-runtime.md#bounded-supersessions-and-additive-seams).
The ordinary API job runtime cannot receive migration credentials or execute this
backfill. The migration-owned loop sets `app.tenant_id` per tenant on its own
**migration** connection:

> This loop is a migration-time backfill, not a ninth entry in ADR-0040's closed
> eight-setter set. Application code never opens its own connection to set the
Expand Down
18 changes: 13 additions & 5 deletions .claude/skills/add-integration-test/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,13 @@ architecture test) plus any other invariant the change touches. See
> for a role-level or provisioning question. `SchemaFixture` builds on it and is
> what almost every test wants: **every** migration chain applied — through
> `MigrationChains.ApplyAllAsync`, never a list a fixture keeps itself — and every
> table seeded for two tenants, with a second organization under tenant A. There
> are five chains and 23 data tables (28 including migration histories). Discover
> table populated under its role and table class, with two tenants and a second
> organization under tenant A for tenant-owned data. There
> are five chains and 42 data tables (47 including migration histories). Every
> discovered public table must match an exact class in
> [SchemaTableClasses](../../../backend/tests/LearnStack.Tests.Integration/Database/SchemaTableClasses.cs).
> Vendor/control SELECTs as `learnstack_app` must raise `42501`; a zero count or
> an excluded table does not prove the required denial. Discover
> current chains and history names through
> [MigrationChains](../../../backend/tests/LearnStack.Tests.Integration/Database/MigrationChains.cs);
> do not copy that inventory into a fixture. Share the schema with
Expand All @@ -90,9 +95,12 @@ What the fixtures do today:
which owns every table — and expose a connection as **`learnstack_app`** for the
tests themselves. A test that connects as the owner or as a `BYPASSRLS` role
passes even when every policy is inert, so it proves nothing.
- Seed **every table for both tenants**, deliberately: a count assertion against a
table the fixture never populated passes whatever the policy says. That shipped
once, in Packet 6, and is why `SchemaFixture` fills all of them.
- Seed **every table**, deliberately: tenant tables carry both tenants and org-scoped
tables also carry both organizations under A. Control/vendor tables carry nonempty
subjects through their confined dispatcher grants; the FORCE-RLS control tables
have no owner/app policy and cannot be seeded by assuming ownership bypasses RLS.
Tenant isolation assertions always authenticate as `learnstack_app`. A count
against an empty table passes whatever the policy says; that shipped in Packet 6.
- Expose the seeded ids as `SchemaFixture.TenantA` / `TenantB` / `OrgA1` / `OrgA2`,
and the session-variable helpers as `SchemaQueries.SetTenantAsync` /
`SetSettingAsync` — `set_config(name, value, true)`, not `SET LOCAL`, because
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/code-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ Walk every change against the project's
| **Tenant + organization isolation** | New tenant-owned entity has `[TenantOwned]` + EF filter + RLS policy + canonical `app.tenant_id` session var. `[OrganizationScoped]` covered the same way. Any `IgnoreQueryFilters` outside platform-admin paths is a zero-tolerance blocker per [17-code-review.md § Zero Tolerance](../../../docs/standards/17-code-review.md). |
| **4-step auth order** | Every write use case checks in order: (1) Authn → (2) Tenant membership → (3) Role / permission → (4) Resource scope. Failure at each step returns the right Problem Details code (`unauthorized` / `tenant_mismatch` / `forbidden` / `resource_scope_violation`). Source: [11-security.md § Authorization](../../../docs/standards/11-security.md), [19-permissions.md § Enforcement Points](../../../docs/standards/19-permissions.md). |
| **Authn / authz** | Every new endpoint has `[Authorize(Policy=…)]` or `[AllowAnonymous]` with a comment. Policy keys exist in the permission registry. Resource-scope handlers (`instructor` edits own course only) present where needed. |
| **Tenant id from the resolved context only** | Resolved per [ADR-0036](../../../docs/decisions/0036-tenant-resolution-trusted-inputs.md): from the host lookup of the effective host, or on a platform host from validated claims confirmed by live membership; off HTTP, from the job parameters or the integration-event envelope. Never from a request body, query string, cookie or tenant header — `X-Tenant-Id` and `X-Organization-Id` are assertions that can only reject, on every hop. Check command and DTO surfaces. |
| **Tenant id from the resolved context only** | Resolved per [ADR-0036](../../../docs/decisions/0036-tenant-resolution-trusted-inputs.md): from the host lookup of the effective host, or on a platform host from validated claims confirmed by live membership; off HTTP, from the validated authoritative job row or the integration-event envelope. Never from a request body, query string, cookie or tenant header — `X-Tenant-Id` and `X-Organization-Id` are assertions that can only reject, on every hop. Check command and DTO surfaces. |
| **SQL injection** | EF Core LINQ or `FromSqlInterpolated`; never raw string concatenation. Raw SQL has parameters. |
| **XSS** | No `dangerouslySetInnerHTML` outside a sanitisation wrapper; CSP nonces in place; markdown via allowlist. Nothing sets a CSP today: the [standards index](../../../docs/standards/README.md#honest-status-today) row for Security Standards carves § HTTP Headers out to [Phase 11](../../../docs/roadmap/phase-11-production-hardening.md#security), so a missing nonce is not a Blocker until that phase sets one. Accepted P02d-6 G42 requires atomic four-color validation and a fixed style element, with whole-palette fallback; output must be safe without CSP. [The accepted package](../../../docs/roadmap/phase-02d-walking-skeleton.md#p02d-6-accepted-answers) owns its proof obligations; acceptance alone is not delivery. |
| **CSRF** | Server Actions / Auth.js session check; non-Action mutating fetches carry CSRF tokens. |
Expand Down
Loading
Loading