Commit Graph

942 Commits

Author SHA1 Message Date
ac242be2d7 docs(account): record step 5 (runicgateway.com /delete-account/) as built
The page Google Play is given, built in runicgateway.com#45, with the
org lead's two answers (D85 links, D86 cannot-sign-in goes to the
operator).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-30 01:26:20 -05:00
5518671d1b Merge pull request 'docs(account): record step 4 (the Android screen) as built' (#395) from docs/account-deletion-android into main
Reviewed-on: #395
2026-10-30 05:27:43 +00:00
a298131052 docs(account): record step 4 (the Android screen) as built
ACCOUNT_DELETION.md §6 step 4 gains what was built beyond §4.3 (refusals
read off the body, the trust token dropped, the snackbar notice, the push
opt-in kept) and what was checked on the emulator. android/PLAN.md M8 step 3
notes the app's part is built.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-30 00:13:37 -05:00
451e81871b Merge pull request 'docs(account): record step 3 (module hooks, kit re-pin) as built' (#394) from docs/account-deletion-modules into main
Reviewed-on: #394
2026-10-30 04:46:35 +00:00
ae3750043a docs(account): record step 3 (module hooks, kit re-pin) as built
ACCOUNT_DELETION.md: status line, and §6 step 3 marked built with what went beyond
§4.4 (Module-uo queues before calling, also retries on a live server.hello, clears
pending rows on a webId-less login, lists them via GET /admin/uo-link/config).
modules/uo/SCHEMA.md: the new shard_pending_unlinks table, and the table count
corrected (it was already stale: 33 tables, 32 shard_* plus uo_link_config).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 23:00:32 -05:00
24f7d33c01 Merge pull request 'docs(website): document account deletion core and MODULE_API 1.20.0' (#392) from docs/account-deletion-core into main
Reviewed-on: #392
2026-10-30 01:24:27 +00:00
42c762cc13 docs(website): document account deletion core and MODULE_API 1.20.0
ACCOUNT_DELETION.md §6 step 2 is built (website feature/account-deletion).

- MODULE_API.md: 1.20.0, api.onUserDeleting (§1.1, §1.1 history, §2.4).
- BACKEND_DESIGN.md: reserved_usernames, DELETE /auth/me/account, the admin
  delete now running the same procedure, the demo lock row, and §6.6 on the
  procedure, the display rule and what goes and what stays.
- TEAMS.md: the forum's deleted-author rule is now "[deleted player]" for
  members and the stored name, marked, for staff.
- ACCOUNT_DELETION.md: AD12 (wrong password or code is 400, not 401) and
  AD13 (a deleted account drops off Forum guests), both asked of the org
  lead while building; §4.1 refusals carry codes; step 2 marked built.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 18:34:28 -05:00
3545e898af Merge pull request 'docs: record M8 step 2 (data safety) and plan self-service account deletion' (#391) from docs/m8-data-safety-built into main
Reviewed-on: #391
2026-10-29 22:33:22 +00:00
fc3f0ed296 docs(website): deletion unlinks game accounts through each module's unlink
A cascade is not an unlink. For UO the link lives on the shard (the
site's shard_account_links is a mirror), so dropping the mirror alone
would leave the shard attributing the game account to a deleted user.

- AD10: the hook is onUserDeleting and runs before the delete; each
  module calls its own unlink for every link (Rust: links.unlinkOwned;
  UO: the sidecar's DELETE /link/{account}, as the staff unlink does).
- AD11: an unlink that can't finish never holds up the deletion. A shard
  that is offline queues into shard_pending_unlinks, retried on
  reconnect. A protected staff account (403) is listed for admins as
  "still linked on the shard".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 17:28:54 -05:00
710262a591 docs(website): record the account-deletion answers (AD4-AD9)
The org lead answered the plan's six questions on 2026-10-29:
- delete at once, no grace period
- what a member wrote stays, and members see every snapshot of a
  deleted account as "[deleted player]"
- staff keep the name and the IP for moderation, so the stored rows are
  untouched and the rule is about who sees what (displayAuthor)
- the password is always the proof; SSO sits on top of a real account
- a UO game account stays on the shard; no protocol change
- a deleted staff username is never available again (reserved_usernames)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 17:23:58 -05:00
2ab35334d6 docs(website): plan self-service account deletion
ACCOUNT_DELETION.md is the plan of record for the org lead's decision:
a member deletes their own account on the website and in the app, as
Google Play requires of an app that starts accounts.

- One deletion service for the admin route and the member's own route,
  with a confirm step, the last-admin and demo refusals, clearing the
  username snapshots on what the member wrote, and a notice by email.
- MODULE_API 1.20.0: api.onUserDeleted, which runs after the commit and
  can't stop a deletion.
- Screens on the web and in the app; runicgateway.com /delete-account/
  as the address Play is given.
- What the schema already does (59 keys: credentials cascade, content
  detaches), the gaps, six questions, and the build order.

M8's order puts account deletion before report, block and hide, which
moves USER_SAFETY.md's reportTargets to MODULE_API 1.21.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 17:18:02 -05:00
988c000074 docs(android): record the account-deletion decision for M8
The org lead chose self-service deletion on the website and in the app,
with a runicgateway.com page as Play's deletion URL. Planned separately,
before the cutover.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 17:08:39 -05:00
6f95ed09d0 docs(android): record M8 step 2, the data-safety audit
runicgateway.com#44 declares everything the app sends as collected,
not shared, encrypted in transit and required, after an audit of
data/api/ on edge. Account deletion is left open for the org lead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 08:21:09 -05:00
410c8acfe6 Merge pull request 'docs: plan report/block/hide, decide M8's open items, plan demo content' (#390) from docs/report-block-hide-plan into main
Reviewed-on: #390
2026-10-29 13:10:02 +00:00
cd6d3d3b8a docs(demo): confirm DM33 (the org lead's Steam ID as demo-player's link) and DM34
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 08:09:10 -05:00
0485dcc87e docs(android): record M8 step 1, the push fix, as built (Android-app#62)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 07:48:18 -05:00
499a686bf3 docs: record the org lead's answers on report/block/hide and demo identities
- USER_SAFETY.md: section 5 becomes decisions S6-S10 (an account to report,
  game-identity blocks allowed, staff cannot be blocked, a block only hides,
  staff see hidden chat marked).
- DEMO_MODE.md: DM33-DM35 (visibly fake 1234567890-prefixed Steam and
  Discord ids plus the org lead's own Steam id; Rust-themed invented names).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 07:34:15 -05:00
df3d43f355 docs: plan report/block/hide, decide M8's open items, plan demo content
- website/USER_SAFETY.md (new): report, block and hide on the website and
  in the app, S1-S5 decided by the org lead, five questions open.
- android/PLAN.md: M8's three open items decided (keep the rating and add
  report/block/hide; conservative data safety; UnifiedPush on specialUse
  with restart on boot), the order to the cutover, and M21 (Teams and the
  team forum in the app, planned, not scheduled).
- website/DEMO_MODE.md: DM32 and section 11, the demo content plan (two
  seed passes; moderation, Teams/forum/reports, event history, Rust stats).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-29 07:27:21 -05:00
6aeb8afa52 Merge pull request 'docs(website): record the demo's step 6 site side and Play state (DM30, DM31)' (#389) from docs/demo-step6 into main
Reviewed-on: #389
2026-10-29 10:12:15 +00:00
6761733f3f docs(website): record the demo's step 6 site side and Play state (DM30, DM31)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-28 15:33:08 -05:00
71fb97ff59 Merge pull request 'docs(website): record the demo's re-check after DM27/DM28 and the play-review walk' (#388) from docs/demo-step5-recheck into main
Reviewed-on: #388
2026-10-28 18:27:05 +00:00
b7d7bf059e docs(website): record the demo's re-check after DM27/DM28 and the play-review walk
The 12:00 UTC wipe on 2026-10-28 installed Module-Rust v0.6.3 (its first run
tagged v0.6.2 and failed to publish it). play-review walked 19/19, the seeded
events' actions came up enabled and Server greeting ran, and both Steam
unlinks answer 403 DEMO_LOCKED with the link kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-28 07:18:23 -05:00
64583c6d1c Merge pull request 'docs(website): record the demo's step-5 walk, its findings and the answers (DM27-DM29)' (#387) from docs/demo-step5-walk into main
Reviewed-on: #387
2026-10-28 09:47:11 +00:00
598b439ec6 docs(website): the org lead's answers to the step-5 walk (DM27-DM29)
DM27 locks removing a Steam link on the demo (player route by demoLocks,
staff route in its handler); DM28 has seed:demo switch on the actions the
seeded events use; DM29 leaves SECRET_WORDS as is. The Chrome problem was
local to the walker's PC, and play-review is walked once the fixes land.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-28 04:44:31 -05:00
2d596c51d9 docs(website): record the demo's step-5 walk and its findings
Every lock through the API (87 checks), the console deny list at save on the
demo and at run on a local core, the three published logins in the browser,
the app on the public HTTPS address, and one wipe cycle restoring a changed
config, permission, NPC placement, event and hero draft. Lists what the walk
found: seeded events whose actions start disabled, the credential check
over-flagging, play-review not walked, the open Steam unlink, empty
moderation queues.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-28 03:18:06 -05:00
3f12c67a95 Merge pull request 'docs(website): demo DM25 + DM26, first wipes, default set, public URL' (#386) from docs/demo-data-uri-lock into main
Reviewed-on: #386
2026-10-28 01:21:04 +00:00
5855bcc5ed docs(website): DM26, NPCs and chat titles come from the demo seed
The first restored wipes brought the default set's permissions back but
not its NPC profiles (the restored rig is marked managed, so a fresh site
adopts none and its first push empties them) or its chat titles (never
adopted). §7.1 records the exception, §7.3 the fixture's new npcs and chat
keys, step 5 of §7.3 the NPC push, §9.1 DM26, and §10 step 5 the default
set, the baseline, the restored wipes and the public URL (Cloudflare set to
DNS only so the app logs the real visitor).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-27 20:17:31 -05:00
8e5d2f5f4e docs(website): DM25 data: URI lock on the demo + first-wipe notes
DEMO_MODE.md §3.3 gets the data: URI rule (a pasted image is an upload),
§9.1 records DM25, and §10 step 5 records the first wipes: the rig half
worked, and the seed loaded no module because the runner's chown of
modules/ and logs/ failed silently. BACKEND_DESIGN.md §5.1 mirrors the rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-27 13:13:54 -05:00
5628bf131b Merge pull request 'docs(tree): sync website/PROJECT_TREE.md' (#379) from chore/sync-website-tree into main
Reviewed-on: #379
2026-10-27 17:33:53 +00:00
072be6122d Merge pull request 'docs(website): Node 22.23.4 floor in the README mirror (Node2Shell)' (#384) from docs/node22-node2shell into main
Reviewed-on: #384
2026-10-27 17:32:26 +00:00
runic-docs-bot
64003289d3 docs(tree): sync website/PROJECT_TREE.md from RunicGateway/website@247323f [skip ci] 2026-10-27 17:32:19 +00:00
5702f26ca4 Merge pull request 'docs(website): demo step 5 built — deploy files, DM22-DM24' (#385) from docs/demo-deploy into main
Reviewed-on: #385
2026-10-27 17:31:19 +00:00
540b66c304 docs(website): demo step 5 built — deploy files, DM22-DM24
DEMO_MODE.md follows website#227:
- §7.2: the baseline is captured with a power stop (quit saves), DM22; a
  first wipe with no baseline only starts the rig; what the panel calls
  were checked to do (synchronous decompress, binary-safe write); the
  server identifier is now 6eb9d621.
- §7.3: MODULES comes from state/modules.env; MODULE_SOURCE_HOSTS seeds a
  fresh database's allowlist; the exact seed:demo command.
- §7.5: where the bundle is recorded (state/bundle.json and the rig's own
  rust-link/bundle.json) and which plugin files the wipe writes.
- §8: the deploy directory and the full .env contents.
- §9.1: DM22 (power stop), DM23 (/opt/demo.runicgateway.com, host mode),
  DM24 (Module-Rust cut over now, v0.6.0).
- §10: step 5's files built and how each half was tested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-26 12:24:32 -05:00
5f5e7e7091 docs(website): Node 22.23.4 floor in the README mirror (Node2Shell)
Mirrors website#226: the images move off end-of-life Node 20 to
node:22.23.4-alpine, the first 22.x with the CVE-2026-111497 Brotli fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-26 10:02:29 -05:00
cf6ee29c60 Merge pull request 'docs(website): demo hero editor previews but does not publish (DM21)' (#383) from fix/demo-hero-publish-lock into main
Reviewed-on: #383
2026-10-26 14:40:11 +00:00
86c3339c31 docs(website): demo hero editor previews but does not publish (DM21)
DEMO_MODE.md: hero_layout joins the "Settings that reach a lock" row, a
paragraph under "Settings stay open" says what the hero editor does on the
demo, DM21 records the decision, and the step-5 walk checks it.
BACKEND_DESIGN.md: the protected-keys list in the demo section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-26 09:35:06 -05:00
3a2f4b62d9 Merge pull request 'docs(website): demo mode step 4 built — DM19, DM20 (the app)' (#382) from docs/demo-mode-app into main
Reviewed-on: #382
2026-10-26 14:17:11 +00:00
076eebee24 docs(website): demo mode step 4 built — DM19, DM20 (the app)
- DM19: the app shows a refusal as one snackbar with the server's sentence;
  lines that blame the role say the demo sentence; ErrorKind.DEMO_LOCKED for
  load screens. §3.1 rewritten to match.
- DM20: the app shows the banner only; its strip names the site's sign-in page
  for the passwords (§6).
- §10 step 4 built as Android-app#61.
- android/PLAN.md §7: the demo's refusal and strip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-26 06:30:10 -05:00
cf5fe5cf75 Merge pull request 'docs(website): demo mode step 3 built (kit re-pin to 1.19.0)' (#381) from docs/demo-mode-kit into main
Reviewed-on: #381
2026-10-26 11:02:41 +00:00
f80c8cd939 docs(website): demo mode step 3 built (kit re-pin to 1.19.0)
DEMO_MODE.md §10 step 3 is Integration-kit#17. The kit pins the sha
website#224 merged as. Chapter 2 gains a section on a public demo site,
covering demoLocks, ctx.demoMode and onDemoSeed. Chapter 5 covers
demoRefuses. Module-Rust's pin moves to the same sha in Module-Rust#63.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-26 05:59:14 -05:00
53539d35a5 Merge pull request 'docs(website): demo mode step 2 built — DM18, MODULE_API 1.19.0' (#380) from docs/demo-mode-module into main
Reviewed-on: #380
2026-10-26 10:51:12 +00:00
1a769f1e6c docs(website): demo mode step 2 built — DM18, MODULE_API 1.19.0
DM18 (org lead, 2026-10-24): core's event save never asked a module
about a step's params, so the console-command deny list's save-time
refusal is a new core hook, demoRefuses(params), asked at create, save
and publish on the demo. MODULE_API 1.19.0.

- DEMO_MODE.md: §3.4 says where the save-time check lives; DM18 row;
  step 2 marked built (website#224, Module-Rust#62) with the module's
  bridge recognition and fail-closed rules; the Rust fixture section.
- MODULE_API.md: 1.19.0 in §1.1, the changelog, the registerEventActions
  signature and the action rules.
- BACKEND_DESIGN.md §5.1: event steps on the demo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-26 03:41:26 -05:00
de7775eaab Merge pull request 'docs(website): demo mode core built — DM15-DM17, MODULE_API 1.18.0' (#378) from docs/demo-mode-core into main
Reviewed-on: #378
2026-10-23 23:56:08 +00:00
6ea268ea86 docs(website): demo mode core built — DM15-DM17, MODULE_API 1.18.0
- DEMO_MODE.md: DM15 (onDemoSeed), DM16 (POST /auth/register locked), DM17
  (sessions route locked outright on a demo account). It also covers the settings
  keys that reach a Tier A lock, how demo accounts are recognised, failing
  closed, the published logins, the toast, the seed's fixture shape and $env,
  and the fact that there is no seeded team (Teams come from the rig's clans).
  The §3.2 example drops the config-file POST that DM14 opened. Step 1 is
  marked built.
- MODULE_API.md: 1.18.0. demoLocks in module.json, ctx.demoMode, and
  api.onDemoSeed, which must upsert because it runs on every seed.
- BACKEND_DESIGN.md: §5.1 demo mode, and demo_state in the settings table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-23 18:52:12 -05:00
6fae383255 Merge pull request 'docs(website): design demo mode for demo.runicgateway.com' (#377) from docs/website-demo-mode into main
Reviewed-on: #377
2026-10-23 23:23:10 +00:00
aadc13f6f4 docs(website): DM14 — open the plugin config editor, hide the bridge's
Visitors may read and change every plugin config except the bridge's: the
editor's save reloads through the bridge (with rollback, D178/D179), not
the console, and the wipe restores oxide/config. The RunicGateway plugin's
files are refused for reading as well as writing and left out of the file
list, because they hold credentials for talking to the sidecar directly.

Because the editor masks secret fields only in the form today, the demo
also redacts flagged values server-side, makes them read-only, refuses
raw-JSON saves, and leaves the sidecar URL out of the Servers admin view.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-23 18:15:10 -05:00
5f3c88e980 docs(website): demo mode fully decided — deny list, bundle, setup done
DM11: console-command steps keep running on the demo except a deny list
(quit/restart, oxide.unload/reload, rcon.*, fps.limit, server.tickrate),
matched on the normalised first word (global. stripped, o. mapped to
oxide.) and enforced by the module at save and at run behind a new
ctx.demoMode.

DM12: "latest" follows the Rust bundle for the rig's plugins and sidecar,
the newest Module-Rust release on the same protocol (a new protocol field
in its install manifest, which core's installer ignores), and the website
main image. If nothing matches yet, the wipe keeps the previous set.

DM13: only settings stay open. The org lead created the Pterodactyl
subuser and added PTERODACTYL_CLIENT_KEY.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-23 18:09:02 -05:00
c4a1a64941 docs(website): record the demo-mode decisions DM1-DM10
The org lead's answers of 2026-10-23: demoLocks in module.json, settings
open, the rig open but reset each cycle through Pterodactyl, content open
with uploads locked hard, the Oxide rig as the demo's, a stand-in Steam
link, every 2 hours, files in website/, latest versions, and every lock at
the server route level.

Adds the rig reset (§7.1-7.2): the site's first sync imports what is on
the rig (D198, D244), so the rig is restored from a baseline archive
before the site relinks, and that first import is the reset. Adds the
hard upload rule (any multipart body refused). Three follow-ups: F1
console-command steps, F2 "latest" across the bundle, F3 reading of DM2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-23 17:57:07 -05:00
c714906bbd docs(website): design demo mode for demo.runicgateway.com
The design for website#222, before any code: one DEMO_MODE flag on the
normal image that locks destructive writes with a 403 DEMO_LOCKED, four
published static logins, no outbound mail/push/Discord, a banner with the
next reset time, and a scheduled wipe on the demo-site runner (drop the
volumes, redeploy, seed accounts + the rig link + content).

Tier A locks are listed route by route. Nine questions for the org lead
(module lock declaration, the rig, visitor content, rig sharing with
walks, the stand-in Steam link, cadence, where the files live, version).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-23 17:43:52 -05:00
4942540796 Merge pull request 'docs(android): M8 step 1 built — API 36, the bundle and the Play upload' (#376) from docs/android-m8-app-ci into main
Reviewed-on: #376
2026-10-23 21:42:39 +00:00