Commit Graph
100 Commits
Author SHA1 Message Date
jjbrunton c904f4e960 release: promote staging to production
Promotes verified staging release candidate 15c7894 to production.
2026-09-06 21:17:34 +01:00
jjbrunton 15c7894bec fix(web): redact invite replay requests 2026-09-06 20:54:19 +01:00
jjbrunton 57c7ecebe6 test(api): isolate drizzle migration ledger 2026-09-06 20:14:13 +01:00
jjbrunton 17372a9bf0 fix(mobile): stop guest warning spam 2026-09-06 19:19:56 +01:00
jjbrunton 0f9c9c2e15 fix(acquisition): use recognized privacy markers 2026-09-06 13:24:39 +01:00
jjbrunton 4a57f31615 fix(acquisition): close invite privacy gaps 2026-09-06 13:18:11 +01:00
jjbrunton 1c7084c033 merge: use safe invite cancellation 2026-09-06 12:56:31 +01:00
jjbrunton 0dfe4435b0 merge: add atomic invite cancellation 2026-09-06 12:56:31 +01:00
jjbrunton 5ac4843095 docs(couples): clarify invite cancellation retention 2026-09-06 12:56:11 +01:00
jjbrunton 8e48467414 fix(mobile): preserve joined invites on cancellation 2026-09-06 12:56:10 +01:00
jjbrunton 1fed348072 fix(couples): protect joined invites from cancellation 2026-09-06 12:54:40 +01:00
jjbrunton a1b62c3b47 merge: correct mobile invite disclosure 2026-09-06 12:50:13 +01:00
jjbrunton 4415dcf29f fix(mobile): keep pairing discoveries truthful 2026-09-06 12:49:57 +01:00
jjbrunton 95162d1889 merge: harden invite analytics redaction 2026-09-06 12:49:50 +01:00
jjbrunton dd1a47ecfa fix(web): scrub invite tokens before analytics 2026-09-06 12:49:32 +01:00
jjbrunton a02e9d531b merge: correct invite privacy copy 2026-09-06 12:47:48 +01:00
jjbrunton 49a9cd270f fix(web): clarify open answer visibility 2026-09-06 12:47:29 +01:00
jjbrunton 077f5433e1 merge: redact invite analytics URLs 2026-09-06 12:45:46 +01:00
jjbrunton ade2c42d51 fix(web): redact invite analytics URLs 2026-09-06 12:45:28 +01:00
jjbrunton daefdc6da9 merge: fix paired state cleanup tests 2026-09-06 12:41:47 +01:00
jjbrunton 029a90b338 fix(mobile): statically load paired unlock state 2026-09-06 12:41:23 +01:00
jjbrunton bb0c712ede merge: fix invite journey routing 2026-09-06 12:39:51 +01:00
jjbrunton 1c4ec2b412 fix(mobile): resolve pairing payoff route types 2026-09-06 12:39:38 +01:00
jjbrunton 21006cd041 merge: improve mobile invite journey 2026-09-06 12:38:57 +01:00
jjbrunton f9481054de feat(mobile): improve pairing invite journey 2026-09-06 12:38:16 +01:00
jjbrunton 922066f492 merge: improve web invite journey 2026-09-06 12:35:44 +01:00
jjbrunton ff2cf09170 feat(web): improve invite landing recovery 2026-09-06 12:31:48 +01:00
jjbrunton 402c027b14 merge: add mutual discovery OTA PRD 2026-09-06 09:33:45 +01:00
jjbrunton 1f5a939c3f docs(product): add mutual discovery OTA PRD 2026-09-06 09:33:35 +01:00
jjbrunton 418dd50306 Merge pull request #34 from jjbrunton/hotfix/sex-fun-market-research
docs(product): add sex fun market strategy
2026-09-05 23:01:07 +01:00
jjbrunton 206acbc670 docs(product): add sex fun market strategy 2026-09-05 22:56:13 +01:00
jjbrunton ea038c9863 merge: add sex fun market strategy 2026-09-05 22:55:52 +01:00
jjbrunton a431adad89 docs(product): add sex fun market strategy 2026-09-05 22:55:10 +01:00
jjbrunton 860986f900 Merge pull request #32 from jjbrunton/task/dare-catalogue-150
feat(dares): seed 150-item catalogue
2026-09-05 22:35:28 +01:00
jjbrunton 439f506fff feat(dares): seed 150-item catalogue 2026-09-05 22:30:39 +01:00
jjbrunton 557d78b785 Merge pull request #33 from jjbrunton/hotfix/agent-ota-assessment
docs(agents): require upfront OTA assessment
2026-09-05 22:23:46 +01:00
jjbrunton 87309101ca docs(agents): require upfront OTA assessment 2026-09-05 22:17:24 +01:00
jjbrunton d998e32047 merge: require upfront OTA assessment 2026-09-05 22:15:42 +01:00
jjbrunton 7edd957547 docs(agents): require upfront OTA assessment 2026-09-05 22:15:29 +01:00
jjbrunton fdaa8c47bb merge: add full question catalogue draft 2026-09-05 21:41:20 +01:00
jjbrunton 04328fb3a8 fix(catalogue): integrate reviewed question sources 2026-09-05 21:36:20 +01:00
jjbrunton f373e3beb4 docs(catalogue): add full live catalogue draft 2026-09-05 21:03:46 +01:00
jjbrunton ba3b37989f Merge pull request #30 from jjbrunton/staging
chore(release): promote staging to main
2026-09-05 20:59:19 +01:00
jjbrunton 583d38eb8c merge(staging): preserve main admin fixes 2026-09-05 20:51:32 +01:00
jjbrunton d604cd7a11 fix(catalogue): avoid literal em dash in validator 2026-09-05 20:28:26 +01:00
jjbrunton ddf1e33a4e merge: add play-safe spicy question draft 2026-09-05 20:27:55 +01:00
jjbrunton da1c310738 docs(catalogue): trim draft source whitespace 2026-09-05 20:27:31 +01:00
jjbrunton 5c8c9cc9a5 docs(catalogue): finalise spicy question draft 2026-09-05 20:24:27 +01:00
jjbrunton c297f03b56 docs(catalogue): add audio concept source 2026-09-05 20:16:34 +01:00
jjbrunton c79d993cf5 docs(catalogue): preserve text answer concepts 2026-09-05 20:14:08 +01:00
jjbrunton b5e6b70d54 docs(catalogue): repair spicy swipe source 2026-09-05 20:07:14 +01:00
jjbrunton 2a2cbe9e85 docs(catalogue): add concept set b source 2026-09-05 19:59:02 +01:00
jjbrunton eb54aa4daa docs(questions): add concept set a swipe drafts 2026-09-05 19:57:48 +01:00
jjbrunton e509ac732f docs(catalogue): replace swipe draft concepts 2026-09-05 19:45:51 +01:00
jjbrunton a72fe9c06d docs(catalogue): expand draft pack themes 2026-09-05 19:36:52 +01:00
jjbrunton 450c527d1e docs(question-types): document interaction contract 2026-09-05 19:33:17 +01:00
jjbrunton 6c7219c741 docs(catalogue): refine spicy draft copy 2026-09-05 19:31:57 +01:00
jjbrunton b02a105e10 docs(catalogue): add play-safe spicy draft 2026-09-05 19:29:05 +01:00
jjbrunton f4687f95fe Merge pull request #29 from jjbrunton/staging
fix(admin): prevent blank dashboard after login
2026-09-05 17:12:45 +01:00
jjbrunton 53a48ab6d5 fix(admin): use feature interest composite key 2026-09-05 17:02:07 +01:00
jjbrunton a6233d0175 fix(admin): render standalone feature interests 2026-09-05 16:57:57 +01:00
jjbrunton c776859183 Merge pull request #28 from jjbrunton/staging
Promote staging to main: Apple review onboarding fixes and v1.0.8 build 49
2026-09-01 16:16:37 +01:00
jjbrunton cc12f5f0ff Merge remote-tracking branch 'origin/main' into sync/staging-backmerge 2026-09-01 16:10:11 +01:00
jjbrunton 3659cc8c2f chore(ios): record v1.0.8 build 49 2026-09-01 14:08:05 +01:00
jjbrunton 4b227ad62c chore(mobile): prepare iOS build 48 2026-09-01 13:47:47 +01:00
jjbrunton 7c8d91c89c fix(mobile): address Apple review onboarding flows 2026-09-01 09:42:48 +01:00
jjbrunton fe1248c59d Merge pull request #25 from jjbrunton/staging
Staging
2026-08-31 20:56:43 +01:00
jjbrunton 6883befff3 fix(mobile): persist matches tutorial dismissal 2026-08-31 19:39:33 +01:00
jjbrunton a06f1b69e8 Merge pull request #27 from jjbrunton/hotfix/admin-cors-origin
fix(api): allow the admin console origin through CORS
2026-08-31 18:22:23 +01:00
jjbruntonandClaude Opus 5 3a019e62d3 fix(api): allow the admin console origin through CORS
The production allowlist held only https://sauci.app, so every
/v1/admin/* preflight from https://manage.sauci.app returned 204 with no
Access-Control-Allow-Origin and the browser blocked the request. Login
then reported "Access denied. You are not an administrator." because the
admin app treats any /v1/admin/me failure as a permissions failure.

Add the admin console origin and record in the README that new admin
hosts belong in the Compose contract rather than a Dokploy override.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 18:17:26 +01:00
jjbruntonandClaude Opus 5 636811e66a fix(api): allow the admin console origin through CORS
The production allowlist held only https://sauci.app, so every
/v1/admin/* preflight from https://manage.sauci.app returned 204 with no
Access-Control-Allow-Origin and the browser blocked the request. Login
then reported "Access denied. You are not an administrator." because the
admin app treats any /v1/admin/me failure as a permissions failure.

Add the admin console origin and record in the README that new admin
hosts belong in the Compose contract rather than a Dokploy override.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 18:17:10 +01:00
jjbrunton 84712a950e Merge pull request #26 from jjbrunton/hotfix/admin-docker-context
fix(admin): restore admin docker build context, allow hotfix branches into main
2026-08-31 18:08:31 +01:00
jjbruntonandClaude Opus 5 d14869d745 ci(branch-policy): allow hotfix and release branches into main
The policy accepted only `staging` as a head for main, so any change
production needed before the next promotion had nowhere to go: the PR was
unmergeable by CI and branch protection blocks direct pushes.

Accept `hotfix/*` and `release/*` heads as well. The naming requirement
keeps a direct-to-main change deliberate and visible, and the master
freeze plus the "features target staging" rule are unchanged. Document
the escape hatch and the need to land the same commit on staging.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 18:03:48 +01:00
jjbruntonandClaude Opus 5 f1573f4906 fix(admin): keep admin app in the docker build context
The root .dockerignore excluded apps/admin, so the monorepo build context
dropped that workspace entirely: npm ci skipped it and
`npm run build -w @sauci/admin` failed with "No workspaces found".
The ignore file was authored for the mcp image and later extended with
re-includes for web; admin never got the same treatment.

Re-include apps/admin, and re-exclude node_modules/dist last so the
re-includes cannot pull host build artefacts into any image context.

Verified with `docker build -f apps/admin/Dockerfile .`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 18:03:48 +01:00
jjbruntonandClaude Opus 5 d825e3d80c ci(branch-policy): allow hotfix and release branches into main
The policy accepted only `staging` as a head for main, so any change
production needed before the next promotion had nowhere to go: the PR was
unmergeable by CI and branch protection blocks direct pushes.

Accept `hotfix/*` and `release/*` heads as well. The naming requirement
keeps a direct-to-main change deliberate and visible, and the master
freeze plus the "features target staging" rule are unchanged. Document
the escape hatch and the need to land the same commit on staging.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 18:03:34 +01:00
jjbruntonandClaude Opus 5 13094267a6 fix(admin): keep admin app in the docker build context
The root .dockerignore excluded apps/admin, so the monorepo build context
dropped that workspace entirely: npm ci skipped it and
`npm run build -w @sauci/admin` failed with "No workspaces found".
The ignore file was authored for the mcp image and later extended with
re-includes for web; admin never got the same treatment.

Re-include apps/admin, and re-exclude node_modules/dist last so the
re-includes cannot pull host build artefacts into any image context.

Verified with `docker build -f apps/admin/Dockerfile .`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 17:56:41 +01:00
jjbruntonandClaude Fable 5 ecc31a13a2 feat(release): enforce manifest and Info.plist release invariants
Extend release-preflight to reject an Android manifest missing the
READ_MEDIA_IMAGES/READ_MEDIA_VIDEO tools:node="remove" attributes and
an iOS Info.plist that regained dev-launcher-only keys, both
regressions introduced silently by expo prebuild during the SDK 54 to
56 upgrade.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 16:03:04 +01:00
jjbruntonandClaude Fable 5 7a76936829 docs(agents): promote v1.0.8 release learnings
Record three confirmed v1.0.8 failure modes (expo prebuild native
regressions, npm 10/11 lockfile divergence, local EAS build
preconditions) and promote each into docs/releasing.md, a new
docs/development/dependencies.md, and the release-preflight script.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 16:03:02 +01:00
jjbrunton 83df3b45f8 Merge pull request #23 from jjbrunton/staging
Release v1.0.8: Expo SDK 56 and EAS Observe
2026-08-31 15:47:29 +01:00
jjbruntonandClaude Fable 5 9609a9084b fix(deps): pin @react-native/metro-config to end npm 10/11 lock divergence
react-native-worklets depends on @react-native/metro-config with a
wildcard range; npm 11 (local) resolves and hoists 0.87.x where npm 10
(CI runners and Docker images) requires 0.85.3 at the same position, so
every lockfile regeneration broke one side. Pin 0.85.3 via the root
overrides and regenerate: npm ci now passes on npm 10.8.2 linux/amd64
(SWC, rollup, and lightningcss platform binaries all install) and on
local npm 11, with verify:fast green on both.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 15:43:49 +01:00
jjbruntonandClaude Fable 5 90cde4aca4 fix(web): pin Next SWC binaries and regenerate lockfile with CI's npm
Since the SDK 56 dependency churn, arborist nests next under apps/web and
npm 10 skipped its platform-optional SWC binaries on the x64 CI runner,
breaking next build. Pin the linux and darwin binaries as direct
optionalDependencies of @sauci/web (bump alongside next) and regenerate
the lockfile from scratch with npm 10.8.2 to match CI. Verified in a
linux/amd64 node:20.19.4 container: npm ci installs the binary.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 15:29:01 +01:00
jjbruntonandClaude Fable 5 ecff9e2ec8 fix(deps): regenerate lockfile with npm 10 for CI compatibility
Today's dependency changes left orphaned @react-native 0.87.x entries
that npm 10's ci validation rejects; npm 11 tolerated them locally.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 15:02:09 +01:00
jjbrunton ffc655f576 Merge remote-tracking branch 'origin/main' into staging 2026-08-31 14:59:44 +01:00
jjbruntonandClaude Fable 5 d8bedead0c chore(ios): sync widget Xcode build number to 47
EAS auto-increment updates the Info.plists but not the widget target's
CURRENT_PROJECT_VERSION; the shipped widget binary already carries 47
from its Info.plist.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:59:02 +01:00
jjbruntonandClaude Fable 5 6c3a181613 chore(android): record v1.0.8 build 51
AAB sha256 4893ee6f64f90bb1b2e1f13c6b088cbe75103337fbc101751da7076224778c29
verified: com.sauci.app 1.0.8 (51), production upload key, four ABIs,
Worklets/Reanimated/Skia libraries, no broad media read permissions,
production OTA endpoint, channel, and code-signing certificate. Supersedes
the build 50 artifact, which predated the skia 2.6.9 bump and the
expo-av migration and was quarantined unshipped.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:58:10 +01:00
jjbruntonandClaude Fable 5 d8ff39a2f3 chore(ios): record v1.0.8 build 47
IPA sha256 760517ccf474d496c940c3f84825f4852306d840d913090610a77dc24450ee36
verified: com.sauci.app and com.sauci.app.LiveDrawWidget both 1.0.8 (47),
team BXVPBATDZY, associated domains, shared app group, production OTA
runtime, endpoint, and code-signing certificate, no dev-launcher keys.
Also syncs the tracked Podfile.lock to the archive's resolution (expo-av
removed; ExpoVideo, ExpoAudio, ExpoSystemUI added; skia 2.6.9).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:46:44 +01:00
jjbruntonandClaude Fable 5 b8cb2addff fix(mobile): migrate expo-av to expo-video and expo-audio
expo-av has no SDK 56 compatible release, and its EXEventEmitter.h
interface was removed from expo-modules-core, so the iOS release
archive fails compiling Pods/EXAV. Move video playback to
expo-video's useVideoPlayer/VideoView, and audio playback and
recording to expo-audio's createAudioPlayer/AudioModule.AudioRecorder,
preserving existing controls, mute/loop/resize behavior, and the
recording audio session configuration.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:35:51 +01:00
jjbruntonandClaude Fable 5 5e28117662 fix(ios): bump react-native-skia to 2.6.9 for the base64 header fix
2.6.2 fails to archive under the SDK 56 toolchain: base64.cpp includes
third_party/base64.h, which the podspec header glob no longer resolves.
2.6.9 includes the header relative to its own directory.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:15:42 +01:00
jjbruntonandClaude Fable 5 196428f796 chore(android): record v1.0.8 build 50
AAB sha256 29c9bee3949e51b027c558637c04eefec96bf7f177151cb9571ca2a289ffee4e
verified: com.sauci.app 1.0.8 (50), production upload key, four ABIs,
Worklets/Reanimated/Skia libraries, no broad media read permissions,
production OTA endpoint, channel, and code-signing certificate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:07:58 +01:00
jjbruntonandClaude Fable 5 6bd04a6c06 fix(ios): keep dev-launcher keys out of the release Info.plist
The SDK 56 prebuild added NSBonjourServices, RCTMetroPort, and the Expo
Dev Launcher NSLocalNetworkUsageDescription to the tracked Info.plist.
v1.0.7 shipped without them and the production app has no local-network
feature to declare.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 13:43:56 +01:00
jjbruntonandClaude Fable 5 7aca39aa8f fix(android): restore blocked media permission removals in manifest
The SDK 56 prebuild dropped the tools:node=remove entries for
READ_MEDIA_IMAGES and READ_MEDIA_VIDEO, so the merged release manifest
regained permissions the Play media policy forbids; Sauci uses the system
photo picker. Restore the removals shipped in v1.0.7.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 13:42:44 +01:00
jjbruntonandClaude Fable 5 79233f58aa fix(android): raise Gradle daemon memory for RN 0.85 toolchain
The prebuild-regenerated gradle.properties restored stock 2GB heap and
512MB Metaspace limits; KSP and CMake configuration under SDK 56 exhaust
Metaspace and fail the release build.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 13:19:41 +01:00
jjbruntonandClaude Fable 5 c9e8835810 fix(mobile): scope Expo exports to native platforms
A bare expo export (used by the OTA preflight and by eoas publish) also
exported the unused web target, whose static render breaks under SDK 56.
XPREM serves only iOS and Android bundles and the website is apps/web, so
declare the Expo app native-only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 12:12:18 +01:00
jjbruntonandClaude Fable 5 ff8f99f418 chore(release): prepare v1.0.8
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 12:07:13 +01:00
jjbruntonandClaude Fable 5 604eec3322 fix(ios): restore LiveDrawWidget identity after apple-targets 5 regeneration
The SDK 56 prebuild derived the widget bundle id from its folder name
(com.sauci.app.widget) and pointed CODE_SIGN_ENTITLEMENTS at the ignored
ios/.targets cache. Restore the shipped com.sauci.app.LiveDrawWidget
identity, the tracked entitlements file, and pin bundleIdentifier in the
target config so future prebuilds keep it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 12:07:13 +01:00
jjbrunton dbf548c7bd Merge remote-tracking branch 'origin/staging' into staging
# Conflicts:
#	docs/releasing.md
2026-08-31 11:54:50 +01:00
jjbrunton 4973f2c631 Merge remote-tracking branch 'origin/staging' into staging
# Conflicts:
#	.codex/skills/release-mobile/SKILL.md
#	apps/mobile/package.json
#	docs/releasing.md
2026-08-31 11:34:33 +01:00
jjbruntonandClaude Fable 5 2b05e50312 feat(release): add fastlane ship lanes and end-to-end release pipeline docs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 11:32:32 +01:00
jjbruntonandClaude Opus 5 26312e5a58 docs(release): a release request carries through to rollout
The upload execution policy stopped an agent at upload: App Review
submission and rollout each needed their own explicit authorization, so a
request to ship a release ended with an artifact sitting in App Store
Connect and a question back to the user. That contradicted the harness
standard in documentation/standards/react-native.md, which has always
authorized the full pipeline, and it is the wrong default: every step from
here is recoverable. A submission can be cancelled while it waits for
review, a phased release paused, a staged rollout halted.

A release request now authorizes build, verification, upload, App Review
submission, and rollout for the platforms it names.

What still needs its own authorization is anything that is not part of
shipping the requested release: widening TestFlight distribution to new
groups, and re-uploading after an ambiguous upload result. The existing
automatic-TestFlight-distribution check before an iOS upload is unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 11:31:08 +01:00
jjbrunton 66c25849e9 Merge remote-tracking branch 'origin/staging' into task/expo-56-observe
# Conflicts:
#	docs/releasing.md
2026-08-31 11:15:09 +01:00