Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
406 commits
Select commit Hold shift + click to select a range
0a2d8d3
Probe all authenticated staging learner endpoints
Muawiya-contact Oct 17, 2026
bad9cf0
Record staging SQL probe and next HTTP check
Muawiya-contact Oct 17, 2026
1a9f7ef
Refresh staging PostgREST after verified SQL
Muawiya-contact Oct 17, 2026
1499c7b
Log safe upstream stage for API incidents
Muawiya-contact Oct 17, 2026
1a59c6d
Document staging schema cache refresh
Muawiya-contact Oct 17, 2026
aeab9d9
Record staging route failure and cache hypothesis
Muawiya-contact Oct 17, 2026
79ce72c
Probe learner RPCs under the service role in staging
Muawiya-contact Oct 17, 2026
cd80f9a
Allow service-only Auth reads through hardened RPCs
Muawiya-contact Oct 17, 2026
416e2e6
Record staging permission diagnosis and repair gate
Muawiya-contact Oct 17, 2026
1545683
Skip shared anon role in cutover test database
Muawiya-contact Oct 17, 2026
c7ca47c
Record staging API smoke recovery
Muawiya-contact Oct 17, 2026
98d1ae5
Port private editorial taxonomy read to Supabase API
Muawiya-contact Oct 17, 2026
ffeef45
Port owner editorial activity read to Supabase API
Muawiya-contact Oct 17, 2026
a39ef59
Port private legacy batch entries read to Supabase API
Muawiya-contact Oct 17, 2026
8a0bf75
Match cutover fixture to Supabase service role
Muawiya-contact Oct 17, 2026
56ebad8
Record editorial route parity and local verification
Muawiya-contact Oct 17, 2026
3e6199c
Port reviewer queue views to Supabase API
Muawiya-contact Oct 17, 2026
01b568c
Record reviewer queue parity and hosted checks
Muawiya-contact Oct 17, 2026
5b9e83b
Port private revision history read to Supabase API
Muawiya-contact Oct 17, 2026
4bb802a
Record revision-history read parity
Muawiya-contact Oct 17, 2026
d7783bc
Port private generation job reads with exact tokens
Muawiya-contact Oct 17, 2026
90044b9
Record generation-job route parity
Muawiya-contact Oct 17, 2026
bfad917
Port editorial generation supply status to Supabase API
Muawiya-contact Oct 17, 2026
e6559d2
Record generation supply candidate parity
Muawiya-contact Oct 17, 2026
83e0e92
Make reviewer pagination test independent of existing rows
Muawiya-contact Oct 17, 2026
b27a701
Port legacy enrichment eligibility to Supabase API
Muawiya-contact Oct 17, 2026
4dac694
Record legacy eligibility candidate parity
Muawiya-contact Oct 17, 2026
d6bee87
Select an active topic in exhausted catalog test
Muawiya-contact Oct 17, 2026
b32dcfa
Port editorial concept timeline to Supabase API
Muawiya-contact Oct 17, 2026
b2fd9fd
Document staging validation and timeline parity
Muawiya-contact Oct 17, 2026
c12b8c8
Port reviewer legacy batch summaries to Supabase API
Muawiya-contact Oct 17, 2026
798cc46
Record legacy batch list route parity
Muawiya-contact Oct 17, 2026
deb6021
Preserve editorial timestamp precision in Python responses
Muawiya-contact Oct 17, 2026
27be3aa
Record timestamp parity CI repair
Muawiya-contact Oct 17, 2026
076b530
Port owner notification policy updates to Supabase API
Muawiya-contact Oct 17, 2026
b0527a1
Record owner policy route parity
Muawiya-contact Oct 17, 2026
d1e5dd1
Port owner delivery overview to Supabase API
Muawiya-contact Oct 17, 2026
677142d
Document delivery reporting and staging SQL result
Muawiya-contact Oct 17, 2026
c526362
Port owner notification retry to Supabase API
Muawiya-contact Oct 17, 2026
71925c6
Record notification retry and staging Edge result
Muawiya-contact Oct 17, 2026
fda924e
Port owner operations report to Supabase API
Muawiya-contact Oct 17, 2026
4cc7b6f
Document owner operations and staging learner smoke
Muawiya-contact Oct 17, 2026
110f885
Port editorial owner overview to Supabase API
Muawiya-contact Oct 17, 2026
718496e
Document owner overview candidate and remaining routes
Muawiya-contact Oct 17, 2026
4a05328
Clean up historical learner after owner overview parity test
Muawiya-contact Oct 17, 2026
e6026e0
Port owner reviewer metrics to Supabase API
Muawiya-contact Oct 17, 2026
0dd0989
Record owner reviewer metrics parity and remaining routes
Muawiya-contact Oct 17, 2026
7ec8df3
Port owner event feed to Supabase API
Muawiya-contact Oct 17, 2026
01b11c6
Record owner event feed parity and remaining routes
Muawiya-contact Oct 17, 2026
025263d
Port versioned reviewer access to Supabase API
Muawiya-contact Oct 17, 2026
e1bdfe2
Record reviewer access parity and remaining routes
Muawiya-contact Oct 17, 2026
3e9fc25
Make owner reviewer parity test tolerant of existing fixtures
Muawiya-contact Oct 17, 2026
23d27b4
Port reviewer invitations through guarded Auth and SQL
Muawiya-contact Oct 17, 2026
a2020f0
Document reviewer invite parity and staging callback
Muawiya-contact Oct 17, 2026
2ed9b37
Clarify path parity for multi-method routes
Muawiya-contact Oct 17, 2026
a4b01ff
Port generation job cancellation with durable replay
Muawiya-contact Oct 17, 2026
23a71f6
Track cancellation route parity and staging sequence
Muawiya-contact Oct 17, 2026
ae448cd
Port legacy enrichment batch commands to Supabase API
Muawiya-contact Oct 17, 2026
34f1f61
Port editorial generation demand recording to Supabase API
Muawiya-contact Oct 17, 2026
579d452
Record grouped Supabase editorial route progress
Muawiya-contact Oct 17, 2026
111a560
Make editorial demand fixture unique across tests
Muawiya-contact Oct 17, 2026
aef6a6b
Port editorial concept preview to private Supabase source
Muawiya-contact Oct 17, 2026
0616512
Port editorial revision preview to private Supabase source
Muawiya-contact Oct 17, 2026
9d1519d
Add transactional Edge editorial revision staging
Muawiya-contact Oct 17, 2026
c56cea7
Queue exact reviewed revisions through Supabase
Muawiya-contact Oct 17, 2026
40eb4cb
Stop parity fixture jobs from affecting worker tests
Muawiya-contact Oct 17, 2026
d8947c6
Implement authenticated concept review actions in Supabase
Muawiya-contact Oct 17, 2026
ca71082
Port editorial revision decisions and publication to Supabase
Muawiya-contact Oct 17, 2026
3f324d3
Add private avatar reference RPC for Supabase API
Muawiya-contact Oct 17, 2026
17b28b8
Normalize avatar uploads with bundled ImageMagick WASM
Muawiya-contact Oct 17, 2026
7f8eec4
Port private avatar upload and removal routes
Muawiya-contact Oct 17, 2026
7606dee
Distinguish image decode errors from avatar service failures
Muawiya-contact Oct 17, 2026
5abc460
Record complete candidate JSON route coverage
Muawiya-contact Oct 17, 2026
aff97c5
Smoke test private avatar upload and removal in staging
Muawiya-contact Oct 17, 2026
4b54519
Document complete candidate route and avatar staging setup
Muawiya-contact Oct 17, 2026
ec5b7c4
Bound avatar decoding to Edge memory limits
Muawiya-contact Oct 17, 2026
a5ae057
Document Edge avatar format limits and resource probe
Muawiya-contact Oct 17, 2026
3ed4d46
Measure bounded staging API load and database connections
Muawiya-contact Oct 17, 2026
8b0567b
Record staging deploy and load test protocol
Muawiya-contact Oct 17, 2026
e73e316
Record hosted avatar and load evidence
Muawiya-contact Oct 17, 2026
320ae16
Exercise protected staging owner and reviewer workflows
Muawiya-contact Oct 17, 2026
098abf0
Document staging role setup and security check
Muawiya-contact Oct 17, 2026
3d1fdaf
Make staging role probe resumable after partial checks
Muawiya-contact Oct 17, 2026
77f2c62
Verify staging public profile redaction and link revocation
Muawiya-contact Oct 17, 2026
ffb0bad
Document hosted public privacy probe
Muawiya-contact Oct 17, 2026
e2229ff
Record hosted avatar and load checks in route inventory
Muawiya-contact Oct 17, 2026
23bc4b1
Identify conflicting staging role credentials safely
Muawiya-contact Oct 17, 2026
387f254
Allow service-only editorial invites to inspect Auth identities
Muawiya-contact Oct 17, 2026
e3788ce
Verify editorial Auth grants in staging migration runner
Muawiya-contact Oct 17, 2026
5565e93
Record staging editorial Auth grant verification
Muawiya-contact Oct 17, 2026
c00794a
Share authenticated API request limits across Edge instances
Muawiya-contact Oct 17, 2026
cf18a16
Enforce account read and write budgets in Edge API
Muawiya-contact Oct 17, 2026
c4b7022
Measure expected throttling in staging read burst
Muawiya-contact Oct 17, 2026
d713a7f
Record hosted role acceptance and rate-limit rollout
Muawiya-contact Oct 17, 2026
533a2e4
Identify safe staging load failure reasons
Muawiya-contact Oct 17, 2026
ec6f3ee
Probe single-account rate limits with five workers
Muawiya-contact Oct 17, 2026
f2f0e98
Record staged limiter and load failure evidence
Muawiya-contact Oct 17, 2026
f56a23a
Verify shared limiter under concurrent requests
Muawiya-contact Oct 17, 2026
9494620
Extend limiter RPC timeout and classify upstream failures
Muawiya-contact Oct 17, 2026
0a1caea
Allow slower state reads during shared-limit bursts
Muawiya-contact Oct 18, 2026
b2c8e7f
Record final hosted API and rate-limit evidence
Muawiya-contact Oct 18, 2026
8923918
Log final staging load and PR handoff
Muawiya-contact Oct 18, 2026
55d8c27
Fix editorial commands with long valid audit notes
Muawiya-contact Oct 18, 2026
5b47a38
Record second API code review and long-note fix
Muawiya-contact Oct 18, 2026
69b01c5
Merge pull request #419 from Coding-Moves/codex/supabase-api-migration
Muawiya-contact Oct 18, 2026
f300a3d
Merge pull request #421 from Coding-Moves/dependabot/pip/backend/asyn…
Muawiya-contact Oct 18, 2026
064b701
Bump sqlalchemy from 2.1.3 to 2.1.4 in /backend
dependabot[bot] Oct 18, 2026
fadf202
Bump fastapi from 0.142.2 to 0.143.1 in /backend
dependabot[bot] Oct 18, 2026
faa2b16
Merge pull request #424 from Coding-Moves/dependabot/pip/backend/sqla…
Muawiya-contact Oct 18, 2026
d33c8fa
Merge pull request #425 from Coding-Moves/dependabot/pip/backend/fast…
Muawiya-contact Oct 18, 2026
1414ca6
Merge pull request #428 from Coding-Moves/dependabot/npm_and_yarn/mob…
Muawiya-contact Oct 18, 2026
dde139a
Merge pull request #429 from Coding-Moves/dependabot/npm_and_yarn/mob…
Muawiya-contact Oct 18, 2026
58f4f85
Merge pull request #423 from Coding-Moves/dependabot/npm_and_yarn/mob…
Muawiya-contact Oct 18, 2026
648f786
Merge pull request #430 from Coding-Moves/dependabot/npm_and_yarn/mob…
Muawiya-contact Oct 18, 2026
154e427
Merge pull request #427 from Coding-Moves/dependabot/npm_and_yarn/mob…
Muawiya-contact Oct 18, 2026
1017d72
Merge pull request #422 from Coding-Moves/dependabot/npm_and_yarn/mob…
Muawiya-contact Oct 18, 2026
3ebdf56
Bump expo from 57.0.26 to 57.0.29 in /mobile
dependabot[bot] Oct 18, 2026
aad1059
Merge pull request #426 from Coding-Moves/dependabot/npm_and_yarn/mob…
Muawiya-contact Oct 18, 2026
ed2187f
Document Railway worker baseline and Supabase handover gates
Muawiya-contact Oct 18, 2026
07b8ac2
Add durable service-only worker run ledger
Muawiya-contact Oct 18, 2026
7681520
Add authenticated Edge worker entry point
Muawiya-contact Oct 18, 2026
c95ef86
Record signed Cron dispatch and HTTP outcomes
Muawiya-contact Oct 18, 2026
b77ee69
Queue daily reminders with bounded one-use claims
Muawiya-contact Oct 18, 2026
f7c049a
Send bounded daily Expo reminder batches
Muawiya-contact Oct 18, 2026
6bf314e
Document and install inactive Supabase worker schedules
Muawiya-contact Oct 18, 2026
be05a84
Merge current develop dependencies into worker branch
Muawiya-contact Oct 18, 2026
d0e1c79
Run Edge worker tests in PR quality checks
Muawiya-contact Oct 18, 2026
051db21
Record step-two draft PR and validation status
Muawiya-contact Oct 18, 2026
6c76994
Add bounded weekly quiz push and receipt SQL
Muawiya-contact Oct 18, 2026
07b0bf2
Send weekly quiz pushes from bounded Edge task
Muawiya-contact Oct 18, 2026
d86cbcd
Schedule bounded weekly quiz drain each minute
Muawiya-contact Oct 18, 2026
6454b1a
Add bounded Gmail OAuth sender for editorial notices
Muawiya-contact Oct 18, 2026
a513a6e
Prepare and claim reviewer email batches in SQL
Muawiya-contact Oct 18, 2026
97b89bf
Deliver reviewer mail with locked eligibility check
Muawiya-contact Oct 18, 2026
b96ab54
Add protected staging batch for worker migrations and Cron
Muawiya-contact Oct 18, 2026
bdfe923
Document Gmail worker locks and staging secrets
Muawiya-contact Oct 18, 2026
5b06c5a
Port bounded Gemini lesson generation and validation
Muawiya-contact Oct 18, 2026
82fdfb9
Plan active-reader demand and fence curated refill drafts
Muawiya-contact Oct 18, 2026
ce22f00
Run bounded curated refill from the Edge worker
Muawiya-contact Oct 18, 2026
22d26e3
Schedule resumable refill drains within daily quota
Muawiya-contact Oct 18, 2026
153c1ce
Fence private editorial corrections on current reviewer access
Muawiya-contact Oct 18, 2026
39c9288
Run one bounded Gemini editorial correction per Edge invocation
Muawiya-contact Oct 18, 2026
9bbd1a2
Isolate worker integration fixtures from the shared test catalog
Muawiya-contact Oct 18, 2026
d408373
Isolate editorial and supply worker fixtures from suite order
Muawiya-contact Oct 18, 2026
638871b
Add fenced SQL claims for legacy enrichment drafts
Muawiya-contact Oct 18, 2026
4c06624
Run grounded legacy enrichment as private Edge drafts
Muawiya-contact Oct 18, 2026
01525dc
Schedule bounded generation jobs and document worker coverage
Muawiya-contact Oct 18, 2026
301b9dd
Configure staged worker secrets in one protected deployment
Muawiya-contact Oct 18, 2026
2a86d26
Choose active taxonomy in editorial worker fixture
Muawiya-contact Oct 18, 2026
8ebe206
Add read-only worker operations status report and runbook
Muawiya-contact Oct 18, 2026
d58f1d3
Require explicit staging opt-in before Gemini worker calls
Muawiya-contact Oct 18, 2026
51c8ac2
Smoke signed staging dispatch with provider tasks disabled
Muawiya-contact Oct 18, 2026
204eac5
Persist cancelled editorial fixture claim before next test
Muawiya-contact Oct 18, 2026
f5dbd55
Bound streamed dispatch bodies before parsing
Muawiya-contact Oct 18, 2026
ae063a9
Preflight staging Edge secret permissions before migrations
Muawiya-contact Oct 18, 2026
f623f04
Prepare version 1.10.15 with worker reliability highlights
Muawiya-contact Oct 18, 2026
c5dd108
Record worker PR progress and staging prerequisite
Muawiya-contact Oct 20, 2026
06e5e26
Restore shared concept questions after weekly worker test
Muawiya-contact Oct 20, 2026
1fad586
Document verified Railway worker runs and staging batch
Muawiya-contact Oct 20, 2026
757ebe8
Document live Railway worker flags and queue state
Muawiya-contact Oct 20, 2026
36c1645
Isolate staging worker canary settings from API secrets
Muawiya-contact Oct 20, 2026
f244302
Label staging push canaries and suppress quiz navigation
Muawiya-contact Oct 20, 2026
9d74b21
Mark staging reviewer emails as non-actionable tests
Muawiya-contact Oct 20, 2026
ba2628b
Add bounded staging worker provider canary tools
Muawiya-contact Oct 20, 2026
7bbbbb1
Run four protected staging provider canaries as one batch
Muawiya-contact Oct 20, 2026
317ffba
Identify invalid staging canary input by name
Muawiya-contact Oct 20, 2026
db8b9b4
Make staging canary secret cleanup idempotent
Muawiya-contact Oct 20, 2026
273e987
Cover safe canary diagnostics and repeatable cleanup
Muawiya-contact Oct 20, 2026
1d7dae4
Normalize copied staging push token across canary steps
Muawiya-contact Oct 20, 2026
29bdb4c
Add read-only staging email canary diagnosis
Muawiya-contact Oct 20, 2026
72f69f6
Retry only OAuth-rejected staging email canary
Muawiya-contact Oct 20, 2026
6ea3c96
Record staging worker canary results and email retry
Muawiya-contact Oct 20, 2026
46ec400
Diagnose staging Gmail token exchange without sending mail
Muawiya-contact Oct 20, 2026
9a91f70
Report Supabase worker health in owner operations
Muawiya-contact Oct 20, 2026
233e412
Preflight final staging Gmail canary retry
Muawiya-contact Oct 20, 2026
3b4fa84
Record worker canary diagnosis and owner status handoff
Muawiya-contact Oct 20, 2026
e68c67f
Bound Supabase worker run history
Muawiya-contact Oct 20, 2026
01414d9
Document bounded worker ledger retention
Muawiya-contact Oct 20, 2026
0936365
Document staging OAuth preflight failure
Muawiya-contact Oct 20, 2026
0154dfa
Document Gmail client secret recovery
Muawiya-contact Oct 20, 2026
c990272
Record staging worker verification and OAuth blocker
Muawiya-contact Oct 20, 2026
f8b40a2
Diagnose staging Gmail credential formatting safely
Muawiya-contact Oct 20, 2026
11cee8c
Identify staging OAuth client ID copy errors
Muawiya-contact Oct 20, 2026
4f6d12f
docs: connect One Concept to Products
Muawiya-contact Oct 20, 2026
be6bff8
docs: record website catalog PR handoff
Muawiya-contact Oct 20, 2026
be2eaf8
Merge pull request #433 from Coding-Moves/codex/align-coding-moves-site
Muawiya-contact Oct 20, 2026
4c7abcb
Wait for HTTP receipt after successful staging worker task
Muawiya-contact Oct 21, 2026
0e5872e
Record staging email send and receipt check gap
Muawiya-contact Oct 21, 2026
e5b5737
Merge current develop into worker migration branch
Muawiya-contact Oct 21, 2026
1a6ec52
Clarify remaining Railway and staging email evidence
Muawiya-contact Oct 21, 2026
9ba416b
Reconcile staged email HTTP receipt without resending
Muawiya-contact Oct 21, 2026
2ce9ac5
Record staged email receipt and delivery placement
Muawiya-contact Oct 21, 2026
9ff9ef9
Block automatic retry after uncertain Gmail sends
Muawiya-contact Oct 21, 2026
e76c79e
Fence expired editorial email claims after uncertain delivery
Muawiya-contact Oct 21, 2026
487abea
Document staged email receipt and safe retry handover
Muawiya-contact Oct 21, 2026
18777c0
Inspect failed staged worker smoke without dispatching
Muawiya-contact Oct 21, 2026
2adfe28
Record staging smoke failure and protected diagnosis
Muawiya-contact Oct 21, 2026
a99039b
Classify signed staging smoke failures without response bodies
Muawiya-contact Oct 21, 2026
6616cb6
Record verified staging worker handoff
Muawiya-contact Oct 21, 2026
586b052
Track remaining worker migration acceptance evidence
Muawiya-contact Oct 21, 2026
b1200a2
Reconcile supplied Railway deployment evidence
Muawiya-contact Oct 21, 2026
551e6fa
Default candidate editorial email cap to zero
Muawiya-contact Oct 21, 2026
d3f62da
Record production worker caps and empty queue snapshot
Muawiya-contact Oct 21, 2026
a953d12
Keep release highlights aligned with enabled reminders
Muawiya-contact Oct 21, 2026
2a0daf4
Record final release-copy review
Muawiya-contact Oct 21, 2026
dc35ecf
Record step-two PR readiness and cutover checks
Muawiya-contact Oct 21, 2026
4648f14
Require a valid Expo ticket for daily push acceptance
Muawiya-contact Oct 21, 2026
b40c5d9
Record worker PR review and validation
Muawiya-contact Oct 21, 2026
caaf0be
Merge pull request #431 from Coding-Moves/codex/supabase-cron-workers
Muawiya-contact Oct 21, 2026
51f7596
Decouple mobile browser links from the API endpoint
Muawiya-contact Oct 21, 2026
8d7c277
Host public recovery and profile pages outside Edge Functions
Muawiya-contact Oct 21, 2026
b035cc6
Gate production Edge deployment and OTA on verified main revision
Muawiya-contact Oct 21, 2026
de99858
Require preview verification before production OTA
Muawiya-contact Oct 21, 2026
b56f43c
Force public page rewrites ahead of Netlify directory routing
Muawiya-contact Oct 21, 2026
264389b
Document production Supabase cutover and release gates
Muawiya-contact Oct 21, 2026
e5e6807
Reject mixed Supabase projects in client release config
Muawiya-contact Oct 21, 2026
a340bb3
Record cutover self-review and validation
Muawiya-contact Oct 21, 2026
07d826e
Use CSP-compatible stylesheet on learner privacy page
Muawiya-contact Oct 21, 2026
43f7671
Record PR gates and production approval protection
Muawiya-contact Oct 21, 2026
4c08eee
Add one-time guarded production SQL batch
Muawiya-contact Oct 21, 2026
2c0b918
Document exact-tag production SQL approval path
Muawiya-contact Oct 21, 2026
648a161
Open learner privacy policy on the browser host
Muawiya-contact Oct 21, 2026
5764f08
Clarify free-plan backup and remaining production gates
Muawiya-contact Oct 21, 2026
ec354e2
Record verified production backup and restore drill
Muawiya-contact Oct 21, 2026
fe098ff
Record production migration restore rehearsal
Muawiya-contact Oct 21, 2026
b958a90
Run production schema verifier as a Python module
Muawiya-contact Oct 21, 2026
1a9e702
Add exact-tag read-only production schema verification
Muawiya-contact Oct 21, 2026
a5f5055
Record production SQL application and verifier follow-up
Muawiya-contact Oct 21, 2026
edd4315
Record verified production Supabase migrations
Muawiya-contact Oct 21, 2026
23abb08
Document verified production schema state
Muawiya-contact Oct 21, 2026
f86674b
Correct release log after migration check passes
Muawiya-contact Oct 21, 2026
bb394b4
Clarify completed production schema cutover
Muawiya-contact Oct 21, 2026
41108f4
Sequence Netlify pages before API routing switch
Muawiya-contact Oct 21, 2026
d38bd84
Verify worker boot in production deploy
Muawiya-contact Oct 21, 2026
73585fd
Record production deploy token readiness
Muawiya-contact Oct 21, 2026
d90ac03
Record production preflight settings and usage
Muawiya-contact Oct 21, 2026
51fcca8
Verify saved production configuration digests
Muawiya-contact Oct 21, 2026
800ff37
Refuse Cron installer reruns after handover
Muawiya-contact Oct 21, 2026
bb0a453
Record Cron guard evidence and CI limits
Muawiya-contact Oct 21, 2026
2d58af6
Record live reviewer site routing baseline
Muawiya-contact Oct 21, 2026
fc4eba9
docs: record production worker secret setup
Muawiya-contact Oct 21, 2026
4331fde
ci: guard one-time inactive production Cron install
Muawiya-contact Oct 21, 2026
4fcecd7
docs: sequence protected inactive Cron installation
Muawiya-contact Oct 21, 2026
f52597a
docs: record live production headroom and site settings
Muawiya-contact Oct 21, 2026
caa81a9
docs: record release PR review handoff
Muawiya-contact Oct 21, 2026
8df6101
docs: account for enabled Cron calls in Free quota
Muawiya-contact Oct 21, 2026
052b5cb
ci: require production Supabase API before release OTA
Muawiya-contact Oct 21, 2026
7a1a27c
ci: require deployed main revision before Cron installation
Muawiya-contact Oct 21, 2026
d7f8873
ci: verify production database identity before deploy and OTA
Muawiya-contact Oct 21, 2026
763e799
docs: align cutover sequence with guarded release
Muawiya-contact Oct 21, 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
19 changes: 19 additions & 0 deletions .github/scripts/check-production-public-config.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// The release gate must not publish an OTA that still targets Railway or a
// different Supabase project after the production Edge deployment succeeded.
const PROJECT_URL = 'https://egdszjoesxlccauahmsx.supabase.co';

function productionConfigReady(env) {
return env.EXPO_PUBLIC_API_BASE_URL === `${PROJECT_URL}/functions/v1/api`
&& env.EXPO_PUBLIC_SUPABASE_URL === PROJECT_URL;
}

if (require.main === module) {
if (!productionConfigReady(process.env)) {
console.error('Production OTA requires the reviewed Supabase API and Auth project.');
process.exitCode = 1;
} else {
console.log('Production API and Auth project verified. No values were logged.');
}
}

module.exports = { productionConfigReady };
30 changes: 30 additions & 0 deletions .github/scripts/check-production-public-config.test.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const assert = require('node:assert/strict');
const { spawnSync } = require('node:child_process');
const { test } = require('node:test');
const { productionConfigReady } = require('./check-production-public-config.cjs');

const production = {
EXPO_PUBLIC_API_BASE_URL: 'https://egdszjoesxlccauahmsx.supabase.co/functions/v1/api',
EXPO_PUBLIC_SUPABASE_URL: 'https://egdszjoesxlccauahmsx.supabase.co',
};

test('production OTA accepts only the matching production API and Auth project', () => {
assert.equal(productionConfigReady(production), true);
assert.equal(productionConfigReady({ ...production,
EXPO_PUBLIC_API_BASE_URL: 'https://one-concept-production.up.railway.app' }), false);
assert.equal(productionConfigReady({ ...production,
EXPO_PUBLIC_API_BASE_URL: 'https://zhrulokgngjceqgjkcmw.supabase.co/functions/v1/api' }), false);
assert.equal(productionConfigReady({ ...production,
EXPO_PUBLIC_SUPABASE_URL: 'https://zhrulokgngjceqgjkcmw.supabase.co' }), false);
});

test('a failed production gate prints no configured URL or public key', () => {
const result = spawnSync(process.execPath, ['.github/scripts/check-production-public-config.cjs'], {
env: { ...process.env, ...production,
EXPO_PUBLIC_API_BASE_URL: 'https://private.example.test/secret',
EXPO_PUBLIC_SUPABASE_ANON_KEY: 'do-not-print-this-key' },
encoding: 'utf8',
});
assert.equal(result.status, 1);
assert.doesNotMatch(result.stderr, /private\.example\.test|do-not-print-this-key/);
});
6 changes: 6 additions & 0 deletions .github/workflows/pr-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@ jobs:
- run: npm ci
- run: npm run typecheck
- run: npm test
- name: Typecheck and test Supabase functions
working-directory: .
run: |
mobile/node_modules/.bin/tsc -p supabase/functions/tsconfig.json
node --experimental-strip-types supabase/functions/api/handler.test.mjs
node --experimental-strip-types --test supabase/functions/worker/*.test.mjs

backend:
name: Backend lint and tests
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/release-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ on:
pull_request:
paths:
- '.github/scripts/check-release-revision*'
- '.github/scripts/check-production-public-config*'
- '.github/workflows/release*.yml'
- '.github/workflows/eas-update.yml'
jobs:
Expand All @@ -15,3 +16,4 @@ jobs:
node-version: 24
- run: bash -n .github/scripts/check-release-revision.sh
- run: node --test --test-isolation=none .github/scripts/check-release-revision.test.cjs
- run: node --test --test-isolation=none .github/scripts/check-production-public-config.test.cjs
88 changes: 76 additions & 12 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Railway deploys main independently. Publish only after the operator verifies
# the same commit on the API and workers and checks production health.
# Publish only after the protected Supabase production deploy succeeded for the
# current main commit and the operator verified the production API and workers.
name: Release

on:
Expand All @@ -9,6 +9,10 @@ on:
description: 'Full main commit SHA verified on healthy production API and workers'
required: true
type: string
production_deploy_run_id:
description: 'Successful Deploy Supabase API and worker to production Actions run ID for this main SHA'
required: true
type: string

# One release at a time: two quick merges must not race the tag check.
concurrency:
Expand All @@ -28,13 +32,39 @@ jobs:
environment: production-schema
permissions:
contents: read
actions: read
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false
- name: Require current main revision
run: |
test "$(git ls-remote origin refs/heads/main | cut -f1)" = "$GITHUB_SHA"
- name: Require successful matching production deployment
env:
GH_TOKEN: ${{ github.token }}
DEPLOY_RUN_ID: ${{ inputs.production_deploy_run_id }}
VERIFIED_BACKEND_SHA: ${{ inputs.backend_revision }}
run: |
set -euo pipefail
[[ "$DEPLOY_RUN_ID" =~ ^[0-9]+$ ]]
test "$VERIFIED_BACKEND_SHA" = "$GITHUB_SHA"
gh api "repos/${GITHUB_REPOSITORY}/actions/runs/${DEPLOY_RUN_ID}" \
--jq '[.path, .head_branch, .head_sha, .event, .conclusion] | @tsv' |
awk -v sha="$GITHUB_SHA" '$1 == ".github/workflows/supabase-production-deploy.yml" && $2 == "main" && $3 == sha && $4 == "workflow_dispatch" && $5 == "success" { found=1 } END { exit !found }'
- uses: actions/setup-node@v7
with:
node-version: 22
- name: Reject an already released app version before publishing any OTA
shell: bash
run: |
set -euo pipefail
version=$(node -p "require('./mobile/app.config.js').expo.version")
[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+([.-].+)?$ ]]
if git ls-remote --exit-code --tags origin "refs/tags/v${version}" >/dev/null 2>&1; then
echo "::error::Version v${version} already has a release tag."
exit 1
fi
- uses: actions/setup-python@v7
with:
python-version: '3.12'
Expand All @@ -43,10 +73,15 @@ jobs:
- name: Check actual target schema without writing to the database
working-directory: backend
env:
PRODUCTION_PROJECT_REF: ${{ vars.SUPABASE_PRODUCTION_PROJECT_REF }}
STAGING_PROJECT_REF: ${{ vars.SUPABASE_STAGING_PROJECT_REF }}
PRODUCTION_SCHEMA_DIRECT_URL: ${{ secrets.PRODUCTION_SCHEMA_DIRECT_URL }}
DIRECT_URL: ${{ secrets.PRODUCTION_SCHEMA_DIRECT_URL }}
run: python -m app.workers.schema_check
run: |
python -c 'from tools.apply_production_cutover import target_environment; target_environment(); print("production_connection=validated")'
python -m app.workers.schema_check

ota:
preview_ota:
needs: schema
runs-on: ubuntu-latest
defaults:
Expand Down Expand Up @@ -81,21 +116,50 @@ jobs:
eas env:exec production 'node scripts/validate-public-config.cjs --release' --non-interactive
eas env:exec preview 'node scripts/validate-public-config.cjs --release' --non-interactive

# Production first, then preview so preview devices are never left
# behind a production release. --environment bundles the EXPO_PUBLIC_*
# values; without it the update ships empty config and crashes.
- name: Publish production OTA
- name: Publish preview OTA
env:
MSG: ${{ github.event.head_commit.message || 'release' }}
run: eas update --channel production --environment production --message "$MSG" --non-interactive
run: eas update --channel preview --environment preview --message "$MSG" --non-interactive

- name: Publish preview OTA
production_ota:
needs: preview_ota
runs-on: ubuntu-latest
# A second protected approval lets the owner test the preview build before
# the installed production runtime receives a new API address.
environment: production-schema
defaults:
run:
working-directory: mobile
steps:
- uses: actions/checkout@v7
- name: Recheck current main after the preview period
env:
VERIFIED_BACKEND_SHA: ${{ inputs.backend_revision }}
run: |
REMOTE_MAIN_SHA=$(git ls-remote origin refs/heads/main | cut -f1)
export REMOTE_MAIN_SHA
bash ../.github/scripts/check-release-revision.sh
- uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
cache-dependency-path: mobile/package-lock.json
- uses: expo/expo-github-action@v9
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
- run: npm ci
- name: Validate production public configuration
run: |
eas env:exec production 'node scripts/validate-public-config.cjs --release' --non-interactive
eas env:exec production 'node ../.github/scripts/check-production-public-config.cjs' --non-interactive
- name: Publish production OTA after preview approval
env:
MSG: ${{ github.event.head_commit.message || 'release' }}
run: eas update --channel preview --environment preview --message "$MSG" --non-interactive
run: eas update --channel production --environment production --message "$MSG" --non-interactive

release:
needs: ota
needs: production_ota
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
Expand Down
Loading
Loading