|
|
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)
release / promote (push) Waiting to run
|
2026-10-15 02:31:15 +08:00 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
68f0ec1a9b
|
docs/pitfalls.md: rows 64-67 (the skill had them)
|
2026-10-15 01:21:13 +08:00 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
d8c3cc88c2
|
acceptance: macOS results of 0.8.3 from 94f61e4 (123/123 on Node 20, Node 22, Bun), docs/acceptance.md regenerated
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 |
|
|
|
94f61e471c
|
acceptance report expects all 9 runs (Linux, Windows, macOS x node20 / node22 / bun)
|
2026-10-14 08:45:32 +08:00 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
f1eab75348
|
tests/teaser: the stamp check back in the safe-margin test (typecheck)
|
2026-10-14 05:49:15 +08:00 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|
|
|
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 |
|