Commit graph

346 commits

Author SHA1 Message Date
CRT
1cde3e6663 release: a cancelled parent run is not a failure (a version-only child runs everything instead of stopping at the gate); a queued run gets 20 min before 'no ci run'; release.ts --resume continues a release that stopped after its push (the history rewrite re-pushed every old tag, their release.yml runs took the runners and cancelled 0.8.5's parent)
Some checks are pending
release / promote (push) Waiting to run
2026-10-15 02:31:15 +08:00
CRT
63d901fa02 storebound 0.8.5: version in package.json and every copy, CHANGELOG 0.8.5 section 2026-10-15 02:24:45 +08:00
CRT
621ac3ed73 publish: the server-side parallel fetch runs in bash on stdin (the VDS login shell is zsh, which did not split the pid list: the rehearsal's publish stopped there) 2026-10-15 02:13:59 +08:00
CRT
d95ee4d988 a pre-release version (0.0.0-rehearsal.1) passes the one-version test; release.ts puts the checkout back when the fast gate fails before anything is committed 2026-10-15 01:46:02 +08:00
CRT
b74160a73d browser tests run only by hand: the suites that launch Chrome / Chromium move to tests/browser/*.browser.ts (bun test, ci, ci:quick and the Forgejo workflows never pick them up; bun run test:browser runs them); the desktop boot check leaves bun run ci (it stays in desktop-release.ts mac at release time); CI=full is gone: Forgejo's ci runs the Rust steps when the push changed a Rust input (STOREBOUND_CI_BASE=HEAD~1), no Playwright install; CONTRIBUTING 2026-10-15 01:25:17 +08:00
CRT
68f0ec1a9b docs/pitfalls.md: rows 64-67 (the skill had them) 2026-10-15 01:21:13 +08:00
CRT
f6d995d3b3 release candidates: draft assets are read by their attachment uuid (the tag URL is 404 for drafts: the record job could not merge SHA256SUMS); the installers are scanned with the private terms in their build jobs, so the record job needs no apt tools (it spent 5 minutes installing them) 2026-10-15 01:18:55 +08:00
CRT
683996e1e7 chrome guard: a zombie counts as ended (an orphan's new parent in a container whose PID 1 is no init never reaps it, and kill(pid, 0) still succeeds), so the reaper reports it and the real-process test passes on the Linux runner 2026-10-15 00:49:56 +08:00
CRT
fa0fda46f9 release candidates: every push to main runs the full CI, the acceptance matrix and the Linux / Windows installer builds in parallel (ci.yml) and records the green result per commit as the draft rc-<sha> (green.json last); a version-only bump commit (proven file by file with the version writers) reuses its parent's CI and matrix and rebuilds only the installers; a v* tag only promotes the candidate (release.yml), fails fast on a red or missing commit; acceptance runs carry a CLI key; tools/release.ts does the whole release on the Mac (bump, CHANGELOG cut, fast gate, push, tag, Mac build + notarize in parallel with Forgejo, cached macOS acceptance, add, verify, publish with one upload of the Mac files, /Applications update, npm commands) and --rehearsal; DMG notarization runs while the app and updater bundle are checked; rehearsal channel on the VDS; docs 2026-10-15 00:42:50 +08:00
CRT
38a621970f console Chrome never outlives its run: exit kills it, SIGINT / SIGTERM / SIGHUP close it gracefully, a detached watchdog ends it when the parent dies (SIGKILL included; a reused pid is never killed); every start ends headless orphans on storebound profiles and names orphaned windows; headless runs on macOS prefer Chromium / Chrome for Testing over Google Chrome.app (an orphan kept the owner's Chrome from opening from the Dock); console fill closes the window on errors; pitfall 68; tests 2026-10-15 00:28:32 +08:00
CRT
023aaddc05 acceptance: the app fixture carries the owner's answers (unanswered: [], its own name and copyright; template answers are refused before store writes); macOS results of 0.8.4 (123/123 on Node 20, Node 22, Bun), docs/acceptance.md regenerated
Some checks are pending
release / prepare (push) Waiting to run
release / ci (push) Blocked by required conditions
release / linux (push) Blocked by required conditions
release / acceptance (bun, 22, ubuntu-22.04, Linux, bun) (push) Blocked by required conditions
release / acceptance (bun, 22, windows, Windows, bun) (push) Blocked by required conditions
release / acceptance (node20, 20, ubuntu-22.04, Linux, node) (push) Blocked by required conditions
release / acceptance (node20, 20, windows, Windows, node) (push) Blocked by required conditions
release / acceptance (node22, 22, ubuntu-22.04, Linux, node) (push) Blocked by required conditions
release / acceptance (node22, 22, windows, Windows, node) (push) Blocked by required conditions
release / acceptance-report (push) Blocked by required conditions
release / windows (push) Blocked by required conditions
release / release (push) Blocked by required conditions
2026-10-14 23:56:57 +08:00
CRT
39e1d879ec storebound 0.8.4: version in package.json and every copy, CHANGELOG 0.8.4 section 2026-10-14 23:40:40 +08:00
CRT
457ac9175f capability check: a checkout without .entitlements is a warning about this checkout only (built from another branch?), naming the current branch and the local branches / worktrees that have an .entitlements file, never a claim about the build; the newest built IPA (highest build number) is read (codesign -d --entitlements on macOS, else the Mach-O signature's entitlements blob) and compared as 'uploaded build N'; without one the output says the App Store Connect API does not expose a build's entitlements; exportedIpas moved to cli/lib/xcode.ts; pitfall 67; tests 2026-10-14 19:17:45 +08:00
CRT
bf131834bc apple signing ensure with automatic signing only adds capabilities (no profiles or certificates; the dry run says so) and lists unused storebound profiles with the exact delete command, never run; every capability write is read back (lag retries, timeout) and fails with the API answers when one did not stick; apple status, signing status and validate compare the App ID, apple.signing.capabilities and the iOS project's entitlements (CODE_SIGN_ENTITLEMENTS too) and name what is missing where; api writes outside a terminal say TTY by design and name the dedicated command; pitfalls 64-66; tests 2026-10-14 19:10:01 +08:00
CRT
93cad15023 --json prints only JSON on stdout (withJsonOutput around every command: logs, tables and prompts to stderr; printJson everywhere; test runs every --json command against the fake stores and parses stdout); prices ppp compares like with like: par = the store's own US-equivalent price (Play convertRegionPrices, Apple equalizations; offline base x fx x (1 + VAT) rounded up) scaled by the PPP price level; defaults only lower, only price levels <= 0.5, World Bank high-income at par, CN at par on Apple and skipped on Play, never above par (--only-decreases, --max-ratio, --min-ratio, --max-level, --include-high-income; --floor / --ceiling kept), top-10 revenue market drops > 20 % warned (sales reports, else a static list), unchanged regions out of the sheet; price changes of existing products only with --allow-price-changes, TTY or not (a terminal yes covered them), then their own question listing each old -> new, held section in dry runs (play products, prices import, play / apple subscriptions); pitfalls 61-63; tests 2026-10-14 17:36:00 +08:00
CRT
5a521737ca whats-new drafts from player-facing notes first (whatsNew.source, docs/RELEASE-<version>.md, the CHANGELOG section of the version or Unreleased; --release, --from-git) and only then from the git log; internal jargon warnings (SDK / vendor names, developer and version-control words, file paths, issue ids, code identifiers) with plain alternatives in the draft and whats-new check, one list in cli/lib/jargon.ts, whatsNew.allowWords keeps a word; skill: write from what players feel, never from commit messages; tests 2026-10-14 14:45:19 +08:00
CRT
9ffb60fe8b check blocks an apple app without app.copyright (App Store Connect requires it; never filled in automatically); validate reads the live version's copyright and says whether the store has one; round-trip test that the config writers (upsertBlock, upsertNestedString, removeKeyPath) keep unknown keys and comments; tests 2026-10-14 14:37:47 +08:00
CRT
e0fb59324b privacy manifest discovery skips build-output and copy folders (hidden dirs like .native-build, build, DerivedData, node_modules, dist, Products, built .app / .xcarchive) in scan, check and privacy-manifest: a stale .native-build copy was checked instead of the real ios/ manifest; test 2026-10-14 13:14:49 +08:00
CRT
b6c9523037 template compliance answers never reach a store: init writes unanswered (dataSafety, appPrivacy, reviewNotes, ageRating, accounts, reviewAccess), older configs are recognised by the template values; check / validate / scan block, play data-safety (also --dry), console plan / fill, apple review-details and appinfo refuse. onboard --declarations replaces them on a live app: name and copyright from the stores (a copyright with a private term is left out), the rows the code proves (scan proposal, sign-up methods from auth code and login SDKs), the rest as one owner question list. play data-safety --dry prints the answers that change (old -> new, account and deletion first) against the last uploaded CSV; pitfall 60; tests 2026-10-14 11:36:30 +08:00
CRT
608f9cea2f site: first-party, cookieless visit stats (self-hosted Umami at storebound.dev/s/, Do Not Track respected) with events for copy buttons, desktop downloads per OS, the teaser (play, 50 %, complete) and outbound docs / git / npm links; a privacy note in the footer; docs/site-analytics.md and tools/vds/ configs to rebuild the server side; scrub allows a page's public stats website id 2026-10-14 11:11:24 +08:00
CRT
1cceb0fc38 tests: console-fill idmsa frame test waits for the frame, its form and its click log instead of reading them right after the sign-in hint (race under load) 2026-10-14 09:13:04 +08:00
CRT
d8c3cc88c2 acceptance: macOS results of 0.8.3 from 94f61e4 (123/123 on Node 20, Node 22, Bun), docs/acceptance.md regenerated
Some checks are pending
release / prepare (push) Waiting to run
release / ci (push) Blocked by required conditions
release / linux (push) Blocked by required conditions
release / acceptance (bun, 22, ubuntu-22.04, Linux, bun) (push) Blocked by required conditions
release / acceptance (bun, 22, windows, Windows, bun) (push) Blocked by required conditions
release / acceptance (node20, 20, ubuntu-22.04, Linux, node) (push) Blocked by required conditions
release / acceptance (node20, 20, windows, Windows, node) (push) Blocked by required conditions
release / acceptance (node22, 22, ubuntu-22.04, Linux, node) (push) Blocked by required conditions
release / acceptance (node22, 22, windows, Windows, node) (push) Blocked by required conditions
release / acceptance-report (push) Blocked by required conditions
release / windows (push) Blocked by required conditions
release / release (push) Blocked by required conditions
2026-10-14 08:51:14 +08:00
CRT
94f61e471c acceptance report expects all 9 runs (Linux, Windows, macOS x node20 / node22 / bun) 2026-10-14 08:45:32 +08:00
CRT
1b160a9bef apple listing: asking for the version that is in review says it is locked (it said "already exists; a new version needs a higher number"); play images: a listing language missing from languages[] is skipped with the fix instead of stopping the run (play listing pushes its text). Both found by the live dry-run sweep; tests 2026-10-14 08:43:59 +08:00
CRT
5f08e3ad7c acceptance.yml: the release matrix on demand (Linux + Windows x node20/node22/bun, then the report); macOS results of 0.8.3 (123/123 on Node 20, Node 22, Bun) in docs/acceptance/, docs/acceptance.md generated 2026-10-14 08:38:12 +08:00
CRT
3aeba5aa33 acceptance: create the --out folder (both CI runs passed every quick cell, then failed writing acceptance/<run>.json), log the warm-up cell 2026-10-14 08:33:12 +08:00
CRT
42b68a5bf1 apple: no app info on App Store Connect is a clear error (it crashed apple listing / appinfo with "undefined is not an object (evaluating 'info.id')"); asset uploads use basename (a Windows path sent the whole C:\... path as fileName), reviews send --only and previews names split both separators; tests/matrix-bugs.test.ts 2026-10-14 08:29:31 +08:00
CRT
ccc2cb1f70 release acceptance matrix: tools/acceptance.ts runs every user-facing command from the packed npm tarball (npx --package=<tgz> on Node 20 / 22, bun x --bun after bun add <tgz>) in fresh temp folders with a fresh HOME, real piped stdin (n, EOF) and per-cell fake stores over HTTP (STOREBOUND_STORE_MOCK, loopback only); a cell passes only with the expected exit code and no crash text; report -> markdown matrix. Prompts go through stdinIsTTY (STOREBOUND_ASSUME_TTY drives them with piped stdin), STOREBOUND_DESKTOP_APP=none for the install prompt on a machine with the app. release.yml: required acceptance job matrix (Linux + Windows x node20/node22/bun) and report, the matrix attached to the release; ci.yml: the quick subset on Linux and Windows. Scan fixtures for React Native and Expo 2026-10-14 08:29:31 +08:00
CRT
91aec822ba release: privacy scan of signed macOS artifacts leaves out Apple code signatures only (copies with codesign --remove-signature on every Mach-O, the DMG's koly signature blob zeroed); any other hit still fails; tests and docs 2026-10-14 08:21:35 +08:00
CRT
1a25555552 storebound 0.8.3: prompts read stdin with rt.readLine (node:readline) instead of Bun-only for await (const line of console), which crashed npx storebound desktop on Node/Windows; node-compat test bans Bun-only stdin iteration; Node prompt smoke, also on the Windows release runner 2026-10-14 08:07:40 +08:00
CRT
7730385b0e storebound 0.8.3: version in package.json and every copy, CHANGELOG 0.8.3 section (docs: no private account names in the published package) 2026-10-14 07:54:56 +08:00
CRT
ca9d933257 storebound 0.8.2: version in package.json and every copy, CHANGELOG 0.8.2 section with the release summary; site teaser cache key v=7
Some checks are pending
release / prepare (push) Waiting to run
release / ci (push) Blocked by required conditions
release / linux (push) Blocked by required conditions
release / windows (push) Blocked by required conditions
release / release (push) Blocked by required conditions
2026-10-14 06:32:32 +08:00
CRT
94174870fa teaser v9 final with the new reject shot: 1920x1080 master, web version and posters from the end card; site teaser and poster (cache key v=6), README poster 2026-10-14 06:10:39 +08:00
CRT
f0cd8dc670 tests copy the demo app as git has it: the example's gitignored .storebound/, renders, frames and video of a local checkout stay out of the temp copy (edit.test.ts failed on a local .storebound/, the boot check's store art case opened a local ios69 render instead of its pulled Play shot) 2026-10-14 06:10:39 +08:00
CRT
f1eab75348 tests/teaser: the stamp check back in the safe-margin test (typecheck) 2026-10-14 05:49:15 +08:00
CRT
a52225d871 teaser: no text overflows anywhere: teaser.textCheck(t) checks every visible text node (scroll size within its element, its box inside its card, every card in frame as drawn), render.ts --animatic runs it at every frame of the whole teaser into animatic-checks.json and tests/teaser.test.ts requires zero problems; reject titles shortened ('No demo account', 'Manifest refused'); fixes it found: terminal and pile rows wrap instead of being cut with an ellipsis, the scan findings wrap, the pile shows only the rows that fit whole (no streaming past the edge), caption, edge word, labels and end card line heights fit their glyphs, builds and products push straight in so the terminal stays in frame 2026-10-14 05:47:42 +08:00
CRT
b593215b1d teaser: the reject shot redone (7-11 s, 4 s): the common rejections storebound catches as real scan finding cards landing one per beat (2.1(a) demo account, 5.1.1(v) account deletion, 5.1.2(i) ATT from tests/fixtures/scan/teaser; ITMS-91064 from the new teaser-manifest fixture), guideline + one plain line each, then our own REJECTED stamp hits the stack on the beat at 9.5 s, no shake (one 4 px 1-frame jolt), a 3% push, the picture darkens into the cut; caption 'Rejected. Again.'; later shots +1.5 s (42.5 s, every cut on a beat, music follows the scenes, a thud per card and a hit on the stamp); render.ts --animatic --range a,b and --sheet a,b,fps, and the reject cards' boxes per frame in animatic-checks.json; tests: real finding lines, beat timing, and every card inside 6% safe margins at every frame 2026-10-14 05:47:42 +08:00
CRT
16eeab0e74 desktop boot check: the Store art tab's live thumbnails are read on demand (art live), so its 'Live store art not read yet' is not a missed background read 2026-10-14 05:35:59 +08:00
CRT
381ce04afe teaser: render.ts --scale 2, the 3840x2160 master for 4K uploads (same page at device scale 2, desktop frames captured at @3x into out/desktop@3x, demo game renders at 2x into out/assets@2x, H.264 high about 40 Mbps, AAC 320 kbps, +faststart; no web version); desktop.ts captureDesktop takes a scale and an output folder 2026-10-14 05:31:31 +08:00
CRT
a9fa7786e6 onboard subscription-level test runs without the art step (--no-art, as the other onboard tests since art pull) 2026-10-14 05:31:02 +08:00
CRT
627d523a2f onboard never writes duplicate subscription levels: the App Store groupLevel when it is set and unique in the group, else a stable order (App Store level, higher price per month = higher level, longer period, id) with a note per derived level; assignLevels in cli/lib/onboard.ts, tests with a live-shape App Store group (groupLevel 2 and 1) and Play-only / tied cases 2026-10-14 05:30:15 +08:00
CRT
80b57b9795 pitfalls dry-run guard: cli/lib/git-ignore.ts's dry branch returns the planned .gitignore line (the plan, printed by its callers), allowed with the reason 2026-10-14 05:26:14 +08:00
CRT
388849116d pulled store art never goes into the app repo: art pull --write, init and onboard add the renders folder (relative to the repo root, e.g. /store/renders/) to the repo's .gitignore when git check-ignore says it is not ignored yet, with one line saying so; tests 2026-10-14 05:25:37 +08:00
CRT
866c8c67a2 tests: art_pull in the local-write tools, art_live / art_thumb in the store-only reads, onboard tests without the art step 2026-10-14 05:25:37 +08:00
CRT
b5758b3ebb store art from the live stores: storebound art pull (App Store screenshot sets and previews per locale and display type from imageAsset.templateUrl at the original size, the App Store icon from the newest build or the public artwork; per Play language icon, feature graphic, phone / 7" / 10" / TV / Wear screenshots as the =s0 originals checked against Play's sha256) into store/renders with pulled.json (sha256, store, URL host, store checksum); upsert (a re-run changes nothing, differing local files kept unless --force, the upload's file of a slot compared: Play .jpg, App Store .png, the App Store icon as a picture); onboard runs it; apple screenshots / previews and play images see unchanged pulled files as the store's own; check: render sources are notes with pulled art; local renders check: pulled files pass, store-empty sets not demanded; art live / thumb / replace; desktop Store art tab: live thumbnails per store, language and set (same / differs / not pulled), Pull from stores, store-only apps read-only, Replace with a file (image_pick, art.replace) in the lightbox and the art editor; boot check store art case; tests/art-pull.test.ts; console parity 76 rows (57 complete, 19 with the reason); store-screenshots skill (pull first for live apps), pitfall 59 2026-10-14 05:25:37 +08:00
CRT
cb5b02c21a bun run ci defers the browser suites and the desktop boot check to Forgejo CI when the 1-minute load is above 2x the cores (deferBrowser in tools/ci-plan.ts, said at the start and in the summary); CI=full forces them, Forgejo runs CI=full 2026-10-14 05:24:38 +08:00
CRT
0882522d15 CI green on a loaded shared machine: browser suites (now also glyph-ligatures and feature-fit, through the shared launch helper) in one dedicated shard started first at concurrency 2; timeouts scaled by load ÷ cores (tests/helpers/load.ts, max(1-, 5-min average), capped at 5x, logged) for browser tests, waits, launch/close, the other shards' default and the desktop boot check; one retry for a browser test that timed out while the factor was above 2, listed as 'retried under load' in the CI summary, never for an assertion failure; the six-type App Privacy walk no longer dumps every step (the --debug-dump check walks two types), wait timeouts print per-line times; play-edit-lock checks reads in flight instead of wall time; tests/load-retry.test.ts 2026-10-14 05:21:15 +08:00
CRT
675aee58fe onboard reads review access from the live App Store version (READY_FOR_SALE / READY_FOR_DISTRIBUTION, newest live first; the newest version only when nothing is live): a newer draft's empty review detail no longer hides the live demo account or turns signInRequired off; reviewVersion in cli/lib/onboard.ts, tests with a live version holding a demo account and a newer draft without 2026-10-14 02:08:39 +08:00
CRT
9836c10d15 teaser v9 final: music reworked for the tight cut (drives from frame 0, an accent on every cut, tension in the pile and the rejection, a short drop into the request, layers building through the montage, the stop on Submit, the resolve on Waiting for review, a confident end under the card fading over the last 1 s; -16 LUFS, true peak <= -1.5 dBTP); 1920x1080 master, web version and posters from the end card; site teaser and poster (cache key v=5), README poster 2026-10-14 01:05:24 +08:00
CRT
7f922168ab teaser v9 animatic: 41 s story cut tight (hard cuts on the beat, 2-4 s shots, frame 0 moving, every shot opens on its subject, captions <= 6 words held >= 2 s, end card with npx storebound init held 4 s); render.ts --animatic (960x540 draft with sound, contact sheet, shot list, end-card layout checks); tests for the v9 timing rules 2026-10-14 01:05:24 +08:00