chore(planning): wiki submodule bump + verifier evidence JSONs
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
---
|
||||
gsd_plan_version: 1.0
|
||||
mode: quick
|
||||
task: Replace all logo references with the new master logo assets
|
||||
quick_id: "261024-001"
|
||||
slug: logo-asset-replacement
|
||||
date: "2026-10-24"
|
||||
---
|
||||
|
||||
# Quick task 261024-001: Replace logo references with master assets
|
||||
|
||||
## Goal
|
||||
|
||||
Point every logo reference in the repository to the new master logo files under
|
||||
`assets/MASTER_FILE-arah2_logo.*`. The primary asset is the SVG; raster formats
|
||||
are used only where the consuming context requires them (Telegram `sendPhoto`
|
||||
must use PNG).
|
||||
|
||||
## must_haves
|
||||
|
||||
- `README.md` renders the logo from `assets/MASTER_FILE-arah2_logo.svg`.
|
||||
- `.planning/tmp/arah2.wiki/Home.md` mirrors the README logo reference.
|
||||
- `bot/src/bot/commands/start.ts` serves the logo via the static-asset public
|
||||
URL `/MASTER_FILE-arah2_logo.png` (PNG is required by Telegram `sendPhoto`).
|
||||
- The Worker can actually serve the new logo files: copy
|
||||
`assets/MASTER_FILE-arah2_logo.svg` and `assets/MASTER_FILE-arah2_logo.png`
|
||||
into `web/public/` so they are emitted to `web/dist/` on build.
|
||||
- The legacy mockups in `stitch_minimalist_route_navigator/*/` stop hotlinking
|
||||
the ephemeral Google-hosted placeholder logo and use the local master SVG
|
||||
(`../../assets/MASTER_FILE-arah2_logo.svg`).
|
||||
|
||||
## Tasks
|
||||
|
||||
| # | Files | Action | Verify | Done |
|
||||
|---|-------|--------|--------|------|
|
||||
| 1 | `README.md` | Replace `assets/logo_arah2.png` with `assets/MASTER_FILE-arah2_logo.svg` | grep shows new path, no old path | [x] |
|
||||
| 2 | `.planning/tmp/arah2.wiki/Home.md` | Replace mirror logo URL with the Gitea media URL for `assets/MASTER_FILE-arah2_logo.svg` | grep shows new path, no old path | [x] |
|
||||
| 3 | `bot/src/bot/commands/start.ts` | Update comment + `startLogoUrl` to return `/MASTER_FILE-arah2_logo.png` | grep shows new path, no old path; `npm test -w bot` passes | [x] |
|
||||
| 4 | `web/public/MASTER_FILE-arah2_logo.svg`, `web/public/MASTER_FILE-arah2_logo.png` | Copy from `assets/` | files exist and are non-empty | [x] |
|
||||
| 5 | `stitch_minimalist_route_navigator/{active_route_guidance,community_incident_reporter,navigate_map_overview,telegram_live_traffic_feed}/code.html` | Replace `lh3.googleusercontent.com/aida/...` logo `src` with `../../assets/MASTER_FILE-arah2_logo.svg`; update `alt` to `arah² logo` | grep shows new path, no Google logo URL in any mockup | [x] |
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
quick_id: "261024-001"
|
||||
slug: logo-asset-replacement
|
||||
date: "2026-10-24"
|
||||
status: complete
|
||||
---
|
||||
|
||||
# Quick task 261024-001: Replace logo references with master assets
|
||||
|
||||
## Summary
|
||||
|
||||
All logo references in the repository now point to the new master logo files
|
||||
under `assets/MASTER_FILE-arah2_logo.*`. SVG is used where browsers/Markdown
|
||||
render it; PNG is used for the Telegram `sendPhoto` path because Telegram's
|
||||
photo API requires a raster image.
|
||||
|
||||
## Changes made
|
||||
|
||||
| # | File | Change |
|
||||
|---|------|--------|
|
||||
| 1 | `README.md` | Logo `src` changed from `assets/logo_arah2.png` to `assets/MASTER_FILE-arah2_logo.svg` |
|
||||
| 2 | `.planning/tmp/arah2.wiki/Home.md` | Mirror logo URL changed to the Gitea media URL for `assets/MASTER_FILE-arah2_logo.svg` |
|
||||
| 3 | `bot/src/bot/commands/start.ts` | Comment and `startLogoUrl` now reference `/MASTER_FILE-arah2_logo.png` (PNG for Telegram `sendPhoto`) |
|
||||
| 4 | `web/public/MASTER_FILE-arah2_logo.svg` | Copied from `assets/MASTER_FILE-arah2_logo.svg`; served by the Worker |
|
||||
| 5 | `web/public/MASTER_FILE-arah2_logo.png` | Copied from `assets/MASTER_FILE-arah2_logo.png`; served by the Worker and used by `sendPhoto` |
|
||||
| 6 | `stitch_minimalist_route_navigator/{active_route_guidance,community_incident_reporter,navigate_map_overview,telegram_live_traffic_feed}/code.html` | Replaced ephemeral Google-hosted placeholder logo with local `../../assets/MASTER_FILE-arah2_logo.svg`; updated `alt` to `arah² logo` in all four mockups |
|
||||
|
||||
## Verification
|
||||
|
||||
- `grep` across `.md`, `.html`, `.ts`, `.json`, and `.jsonc` files shows no
|
||||
remaining active references to `logo_arah2.png` or `lh3.googleusercontent.com/aida/`
|
||||
logo URLs. Descriptive mentions in the quick-task PLAN/SUMMARY and in
|
||||
legacy-doc paragraphs are intentional.
|
||||
- `npm test -w bot` passes: 125 passed, 0 failed.
|
||||
- New public assets exist in `web/public/` and are non-empty.
|
||||
|
||||
## Notes
|
||||
|
||||
- The legacy files `assets/logo_arah2.png` and `web/public/logo_arah2.png` were
|
||||
left in place; only references were redirected.
|
||||
- The `@assets/MASTER_FILE-arah2_logo.svg` directive was interpreted as the
|
||||
conceptual primary asset. In concrete paths: repo-root-relative
|
||||
`assets/MASTER_FILE-arah2_logo.svg` for `README.md`, the Gitea media absolute
|
||||
URL for the wiki mirror, and the public URL `/MASTER_FILE-arah2_logo.png`
|
||||
for the bot's Telegram `sendPhoto` call (PNG is required by Telegram's photo
|
||||
API).
|
||||
+1
-1
Submodule .planning/tmp/arah2.wiki updated: f46379d32c...848a140b32
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"doc_path": "docs/API.md",
|
||||
"claims_checked": 55,
|
||||
"claims_passed": 55,
|
||||
"claims_failed": 0,
|
||||
"failures": []
|
||||
}
|
||||
@@ -1,14 +1,32 @@
|
||||
{
|
||||
"doc_path": "docs/ARCHITECTURE.md",
|
||||
"claims_checked": 118,
|
||||
"claims_passed": 117,
|
||||
"claims_failed": 1,
|
||||
"claims_checked": 60,
|
||||
"claims_passed": 56,
|
||||
"claims_failed": 4,
|
||||
"failures": [
|
||||
{
|
||||
"line": 348,
|
||||
"claim": "`KvLike` | `bot/src/kv/*.ts` | Structural KV interface — lets tests pass a fake without depending on Workers types",
|
||||
"expected": "listed as a `Key Abstractions` entry, i.e. an importable named export",
|
||||
"actual": "`interface KvLike` exists in both bot/src/kv/sessions.ts:53 and bot/src/kv/location-pin.ts:34 but is NOT exported (module-private). Only the derived `MintSessionKv` / `LocationPinKv` are exported, so no module can import `KvLike`. The structural-KV and fake-test description is otherwise accurate; only the abstraction-table framing is imprecise."
|
||||
"line": 513,
|
||||
"claim": "web/test/build-artifact.test.mjs (BA1–BA6)",
|
||||
"expected": "BA1–BA10",
|
||||
"actual": "STALE: the build-artifact suite has 10 cases (BA1–BA10); BA7 (gazetteer id parity), BA8 (no deep-link crypto), BA9 (200 KiB gz budget), BA10 (pairId parity) exist"
|
||||
},
|
||||
{
|
||||
"line": 539,
|
||||
"claim": "`KvLike` | `bot/src/kv/*.ts` | Structural KV interface (module-private, not exported — the derived `MintSessionKv`/`LocationPinKv`/`GuidanceSessionKv` are the public surface)",
|
||||
"expected": "KvLike exists in sessions.ts and location-pin.ts only; guidance-sessions.ts defines its own module-private `GuidanceSessionKv` (line 77, not exported, does not extend KvLike)",
|
||||
"actual": "PARTIALLY WRONG: `GuidanceSessionKv` is itself the module-private interface (nothing is derived/exported in guidance-sessions.ts); KvLike is not present in all kv/*.ts"
|
||||
},
|
||||
{
|
||||
"line": 579,
|
||||
"claim": "`TelegramWebAppLike` ... Hand-rolled ~12-member contract for `window.Telegram.WebApp`",
|
||||
"expected": "~20 members",
|
||||
"actual": "DRIFT: interface has ~20 members (initData, startParam, colorScheme, themeParams, version, platform, safeAreaInset, contentSafeAreaInset, isActive, 4 swipe/confirm methods, isFullscreen, unlockOrientation, BackButton, LocationManager members...)"
|
||||
},
|
||||
{
|
||||
"line": 519,
|
||||
"claim": "VERIFY: production Worker hostname and KV namespace id come from bot/wrangler.jsonc and bot/.dev.vars, both environment-specific.",
|
||||
"expected": "VERIFY markers should cite only facts external to the repo",
|
||||
"actual": "OVER-FLAGGED: both the workers.dev hostname (MINI_APP_URL) and the KV namespace id ARE committed repo facts in bot/wrangler.jsonc — this marker can be dropped or reworded (fork-specific values aside)"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"doc_path": "docs/CONFIGURATION.md",
|
||||
"claims_checked": 45,
|
||||
"claims_passed": 42,
|
||||
"claims_failed": 3,
|
||||
"failures": [
|
||||
{
|
||||
"line": 381,
|
||||
"claim": "`.gitignore` at the repo root excludes `.planning/`",
|
||||
"expected": "the '.planning/' entry is COMMENTED OUT ('#.planning/') and 139 .planning files are git-tracked",
|
||||
"actual": "FALSE: .planning/ is not ignored — contradicts CONTRIBUTING.md and git ls-files .planning"
|
||||
},
|
||||
{
|
||||
"line": 301,
|
||||
"claim": "`npm run commands` | `bot` | `node scripts/register-commands.mjs` — `setMyCommands` in default scope and in `language_code: \"ms\"`",
|
||||
"expected": "six setMyCommands calls (default en/ms, all_private_chats en/ms, clear group scopes)",
|
||||
"actual": "STALE: describes the old two-call script; DEPLOYMENT.md:135-137 has the current six-call set"
|
||||
},
|
||||
{
|
||||
"line": 31,
|
||||
"claim": "Four variables reach the Worker (`bot/src/config.ts` declares them as a typed `Env` interface, plus two *bindings* ...)",
|
||||
"expected": "THREE variables reach the Worker (BOT_TOKEN, WEBHOOK_SECRET, MINI_APP_URL) plus the two bindings",
|
||||
"actual": "WRONG COUNT: config.ts's Env has three string variables; the sentence itself then says WEBHOOK_URL 'never' reaches the Worker, contradicting its own 'four'"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"doc_path": "CONTRIBUTING.md",
|
||||
"claims_checked": 24,
|
||||
"claims_passed": 23,
|
||||
"claims_failed": 1,
|
||||
"failures": [
|
||||
{
|
||||
"line": 115,
|
||||
"claim": "the build-artifact gates (BA1–BA6) fail with a \"build first\" message",
|
||||
"expected": "BA1–BA10 (web/test/build-artifact.test.mjs contains BA1 through BA10)",
|
||||
"actual": "STALE: the suite now carries BA7–BA10 too (grep confirms BA1,BA2,...,BA10). TESTING.md:335-346 already documents BA1–BA10"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"doc_path": "docs/DEPLOYMENT.md",
|
||||
"claims_checked": 40,
|
||||
"claims_passed": 40,
|
||||
"claims_failed": 0,
|
||||
"failures": []
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"doc_path": "docs/DEVELOPMENT.md",
|
||||
"claims_checked": 55,
|
||||
"claims_passed": 51,
|
||||
"claims_failed": 4,
|
||||
"failures": [
|
||||
{
|
||||
"line": 263,
|
||||
"claim": "makes exactly two `setMyCommands` calls — one for the default scope (English) and one for `language_code: \"ms\"`",
|
||||
"expected": "SIX calls (bot/scripts/register-commands.mjs CALLS array)",
|
||||
"actual": "STALE: actual set is default(en), default+ms, all_private_chats(en), all_private_chats(ms), clear all_group_chats, clear all_chat_administrators. DEPLOYMENT.md:135-137 and GETTING-STARTED.md:216-218 describe the six-call set correctly"
|
||||
},
|
||||
{
|
||||
"line": 571,
|
||||
"claim": "no `CONTRIBUTING.md`, no PR template, no CI config",
|
||||
"expected": "CONTRIBUTING.md exists at repo root",
|
||||
"actual": "STALE: CONTRIBUTING.md now exists (this docs-update wave added it); CI config still absent"
|
||||
},
|
||||
{
|
||||
"line": 605,
|
||||
"claim": "no `.github/PULL_REQUEST_TEMPLATE.md`, no CONTRIBUTING file, no CI, no required reviewers",
|
||||
"expected": "CONTRIBUTING file exists",
|
||||
"actual": "STALE: same drift — CONTRIBUTING.md exists at root; the rest of the sentence holds"
|
||||
},
|
||||
{
|
||||
"line": 638,
|
||||
"claim": "`.planning/` is also gitignored (local-only planning docs)",
|
||||
"expected": ".planning/ is TRACKED in git (139 files; the '#.planning/' line in root .gitignore is commented out)",
|
||||
"actual": "FALSE: contradicts CONTRIBUTING.md:19 ('.planning/PROJECT.md, tracked in this repo') and git ls-files; also the root .gitignore's Zone.Identifier claim nearby is fine, but .planning is not ignored"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,40 +1,26 @@
|
||||
{
|
||||
"doc_path": "docs/GETTING-STARTED.md",
|
||||
"claims_checked": 78,
|
||||
"claims_passed": 76,
|
||||
"claims_failed": 2,
|
||||
"claims_checked": 45,
|
||||
"claims_passed": 42,
|
||||
"claims_failed": 3,
|
||||
"failures": [
|
||||
{
|
||||
"line": 198,
|
||||
"claim": "Register the persistent command menu (English + Bahasa Melayu) once, so `/start`, `/help`, and `/privacy` appear in the Telegram UI",
|
||||
"expected": "`npm run bot:commands` (bot/scripts/register-commands.mjs) registers /start, /help, and /privacy in the Telegram command menu",
|
||||
"actual": "register-commands.mjs registers ONLY two commands. Line 61: `return [\"help\", \"privacy\"].map((command) => {`. Its header comment (lines 9-10) states: \"D-03: the menu lists ONLY commands that exist in this phase (/help, /privacy) — no stub entries reserved for future commands.\" /start is a real command handler (bot/src/bot/commands/start.ts, registered in bot.ts:32) but is deliberately excluded from the persistent menu."
|
||||
"line": 35,
|
||||
"claim": "only the `npm run routing:glyphs` glyph-builder needs it",
|
||||
"expected": "script 'routing:glyphs' in package.json",
|
||||
"actual": "BLOCKER: no `routing:glyphs` script exists in root package.json (nor anywhere). The correct invocation is `npm run glyphs -w routing` (routing/package.json 'glyphs'), as DEVELOPMENT.md:222 states"
|
||||
},
|
||||
{
|
||||
"line": 292,
|
||||
"claim": "`Missing BOT_TOKEN, WEBHOOK_SECRET, WEBHOOK_URL` and exit code `1`",
|
||||
"expected": "set-webhook.mjs prints exactly `Missing BOT_TOKEN, WEBHOOK_SECRET, WEBHOOK_URL`",
|
||||
"actual": "Variable order differs. bot/scripts/set-webhook.mjs:48 filters `[\"BOT_TOKEN\", \"WEBHOOK_URL\", \"WEBHOOK_SECRET\"]` and line 52 prints `Missing ${missing.join(\", \")}`, so the real output is `Missing BOT_TOKEN, WEBHOOK_URL, WEBHOOK_SECRET`. Exit code 1 (line 53) and the names-only, never-echoing behavior are correct."
|
||||
}
|
||||
],
|
||||
"warnings": [
|
||||
{
|
||||
"line": 173,
|
||||
"claim": "`npm run deploy --workspace bot` inside the 'Expose the webhook' step",
|
||||
"expected": "a step-appropriate command",
|
||||
"actual": "NPM rejects `--workspace` passed after the script name when combined with this shape, and the surrounding prose immediately retracts it ('which is the wrong tool for local work'). Retracted on the next lines, so not counted as a failure, but the code block itself is misleading — the real invocation is `node bot/scripts/set-webhook.mjs` on line 181."
|
||||
"line": 33,
|
||||
"claim": "`web/scripts/capture.mjs:163`",
|
||||
"expected": "chromium.launch() at the cited line",
|
||||
"actual": "STALE: chromium.launch() is at web/scripts/capture.mjs:201 (line 163 is the docroot-guard region). The sibling citation theme/scripts/screenshot.mjs:103 is correct"
|
||||
},
|
||||
{
|
||||
"line": 147,
|
||||
"claim": "Unknown paths are 404 — the Worker's fetch handler routes exactly four paths",
|
||||
"expected": "exactly four routed paths",
|
||||
"actual": "Accurate: webhook.ts routes /telegram/webhook (line 57), /api/session (73), /api/location (76), /api/location-fallback (79) — four paths. However `run_worker_first` is [\"/api/*\", \"/telegram/*\"], so the /api/* namespace falls through to the ASSETS binding for unlisted sub-paths; with `not_found_handling: \"none\"` this yields an assets 404 rather than the Worker's own fallthrough. Behavior matches the doc's stated outcome."
|
||||
},
|
||||
{
|
||||
"line": 233,
|
||||
"claim": "the `/api/*` calls stay stubbed under `npm run web:dev`",
|
||||
"expected": "API calls stubbed in Vite dev without a Worker",
|
||||
"actual": "Unverifiable from filesystem alone (runtime fetch behavior). The static basis checks out: web/src/main.ts:228 gates the mock on `(__ARAHARAH_HARNESS__ || import.meta.env.DEV) && !window.__ARAHARAH_MOCK__`, and vite.config.ts defines `__ARAHARAH_HARNESS__` as JSON.stringify(false) outside harness mode, leaving import.meta.env.DEV as the live trigger. Not a false claim, but a runtime assertion."
|
||||
"line": 352,
|
||||
"claim": "`/api/route` answers `{\"route\":null}` for long trips",
|
||||
"expected": "the null-contract body is a bare JSON `null` (routePending(): JSON.stringify(null) → body 'null')",
|
||||
"actual": "WRONG SHAPE: the Worker never wraps the null in {\"route\":...} — bot/src/routing/worker-router.ts:102-104"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"doc_path": "README.md",
|
||||
"claims_checked": 40,
|
||||
"claims_passed": 38,
|
||||
"claims_failed": 2,
|
||||
"failures": [
|
||||
{
|
||||
"line": 131,
|
||||
"claim": "a button back into the Mini App at `?g=<session-id>`",
|
||||
"expected": "?g=<guidance envelope id> (cron opens MINI_APP_URL/?g=${envelope.id})",
|
||||
"actual": "MINOR: README says 'session-id' but the cron button deep-links the guidance ENVELOPE id (bot/src/webhook.ts:194). API.md and ARCHITECTURE.md describe it correctly as 'envelope id'/?g=<uuid>"
|
||||
},
|
||||
{
|
||||
"line": 86,
|
||||
"claim": "It holds `BOT_TOKEN` ..., `WEBHOOK_SECRET`, and `WEBHOOK_URL`",
|
||||
"expected": "bot/.dev.vars.example defines FOUR variables (adds MINI_APP_URL)",
|
||||
"actual": "MINOR: incomplete list — the committed template (bot/.dev.vars.example) also carries MINI_APP_URL (optional locally; blank origin omits the /cari OPEN button). DEVELOPMENT.md:49 lists all four"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"doc_path": "docs/TESTING.md",
|
||||
"claims_checked": 45,
|
||||
"claims_passed": 44,
|
||||
"claims_failed": 1,
|
||||
"failures": [
|
||||
{
|
||||
"line": 62,
|
||||
"claim": "The runner (47 lines, behaviour-identical across all four suites)",
|
||||
"expected": "bot/web runner.mjs are 47 lines; search/routing runner.mjs are 48 lines",
|
||||
"actual": "TRIVIAL DRIFT: behaviour-identical holds (diff = header comments only), but '47 lines' is exact only for bot/web; search/routing are 48"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user