diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 0000000..dcd53f6 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,64 @@ +# Credits and Provenance + +Gig Line is a local, single-player security-shift game built with Godot 4 and +GDScript. This file records the asset provenance needed for the release review; +it is not a legal opinion or a claim that every provider licence has already +been cleared for public distribution. + +## Game, code and design + +- Game design, systems, scenarios, dialogue and UI code: the Gig Line project. +- Engine: [Godot Engine 4.7.2](https://godotengine.org/), MIT licence. +- The game bundles no third-party fonts; it uses Godot's default theme font. +- No third-party music, sound effects or voice recordings are bundled. Crowd + ambience and radio cues are generated procedurally at runtime. + +## 3D characters, gear and props + +The character, gear and prop library is generated by project-owned scripts +(`tools/blender_assets.py`, `tools/npc_pipeline.py`, `tools/model_pipeline.py`) +using Blender. The `.blend` working sources are developer artifacts and are not +shipped. The exported `.glb` files and baked AO maps are project assets; they do +not embed third-party models or purchased asset packs. + +The venue geometry is authored procedurally in `src/game/world_builder.gd` as a +stylized reconstruction. The Joke Shop is a fictional stand-in for the real +Sunset Strip block; the game does not claim endorsement by, or an exact replica +of, any real venue or tenant. + +## AI-assisted images + +Surface textures, skyline panoramas, UI art and concept references were produced +with image-generation calls from the project's tooling. The default model slugs +recorded in the source are: + +- `bytedance-seed/seedream-4.5` — `tools/generate_textures.py` +- `openai/gpt-5-image-mini` — `tools/asset_pipeline.py`, + `tools/model_pipeline.py`, `tools/scene_concepts.py` and + `tools/screen_designs.py` +- Judging/review calls use the model selected by `tools/openrouter_judge.py` and + are development-only; they do not ship in the game. + +The prompts and generation workflow live in those tools. Per-file generation +metadata is not stored with every image, so the exact provider, model version and +generation date of each committed bitmap cannot be reconstructed from the +repository alone. Before a public 0.10.0 release, the provider terms and +commercial-use/redistribution rights for those generated outputs must be +reviewed and recorded. **This is a release blocker, not an assumed clearance.** + +Reference photographs linked from the venue documents are hosted on Wikimedia +Commons and were used for proportion/material study only. They are not included +in the game or its release packages. If any future derivative asset copies a +reference more directly, its attribution and licence must be added here. + +## Audio + +All runtime audio is procedural (crowd bed, radio crackle and interface cues). +There are no external audio files, so there is no separate music/SFX licence to +clear. See `docs/accessibility.md` for caption and volume behaviour. + +## Third-party names + +The game is a work of fiction. Real place names and public references are used +for orientation and satire/stand-in geography; no real person, venue or brand +endorses the game. Review the storefront and trademark language before release. diff --git a/MEMORY.md b/MEMORY.md index 8124cf5..7e151ef 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -183,6 +183,12 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o 0.9.3 UI polish, 0.9.4 NPC visual optimization, 0.9.5 texture/material pass and 0.9.6 integration are complete and in `DONE.md`. 0.10.0 release-candidate work is next. The source version is 0.9.6. +- **Release/legal blockers (0.10.0 work, 2026-11-03):** macOS remains unsigned + (quarantine instructions only); AI image provider terms/commercial rights and + external storefront/rating approval are not cleared; external playtests and the + full hardware matrix are pending. `CREDITS.md`, `PRIVACY.md`, `docs/accessibility.md` + and `docs/known-limitations.md` record these explicitly rather than claiming + approval. Do not tag 0.10.0 as final until these are accepted or cleared. - **Save migration (0.10.0 work, 2026-11-03):** fixtures in `src/test/fixtures/saves/` cover 0.8 settings/campaign/history and a 0.9.0 checkpoint. `_load_json` uses `JSON.new().parse()` so corrupt player files fall back silently instead of diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 0000000..cac5269 --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,27 @@ +# Privacy Note + +Gig Line runs locally. The game itself does not include telemetry, analytics, +accounts, advertising, cloud saves or network requests. It does not access the +camera, microphone, contacts or location, and the body-camera feature is a +simulated overlay, not a real recording device. + +Player data is written only to Godot's local `user://` directory: + +- `settings.json` +- `campaign.json` +- `shift_results.json` +- `shift_state.json` + +Those files stay on the player's machine unless the player copies them. Deleting +the files (or the `Gig Line` user directory) resets the profile. See +[`docs/getting-started.md`](docs/getting-started.md#save-data-and-migration) for +locations, migration and rollback instructions. + +The repository's development tools can call OpenRouter when a developer supplies +`OPENROUTER_API_KEY`; those calls generate or judge development assets and are +not part of the shipped game. The key and generated review artifacts remain +local/gitignored. + +Questions about a storefront release should be checked against the final package +and the provider terms recorded in [`CREDITS.md`](CREDITS.md); external legal and +storefront approval is still pending for 0.10.0. diff --git a/README.md b/README.md index 46f4d96..19a21e6 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,11 @@ Full setup, every run/test/smoke command, and the controls table are in - [`docs/asset-tooling.md`](docs/asset-tooling.md) — Asset pipelines, model tools, and screenshot gates. - [`docs/getting-started.md`](docs/getting-started.md) — Setup, run/test commands, and controls. - [`docs/development-status.md`](docs/development-status.md) — Implemented features and what's next. +- [`docs/accessibility.md`](docs/accessibility.md) — Accessibility features, known gaps and statement. +- [`docs/known-limitations.md`](docs/known-limitations.md) — Release-candidate blockers and accepted limitations. - [`docs/smoke-checklist.md`](docs/smoke-checklist.md) — Manual smoke-test checklist. +- [`CREDITS.md`](CREDITS.md) — Credits, AI/reference provenance and licensing notes. +- [`PRIVACY.md`](PRIVACY.md) — Local-only data, save files and development API use. - [`docs/blender-assets.md`](docs/blender-assets.md) — Blender asset library: characters, gear, props, attach points. - [`docs/npc-visual-review.md`](docs/npc-visual-review.md) — 0.9.4 NPC baseline, acceptance criteria and ranked visual gaps; 0.9.5 texture comparison is in [`docs/blender_previews/sheet_texture_refinement_0.9.5.jpg`](docs/blender_previews/sheet_texture_refinement_0.9.5.jpg). - [`docs/npc-proportion-audit.md`](docs/npc-proportion-audit.md) — NPC proportion measurements against the shared stylized guide. @@ -140,6 +144,16 @@ tutorial/campaign/resume work and the v0.7.x venue/gear/judge work. See [`docs/d for the implemented list and [`TODO.md`](TODO.md) for the 0.x roadmap. Manual verification uses the [`docs/smoke-checklist.md`](docs/smoke-checklist.md). +## Credits, Privacy and Accessibility + +Gig Line is a local-only single-player game: there is no runtime telemetry or +network service, and saves stay in Godot's local `user://` folder. The +body-camera overlay is simulated. Asset provenance, AI-assisted image usage and +credits are recorded in [`CREDITS.md`](CREDITS.md); the local-data policy is in +[`PRIVACY.md`](PRIVACY.md); accessibility features and gaps are in +[`docs/accessibility.md`](docs/accessibility.md); and release-candidate blockers +are listed in [`docs/known-limitations.md`](docs/known-limitations.md). + ## Development Workflow Follow [`AGENTS.md`](AGENTS.md): inspect the repository first, record work as checkbox tasks in `TODO.md`, move completed sections to `DONE.md`, update `MEMORY.md` with durable context, and keep this README synchronized with setup and architecture changes. diff --git a/TODO.md b/TODO.md index 0c19895..aa00d46 100644 --- a/TODO.md +++ b/TODO.md @@ -118,22 +118,43 @@ verify every distribution path. This is the next minor release after the 0.9.x p artifact names, sizes and checksums. - [ ] Smoke-test fresh Linux portable/AppImage, Windows portable/installer, macOS unzip/launch, Web static hosting and Desktop HQ Vulkan fallback on the target matrix. -- [ ] Add a disk-space preflight and retention policy to the release/publish scripts so a full - Gitea host cannot leave a partially uploaded release. -- [ ] Verify release metadata, tag/version consistency, asset counts and download links; retain +- [x] Add a disk-space preflight and retention policy to the release/publish scripts so a full + Gitea host cannot leave a partially uploaded release. (`publish_release.sh` + checks artifact size/free space, writes SHA-256 checksums, supports + `PUBLISH_DRY_RUN`, rolls back uploaded assets/new releases on failure, and + offers opt-in `RETAIN_RELEASES` pruning; dry-run verified.) +- [x] Verify release metadata, tag/version consistency, asset counts and download links; retain at least the latest 0.8/0.9 releases and document older-asset pruning. -- [ ] Decide and document whether macOS signing/notarization is required for 0.10.0 or explicitly + (Source/version and tag are both 0.9.6; all seven published releases carry + 5–7 assets, including the retained v0.8.0/v0.8.1/v0.9.0/v0.9.1 line. + `publish_release.sh` documents opt-in `RETAIN_RELEASES` pruning and + `RELEASING.md` describes the seven-release policy.) +- [x] Decide and document whether macOS signing/notarization is required for 0.10.0 or explicitly remains a future release blocker; record the quarantine instructions either way. + (0.10.0 ships unsigned with quarantine instructions; signing/notarization + remains an explicit public-release blocker in `RELEASING.md` and + `known-limitations.md`.) ### Legal, credits and platform policy -- [ ] Audit AI-assisted asset provenance and licenses; record source/model usage and any +- [x] Audit AI-assisted asset provenance and licenses; record source/model usage and any redistribution constraints for textures, characters, props and UI art. -- [ ] Audit audio/SFX/music licensing (or confirm everything is procedural) and add a credits file. -- [ ] Review body-camera/privacy language, mental-health-crisis representation, age/content rating + (`CREDITS.md` records the Blender/OpenRouter toolchain, default model slugs, + missing per-file generation metadata and the commercial-rights review as an + explicit release blocker.) +- [x] Audit audio/SFX/music licensing (or confirm everything is procedural) and add a credits file. + (All runtime audio is procedural; no external music/SFX files are bundled. + `CREDITS.md` records this.) +- [x] Review body-camera/privacy language, mental-health-crisis representation, age/content rating and storefront requirements; fix any release-blocking copy or content. -- [ ] Add the player-facing credits, known limitations, accessibility statement and privacy note to - the release package/README. + (`PRIVACY.md` clarifies the simulated body camera/local-only data; the + accessibility and known-limitations pages record the remaining + mental-health/rating/storefront review as a release blocker rather than + claiming approval.) +- [x] Add the player-facing credits, known limitations, accessibility statement and privacy note to + the release package/README. (`README.md` links `CREDITS.md`, `PRIVACY.md`, + `docs/accessibility.md` and `docs/known-limitations.md`; the Web and Desktop + HQ package builders copy those documents into the shipped archives.) - [ ] Mark external legal/storefront approval as complete or explicitly block the 0.10.0 release on it. ### Documentation and visual sign-off diff --git a/docs/README.md b/docs/README.md index e0649b4..45e99aa 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,7 +14,11 @@ This folder holds the project documentation, visual references and generated QA - [`npc-visual-review.md`](npc-visual-review.md) — NPC visual baseline, acceptance criteria and ranked gaps - [`npc-proportion-audit.md`](npc-proportion-audit.md) — NPC proportion ratios and stylized guide results - [`development-status.md`](development-status.md) — implemented features and current gaps +- [`accessibility.md`](accessibility.md) — accessibility statement and known gaps +- [`known-limitations.md`](known-limitations.md) — release-candidate blockers and accepted limits - [`smoke-checklist.md`](smoke-checklist.md) — manual verification +- [`../CREDITS.md`](../CREDITS.md) — credits and asset provenance +- [`../PRIVACY.md`](../PRIVACY.md) — privacy note - [`ui-copy.md`](ui-copy.md) — screen, copy and button inventory - [`RELEASING.md`](RELEASING.md) — export, CI and publishing workflow - [`adr/README.md`](adr/README.md) — architecture decisions diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 57ea898..5d7a350 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -103,6 +103,26 @@ The optional Desktop HQ zip is assembled by `tools/build_releases.sh` from `packaging/desktop_hq/`; keep `override.cfg` next to the extracted executable. It is not part of the default Compatibility/Web build. +`tools/publish_release.sh` preflights every artifact for existence and non-zero +size, checks free space in `build/`, writes `build/SHA256SUMS-.txt`, and +uploads only after those checks pass. If an upload or the final asset-count check +fails, it removes the assets it just uploaded (and removes a newly created +release) so the host never keeps a partial release. Use +`PUBLISH_DRY_RUN=1 ./tools/publish_release.sh` to run the preflight and checksum +steps without touching the API. Set `RETAIN_RELEASES=7` to prune older releases +after a successful publish; the default `0` disables pruning and never deletes +history implicitly. A retention of seven keeps the newest seven releases, +including the latest 0.8/0.9 line. + +### 0.10.0 macOS signing decision + +The 0.10.0 release candidate will continue to ship an **unsigned** macOS zip with +the documented right-click/`xattr` quarantine instructions. Signing and +notarization remain a public-release blocker until an Apple Developer account and +a reproducible signing/notarization job are available; they are not silently +claimed as complete. The same limitation is recorded in +[`known-limitations.md`](known-limitations.md). + Always run the release build from a clean checkout or detached worktree. Godot can pack files from ignored `tmp/` and old `build/` folders into the PCK; the 0.9.6 dirty-tree build produced 1.6–3.1 GB artifacts, while the clean worktree diff --git a/docs/accessibility.md b/docs/accessibility.md new file mode 100644 index 0000000..964e8b0 --- /dev/null +++ b/docs/accessibility.md @@ -0,0 +1,32 @@ +# Accessibility Statement + +Gig Line is a keyboard/mouse-first first-person game with gamepad support. The +current build includes the following accessibility features: + +- Remappable keyboard and gamepad bindings, persisted in `settings.json`. +- Keyboard focus rings and explicit default focus in every modal, with A/B + accept/cancel on a gamepad and wrapped Tab/arrow navigation. +- Adjustable HUD font scale up to 1.75× with clipped/ellipsized long labels. +- Reduced-motion mode that disables head bob and motion-sensitive presentation. +- Captions in the HUD log for radio, interaction and event messages. +- Master, SFX and ambience volume controls. +- Shape plus number escalation meter, so escalation is readable without colour. +- Hold-to-confirm emergency action and guarded destructive actions. +- Searchable Help generated from the live input bindings. +- Mouse-transparent HUD, right-click/Esc modal handling, and a predictable + top-panel close path. + +Known gaps: + +- There is no screen-reader integration or text-to-speech narration. +- The game is English-only; no pseudo-locale or full localization review has + been completed. +- The visual style is stylized and some small environmental detail may be hard + to read at low resolution; a full low-vision/high-contrast audit is pending. +- Audio captions cover gameplay messages, not every ambient sound. +- A formal WCAG conformance claim has **not** been made. External accessibility + review is still a 0.10.0 release-review item. + +Test evidence and the manual checklist live in +[`smoke-checklist.md`](smoke-checklist.md); settings and save behaviour are +documented in [`getting-started.md`](getting-started.md). diff --git a/docs/known-limitations.md b/docs/known-limitations.md new file mode 100644 index 0000000..0d45ebf --- /dev/null +++ b/docs/known-limitations.md @@ -0,0 +1,48 @@ +# Known Limitations + +This page records the limitations that remain at the 0.10.0 release-candidate +stage. Items marked **blocker** must be cleared or explicitly accepted before a +public release. + +## Release blockers + +- **External playtest:** at least five first-time-player sessions and the + resulting onboarding/accessibility triage have not been completed. The + tutorial/campaign evidence is currently automated smoke coverage, not player + observation. +- **AI asset provenance:** the image-generation provider terms and commercial + redistribution rights for the committed AI-assisted textures/UI art still need + legal review. See [`../CREDITS.md`](../CREDITS.md). +- **Storefront/legal approval:** age/content rating, storefront policy, trademark + language and the mental-health-crisis/body-camera representation have not been + externally approved. +- **macOS signing/notarization:** the 0.10.0 release candidate ships unsigned + with right-click/`xattr` quarantine instructions. Signing and notarization are + required before a broad public/storefront release and remain blocked until an + Apple Developer account and signing job exist. +- **Hardware matrix:** Web, Windows and Desktop HQ have been built and checked + structurally; a complete target-hardware performance/launch matrix is still + pending. + +## Content and presentation + +- The venues are stylized reconstructions, not survey-accurate models. The Joke + Shop is a fictional stand-in for the real Sunset Strip block. +- Character faces, hands and fabric use a deliberately low-poly style; the + >26 m tier remains a two-quad impostor and there is no separate finger-curl + rig. The accepted limits are recorded in + [`npc-visual-review.md`](npc-visual-review.md). +- There is no live 3D body-camera replay; the timeline is text-based. +- There is no recorded voice/music track. Ambience and cues are procedural. +- The game is English-only and does not yet have a translator workflow or + pseudo-locale layout sign-off. + +## Persistence and platform + +- Save migration is covered by synthetic 0.8/0.9 fixtures and failure-mode tests, + not by a real player profile collected from every earlier release. +- Desktop HQ requires a Vulkan-capable GPU/driver; the default Compatibility and + Web builds remain the broad target. +- The manual smoke checklist is completed by developers; external device + coverage (Windows installer, macOS launch, gamepad and Web hosts) is not yet a + complete evidence set. diff --git a/tools/build_releases.sh b/tools/build_releases.sh index 746a8e2..29ea5aa 100755 --- a/tools/build_releases.sh +++ b/tools/build_releases.sh @@ -17,6 +17,12 @@ set -euo pipefail GODOT="${GODOT:-godot}" VERSION="$(grep -oP 'config/version="\K[^"]+' project.godot)" +PLAYER_DOCS=( + "CREDITS.md" + "PRIVACY.md" + "docs/accessibility.md" + "docs/known-limitations.md" +) mkdir -p build # Presets now embed the PCK into a single binary; drop stale .pck leftovers. rm -f build/*.pck @@ -34,6 +40,9 @@ echo "==> Exporting Web (no threads, static-hosting friendly)" rm -rf build/web mkdir -p build/web "$GODOT" --headless --export-release "Web" "build/web/index.html" +for doc in "${PLAYER_DOCS[@]}"; do + cp "$doc" "build/web/$(basename "$doc")" +done # Ship the web build as a single zip so it can be downloaded and served as-is. rm -f "build/gig-line-web-${VERSION}.zip" if command -v zip >/dev/null 2>&1; then @@ -58,6 +67,9 @@ cp "build/gig-line-linux-${VERSION}.x86_64" "$HQ_DIR/" cp "build/gig-line-windows-${VERSION}.exe" "$HQ_DIR/" cp packaging/desktop_hq/override.cfg "$HQ_DIR/" cp packaging/desktop_hq/README.txt "$HQ_DIR/" +for doc in "${PLAYER_DOCS[@]}"; do + cp "$doc" "$HQ_DIR/$(basename "$doc")" +done rm -f "build/gig-line-desktop-hq-${VERSION}.zip" if command -v zip >/dev/null 2>&1; then (cd "$HQ_DIR" && zip -q -r "../gig-line-desktop-hq-${VERSION}.zip" .) diff --git a/tools/publish_release.sh b/tools/publish_release.sh index 44f0078..a48e9e6 100755 --- a/tools/publish_release.sh +++ b/tools/publish_release.sh @@ -106,6 +106,10 @@ for f in "${all_artifacts[@]}"; do done echo "==> Checksums written to $checksum_file" cat "$checksum_file" +if [[ "${PUBLISH_DRY_RUN:-0}" == "1" ]]; then + echo "DRY RUN: preflight and checksums passed; no release or upload was created." + exit 0 +fi API="$HOST/api/v1/repos/$REPO/releases" created_release=0