|
|
6d95ea00f5
|
agent rules: every check, rule, template line, message and desktop view covers both stores and every surface
|
2026-10-18 01:31:17 +08:00 |
|
|
|
5a266b952f
|
templates: the 2.3.1 example line says where the same goes on Google Play (no review-notes field: App access 'Any other information' with a sign-in, and the full description for what needs a subscription)
|
2026-10-18 01:29:36 +08:00 |
|
|
|
61cb3338e8
|
scan: remote config, feature flags and remote paywalls not told to review (App Review 2.3.1, Play Deceptive behavior): remote-features finding for both stores, medium, with deep links, unless the review notes mention them; check prints it as a warning, validate carries it; warn only, the templates get a commented example line; code obfuscators a low note, minify alone nothing; store-pitfalls 74
|
2026-10-18 01:26:32 +08:00 |
|
|
|
9ba97b7e29
|
release: candidate downloads go through Cloudflare first (the direct route to the origin was throttled per connection: one AppImage took 20+ min there, 3 MB/s through Cloudflare), the origin only as a fallback; a heartbeat logs the bytes every 30 s
|
2026-10-17 15:59:44 +08:00 |
|
|
|
37cda2a39a
|
storebound 0.8.11: version in package.json and every copy, CHANGELOG 0.8.11 section
|
2026-10-17 14:29:27 +08:00 |
|
|
|
824758179b
|
review access: guest-play apps rejected by Play as a login wall (empty name field, disabled Continue, a code link on the first screen): check warns for a Play app with a first-run gate or IAP and no reviewAccess.instructions; with guest steps the play-sign-in-details plan declares one entry without credentials, the dialog's required full-access box as the owner's step; store-pitfalls 73
|
2026-10-17 12:50:06 +08:00 |
|
|
|
d6070cc185
|
release: when the published version is still missing from the registry after 2 minutes, publish once more (0.8.10's publish answered 0 and left nothing)
|
2026-10-16 07:48:55 +08:00 |
|
|
|
9059b2b32a
|
background tests: ci.yml runs the CI and the acceptance matrix on every push again but nothing waits for them (the gate no longer waits for the parent's run, which a release's own bump push cancels; the record job needs only the installers); tools/ci-status.ts reports main's newest test run and release.ts prints a red one as a warning
|
2026-10-16 07:17:19 +08:00 |
|
|
|
b84538e4cb
|
storebound 0.8.10: version in package.json and every copy, CHANGELOG 0.8.10 section
|
2026-10-16 06:35:47 +08:00 |
|
|
|
b6c4beaada
|
release: the CHANGELOG cut is checked before any version copy changes, and in the dry run (an empty Unreleased left every copy bumped and the next run refused 'not newer')
|
2026-10-16 06:34:51 +08:00 |
|
|
|
1f47b10fa9
|
CHANGELOG: Unreleased for 0.8.10
|
2026-10-16 06:33:40 +08:00 |
|
|
|
6443a5c442
|
neutral names in docs, tests and comments (no real app or project names)
|
2026-10-16 06:14:02 +08:00 |
|
|
|
cba4660777
|
release-candidate: a candidate whose jobs were only cancelled (a newer push to main cancels the older run) says so and gives the tag move + --resume line instead of 'red: fix it'
|
2026-10-16 05:54:14 +08:00 |
|
|
|
8a84ab4089
|
play: changesNotSentForReview goes only on edits.commit (validate answers 400 "Unknown name changesNotSentForReview: Cannot bind query parameter", found by a game on 220e9bb's real run): a refused commit is committed again with the parameter, a dry run's refused validate only says how the real run commits; the fake Play refuses the parameter on validate and a test asserts validate never gets it
|
2026-10-16 05:53:18 +08:00 |
|
|
|
dcb553fd16
|
storebound 0.8.9: version in package.json and every copy, CHANGELOG 0.8.9 section
|
2026-10-16 05:51:05 +08:00 |
|
|
|
220e9bb072
|
play: an edit Play will not send for review (400 'set changesNotSentForReview to true', a game 1.0.1 (5) after a rejection) is validated and committed again on the same edit with changesNotSentForReview=true; dry runs validate that way and say so; prints the Publishing overview link (owner's button), records it in .storebound/ for play status; --not-sent-for-review on release / upload / rollout / listing / images and MCP / desktop; pitfall 72
|
2026-10-16 05:50:37 +08:00 |
|
|
|
dcca4e86e4
|
storebound 0.8.8: version in package.json and every copy, CHANGELOG 0.8.8 section
|
2026-10-16 00:09:06 +08:00 |
|
|
|
728b216dcc
|
tests: the rtdn email fixture keeps the user-data line out of the service-account comment's window
|
2026-10-15 22:51:31 +08:00 |
|
|
|
a1647e9552
|
scan: an email hit whose line or the 3 lines above (doc comment, enclosing interface) name a server / config identity is not user data (a game apps/server/src/iap/rtdn.ts: email: string | null under 'Push service account email')
|
2026-10-15 22:51:02 +08:00 |
|
|
|
9171cb1129
|
scan: the email detector skips server / config identities (a service account or OIDC email of a Pub/Sub push, SMTP / sender / admin addresses, values from the environment); a game's rtdn: { audience; email; token } in apps/server/src/config.ts was flagged as App Privacy Email Address
|
2026-10-15 22:49:35 +08:00 |
|
|
|
ead5da4ab3
|
release: npm publish + deprecate run by themselves with a granular access token from ~/.storebound-keys/npm-token (0600; npm reads it through a temporary userconfig, never argv, logs or the checkout); bun tools/release.ts npm-token saves it once from the clipboard, npm-publish publishes this checkout's version
|
2026-10-15 20:13:42 +08:00 |
|
|
|
9d41fcdc50
|
no CI, no acceptance runs (the owner's decision): Forgejo's ci and acceptance jobs are off (if: false), the record job needs only the Linux / Windows installers; release.ts skips ci:quick, the macOS acceptance matrix and its report (TESTS = false); build, signing, notarization, privacy scans and verify stay
|
2026-10-15 19:58:47 +08:00 |
|
|
|
e7e26db4aa
|
acceptance: a cell's timeout grows with the machine's load (like tools/ci.ts) and a cell that only timed out runs once more, marked; a release failed on two cells that take 3 s alone, at load 95 on 10 cores
|
2026-10-15 19:57:17 +08:00 |
|
|
|
e500e88e40
|
Console pages as absolute deep links: cli/lib/console-links.ts builds the URL of every App Store Connect / Play Console page from apple.appId, play.developerId and play.appId (app list / developer chooser when unknown); every plain 'App Store Connect > ...' / 'Play Console > ...' direction in cli/ and templates/ now carries it, validate / scan / declarations / release plan JSON carry url, the desktop shows an Open button; tests/console-links.test.ts guards it; AGENTS rule 11, pitfall 71
|
2026-10-15 19:55:37 +08:00 |
|
|
|
f898d642d0
|
desktop AI fix: kill only the agent's own process group with killpg (never pgid <= 1 or our own group) instead of the external kill command; a Forgejo ci run of bc85dab died of SIGTERM in the middle of these tests
|
2026-10-15 19:45:00 +08:00 |
|
|
|
bc85dabf90
|
storebound 0.8.7: version in package.json and every copy, CHANGELOG 0.8.7 section
|
2026-10-15 19:38:32 +08:00 |
|
|
|
b830a99a5f
|
First in-app purchases left out of a review are caught (pitfall 70): firstProductGaps in validate / release plan (blocker) and the apple submit plan (refuses to leave a never-approved first product out); apple status (WARN + firstProductGaps in --json), release status and the desktop checks warn while a version waits for or is in review without it; iap-review says 'ready, not submitted yet' instead of 'complete'
|
2026-10-15 19:31:26 +08:00 |
|
|
|
1c35a625e1
|
build-node: TypeScript's own script runs under Bun (node_modules/.bin/tsc is a .exe / .cmd shim on Windows: the Windows acceptance cell packed nothing on dc387f6)
|
2026-10-15 06:36:24 +08:00 |
|
|
|
dc387f6ffb
|
storebound 0.8.6: version in package.json and every copy, CHANGELOG 0.8.6 section
|
2026-10-15 06:33:52 +08:00 |
|
|
|
d72b199645
|
ci: the acceptance jobs run bun install before packing (prepack builds the package's declarations with the pinned TypeScript; without node_modules npm pack failed and every acceptance cell went red on 5ed787a); build-node names the missing install instead of a bare ENOENT
|
2026-10-15 06:33:01 +08:00 |
|
|
|
5ed787a8ca
|
desktop AI fix: a claude CLI without a sign-in ("Not logged in · Please run /login", seen in a real headless run) shows 'not signed in' with the copy-for-AI fallback instead of a bare failure; the flags were checked against a real claude run (it edited the file)
|
2026-10-15 06:28:52 +08:00 |
|
|
|
c95f2af8ff
|
desktop: Fix with AI on scan findings that need a code change (aiFix: true, AI_FIX_RULES). The host (src-tauri/src/ai_fix.rs) runs the owner's local Claude Code headless in the app folder with Read / Edit / Write / Grep / Glob only (Bash, web tools, sub-agents disallowed) and a prompt it builds from the finding's fields; it refuses while the folder has uncommitted files, streams progress, times out after 10 min with a heartbeat, kills the process group on Cancel or exit, and records the run's changed files so Undo restores exactly those; the window shows the diff with Keep / Undo and rescans. Without claude the button copies the prompt (Copy for AI). Only the claude binary, git and kill / taskkill are started there (tests/security.rs); tests/ai_fix.rs covers the prompt, dirty-tree refusal, undo scope, timeout and cancel
|
2026-10-15 06:26:29 +08:00 |
|
|
|
992f5bcc0e
|
desktop: a Fix button on scan and validate findings storebound can fix itself. Findings carry action { method, args } (cli/lib/fix-actions.ts); privacy-labels runs scan.write (scan --write-only, the dialog shows the config diff), Play listing gaps play.listing, a missing App Store localization or copyright apple.listing (editable version only), the App Review contact apple.review_details; each a dry run, the native dialog, then the confirmed run. --write-only is forbidden for MCP tools; tests pin the mapping, the round trip on a fixture and that no fix reaches a submit, release or publish
|
2026-10-15 06:14:49 +08:00 |
|
|
|
bd83d036ba
|
desktop: long findings wrap inside the Store readiness card (a build-folder path pushed the store chips out); the release timeline's rail no longer breaks after the current step; the rollout bar stays under its stage. scan: function words of the listing languages (German eine / der, French les, Turkish bir, ...) are not repeated keywords; the dev fixture has a long-path finding
|
2026-10-15 06:07:01 +08:00 |
|
|
|
04647c079e
|
package: CommonJS projects get their own declarations (dist/types-cjs; node16 / nodenext refused an ESM-only .d.ts from a CJS file, TS1541); the package-types test covers ES module and CommonJS projects under bundler / node16 / nodenext / node10 and loads the package with import() and require() under Node; pitfall 69
|
2026-10-15 06:01:33 +08:00 |
|
|
|
d717ceb4cd
|
package: ship declarations (dist/types, the "types" condition) and a Node JS entry for 'storebound'; Bun keeps the .ts source. 0.8.5 exported only cli/lib/config.ts, so tsc (next build, vue-tsc, tsc --noEmit) failed on a scaffolded storebound.config.ts and broke a Next app's build; a test type-checks the template against the packed entry under bundler / node16 / nodenext without @types/node. check fails on the template's own placeholders (Example Studio, bare example.com URLs and addresses)
|
2026-10-15 05:49:05 +08:00 |
|
|
|
77f141e223
|
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)
|
2026-10-15 02:31:15 +08:00 |
|
|
|
a64a7f198d
|
storebound 0.8.5: version in package.json and every copy, CHANGELOG 0.8.5 section
|
2026-10-15 02:24:45 +08:00 |
|
|
|
8de60aaef4
|
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 |
|
|
|
ef81dd1b3e
|
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 |
|
|
|
cd1e13c1e2
|
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 |
|
|
|
4c7ff89950
|
docs/pitfalls.md: rows 64-67 (the skill had them)
|
2026-10-15 01:21:13 +08:00 |
|
|
|
6873f2cc68
|
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 |
|
|
|
cdaecc2afb
|
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 |
|
|
|
c3b1e8c370
|
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 |
|
|
|
89d94d6993
|
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 |
|
|
|
b350781ab5
|
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
|
2026-10-14 23:56:57 +08:00 |
|
|
|
af858a3f36
|
storebound 0.8.4: version in package.json and every copy, CHANGELOG 0.8.4 section
|
2026-10-14 23:40:40 +08:00 |
|
|
|
2b07f56673
|
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 |
|
|
|
daae3715bf
|
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 |
|