Commit Graph
284 Commits
Author SHA1 Message Date
araharah-executor 3ec3584fbd chore(planning): 08-03 summary — ALT potentials live, rollout pins committed (full battery green); state synced to 08-04 2026-10-25 19:05:44 +08:00
araharah-executor 8fac68bca7 test(08-03): rollout pins RO1/RO2 — the D-01 locks enforced suite-side (full battery green)
- RO1 upload-format-agnostic: upload-road-graph.mjs keeps KEY
  'kl-roadgraph.v1.bin' + BUCKET 'araharah-graphs'; comment-stripped code
  contains ZERO format tokens (landmark/encodeGraph/decodeGraph/ARG1/ARG2
  magics/GRAPH_VERSION) — the migration is byte-shipping of the same key,
  forever (A8 grep-shape)
- RO2 one decode path: worker-router.ts keeps GRAPH_KEY unchanged, exactly
  ONE decodeGraph call in the loadGraph flow, no version-conditional branch
  (GRAPH_VERSION / magics / '=== 2' absent) — an undecodable binary flows
  to the existing null -> router-pending path (D-01 at the consumer)
- full battery at this commit — the FIRST where routeAstar consults real
  landmark tables on the bot suite's ARG2 corridor graphs: routing 79/79
  (A1 seal + A9/A10/A11 + RO1/RO2), bot 126/126 (RT trunks + cron),
  routing+bot typechecks clean; worker-router.ts and upload-road-graph.mjs
  untouched (git diff --stat empty)
2026-10-25 19:03:08 +08:00
araharah-executor ddd2f3c093 feat(08-03): ALT potentials inside the proven BH skeleton — GREEN
- routeAstar's ONLY change: the h_f/h_b bodies become max(ALT triangle
  bounds, haversine) — per-search Float64Array(L) constant tables in quanta
  (0xFFFF written as NaN = search-scoped landmark drop), lazy per-node
  max over the four triangle families with RAW u16 sentinel compares
  BEFORE any float conversion, haversine max-fallback on sentinel-flooded
  nodes (Pattern 3 containment)
- the (h_f - h_b)/2 combination, reductions, balanced alternation, meet
  probes, BH stop rule, and real-seconds reconstruction are byte-identical
  (research Pattern 1 — the survey's (pf-pr)/2 is what p_f already is)
- no Map/Object allocations (A8 green), no new imports, one search path
  (L >= 1 is the decodeGraph guarantee, D-01)
- A1's 625-pair Dijkstra-equivalence sweep re-pinned under ALT: the
  standing optimality proof; A9 island + A10 skip laws sealed; A11
  structural pin green
- module header + routeAstar doc gain the ALT paragraph (c-metric
  exactness, sentinel laws, Ikeda history intact)
2026-10-25 19:02:21 +08:00
araharah-executor 92b97fc97f test(08-03): ALT containment cases — A9 island sweep + A10 search-scoped skip + A11 structural pin (RED)
- A9: two-component synthetic (3x3 grid + 4-node path), anchors HAND-PINNED
  inside component A only via landmarkTables; full 169-pair sweep asserts
  seconds-only Dijkstra equivalence (A-internal with ALT live, B-internal
  on the haversine fallback, 72 cross pairs -> null)
- A10: origin AND goal inside the anchorless component — all families drop
  at SEARCH scope, the 16 B-internal pairs still route Dijkstra-equal
- A11: comment-stripped astar.ts must reference landmarkTo/landmarkFrom/
  landmarkQuantumS in CODE; one sentinel spelling (0xffff, never 65535);
  A8's no-Map law unchanged — FAILS now (RED: the potential is still
  pure haversine)
- case-index doc-comment extended A1-A8 -> A1-A11; buildIslandFixture
  helper routes fixture tables through the ONE landmark module
2026-10-25 19:00:56 +08:00
araharah-executor 37394ad8e3 chore(planning): 08-02 summary — landmark core + ARG2 codec committed (full battery green); state synced to 08-03 2026-10-25 18:53:58 +08:00
araharah-executor 9770867fd2 test(08-02): bot-suite encodeGraph call sites carry landmark blocks (full battery green)
webhook corridor/sparse builders + guidance-cron unnamed way compute
tiny tables through the ONE preprocessing core (@araharah/routing
farthestPointAnchors + landmarkTables) and pass the landmarks block
into the same single encodeGraph call — call-site updates, not a
second encode function. Graphs with no degree>=2 candidate (sparse,
2-node) pin their anchor explicitly; tables still come from the
integer-Dijkstra core.

FULL BATTERY at this commit: routing:test 74/74, bot 126/126, both
typechecks clean; the regenerated fixture is deterministic (byte-
identical re-run); mini-graph-arg1.bin is byte-stable vs its committed
08-01 bytes.
2026-10-25 18:50:20 +08:00
araharah-executor 32a00b5b0b feat(08-02): ARG2 codec — one version, one decode path (G-suite GREEN)
graph.ts versioned IN PLACE (no second codec): GRAPH_MAGIC 0x41524732,
GRAPH_VERSION 2, HEADER_SIZE 72 (72%8==0 keeps f64 views aligned);
header gains landmarkCount u32 @60 (the old pad), landmarkQuantumS f32
@64, reserved u32 @68; the landmark suffix (u16 toTable, u16 fromTable,
u32 landmarkNodes) extends layoutFor's total arithmetic — exact-size
law covers the variable suffix BEFORE any view allocation (T-08-01).
D-01 fail-honest: ARG1 bytes / version!=2 / landmarkCount=0 / hostile
quantum / size mismatch all decode null (committed mini-graph-arg1.bin
is the standing rejection vector). GraphInput.landmarks REQUIRED and
loud-validated (T-08-04). RoadGraph gains the five landmark fields
(Plan 08-03's ALT potentials consume them).

Fixture regenerated as ARG2 through the SAME encode authority: the
builder gains the tiny real landmark stage (L=2, anchors [0,18],
quantum 0.1s, coverage 1.0 — identical bytes every re-run).

Rule-3 call-site updates forced by the required-landmarks law (missed
by the plan's files list): astar.test A3 + snap.test S3 synthetics
carry inert hand landmark blocks. Fixture regen pulled forward from
task 3 so this commit's own battery is green (74 passed, 0 failed).
2026-10-25 18:48:23 +08:00
araharah-executor 34d96b0cdb test(08-02): ARG2 codec G-suite — RED gate (G3/G5/G7/G8 re-pins + new G9-G11)
Re-pins: G3 consumes the frozen mini-graph-arg1.bin as the standing ARG1
rejection vector (D-01 one-path law) + v1/v3 tamper; G5's zero-copy flip
moves to byte 72 (the ARG2 header end); G7 expects the regenerated ARG2
fixture (landmarkCount >= 1, quantum 0.1, L*N tables, anchor self-cells
0); G8 re-pins the exported constants to 0x41524732/2.

New: G9 table round-trip (four landmark properties, sentinel-is-DATA,
zero-copy u16 views); G10 encode-validation matrix (9 named-throw cases,
T-08-04); G11 decode rejection (landmarkCount=0 refused even when the
byte size exactly matches the L=0 layout — D-01/A5 — plus the monster
landmarkCount=2e6 arithmetic rejection, T-08-01).
2026-10-25 18:46:00 +08:00
araharah-executor 5b7a1300c2 feat(08-02): implement the pure landmark compute core — L-suite GREEN
farthestPointAnchors + landmarkTables + landmarkCoverage over the
ĉ metric: edge weights floor-quantized once (Math.floor(seconds/q)),
exact integer Dijkstras (Int32 labels, binary heap, lazy deletion),
0xFFFF sentinel, 65000-quantum loud overflow. Traversal law mirrors
astar.ts verbatim: bit0 edges never relaxed in EITHER direction.

Test-vector corrections caught at GREEN (expectations were wrong,
implementation was right):
- L4: rows index by anchor POSITION (row-major [l*N+v]), not node id
- L6: the c-metric farthest node from corner 0 is interior node 18
  (297q: interior hops cost 2x perimeter), not corner 24 (264q) —
  verified against an independent brute-force Dijkstra
2026-10-25 18:40:17 +08:00
araharah-executor 1bf413b3ac test(08-02): L5 overflow vector becomes a 3-node path
A 2-node graph has no degree>=2 candidates, so farthestPointAnchors
returns empty before any Dijkstra runs and never reaches the overflow
throw. Node 1 on a 3-node path is a candidate, so the selection pass
actually exercises the law.
2026-10-25 18:37:01 +08:00
araharah-executor c3a31ae7ee test(08-02): add failing landmark-core suite (L1-L6) — RED gate
Hand-computed vectors for the pure landmark compute core: deterministic
degree-filtered farthest-point anchors, exact integer quanta
(floor(2.55/0.1)=25, two edges=50), 0xFFFF sentinel + self-cell laws,
oneway asymmetry, the 65000-quantum overflow throw, and the 5x5-grid
corner-to-corner 264-quanta vector with coverage 1.0.
2026-10-25 18:35:15 +08:00
araharah-executor f15e3b223b chore(planning): 08-01 summary — wave 0 complete (baseline record committed, ARG1 vector frozen, extended verdict measured); state synced 2026-10-25 17:16:18 +08:00
araharah-executor 477961addd feat(routing): 08-01 task 3 — --extended D-04 verdict on the CPU gate (100 cross-metro pairs, seed 0x08a1 shared with the baseline); default zero-arg mode byte-compatible, budget-audit 19/19 2026-10-25 17:15:02 +08:00
araharah-executor 643df1a07b feat(routing): 08-01 task 2 — pre-ALT optimality baseline: recorder + committed 100-pair record (D-03 anchor, measured before ARG2 lands, immutable) 2026-10-25 17:13:09 +08:00
araharah-executor 0fca2e08db feat(routing): 08-01 task 1 — freeze ARG1 fixture bytes as mini-graph-arg1.bin (the v1 decode-rejection vector); provenance in the builder 2026-10-25 17:11:41 +08:00
araharah-executor eb3bb30247 docs(routing): §2.5 — the six planned ALT decision points, options, and the accepted recommendations 2026-10-25 17:11:26 +08:00
araharah-executor 13c537b60f chore(planning): phase 8 plans 08-03..05 (ALT potentials, build stage, campaign) + validation re-map; stale 08-02 bullet fixed 2026-10-25 17:11:26 +08:00
araharah-executor f018ab1d06 roadmap: v1.x milestone scoped — phases 8-11 (ALT, extras, battery, engine B); engine-first ordering 2026-10-25 13:47:34 +08:00
araharah-executor 5622a05fe4 chore(wiki): submodule bump — entity-encode pass 2026-10-25 13:43:07 +08:00
araharah-executor 24469ea3fe chore(wiki): submodule bump — logo fix 2026-10-25 13:28:59 +08:00
araharah-executor c2b714f285 docs: README logo 560px + quickstart/future sections; new CORE-CONCEPTS doc; wiki synced 2026-10-25 13:10:52 +08:00
araharah-executor 5a0c8d8110 docs(README): logo at 280px — the 140px was too small 2026-10-25 12:53:38 +08:00
araharah-executor cff6c15622 chore(planning): wiki submodule bump + verifier evidence JSONs 2026-10-25 12:51:35 +08:00
araharah-executor db27aa8440 chore(planning): phase 5/6/7 planning artifacts + milestone-completion state sync 2026-10-25 12:51:27 +08:00
araharah-executor bb587ab537 chore(art): regenerated guidance captures — landscape geometry refinement 2026-10-25 12:51:17 +08:00
araharah-executor 44851c70fe docs: full docs-update pass — 9 GSD docs regenerated + verified (434→454 claims; verifier corrections applied) 2026-10-25 12:51:01 +08:00
araharah-executor 809864f5b6 docs(cron): stale in-code cadence comment — 4 minutes post-retune 2026-10-25 12:50:53 +08:00
araharah-executor d2e9ecfcd1 docs(07): phase 7 PASSED — v1 milestone complete 2026-10-25 11:50:13 +08:00
araharah-executor bac01a9d1a docs(07-06): launch gate SIGNED — Part C 12/12 with real numbers, Part A pass, Part B deferred, Part D 5/6 (repo-public pending) 2026-10-25 11:49:28 +08:00
araharah-executor 36679468c8 feat(07-06): --live probes read Cloudflare credentials from bot/.dev.vars (gitignored, D-15) as fallback to env 2026-10-25 11:37:03 +08:00
araharah-executor dedcdcdbc5 fix(07-06): launch-gate decisions — KV cron retune to 720/day (the $0 law holds), brand sweep araharah→arah² across user-facing copy, menu button text 2026-10-25 11:24:03 +08:00
araharah-executor 5f4fd8b297 docs(07-06): complete the launch-gate prep — SUMMARY
- unsigned protocol file, audit-green restoration, /cari root-cause fix,
  deploy dd55a073 + full canary verification documented
- task 2 (the physical walk + battery run) BLOCKING for the human;
  task 3 (STATE.md record) orchestrator-owned
2026-10-25 05:33:45 +08:00
araharah-executor 53930eb497 docs(07-06): the launch gate protocol — 4×7 device matrix, battery record, automated half, D-09 checklist
- Part A: the ONE consolidated walk (D-05) — four clients × seven
  interactions, ⬜ cells, PASS/FAIL/NOT RUN vocabulary defined in-file
- Part B: the Android battery record (D-04) — 11 required fields, the
  no-extrapolation rule in the file's own voice
- Part C: the 12 automated-half commands with ⬜ result cells + the
  --live NOT-RUN-is-not-a-pass note
- Part D: the six D-09 checklist items, each naming its evidence
- Executor notes: the /cari defect ROOT-CAUSED+FIXED (script param
  name), the c3 posture, the R2 graph state, the KV-list over-ceiling
  options (user decision), the kv-expiry credential caveat, never-fake
- FINAL VERDICT: ⬜ NOT YET SIGNED — the human fills the verdicts
2026-10-25 05:31:47 +08:00
araharah-executor 141d6d2a88 fix(07-06): root-cause the /cari menu defect — register-commands.mjs sent the wrong Bot API field name
- the Bot API parameter is 'scope' (verified against
  core.telegram.org/bots/api/methods/setmycommands); the script's
  'bot_command_scope' was an unknown field Telegram silently ignores,
  so every call hit the default scope and the two clear calls wiped the
  default set entirely — the ok:true lines proved nothing about scope
- registration re-run: default (agnostic/en/ms) + all_private_chats
  (agnostic/ms) read back help, privacy, cari via getMyCommands with
  the correct 'scope' param; group scopes verified cleared
- docs/KNOWN-LIMITATIONS.md: the 'Telegram-side defect' attribution
  corrected to the actual script bug; residual client menu-caching
  caveat + type-the-command workaround kept
- bot/README.md command row updated to the real scope set
2026-10-25 05:29:38 +08:00
araharah-executor 71fff10cb4 fix(07-02): landscape cockpit geometry refinement — the content fits the 72px banner floor
- banner takes one step down the SAME type-token scale in landscape
  (headline-md distance / label-lg street) + xs vertical padding so the
  measures fit the 72px min-height instead of overflowing it
- guide-list chrome offset corrected to its own margin stack
  (sm + 72 + 1 + 24 + sm = 113px, was 104px)
- bottom register: the portrait 64px control-clearance composite already
  seats the guidance/confirm card inside the landscape height — the
  landscape override is removed (measured card top 159 vs banner bottom
  103 at 844x390); attribution chip + recenter control clear
- device-walk feedback on 07-02's committed geometry; tokens binding
- captures re-run: CAPTURE OK — 22/22 non-blank
2026-10-25 05:25:19 +08:00
araharah-executor b7576c1b21 chore(07-06): land the quick-task 261024-001 logo-asset replacement residue
- /start sendPhoto now points at MASTER_FILE-arah2_logo.png (deployed
  from web/public/ — the untracked asset lands here so the reference
  resolves on deploy)
- README + AGENTS.md + the 4 mockup screens swapped the Stitch
  googleusercontent logo placeholder for the local master logo
- pre-existing on the tree through 07-03..07-05 execution; verified by
  this session's baselines (bot 126/126, web 165/165, captures 22/22)
2026-10-25 05:24:52 +08:00
araharah-executor 2489cca8ec fix(07-06): the /help doc pointer is a documented static-text class — privacy audit green again
- source-side runtime-hosts gate gains DOC_POINTER_STATIC_TEXT_HOSTS (the
  MapLibre-attribution precedent): the published repo origin may appear
  ONLY as a bare URL literal in bot copy (D-08/D-09), never fetched
- class is NARROW and pinned by SA6: a fetch( target naming the same
  host is still a violation
- Rule 1 (found by SA6's RED): the fetch( handler's declaration
  heuristic misclassified any quoted absolute URL as a TS declaration —
  quoted strings are targets; they now reach the host check
- docs/PRIVACY-AUDIT.md: adjudication documented + dated re-run addendum
- deferred-items.md #1 closed: npm run privacy-audit exits 0 again
  (PRIVACY AUDIT CLEAN — 5 gate(s) passed, 0 violations; suite 13/13)
2026-10-25 05:18:47 +08:00
araharah-executor b06c64d5fc test(07-06): RED — SA6 doc-pointer static-text class vector (URL literals only; fetch targets to the same host still fail) 2026-10-25 05:15:57 +08:00
araharah-executor 7a1206d5c8 fix(07-03): fold the follow-up fixes described in 07-03-SUMMARY
- asset-header probe reads HTTP status BEFORE interpreting headers — a
  non-2xx is deployment drift (the notRun exit-2 class), never a cache
  violation; the violations.length count bug fixed
- XHTML namespace URI joins the SVG spec-identifier adjudication
- probeUnavailable carries the reason only (the CLI prints NOT RUN)
- CP2/AU1 suite vectors updated to the corrected contracts

Residue note: these edits were on the tree during 07-03/07-04 execution
but escaped those plans' commits (07-04-SUMMARY residue caution).
2026-10-25 05:15:38 +08:00
araharah-executor 4ecd4325f8 docs(07-04): complete the consolidated budget-audit plan — SUMMARY
- 3 tasks (TDD RED→GREEN), 7 commits, 19/19 budget-audit suite vectors
- BUDGET AUDIT CLEAN (exit 0); --live exits 2 on deployment drift (honest class)
- 2 deviations documented: the c3-aware route-cpu verdict (plan contradiction),
  the golden-corpus environment-drift class
- open items for 07-06 flagged: the KV-list cadence finding + the privacy-audit
  RED (07-05's gitmirah strings) — both in deferred-items.md
2026-10-25 05:09:19 +08:00
araharah-executor 349e34e9e6 fix(07-04): golden-corpus treats an npm-root-less cwd as environment drift (notRun, exit 2) + the AU1 placeholder regex pin
- a missing package.json in the audit root is T-07-22's environment-drift class,
  not a corpus failure — the corpora cannot even be spawned there
- AU1's flag-skip assertion matches the printed 'NOT RUN — (pass --live)' shape
2026-10-25 05:08:02 +08:00
araharah-executor 887b446955 docs(07-04): the checked-in BUDGET RECORD — real measured numbers beside the free-plan ceilings (D-06)
- the full ceilings table (Cloudflare Workers limits / KV limits / pricing, sourced)
- current measurements: A* p95 83.989 ms vs 8 ms ladder budget (the accepted c3 class,
  negative headroom printed), BA9 79,815/204,800 gz, app bundle 479,178/500,000 gz,
  KV write classes (cron = 0, source-proven), golden corpora exit 0
- the per-request-class subrequest inventory (source-derived, not a live Workers Logs metric)
- the DISCOVERED finding: KV list rate 1,440/day (60 s cron x 1 list/tick) OVER the
  1,000/day ceiling — documented with options, decision deferred to the 07-06 launch gate
- the c3 cross-metro escalation restated; honest Statement; unsigned signature block
2026-10-25 05:06:30 +08:00
araharah-executor bbf003fa5d feat(07-04): the budget-audit CLI + the root npm script — orchestration, free-tier comparison table, 0/1/2 exit codes
- npm run budget-audit: 5 required gates + the --live cache-header probe; one evidence line per gate
- the FREE-TIER COMPARISON table: every documented Cloudflare free-plan ceiling beside the
  current value where measured, `not measured` where not — the console form of docs/BUDGETS.md
- exit 0 CLEAN / 1 FAILED / 2 NOT RUN — a skip is never a pass (T-07-22)
- no secret, no coordinate in the output (D-14's category-only law, applied to budgets)
2026-10-25 05:05:04 +08:00
araharah-executor 8378337578 test(07-04): RED — the CLI vectors: per-gate evidence lines, the free-tier comparison table, CLEAN exit 0, --live contract, environment-drift exit 2 2026-10-25 05:03:00 +08:00
araharah-executor 9efb6e2832 feat(07-04): the budget-gates library — six measurement gates (T-07-18/19/20/22/23b)
- route-cpu: RE-RUNS routing/scripts/measure-route-cpu.mjs as a child process; p95 printed
  against the 8 ms product budget + 10 ms free ceiling; the child's GATE FAIL line carried
  verbatim; the accepted c3 band has a 200 ms drift guard — uncharted regression fails
- bundle-budget: BA9 route-payload gz sum + whole-app bundle ceiling (500000 gz bytes);
  Worker bundle honest NOT MEASURED when bot/dist is absent (never zero)
- kv-writes: 4 write sites inventoried by family, every write TTL-named (PG1); the cron
  zero-write law is source-proven — runGuidanceCronTick's body must contain no .put(/.delete(
- subrequests: per-request-class external-subrequest inventory derived from the route table;
  uninventoried classes FAIL; source-derived honesty sentence verbatim; never a fabricated zero
- cache-headers: reuses cloudflare-probes' runAssetHeaderProbe (imported, never forked)
- golden-corpus: RE-RUNS routing:corpus + search:corpus as child processes (SC4.a/SC4.b)
2026-10-25 04:59:27 +08:00
araharah-executor 160a173010 test(07-04): RED — the budget-gates TDD suite (15 vectors: CPU ladder re-run, bundle bytes, KV cron zero-write law, subrequest inventory, cache-header reuse, golden corpora)
- every gate must print its measurement and carry its contract id
- every gate must be able to FAIL on a synthetic violation (fixture injection)
- a skip is never a pass (notRun class; T-07-22)
2026-10-25 04:55:55 +08:00
araharah-executor 087276fa90 feat(07-04): the static-asset cache policy — hashed assets immutable, HTML entry revalidating (T-07-20, D-06)
- web/public/_headers: /assets/* → public, max-age=31556952, immutable (Vite content-hashed output)
- / → public, max-age=0, must-revalidate (the HTML entry points at the current hashed assets)
- no CORS/Set-Cookie/other rules — same-origin policy stays the app's design
- verified: web/dist/_headers exists after the theme+web build
2026-10-25 04:54:41 +08:00
araharah-executor f87f3418d5 docs(07-05): complete the debt-closure + known-limitations plan — SUMMARY
- IN-01/IN-02/IN-03 paid (dead export gone, wrangler comment truthful,
  exact-900 s boundary pinned green)
- docs/KNOWN-LIMITATIONS.md shipped (D-08) + /help pointer line en+ms (CS5 green)
- /cari re-arm recorded honestly (all scopes armed) + A1/A3 closure
- suite 126/126; STATE.md/ROADMAP.md untouched (orchestrator-owned)
2026-10-25 04:47:48 +08:00
araharah-executor 6e0673f6ef docs(07-05): the /cari re-arm attempt + the A1/A3 assumption closure, recorded honestly
- /cari re-arm RAN 2026-10-25: all six scopes ok:true — 'all command scopes
  armed'; residual Telegram client-menu caching risk stated, workaround
  pointers at docs/KNOWN-LIMITATIONS.md (T-07-24/T-07-26)
- A1: NOT RETIRED as a mechanism hypothesis — mitigated-by-design via the
  chain.ts polling degradation; A3: RETIRED as a decision constraint
  (remote workers.dev origin, no LAN-IP dev deployment)
- the Phase-3 FINAL VERDICT table untouched (1 occurrence; the dated
  section is the closure)
2026-10-25 04:46:40 +08:00
araharah-executor 78482ab209 feat(07-05): the known-limitations document (D-08) + the /help pointer line (en+ms)
- docs/KNOWN-LIMITATIONS.md — new, for drivers AND forks: OSM data gaps,
  the c3 cross-metro CPU degradation (2-8 ms short / p95 38-93 ms cross-metro,
  measure-route-cpu.mjs LADDER HISTORY as evidence, ALT as the committed lever,
  Workers Paid rejected on the $0 mandate), the /cari menu defect + the
  type-the-command workaround, the beta-quality statement, the roadmap
  pointers (WASM-router / ALT / engine B — none in this release), the
  privacy paragraph, and the fork-facing audit commands
- strings.ts helpMenu (en+ms): ONE pointer line each, not /-prefixed so the
  CS5 menu parse ignores it; URL is the repo's actual remote deep link
  (http://gitmirah:3000/c-fu/arah2/src/branch/main/docs/KNOWN-LIMITATIONS.md),
  identical in both locales — single-copy law (D-05)
- suite 126/126, CS5 green
2026-10-25 04:46:02 +08:00