Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
1e6ed71
docs: record dev branch delivery workflow
Shaan-Shoukath Oct 16, 2026
55535f9
feat(a1): add native device sign-in and secure session lifecycle
Shaan-Shoukath Oct 16, 2026
37d532a
feat(a1): add isolated auth demo and adaptive device validation
Shaan-Shoukath Oct 16, 2026
047197f
fix(a1): match generated login variants and error state
Shaan-Shoukath Oct 16, 2026
760afe7
feat(a1): complete native identity gates and preview sign-in journeys
Shaan-Shoukath Oct 16, 2026
1e9d6d0
fix(a1): sign simulator Keychain identity and preserve password focus
Shaan-Shoukath Oct 16, 2026
f7f414e
test(a1): isolate saved makerspace selection between UI journeys
Shaan-Shoukath Oct 16, 2026
da24b60
feat(ux): add branded onboarding and native account recovery flows
Shaan-Shoukath Oct 16, 2026
7451485
fix(ux): disambiguate native provider button callbacks
Shaan-Shoukath Oct 16, 2026
4b5dbff
fix(ux): select the visible sign-out confirmation control
Shaan-Shoukath Oct 16, 2026
32a2be4
feat(a2): build native member dashboard inventory and inbox flows
Shaan-Shoukath Oct 16, 2026
a6bee1f
fix(a2): import generated API types in member workspace
Shaan-Shoukath Oct 16, 2026
cf6658e
fix(a2): unwrap generated booking status composition
Shaan-Shoukath Oct 16, 2026
0a232dd
fix(a2): dismiss portrait sidebar and protect background snapshots
Shaan-Shoukath Oct 16, 2026
0405b95
fix(a2): restore adaptive sidebar after rotation
Shaan-Shoukath Oct 16, 2026
a335e7d
feat(a3): add scoped member actions and native SDK support
Shaan-Shoukath Oct 16, 2026
33536e7
fix(a3): select Xcode 26 SDK for native payments
Shaan-Shoukath Oct 16, 2026
7adc057
fix(a3): preserve latest card authority and target visible controls
Shaan-Shoukath Oct 16, 2026
cfd701a
test(a3): keep native interactions inside visible content
Shaan-Shoukath Oct 16, 2026
9b304d2
test(a3): handle unpublished offscreen control geometry
Shaan-Shoukath Oct 16, 2026
d1648e5
test(a3): search scroll content without midpoint oscillation
Shaan-Shoukath Oct 16, 2026
e427626
test(a3): target review sheets and stop scroll inertia
Shaan-Shoukath Oct 16, 2026
ab3a43d
feat(a4): add owned push registration and trusted navigation
Shaan-Shoukath Oct 16, 2026
0466acb
test(a4): resolve the canonical macOS fixture root
Shaan-Shoukath Oct 16, 2026
fdafeed
test(a4): scroll the parent outside multiline controls
Shaan-Shoukath Oct 16, 2026
00f636d
test(a4): keep generic drags in their content column
Shaan-Shoukath Oct 17, 2026
d058b8b
test(a4): drag within the review card padding
Shaan-Shoukath Oct 17, 2026
3e75740
test(a4): inspect native review scrolling geometry
Shaan-Shoukath Oct 17, 2026
89bee9e
fix(a4): format probe geometry with current Swift APIs
Shaan-Shoukath Oct 17, 2026
55dd190
test(a4): keep modal scrolling aimed at the target
Shaan-Shoukath Oct 17, 2026
a989989
perf(a4): schedule request countdown only when needed
Shaan-Shoukath Oct 17, 2026
8d7b036
feat(a5): add authoritative native payments
Shaan-Shoukath Oct 17, 2026
ce64d6b
fix(a5): expose session installation ownership check
Shaan-Shoukath Oct 17, 2026
072275f
test(a5): activate native checkout dialog actions
Shaan-Shoukath Oct 17, 2026
eaa400d
feat(a6): add reviewed staff handover flows
Shaan-Shoukath Oct 17, 2026
c49f55b
fix(a6): isolate child cleanup and retain demo quantities
Shaan-Shoukath Oct 17, 2026
0c5c38b
test(a6): activate the native handover confirmation
Shaan-Shoukath Oct 17, 2026
36fd853
fix(a6): preserve staff controls through native transitions
Shaan-Shoukath Oct 17, 2026
53843cb
test(a6): match native controls and scroll visible review content
Shaan-Shoukath Oct 17, 2026
d05dcfc
feat(a7): complete account security and localization-ready flows
Shaan-Shoukath Oct 17, 2026
9e619b7
feat(a8): add usage guide and release handoff
Shaan-Shoukath Oct 17, 2026
8ff47bc
fix(a7): render remote staff row titles verbatim
Shaan-Shoukath Oct 17, 2026
7455146
merge(a8): include A7 staff title correction
Shaan-Shoukath Oct 17, 2026
96c25e6
fix(a8): consume reduce motion policy in introduction
Shaan-Shoukath Oct 17, 2026
e94a5c8
test(a7): complete refresh fixtures and bound retry synchronization
Shaan-Shoukath Oct 17, 2026
32c69d9
Merge corrected A7 refresh fixtures and expose A8 native CI stages
Shaan-Shoukath Oct 17, 2026
988b8ad
test(a8): preserve integer boundary proof across localized grouping
Shaan-Shoukath Oct 17, 2026
a1ad7b2
fix(a7): adapt accessible account rows and keyboard journeys
Shaan-Shoukath Oct 17, 2026
ba22d5f
Merge accessible A7 account flows and correct A8 guide label queries
Shaan-Shoukath Oct 17, 2026
bdc4add
fix(a8): give accessible inventory and staff rows full text width
Shaan-Shoukath Oct 17, 2026
3193b08
fix(a7): expose native accessible keyboard dismissal
Shaan-Shoukath Oct 17, 2026
047acbd
Merge native A7 keyboard actions into the complete A8 candidate
Shaan-Shoukath Oct 17, 2026
0cab1e6
test(a8): use actual guide fixture and safe native tab navigation
Shaan-Shoukath Oct 17, 2026
6505723
fix(a8): present readable native demo payment outcomes
Shaan-Shoukath Oct 17, 2026
64afc3a
fix(a8): clarify native confirmation and destination readiness
Shaan-Shoukath Oct 17, 2026
547282b
Improve native control readiness across accessibility profiles
Shaan-Shoukath Oct 17, 2026
306983d
Use native sidebar controls in remaining UI journeys
Shaan-Shoukath Oct 17, 2026
4e72fb2
Use native scrolling to reveal demo payment outcomes
Shaan-Shoukath Oct 17, 2026
64f5e75
Wait for settled account navigation and valid scroll geometry
Shaan-Shoukath Oct 17, 2026
cb037f5
Keep membership confirmation actions readable at large text
Shaan-Shoukath Oct 17, 2026
e936a47
Preserve the explicit single-scene app manifest
Shaan-Shoukath Oct 17, 2026
3da09b8
Keep large-text sign-up actions readable and captures scoped
Shaan-Shoukath Oct 17, 2026
601a8fe
Preserve navigation hosts across phone rotation and tablet resize
Shaan-Shoukath Oct 17, 2026
5205d18
Require auth captures below the actual fixed header
Shaan-Shoukath Oct 17, 2026
3d3ec7e
Settle bounded auth scroll adjustments before capture
Shaan-Shoukath Oct 17, 2026
343400d
feat(b1): apply Gilroy content typography and native bars
Shaan-Shoukath Oct 17, 2026
d93aa95
test(b2): center auth actions and record native rotation policy
Shaan-Shoukath Oct 17, 2026
1731d12
feat(b3): complete brand conformance in codes and checkout
Shaan-Shoukath Oct 17, 2026
34bb979
feat(b4): add owned native feedback and accessible onboarding motion
Shaan-Shoukath Oct 17, 2026
7236e6a
fix(b5): reveal native controls and preserve profile replacement
Shaan-Shoukath Oct 18, 2026
631518f
test(b5): prove notification heading at largest text
Shaan-Shoukath Oct 18, 2026
7ff1398
test(b5): verify demo destination before member setup
Shaan-Shoukath Oct 18, 2026
6801353
fix(b5): fit notification heading and use native paragraph selection
Shaan-Shoukath Oct 18, 2026
1d0e4a7
fix(b5): use native profile keyboard action and verify input readiness
Shaan-Shoukath Oct 18, 2026
0267d4c
fix(b5): use native inline notification titles at accessibility sizes
Shaan-Shoukath Oct 18, 2026
3fe68c3
test(b5): synchronize native profile editing and sidebar readiness
Shaan-Shoukath Oct 18, 2026
739af77
test(b5): wait for native sidebar and system share readiness
Shaan-Shoukath Oct 18, 2026
47e1880
chore(b6): capture durable native orientation diagnostics
Shaan-Shoukath Oct 18, 2026
775f298
test(b6): keep sign-in reveal within the content gutter
Shaan-Shoukath Oct 18, 2026
2ba7ec4
chore(c1): harden build inputs and document native app handoff
Shaan-Shoukath Oct 18, 2026
0151aee
chore(c2): observe native export presentation failures
Shaan-Shoukath Oct 18, 2026
ed2aca4
test(c3): guard finite native navigation readiness
Shaan-Shoukath Oct 18, 2026
4a0cbf7
chore(c4): trace isolated demo entry diagnostics
Shaan-Shoukath Oct 18, 2026
a62a115
test(c5): request profile orientation after launch
Shaan-Shoukath Oct 18, 2026
caf9663
Fix unread Inbox heading at accessibility sizes
Shaan-Shoukath Oct 18, 2026
d4ebfa4
Preserve independent push and pull-request validation
Shaan-Shoukath Oct 18, 2026
a9312aa
feat(d1): re-pin the mobile backend contract and adopt vendor payments
Shaan-Shoukath Oct 18, 2026
8fa9011
feat(d2): native provider, phone and version-gated device sign-in
Shaan-Shoukath Oct 18, 2026
394271e
feat(d3): open live staff tools for native staff sessions
Shaan-Shoukath Oct 18, 2026
9867283
feat(d4): whole-account deletion with blockers, fresh proof and typed…
Shaan-Shoukath Oct 18, 2026
ba9fbb3
feat(d5): route v2 push and universal links through the server link c…
Shaan-Shoukath Oct 18, 2026
e4990f3
chore(d6): declare collected data in the privacy manifest and seed ne…
Shaan-Shoukath Oct 18, 2026
cfe013e
fix(d6): compile deletion probe, add deletion journey and record D-ph…
Shaan-Shoukath Oct 18, 2026
dcb7331
test(d2): import the API module for identity provider error assertions
Shaan-Shoukath Oct 18, 2026
4e54269
test(d5): align inbox landing link refusals with the server link cont…
Shaan-Shoukath Oct 18, 2026
252376e
fix(d2): keep the phone sheet on the auth root and dismiss deletion k…
Shaan-Shoukath Oct 18, 2026
85c6c37
feat(d7): opt-in Face ID and passcode app lock per account
Shaan-Shoukath Oct 18, 2026
0a0486d
test(d7): include the Face ID purpose in the audited bundle fixture
Shaan-Shoukath Oct 18, 2026
9f89282
Merge main (AGPL license) into dev before delivery
Shaan-Shoukath Oct 18, 2026
83017c1
feat(d8): member usage, staff glance, SMS/WhatsApp consent and phone …
Shaan-Shoukath Oct 18, 2026
e4113bc
docs(d8): record v2 extras and native app lock in the phase note
Shaan-Shoukath Oct 18, 2026
6dd62c7
test(d2): tap phone Verify only after the tablet sheet layout settles
Shaan-Shoukath Oct 18, 2026
e4a8c8e
fix(d2): verify a complete phone code automatically and settle tablet…
Shaan-Shoukath Oct 18, 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
237 changes: 226 additions & 11 deletions .github/workflows/ios.yml

Large diffs are not rendered by default.

15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,18 @@ google-services.json
*.mobileprovision
*.xcresult/
__pycache__/
/validation-device.json
/TestAttachments/
/build.log
/SourcePackages/
/release-build.log

# Private deployment inputs; templates remain reviewable.
.env
.env.*
!.env.example
*.pem
*.key
*.pfx
/dependency-lock-validation.json
/build-tools.json
27 changes: 27 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,30 @@
A phase with failing or skipped tests is not done.
6. Secrets: none in the repo, ever. No analytics or third-party SDKs beyond §6 without asking.
7. Accessibility and dark mode are part of "done" in every phase, not a final polish pass.

## Branch delivery workflow

The owner merged the A0 foundation and subsequently updated the delivery workflow:

- Start ongoing work from `dev`, commit there, and push to `origin/dev`.
- Consolidate on `dev` without new feature branches or pull requests. The owner's latest instruction uses the already-open iOS [pull request #4](https://github.com/SpaceWorks-HQ/SpaceWorks-iOS/pull/4): after the required repository native/CI, unsigned Release and actual visual gates pass, merge that exact reviewed head into `main` through the existing pull request. Keep `dev` and preserve phase commits.
- Retire obsolete work branches only after their work is safely retained. Preserve the owner's configured commit identity and the required Codex co-author trailer.

## Complete-build execution addendum (owner, 2026-10-16; delivery updated 2026-10-18)

The owner requested the remaining phases as one batch, with Android and iOS agents in parallel.
Implement each phase sequentially on `dev`, with phase commits, tests, CI evidence, and a changelog
parity checklist. A green phase may proceed without an intermediate merge. Consolidate the batch
on `dev`, complete the required repository validation and actual visual review, then merge the tested
work into `main` through the already-open iOS pull request #4 under the owner's latest instruction.
Keep `dev` and phase commits; do not create another pull request or feature branch for this batch.
Follow the branch delivery policy above. Preserve `docs/PRD.md`
byte-for-byte.
Phone and tablet layouts, portrait/landscape, light/dark and largest Dynamic Type are now in scope.
Use generated contract operations only. Record missing backend contracts as `backend-request`
issues and continue independent work when prerequisites permit. Local Docker is the development API;
development attestation and local HTTP must remain Debug-only. Store credentials only in Keychain.

Mobile-specific onboarding/auth UX and motion belong in `docs/mobile-auth-ux-spec.md` and
`tokens/mobile-motion.json` in this repository. Do not push mobile implementation/spec additions
to the Design repository. The Design submodule supplies the existing brand masters and colors.
34 changes: 34 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Contributing

Read [AGENTS.md](AGENTS.md), the immutable [PRD](docs/PRD.md), the current phase notes and
[release handoff](docs/RELEASE-READINESS.md) before changing behavior. Follow the owner's current
branch/PR instructions; do not create another delivery PR for the current batch.

Use the pinned Design submodule and supplied OpenAPI contract. Server calls and payload models
belong to the generated client. Report missing contracts rather than inventing endpoints, successful
payments, deletion or access. Keep credentials and personal data out of code, fixtures and logs.
Use private reporting for security issues; see [SECURITY.md](SECURITY.md).

On a Mac with the reviewed Xcode/generator versions:

```sh
git submodule update --init --recursive
python3 scripts/check_build_tools.py
python3 scripts/generate.py
python3 -m unittest discover -s scripts/tests -v
python3 scripts/lint.py
xcodegen generate
python3 scripts/dependency_lock.py stage
```

Use the exact native commands and simulator signing configuration in the release guide. Retain the
reviewed lock and no-automatic-resolution flags documented in [Dependencies](Dependencies/README.md).
Generated Swift, assets, entitlements and Xcode projects are not source edits. A dependency/toolchain
change requires explicit graph review and fresh native/Release proof; do not update versions implicitly.

Preserve native navigation, semantic branding, Dynamic Type/Bold Text, VoiceOver, Reduce Motion,
session ownership and cancellation. Test affected behavior without removing required cases or
pretending Windows source checks establish a SwiftUI build. Preserve exact source/run/artifact
provenance and actually inspect required full-OS captures. Fixture/demo results never establish
backend delivery or signed real-device behavior. Use small phase commits with the configured
owner identity and the required Codex trailer for Codex-authored changes.
186 changes: 186 additions & 0 deletions Dependencies/Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 33 additions & 0 deletions Dependencies/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Reviewed build dependencies

`Package.resolved` is the unmodified Xcode lock exported from actual source
`47e1880a5c7fe549608e2a38cba789d47cf152dc`, focused run
[39100123222](https://github.com/SpaceWorks-HQ/SpaceWorks-iOS/actions/runs/39100123222),
artifact 12125599794. SHA-256:
`4a0c17f8dbe46c87952310b079a07b89481d715af79b17a2d164581e7b7b2aa0`.
Its 20 version/revision pins include the direct and transitive app/code-generator dependencies.
The package/project declarations were unchanged at `775f298`. This provenance is an actual focused
build, not a claim that the old source passed complete final validation.

Following [Apple's CI guidance](https://developer.apple.com/documentation/xcode/building-swift-packages-or-apps-that-use-them-in-continuous-integration-workflows),
after generating the Xcode project run `python3 scripts/dependency_lock.py stage`.
Xcode builds use `-disableAutomaticPackageResolution -onlyUsePackageVersionsFromResolvedFile`.
`python3 scripts/dependency_lock.py check` rejects any byte change to the resulting workspace lock.
CI caches include the canonical lock's hash and archive both the observed lock and verification.
The generated project remains ignored; do not commit a generated Xcode project to retain the lock.

For an intentional dependency update, change the declared exact versions, resolve explicitly on
the pinned Xcode installation in a reviewed development checkout, inspect every changed version,
revision and upstream repository, then replace this canonical lock. Run the complete source/native,
device-profile and unsigned Release/resource gates. Never accept an automatically rewritten lock,
silently update a package, or treat an SDK compile as live provider/backend verification.

`build-tools.json` records XcodeGen 2.46.0 and librsvg 2.62.3 from the actual published installation
log. CI checks these versions after installation and records actual executable version output;
it fails closed if a future Homebrew install selects a different version. This does not promise
that Homebrew will retain an older formula. Review a deliberate toolchain update and its generated
assets instead of upgrading the expected version merely to make a check pass. Xcode 26.2 remains
the separately pinned Apple toolchain.

Dependencies and supplied fonts/assets retain their own applicable licenses. This file grants no
additional license or embedding rights and does not choose an application repository license.
12 changes: 12 additions & 0 deletions Dependencies/build-tools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"versions": {
"xcodegen": "2.46.0",
"librsvg": "2.62.3"
},
"provenance": {
"source_sha": "47e1880a5c7fe549608e2a38cba789d47cf152dc",
"run": 39100123222,
"job": 117594513500,
"evidence": "Published Install project and icon generators job log; Cellar version paths. Same versions also appear in the 775f298 full-phone prefix."
}
}
3 changes: 3 additions & 0 deletions Fixtures/Account/archive.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"base64": "UEsDBBQAAAAAAABIUF2EsZAMUAAAAFAAAAAKAAAAUkVBRE1FLnR4dFNQQUNFIFdPUktTIERFTU8gRVhQT1JUClNhbXBsZSBkYXRhIG9ubHkuIE5vIHBlcnNvbmFsIGFjY291bnQgZGF0YSBpcyBpbmNsdWRlZC4KUEsBAhQAFAAAAAAAAEhQXYSxkAxQAAAAUAAAAAoAAAAAAAAAAAAAAIABAAAAAFJFQURNRS50eHRQSwUGAAAAAAEAAQA4AAAAeAAAAAAA"
}
6 changes: 6 additions & 0 deletions Fixtures/Account/challenge.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"challenge": "demo-account-challenge",
"enrollment_required": true,
"expires_in": 300,
"mfa_required": true
}
12 changes: 12 additions & 0 deletions Fixtures/Account/export.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"completed_at": null,
"created_at": "2026-10-16T09:00:00Z",
"expires_at": "2099-01-01T00:00:00Z",
"failure_code": "",
"failure_detail": "",
"id": "84000000-0000-4000-8000-000000000001",
"manifest": {
"demo": true
},
"status": "available"
}
22 changes: 22 additions & 0 deletions Fixtures/Account/grants.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
[
{
"app_id": "org.spaceworks.app",
"attested_at": "2026-10-16T09:00:00Z",
"created_at": "2026-10-16T09:00:00Z",
"environment": "development",
"id": "83000000-0000-4000-8000-000000000001",
"last_used_at": "2026-10-16T09:00:00Z",
"platform": "apple",
"status": "active"
},
{
"app_id": "org.spaceworks.app",
"attested_at": "2026-10-16T09:00:00Z",
"created_at": "2026-10-16T09:00:00Z",
"environment": "development",
"id": "83000000-0000-4000-8000-000000000002",
"last_used_at": "2026-10-16T09:00:00Z",
"platform": "android",
"status": "active"
}
]
4 changes: 4 additions & 0 deletions Fixtures/Account/membership.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"renewal_cancelled_at": null,
"status": "active"
}
5 changes: 5 additions & 0 deletions Fixtures/Account/mfa.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"available": true,
"enabled": true,
"required": false
}
5 changes: 5 additions & 0 deletions Fixtures/Account/provider.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"created_at": "2026-10-16T09:00:00Z",
"provider": "google",
"updated_at": "2026-10-16T09:00:00Z"
}
7 changes: 7 additions & 0 deletions Fixtures/Account/recovery.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"recovery_codes": [
"demo-recovery-01",
"demo-recovery-02",
"demo-recovery-03"
]
}
Loading
Loading