Appearance
Ariadne and Theseus inventory
Setup pass: 11 September 2026. A1–A5 and parent A0 (#143) landed 17 September 2026. T1–T8 and parent T0 (#149) landed 17 September 2026. This page is still the inventory, not a claim that OA-AT-maps is done. OA-AT-unlock and OA-AT-ops are done (17 September 2026).
Durable tally of the Hansel / Gretel (Ariadne) hospital navigation POC versus what SafeCall has, and the Theseus field / ops gaps that T1–T8 filled. Implementers should read this instead of re-searching the legacy trees.
GitLab tracking lives in the Ariadne / Theseus roadmap (parents #143, #149). Human / secret-store steps live in operator actions. Click-level sittings: Ariadne operator close-out, Theseus operator close-out. Issue fetch/close rules: GitLab issues.
Locked decisions
- Current
mobile/became Ariadne (ariadne/). The repo end state isariadne/+theseus/and nomobile/. - Theseus is a new Flutter app (same stack as Keryx / Ariadne: BLE, camera, ntfy).
- Theseus auth is two-layer: Wantok staff unlock first, then per-site SafeCall QR pairing.
- Keryx stays the client-admin alert app. Theseus does not replace Keryx and does not subscribe to staff categories. It owns
safecall-opsonly. - Theseus is Wantok-internal (no public-store GTM clone of Keryx). Ariadne store launch is out of this program; first Ariadne exit is POC replay.
- Navigation graph stays SafeCall nodes/edges. Hansel
active_regions/pathsare import sources, not a second runtime model. - Do not commit hospital floor plans,
mar.json, passwords, or pairing tokens. - Lab pairing URL is
https://safecall-lab.sourcectl.com. That host is not Keryx{public_base}.
Names and where the old code is
| Name | What it was | On this Mac | In safecall today |
|---|---|---|---|
| Hansel | Wantok web toolchain: Pixi editor, QR field deploy, project.json store | /Users/tmin/Code/archive/old_safecall_files/legacy/hansel (canonical data + maps); copy in /Users/tmin/Code/active/wantok/hansel | Reimplemented as web Navigation editor + server bundle APIs. No field deploy app. |
| Gretel | Flutter repo / package name | /Users/tmin/Code/active/gretel ≡ archive legacy/gretel (last commit 2025-12-11) | Ported into ariadne/ (was mobile/) as SafeCall Nav, then renamed Ariadne |
| Ariadne | Shipped Gretel brand (cz.wantok.ariadne) | Same Gretel trees (Android label / bundle id) | ariadne/. Display and Dart package Ariadne. Store IDs com.sourcectl.ariadne (Android and iOS). Never cz.wantok.ariadne. |
| Theseus | New Wantok field / ops app | theseus/ | theseus/ |
Do not treat these as sources:
/Users/tmin/Code/active/assimilator/hansel— aborted SQLite/JWT rewrite;db/hansel.dbhas no tables..cursor/plans/navigation_system_migration_99812b4c.plan.mdpointed atlegacy/gretel/inside this repo. That path was never committed here.
Hospital POC data (stay on disk; never git):
- AKESO-CEDR (hardcoded Gretel project id): 7 floors, quadrant names
4A–4Don 4. NP. Server-format JSON withpathsplus maps under Hanselserver/projects/AKESO-CEDR/andback/projects/AKESO-CEDR/images/. - Multiscan 999 (Pardubice) sample in Gretel
lib/project.json(editor format, emptypaths). - SafeCall once had
server/scripts/mar.json(same CEDR export); removed in06bc9123. Maps were never in this repo.
Ariadne today (ariadne/)
App identity: Dart package ariadne, display “Ariadne”, launcher Ariadne, store title Ariadne Indoor Navigation. Android and iOS IDs are com.sourcectl.ariadne. Never claim cz.wantok.ariadne. If Apple refuses the iOS App ID, fall back to com.sourcectl.ariadneapp in a follow-up — do not invent the suffix in source until that happens.
| Path | Role |
|---|---|
ariadne/lib/main.dart | App shell |
ariadne/lib/screens/home_screen.dart | URL, QR / key, sync, location pick |
ariadne/lib/screens/qr_scanner_screen.dart | { url, mobile_key } |
ariadne/lib/screens/navigation_screen.dart | Map, BLE pose, pathfind, survey |
ariadne/lib/core/positioning.dart | RSSI → meters × floor px/m + Cramer; fingerprint k-NN |
ariadne/lib/core/navigation_graph.dart | Dijkstra + edge projection |
ariadne/lib/services/ble_scanner.dart | WTK_ scan, 50-sample RSSI buffer |
ariadne/lib/game/navigation_game.dart | Flame renderer; live heading + pin fallback |
ariadne/lib/core/heading.dart | Device heading + floor compass_angle (Gretel wrap) |
ariadne/lib/core/map_scale.dart | Hansel map_scale + ruler_width → pixels/meter |
ariadne/lib/models/navigation_data.dart | Bundle / floor / node / edge / beacon |
Notifications are not in ariadne/. They live in keryx/.
Algorithm transfer (Gretel → SafeCall)
| Capability | Gretel / Ariadne POC | Ariadne (ariadne/) now | Gap for Ariadne POC replay |
|---|---|---|---|
| WTK_ BLE scan + RSSI buffer | Yes (100 samples) | Yes (50 samples) | None — keep SafeCall |
| 1-beacon snap / 2-beacon midpoint | Yes | Yes | None |
| 3+ trilateration | Code exists; never sets distance from RSSI | Path-loss _rssiToDistance + Cramer | Keep SafeCall — do not restore broken Gretel math |
| Live magnetometer heading | Yes: FlutterCompass + per-floor compass_angle | A2: heading.dart + FlutterCompass; pin when no compass | Landed (A2 / #145) |
map_scale / ruler / origin | In JSON; unused at runtime | A3: map_scale + ruler_width → px/m on 3+ RSSI path; origin unused | Landed (A3 / #146; origin unused) |
| End-user vs deployment map | Server had both | Prefer cached floor_{id}_enduser.png; else deployment PNG | Landed (A3 / #146) |
| Corridor graph | active_regions → paths (convert_coords.js) + beacon connections | A4: import_hansel_project.ts → nodes/edges (20 px H/V snap; connections skipped) | Landed (A4 / #147) |
| Path-follow animation | Player walks the polyline | Snap-to-edge only | Nice-to-have, not POC-blocking |
| Multi-floor auto transition | Attempted; marked broken | Floor picker only | Out of first Ariadne milestone |
| Particle / Kalman / PDR | No | No | Not in this program |
| Fingerprint / Wi‑Fi k-NN | No | POC + scripts/ml/fingerprint_train.ts | Keep as-is; not required for hospital POC |
| QR onboarding | No (hardcoded AKESO-CEDR + wantok.minitsios.com/hnsl) | Yes: { url, mobile_key } | Keep SafeCall QR |
Gretel compass math (A2 landed): GretaPlayer in /Users/tmin/Code/active/gretel/lib/main.dart combines device heading with per-floor compass_angle. Ariadne does the same in ariadne/lib/core/heading.dart.
Gretel path conversion (A4 landed): /Users/tmin/Code/archive/old_safecall_files/legacy/hansel/back/convert_coords.js maps active_regions line segments → paths. Import the already-converted CEDR server project.json with server/scripts/import_hansel_project.ts. How-to: Hansel import. Replay walk-through: POC replay.
Theseus vs Hansel vs current admin
| Theseus goal | Legacy Hansel | SafeCall today | Gap |
|---|---|---|---|
| Pair to an install | Deploy app JWT + hardcoded HNSL URL | Theseus field QR (th_, write-scoped) plus Nav QR (read key) and Keryx QR (ntfy subscribe) | Landed (T3 / #152). Do not reuse server_mobile_api_key |
| Pick a map / floor | Project + floor list in editor | Theseus snapshot catalog after pair; web Navigation + Maps | Landed (T6 / #155) |
| Find nearby beacons while walking | Phone was Gretel (scan only). Hansel deploy scanned printed MAC / holder QRs | Theseus phone BLE (WTK_). Gateway ID still ranks gateways that hear a MAC via MQTT adv4 | Landed (T7 / #156). Gatify is a later optional add-on |
| Confirm beacon on map | Pixi drag in desktop editor; deploy only binds MAC / holder | Theseus walk-up hear + tap-to-confirm; web Navigation can still drag beacons | Landed (T7 / #156) |
| Create routes | Draw H/V active_regions; form-based beacon connections | Theseus add/connect + POST /theseus/floor/:id/graph; web node/edge tools remain | Landed (T8 / #157 via T5) |
| Wantok-only access | users.json operators + JWT on /deploy; editor WS had no auth | Theseus layer-1 unlock (PHC, not a customer-box role). Roles stay admin / user / maintenance / api (lib/src/roles.ts) | Landed (T2 / #151). Identity does not live on the customer box. NAS PHC OA-AT-unlock done 17 September 2026 |
| Ops notifications | None | Theseus foreground safecall-ops inbox. Publisher {binary_name}-ops / safecall-ops. Excluded from Keryx QR / /features | Landed (T4 / #153). Subscribe token OA-AT-ops done 17 September 2026 |
Reuse for Theseus ops: keryx/lib/services/ntfy_stream_service.dart and the SafeCall alert-record parser. Topic inventory: ntfy topics. Do not put safecall-ops on a Keryx QR.
Hansel deploy (front/deploy.js) is a printed-MAC / holder-QR wizard. That is a different job than “hear a beacon and confirm it on the map.”
Target architecture (current)
Wantok unlock (Theseus, layer 1)
│
▼
Site Theseus QR (Mobile Access) ──► field token + origin
│
├── GET navigation snapshot / maps
├── POST beacon confirm + graph write
└── ntfy subscribe safecall-ops (Wantok creds, not site QR)
Ariadne ── mobile key QR ──► same snapshot / maps (read-only)Work-item map (256k-sized)
Codes match GitLab titles. Full descriptions and iids are on the roadmap.
| Code | Milestone | Item | One-window job |
|---|---|---|---|
| A0 | Ariadne POC parity | #143 | Parent (landed; A1–A5 closed; rasters still OA-AT-maps) |
| A1 | Ariadne POC parity | #144 | Rename mobile/ → ariadne/ (landed); no behavior change |
| A2 | Ariadne POC parity | #145 | Live compass + floor compass_angle (landed) |
| A3 | Ariadne POC parity | #146 | map_scale / origin + show end-user map (landed; origin unused) |
| A4 | Ariadne POC parity | #147 | Hansel project.json → floors / beacons / nodes / edges (landed) |
| A5 | Ariadne POC parity | #148 | POC replay operator packet (landed; rasters still OA-AT-maps) |
| T0 | Theseus Wantok access | #149 | Parent (landed; T1–T8 closed; OA-AT-unlock and OA-AT-ops done; maps still operator-actions) |
| T1 | Theseus Wantok access | #150 | Scaffold theseus/ (landed) |
| T2 | Theseus Wantok access | #151 | Layer-1 Wantok unlock (landed; NAS PHC OA-AT-unlock done 17 September 2026) |
| T3 | Theseus Wantok access | #152 | Site-pairing QR (layer 2) (landed) |
| T4 | Theseus Wantok access | #153 | safecall-ops inbox (landed; subscribe token OA-AT-ops done 17 September 2026) |
| T5 | Theseus site commissioning | #154 | Server field APIs + guard_theseus (landed) |
| T6 | Theseus site commissioning | #155 | Pick location / floor / map (landed) |
| T7 | Theseus site commissioning | #156 | BLE discover + confirm on map (landed) |
| T8 | Theseus site commissioning | #157 | Field route authoring (landed) |
Intentionally deferred
- Theseus public App Store / Play GTM.
- Claiming Gretel store ids
cz.wantok.ariadne(source IDs arecom.sourcectl.ariadne). - Hansel printed-MAC deploy wizard.
- Central Wantok backend that proxies all customer installs.
- New SafeCall
wantokuser role on customer boxes. - Path-follow animation, auto floor change, fingerprint promotion.
- Extracting a shared Dart package between Ariadne and Theseus.
- Committing CEDR / Multiscan rasters or
mar.json.
Key SafeCall files (current names)
Navigation app: ariadne/ and docs/ariadne/. Keryx product docs: docs/keryx/ (GTM remains docs/gtm/keryx/).
| Area | Paths |
|---|---|
| Nav editor | web/src/admin/pages/navigation.ts |
| Mobile Access QR | web/src/admin/tools/mobile-access/ |
| Gateway ID | web/src/admin/tools/gateway-id/ |
| Navigation HTTP | server/src/routes/http.ts (guard_navigation, guard_navigation_mobile_key) |
| Theseus field HTTP | server/src/theseus.ts (guard_theseus); Flutter theseus/ |
| ntfy ops | server/src/ntfy.ts (ntfy_publish_ops_health), server/src/ntfy_topics.ts |
| Keryx QR | server/src/keryx_ntfy.ts |
| Roles | lib/src/roles.ts |
| Import | server/scripts/import_hansel_project.ts (server/src/hansel_import.ts) |