@bongos/core 1.18.0 → 1.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bongos-core.json +132 -322
- package/README.md +1 -1
- package/config/branding.neutral.json +5 -1
- package/docs/adr/0142-project-context-is-prose-only.md +41 -0
- package/docs/adr/0143-onboarding-repo-picker-oauth-scope.md +35 -0
- package/docs/adr/README.md +5 -2
- package/docs/api/openapi.json +1789 -450
- package/docs/api-reference.md +52 -5
- package/docs/file-map.md +7 -7
- package/docs/recipes/packaging-the-core.md +13 -0
- package/docs/recipes/upgrading-the-core.md +5 -2
- package/migrations/039_newcomer_friendly_column.sql +5 -0
- package/migrations/102_remove_box_first_provision_approval.sql +4 -0
- package/migrations/core_192_github_oauth_tokens.sql +33 -0
- package/modules/hall-ui/public/my-projects.html +78 -0
- package/modules/hall-ui/public/my-projects.js +142 -0
- package/modules/hall-ui/public/scouting.html +45 -0
- package/modules/hall-ui/public/scouting.js +73 -0
- package/modules/status-ui/public/explore.html +54 -0
- package/modules/status-ui/public/explore.js +67 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/create.html +211 -14
- package/scripts/gds/cli-lib.js +11 -5
- package/scripts/gds/lint-migrations.js +102 -0
- package/scripts/gds/login.js +42 -10
- package/scripts/gds/mirror-redact.js +5 -0
- package/scripts/gds/package-core.js +263 -4
- package/scripts/gds/provision.js +145 -7
- package/scripts/gds/publish-manifest.js +15 -0
- package/scripts/gds/run-unit-tests.js +38 -14
- package/scripts/gds/setup.js +41 -0
- package/scripts/gds/ship.js +115 -31
- package/scripts/gds/upgrade.js +147 -5
- package/scripts/migrate.sh +10 -0
- package/src/bongos/auth.js +362 -5
- package/src/bongos/db.js +66 -0
- package/src/bongos/github-repos.js +93 -0
- package/src/bongos/routes/auth.js +93 -11
- package/src/bongos/routes/github.js +90 -0
- package/src/bongos/routes/instance.js +15 -3
- package/src/bongos/routes.js +2 -0
- package/src/branding.js +17 -2
- package/src/instance-config.js +16 -0
- package/src/module-api.js +29 -1
- package/tests/branding.mjs +29 -23
- package/tests/github_repos_helpers.mjs +91 -0
- package/tests/github_token_store.mjs +121 -0
- package/tests/idp_device_exchange.mjs +105 -0
- package/tests/idp_federation.mjs +100 -0
- package/tests/migrations_forward_safe.mjs +86 -0
- package/tests/module_api.mjs +1 -1
- package/tests/package_core.mjs +246 -1
- package/tests/provision.mjs +157 -0
- package/tests/pruned_lockfile_integrity.mjs +79 -0
- package/tests/ship_ci_deploy.mjs +60 -0
- package/tests/upgrade.mjs +254 -5
- package/.gitignore +0 -91
- package/docs/adr/0139-platform-history-migration-to-cloudbongos.md +0 -94
- package/docs/adr/0140-cloudbongos-standalone-reprovision.md +0 -43
- package/scripts/hall-preview/fixtures/access-requests.json +0 -20
- package/scripts/hall-preview/fixtures/achievements.json +0 -76
- package/scripts/hall-preview/fixtures/analytics__builder.json +0 -251
- package/scripts/hall-preview/fixtures/audit-log.json +0 -68
- package/scripts/hall-preview/fixtures/blockers__detail.json +0 -12
- package/scripts/hall-preview/fixtures/box__me.json +0 -5
- package/scripts/hall-preview/fixtures/boxes__cost-ledger.json +0 -69
- package/scripts/hall-preview/fixtures/builders__active-claims.json +0 -1
- package/scripts/hall-preview/fixtures/builders__directory.json +0 -81
- package/scripts/hall-preview/fixtures/builders__roster.json +0 -48
- package/scripts/hall-preview/fixtures/goals.json +0 -502
- package/scripts/hall-preview/fixtures/goals__25.json +0 -96
- package/scripts/hall-preview/fixtures/goals__26.json +0 -67
- package/scripts/hall-preview/fixtures/goals__3.json +0 -103
- package/scripts/hall-preview/fixtures/goals__35.json +0 -49
- package/scripts/hall-preview/fixtures/goals__conflicts.json +0 -154
- package/scripts/hall-preview/fixtures/goals__detail.json +0 -96
- package/scripts/hall-preview/fixtures/goals__inbox.json +0 -5
- package/scripts/hall-preview/fixtures/goals__requests.json +0 -3
- package/scripts/hall-preview/fixtures/grades__by-builder.json +0 -32
- package/scripts/hall-preview/fixtures/inbox.json +0 -330
- package/scripts/hall-preview/fixtures/inbox__detail.json +0 -15
- package/scripts/hall-preview/fixtures/instance.json +0 -124
- package/scripts/hall-preview/fixtures/leaderboard.json +0 -184
- package/scripts/hall-preview/fixtures/me.json +0 -476
- package/scripts/hall-preview/fixtures/me__art-key__own.json +0 -6
- package/scripts/hall-preview/fixtures/me__event-sound-prefs.json +0 -209
- package/scripts/hall-preview/fixtures/me__recent-ships.json +0 -304
- package/scripts/hall-preview/fixtures/me__render.json +0 -5
- package/scripts/hall-preview/fixtures/me__skill-prefs.json +0 -143
- package/scripts/hall-preview/fixtures/me__sound-prefs.json +0 -67
- package/scripts/hall-preview/fixtures/me__wandering.json +0 -43
- package/scripts/hall-preview/fixtures/override-requests.json +0 -15
- package/scripts/hall-preview/fixtures/provisioning__fleet.json +0 -1
- package/scripts/hall-preview/fixtures/provisioning__fleet__cost-ledger.json +0 -1
- package/scripts/hall-preview/fixtures/provisioning__instances.json +0 -1
- package/scripts/hall-preview/fixtures/public__analytics__ecosystem.json +0 -516
- package/scripts/hall-preview/fixtures/public__bounty-table.json +0 -37
- package/scripts/hall-preview/fixtures/public__cost-summary.json +0 -742
- package/scripts/hall-preview/fixtures/public__estimation-drift.json +0 -41
- package/scripts/hall-preview/fixtures/public__grades.json +0 -50
- package/scripts/hall-preview/fixtures/public__progress.json +0 -124
- package/scripts/hall-preview/fixtures/public__recent-shipped.json +0 -426
- package/scripts/hall-preview/fixtures/public__repo-health.json +0 -160
- package/scripts/hall-preview/fixtures/public__repo-info.json +0 -5
- package/scripts/hall-preview/fixtures/security__docs.json +0 -10
- package/scripts/hall-preview/fixtures/security__reports.json +0 -31
- package/scripts/hall-preview/fixtures/sessions__search.json +0 -9
- package/scripts/hall-preview/fixtures/tasks.json +0 -2420
- package/scripts/hall-preview/fixtures/tasks__claimable.json +0 -2555
- package/scripts/hall-preview/fixtures/tasks__detail.json +0 -111
- package/scripts/hall-preview/fixtures/tasks__peer-votes__feed.json +0 -330
- package/scripts/hall-preview/fixtures/versions.json +0 -89
|
@@ -1,2420 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"tasks": [
|
|
3
|
-
{
|
|
4
|
-
"id": "640",
|
|
5
|
-
"version_id": "V2",
|
|
6
|
-
"title": "Palette overhaul: replace Mediterranean palette with Poke Mart blue + container red/black for interior and exterior",
|
|
7
|
-
"description": "## Summary\n\nThe current locked art palette is Mediterranean (olive greens, warm tans, turquoise sea — extracted from FireRed screenshots). The reference images confirm the actual target palette is substantially different and needs a new extraction pass and palette decision before interior/exterior art work begins.\n\n## What the reference images show\n\n### Interior palette\n- **Floor**: blue wave-checkerboard pattern (the iconic Poke Mart floor) — a mid-blue with a lighter blue wave overlay tile\n- **Shelving/counters**: white or near-white with dark outlines\n- **Walls**: light grey or cream — neutral so product stands out\n- **Accent**: warm lamp lighting in luxury boutique references, track lighting highlights\n\n### Exterior palette\n- **Primary container colour**: bold red (exterior1 reference) OR matte charcoal/black (exterior4 reference) — both valid, one needs to be chosen as the canonical container colour\n- **Glass panels**: light blue-grey with white highlight strip — large proportion of the facade\n- **Trim/frame**: dark metal (black or dark grey)\n- **Ground/approach**: stone paving or sand approach path\n\n### What this means for the pipeline\n- The 64-colour Mediterranean palette locked in `art/template/palette.json` was extracted from FireRed screenshots. It does not contain the blues needed for the Poke Mart floor, the reds/blacks for the container exterior, or the whites for the interior shelving.\n- A new palette extraction pass is required against Pokémon Emerald Poke Mart screenshots + the concept art reference images.\n- This is a **breaking change** to existing generated tiles — any tile already generated against the old palette will look inconsistent with new tiles generated against the new one.\n- A migration plan (audit existing tiles, identify which need re-gen, batch re-gen pass) should accompany the palette change.\n\n## Decision needed\n1. Red container or black container as the canonical exterior? (Both references are compelling — red is warmer and more recognizable as a shipping container; black is more premium/luxury.)\n2. Does the old Mediterranean palette get retired entirely, or does it survive for exterior world tiles (grass, sand, sea) while the new palette covers the container building and interior?\n\n---\nPromoted from idea_inbox #159 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
8
|
-
"status": "ready",
|
|
9
|
-
"touches": [
|
|
10
|
-
"migrations/"
|
|
11
|
-
],
|
|
12
|
-
"est_minutes": 120,
|
|
13
|
-
"est_cost_usd": null,
|
|
14
|
-
"manual_degree": null,
|
|
15
|
-
"priority": 1,
|
|
16
|
-
"automation_tag": null,
|
|
17
|
-
"credits_reward": 6,
|
|
18
|
-
"source": "idea_inbox",
|
|
19
|
-
"source_ref": "idea:159",
|
|
20
|
-
"promoted_at": null,
|
|
21
|
-
"shipped_at": null,
|
|
22
|
-
"shipped_by": null,
|
|
23
|
-
"value_summary": null,
|
|
24
|
-
"created_at": "2026-06-04T22:07:50.721Z",
|
|
25
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
26
|
-
"kind": "decision",
|
|
27
|
-
"parent_task_id": null,
|
|
28
|
-
"actual_minutes": null,
|
|
29
|
-
"scoping_confidence": null,
|
|
30
|
-
"discipline": "unclassified",
|
|
31
|
-
"parallel_safe": null,
|
|
32
|
-
"newcomer_friendly": false,
|
|
33
|
-
"requires_rank": "metic",
|
|
34
|
-
"needs_migration": true,
|
|
35
|
-
"security_sensitive": false,
|
|
36
|
-
"sandbox_review": null,
|
|
37
|
-
"goal_id": "6",
|
|
38
|
-
"module_key": null,
|
|
39
|
-
"reward_gate_exempt": true,
|
|
40
|
-
"credits_awarded": 0,
|
|
41
|
-
"est_minutes_calibrated": 12
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"id": "642",
|
|
45
|
-
"version_id": "V2",
|
|
46
|
-
"title": "Interior layout: blue wave-checkerboard floor, perimeter shelving, center display tables, rear counter — luxury Poke Mart",
|
|
47
|
-
"description": "## Summary\n\nThe interior layout combines the iconic Pokémon Emerald Poke Mart floor plan with luxury boutique retail principles: open center floor with the signature blue wave-checkerboard tile, shelving units along the perimeter walls, free-standing display tables in the center, and the counter clerk at the rear.\n\n## Layout (top-down, Pokémon Emerald perspective)\n\n```\n┌─────────────────────────────────┐\n│ [shelf] [shelf] [shelf] │\n│ │\n│ [display table] [display] │\n│ │\n│ [display table] │\n│ │\n│ [counter] [counter] [counter] │\n│ (clerk NPC here) │\n└────────[glass doors]────────────┘\n ↑ player enters here\n```\n\n- **Floor**: blue wave-checkerboard tile (the Poke Mart signature) covering the entire interior\n- **Perimeter shelving**: white shelving units against left, right, and rear walls — items displayed on them\n- **Center display tables**: 1–2 free-standing display tables in the open floor area — used for featured/hero items\n- **Counter**: rear wall, full-width counter behind which the clerk NPC stands\n- **Entrance**: bottom of the map (south wall), the glass doors open into this space\n- **Ceiling**: double-height where possible — the container interior references show tall ceilings as a key luxury signal\n- **Lighting**: warm track lighting pointed at shelves and display tables (visible as tile-level light highlight overlays)\n\n## Luxury boutique principles applied\n\nFrom the interior3 and interiorShelving1 references:\n- Items have breathing room — not packed together\n- Product is displayed like sculpture, not like grocery stock\n- The space itself is part of the product experience — the floor, the light, the architecture are all premium signals\n- Less is more: fewer items displayed more beautifully beats a fully-stocked Poke Mart wall\n\n## Tile assets needed (interior family)\n\n- Blue wave-checkerboard floor tile (the most important single tile in the project)\n- White shelving unit (wall-mounted, multiple fill states: empty, stocked, featured)\n- Counter tile (rear, clerk-side + player-side variants)\n- Display table tile (free-standing, object overlay)\n- Interior wall tile (light grey/cream, with wainscoting detail)\n- Track lighting ceiling tile or overlay\n- Interior door frame tiles (where glass doors meet interior floor)\n\n---\nPromoted from idea_inbox #161 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
48
|
-
"status": "ready",
|
|
49
|
-
"touches": [],
|
|
50
|
-
"est_minutes": 120,
|
|
51
|
-
"est_cost_usd": null,
|
|
52
|
-
"manual_degree": null,
|
|
53
|
-
"priority": 1,
|
|
54
|
-
"automation_tag": null,
|
|
55
|
-
"credits_reward": 6,
|
|
56
|
-
"source": "idea_inbox",
|
|
57
|
-
"source_ref": "idea:161",
|
|
58
|
-
"promoted_at": null,
|
|
59
|
-
"shipped_at": null,
|
|
60
|
-
"shipped_by": null,
|
|
61
|
-
"value_summary": null,
|
|
62
|
-
"created_at": "2026-06-04T22:07:51.589Z",
|
|
63
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
64
|
-
"kind": "feature",
|
|
65
|
-
"parent_task_id": null,
|
|
66
|
-
"actual_minutes": null,
|
|
67
|
-
"scoping_confidence": null,
|
|
68
|
-
"discipline": "unclassified",
|
|
69
|
-
"parallel_safe": null,
|
|
70
|
-
"newcomer_friendly": false,
|
|
71
|
-
"requires_rank": "xenos",
|
|
72
|
-
"needs_migration": false,
|
|
73
|
-
"security_sensitive": false,
|
|
74
|
-
"sandbox_review": null,
|
|
75
|
-
"goal_id": "6",
|
|
76
|
-
"module_key": null,
|
|
77
|
-
"reward_gate_exempt": true,
|
|
78
|
-
"credits_awarded": 0,
|
|
79
|
-
"est_minutes_calibrated": 9
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
"id": "644",
|
|
83
|
-
"version_id": "V2",
|
|
84
|
-
"title": "Poke Mart floor tile: blue aqua-tinted wave-scale pattern — pixel-precise spec, the single most important interior tile",
|
|
85
|
-
"description": "## Summary\n\nThe single most important tile in the interior: the Pokémon Emerald Poke Mart floor. This brief isolates it completely and describes it with enough precision to generate it directly.\n\n---\n\n## What the reference images show\n\n### graphics2.png (FireRed/FRLG Poke Mart interior)\nThe floor is a specific shade of **medium royal blue** — not navy, not sky blue, not teal. A clean, saturated mid-blue that reads as bright and welcoming, like a tiled public building. The pattern is **NOT a checkerboard**. It is a **scale/wave pattern** — overlapping scallop shapes, like fish scales or roof tiles, arranged in a grid. Each scale is approximately 8–10 pixels wide in the original game's 16px tile grid, meaning at 32×32 it would be roughly 16–20 pixels per scale unit.\n\nThe scales have:\n- A darker blue outline/edge (1px, bottom and right of each scale)\n- A lighter blue highlight at the top of each scale (1px, catches overhead light)\n- The base fill is the mid-blue\n\n### graphics3.png (Pokémon Emerald Poke Mart interior)\nThe Emerald version is subtly different from FireRed:\n- The blue has a very slight **aqua/teal shift** — warmer and more nuanced than FireRed's pure mid-blue\n- The scale pattern is the same structure but the colour temperature makes it feel slightly more premium\n- This Emerald variant is the target, not the FireRed version\n\n---\n\n## Pixel art tile spec — Poke Mart floor (32×32)\n\n### Colour values (approximate, pending final palette extraction)\n- Base fill: mid-blue, slight aqua lean (~#5B8FD4 or similar — needs precise extraction from Emerald screenshots)\n- Scale highlight: 1 shade lighter (~#7AAEE8)\n- Scale shadow/outline: 1 shade darker (~#3B6CB0)\n- Deepest shadow (very subtle, at scale junction): 2 shades darker, only 1px\n\n### Pattern structure\nThe 32×32 tile contains a **4×4 grid of scale units**, each 8×8 pixels:\n- Each 8×8 unit: top 2px = highlight strip (lighter blue), middle 4px = base fill, bottom 2px = shadow strip (darker blue), left and right edges blend into adjacent scales\n- The scales in even rows are offset by 4px horizontally from scales in odd rows (brick-offset, not grid-aligned) — this is what creates the fish-scale/wave appearance rather than a plain stripe\n\n### Tileable requirement\nThe tile must be **seamlessly tileable** — when 4 copies are placed 2×2, no seam or repeat pattern should be visible at a glance. The scale offset handles most of this naturally.\n\n### What makes it iconic\nThis floor tile is arguably the most recognizable interior element in the entire project. Players who grew up with Pokémon will feel the nostalgia the instant they see it — before they read any dialogue, before they see any item, before they meet any NPC. **This tile is the emotional trigger.** It must be executed with precision. No approximation.\n\n---\n\n## Mood target\n\nBright. Clean. Welcoming. The blue reads as trustworthy — like a pharmacy or a well-lit shop. It should not look muddy, not look cold, not look grey. It is the colour of a place where good things are available to you.\n\n---\nPromoted from idea_inbox #163 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
86
|
-
"status": "ready",
|
|
87
|
-
"touches": [],
|
|
88
|
-
"est_minutes": 120,
|
|
89
|
-
"est_cost_usd": null,
|
|
90
|
-
"manual_degree": null,
|
|
91
|
-
"priority": 1,
|
|
92
|
-
"automation_tag": null,
|
|
93
|
-
"credits_reward": 6,
|
|
94
|
-
"source": "idea_inbox",
|
|
95
|
-
"source_ref": "idea:163",
|
|
96
|
-
"promoted_at": null,
|
|
97
|
-
"shipped_at": null,
|
|
98
|
-
"shipped_by": null,
|
|
99
|
-
"value_summary": null,
|
|
100
|
-
"created_at": "2026-06-04T22:07:52.347Z",
|
|
101
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
102
|
-
"kind": "feature",
|
|
103
|
-
"parent_task_id": null,
|
|
104
|
-
"actual_minutes": null,
|
|
105
|
-
"scoping_confidence": null,
|
|
106
|
-
"discipline": "unclassified",
|
|
107
|
-
"parallel_safe": null,
|
|
108
|
-
"newcomer_friendly": false,
|
|
109
|
-
"requires_rank": "xenos",
|
|
110
|
-
"needs_migration": false,
|
|
111
|
-
"security_sensitive": false,
|
|
112
|
-
"sandbox_review": null,
|
|
113
|
-
"goal_id": "6",
|
|
114
|
-
"module_key": null,
|
|
115
|
-
"reward_gate_exempt": true,
|
|
116
|
-
"credits_awarded": 0,
|
|
117
|
-
"est_minutes_calibrated": 9
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
"id": "587",
|
|
121
|
-
"version_id": "V2",
|
|
122
|
-
"title": "Run player_walk family pipeline (AI walk-frame generation) + publish atlas/manifest",
|
|
123
|
-
"description": "Promoted from idea_inbox #26 during /idea-triage 2026-06-03. See the idea body for full context.",
|
|
124
|
-
"status": "ready",
|
|
125
|
-
"touches": [
|
|
126
|
-
"public/assets/tiles/"
|
|
127
|
-
],
|
|
128
|
-
"est_minutes": 60,
|
|
129
|
-
"est_cost_usd": null,
|
|
130
|
-
"manual_degree": null,
|
|
131
|
-
"priority": 2,
|
|
132
|
-
"automation_tag": null,
|
|
133
|
-
"credits_reward": 30,
|
|
134
|
-
"source": "idea_inbox",
|
|
135
|
-
"source_ref": "idea:26",
|
|
136
|
-
"promoted_at": null,
|
|
137
|
-
"shipped_at": null,
|
|
138
|
-
"shipped_by": null,
|
|
139
|
-
"value_summary": null,
|
|
140
|
-
"created_at": "2026-06-03T19:26:51.982Z",
|
|
141
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
142
|
-
"kind": "feature",
|
|
143
|
-
"parent_task_id": null,
|
|
144
|
-
"actual_minutes": null,
|
|
145
|
-
"scoping_confidence": null,
|
|
146
|
-
"discipline": "engineer",
|
|
147
|
-
"parallel_safe": null,
|
|
148
|
-
"newcomer_friendly": false,
|
|
149
|
-
"requires_rank": "xenos",
|
|
150
|
-
"needs_migration": false,
|
|
151
|
-
"security_sensitive": false,
|
|
152
|
-
"sandbox_review": null,
|
|
153
|
-
"goal_id": "6",
|
|
154
|
-
"module_key": null,
|
|
155
|
-
"reward_gate_exempt": true,
|
|
156
|
-
"credits_awarded": 0,
|
|
157
|
-
"est_minutes_calibrated": 5
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
"id": "630",
|
|
161
|
-
"version_id": "V2",
|
|
162
|
-
"title": "Art style direction: shift reference from Pokemon FireRed to Pokemon Emerald",
|
|
163
|
-
"description": "## Summary\n\nShift the canonical art style reference from Pokémon FireRed to **Pokémon Emerald**. This is a foundational change to the art pipeline's style guide, rubric, and reference corpus.\n\n## What changes\n\n- Replace the 24 FireRed map screenshots in `art/references/pokemon-firered/` with Emerald equivalents (or augment with Emerald references as the dominant weight).\n- Re-extract the 64-color locked palette from the Emerald corpus — Emerald uses a richer, slightly cooler palette with more contrast and saturation than FireRed.\n- Update `art/template/style_guide.md` to describe Emerald's aesthetic: more detailed tile interiors, richer shadow work, cleaner gradients, more animation frames per sprite.\n- Re-score the rubric criteria against Emerald samples so the reviewer grades against the right target.\n- The overall feel target: Pokémon Emerald's visual richness blended with a luxury-minimalist sensibility — full of life but never cluttered.\n\n## Why Emerald over FireRed\n\nThe project's setting is an interior retail space (shipping container as Poke Mart). Emerald's interior tilesets are significantly more detailed and atmospheric than FireRed's. Emerald also introduced richer NPC animation, better lighting simulation in tiles, and more sophisticated use of shadow — all directly applicable to this project's goals.\n\n## Risk\n\nThe current art pipeline has generated tiles against the FireRed reference. Switching references will make existing tiles look inconsistent with new ones until a re-generation pass is run. A migration plan (re-gen pass on key tiles before V2 ships new content) should accompany this change.\n\n---\nPromoted from idea_inbox #149 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
164
|
-
"status": "ready",
|
|
165
|
-
"touches": [
|
|
166
|
-
"art/generated/tiles/scene_villager_elder.png",
|
|
167
|
-
"art/generated/tiles/scene_villager_man.png",
|
|
168
|
-
"art/generated/tiles/scene_villager_woman.png",
|
|
169
|
-
"art/generated/tiles/villager_elder.png",
|
|
170
|
-
"art/generated/tiles/villager_man.png",
|
|
171
|
-
"art/generated/tiles/villager_woman.png",
|
|
172
|
-
"art/pipeline/autotile_orchestrator.py",
|
|
173
|
-
"art/pipeline/family_generator.py",
|
|
174
|
-
"art/pipeline/family_review.py",
|
|
175
|
-
"art/pipeline/generators/ai_biome.py",
|
|
176
|
-
"art/pipeline/orchestrator.py",
|
|
177
|
-
"art/pipeline/scene_inventory_diff.py",
|
|
178
|
-
"art/pipeline/world_scorer.py",
|
|
179
|
-
"art/template/families.json",
|
|
180
|
-
"art/template/newcomer-prompts.json",
|
|
181
|
-
"art/template/rubric.json",
|
|
182
|
-
"art/template/style_guide.md",
|
|
183
|
-
"art/template/tile_index.json",
|
|
184
|
-
"art/template/vocabulary.json",
|
|
185
|
-
"art/template/world_rubric.json",
|
|
186
|
-
"docs/adr/0084-art-reference-firered-to-emerald.md",
|
|
187
|
-
"public/assets/tiles/atlas-d8b518d2.png",
|
|
188
|
-
"public/assets/tiles/manifest.json",
|
|
189
|
-
"public/assets/tiles/objects/scene_villager_elder.png",
|
|
190
|
-
"public/assets/tiles/objects/scene_villager_man.png",
|
|
191
|
-
"public/assets/tiles/objects/scene_villager_woman.png",
|
|
192
|
-
"public/assets/tiles/sprites/villager_elder.png",
|
|
193
|
-
"public/assets/tiles/sprites/villager_man.png",
|
|
194
|
-
"public/assets/tiles/sprites/villager_woman.png",
|
|
195
|
-
"public/game/scenes/beachScene.js"
|
|
196
|
-
],
|
|
197
|
-
"est_minutes": 120,
|
|
198
|
-
"est_cost_usd": null,
|
|
199
|
-
"manual_degree": null,
|
|
200
|
-
"priority": 2,
|
|
201
|
-
"automation_tag": null,
|
|
202
|
-
"credits_reward": 6,
|
|
203
|
-
"source": "idea_inbox",
|
|
204
|
-
"source_ref": "idea:149",
|
|
205
|
-
"promoted_at": null,
|
|
206
|
-
"shipped_at": null,
|
|
207
|
-
"shipped_by": null,
|
|
208
|
-
"value_summary": "The world's art now takes its cues from Pokemon Emerald instead of FireRed - richer, more detailed tiles and shadows better suited to a discovered-relic boutique. This sets the direction; the full art refresh follows once we pick the reference set.",
|
|
209
|
-
"created_at": "2026-06-04T22:07:46.533Z",
|
|
210
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
211
|
-
"kind": "decision",
|
|
212
|
-
"parent_task_id": null,
|
|
213
|
-
"actual_minutes": 83,
|
|
214
|
-
"scoping_confidence": null,
|
|
215
|
-
"discipline": "unclassified",
|
|
216
|
-
"parallel_safe": null,
|
|
217
|
-
"newcomer_friendly": false,
|
|
218
|
-
"requires_rank": "metic",
|
|
219
|
-
"needs_migration": true,
|
|
220
|
-
"security_sensitive": false,
|
|
221
|
-
"sandbox_review": {
|
|
222
|
-
"at": "2026-06-23T18:22:18.350843-04:00",
|
|
223
|
-
"by": "IAMMASTERQUA",
|
|
224
|
-
"url": null,
|
|
225
|
-
"stamp": "14628e0131416c9dd8153920964fb80d5071c186ff6ec158aab35c6ba19ec605",
|
|
226
|
-
"method": "flag"
|
|
227
|
-
},
|
|
228
|
-
"goal_id": "6",
|
|
229
|
-
"module_key": null,
|
|
230
|
-
"reward_gate_exempt": true,
|
|
231
|
-
"credits_awarded": 0,
|
|
232
|
-
"est_minutes_calibrated": 12
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
"id": "631",
|
|
236
|
-
"version_id": "V2",
|
|
237
|
-
"title": "Terrain movement feedback: distinct walk/run animations per surface type (sand, grass, stone)",
|
|
238
|
-
"description": "## Summary\n\nWalking and running on different terrain types should produce distinct visual feedback animations — matching the feel of Pokémon Emerald where movement *feels* like the surface you're on.\n\n## Behaviour spec\n\n- **Walking on sand**: player sprite uses a heavier foot-lift animation; small dust/sand particle puff on each step.\n- **Running on sand**: faster cycle, larger sand spray particles, slight screen wobble or sprite bob.\n- **Walking on grass**: subtle grass-rustle frame overlay on tiles the player passes through; softer step animation.\n- **Running on grass**: grass tiles animate a wake behind the player (2–3 tile trail of rustling frames); more pronounced sprite lean.\n- **Walking on stone/marble path**: crisp step, no particle — the surface is hard and clean.\n- **Running on stone/marble**: same as walk but faster cycle; optional subtle echo sound cue.\n\n## Why this matters\n\nTerrain feedback is what makes a tile-based world feel *alive* rather than like a grid of images. Emerald's grass-rustle effect is one of the most remembered sensory details from that game. Replicating and expanding it to all surface types gives Amazonprimea that same quality of presence.\n\n## Implementation notes\n\n- Particle/overlay effects are client-side only (Phaser emitters or tile-layer overlays).\n- Server does not need to know terrain type for this — client already has the terrain grid.\n- Animation frames for sand and grass overlays need new art assets (families, not singletons).\n- Should be gated by a client-side performance check — low-end devices can disable particles.\n\n---\nPromoted from idea_inbox #150 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
239
|
-
"status": "ready",
|
|
240
|
-
"touches": [],
|
|
241
|
-
"est_minutes": 120,
|
|
242
|
-
"est_cost_usd": null,
|
|
243
|
-
"manual_degree": null,
|
|
244
|
-
"priority": 2,
|
|
245
|
-
"automation_tag": null,
|
|
246
|
-
"credits_reward": 6,
|
|
247
|
-
"source": "idea_inbox",
|
|
248
|
-
"source_ref": "idea:150",
|
|
249
|
-
"promoted_at": null,
|
|
250
|
-
"shipped_at": null,
|
|
251
|
-
"shipped_by": null,
|
|
252
|
-
"value_summary": "Explore a much bigger world — beach, meadows, a marble town square and its roads — and hold Shift to run. The ground now reacts under your feet: sand kicks up dust, grass rustles as you pass, stone stays crisp. Walking is also a little slower and more deliberate.",
|
|
253
|
-
"created_at": "2026-06-04T22:07:46.946Z",
|
|
254
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
255
|
-
"kind": "feature",
|
|
256
|
-
"parent_task_id": null,
|
|
257
|
-
"actual_minutes": 40,
|
|
258
|
-
"scoping_confidence": null,
|
|
259
|
-
"discipline": "unclassified",
|
|
260
|
-
"parallel_safe": null,
|
|
261
|
-
"newcomer_friendly": false,
|
|
262
|
-
"requires_rank": "xenos",
|
|
263
|
-
"needs_migration": false,
|
|
264
|
-
"security_sensitive": false,
|
|
265
|
-
"sandbox_review": null,
|
|
266
|
-
"goal_id": "6",
|
|
267
|
-
"module_key": null,
|
|
268
|
-
"reward_gate_exempt": true,
|
|
269
|
-
"credits_awarded": 0,
|
|
270
|
-
"est_minutes_calibrated": 9
|
|
271
|
-
},
|
|
272
|
-
{
|
|
273
|
-
"id": "634",
|
|
274
|
-
"version_id": "V2",
|
|
275
|
-
"title": "NPC system: counter clerk, ambient NPCs, and lore helper with full Emerald-style dialogue",
|
|
276
|
-
"description": "## Summary\n\nA full NPC system for the interior and exterior: counter staff, ambient NPCs (other shoppers/townsfolk), and a lore helper NPC who introduces the player to the world of Amazonprimea.\n\n## NPC types\n\n### Counter clerk (interior)\n- Stands behind the shop counter.\n- Dialogue: welcomes the player, explains the shop, initiates purchase flows.\n- Sprite: pixel art character in a uniform or ancient-Greek retail attire — styled to match the luxury-minimalist aesthetic.\n- Has multiple dialogue states: greeting (first visit), help (explains items), transaction (during purchase), farewell.\n\n### Ambient NPCs (interior + exterior)\n- 2–4 other characters moving through the space or standing idle.\n- Not interactive in V1 of this feature — just add life to the environment.\n- Exterior: Greek townspeople, fishermen, curious locals.\n- Interior: other shoppers browsing shelves.\n\n### Lore helper NPC (exterior, near the container)\n- A quirky, memorable character who delivers the world's backstory.\n- Explains: what Amazonprimea is, who Hermes is, why the container is here, what the player can do inside.\n- Dialogue is written to feel mythic and slightly tongue-in-cheek — not dry tutorial text.\n- Could be a wandering philosopher, a dockworker, or a herald of Hermes.\n\n## Dialogue system\n\n- Pokémon Emerald-style dialogue box: bottom of screen, portrait on left, text scrolls in.\n- Player presses interact key to advance lines.\n- Branching dialogue for the counter clerk (choose what you need help with).\n- All dialogue written to reinforce the brand tone: discovered secret, ancient wisdom, underground luxury.\n\n## Why this matters\n\nNPCs are what make a world feel inhabited. Without them the container is just a building. The lore helper NPC in particular is the project's voice — the character through whom the brand's entire story is delivered in 30 seconds of play.\n\n---\nPromoted from idea_inbox #153 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
277
|
-
"status": "ready",
|
|
278
|
-
"touches": [],
|
|
279
|
-
"est_minutes": 120,
|
|
280
|
-
"est_cost_usd": null,
|
|
281
|
-
"manual_degree": null,
|
|
282
|
-
"priority": 2,
|
|
283
|
-
"automation_tag": null,
|
|
284
|
-
"credits_reward": 6,
|
|
285
|
-
"source": "idea_inbox",
|
|
286
|
-
"source_ref": "idea:153",
|
|
287
|
-
"promoted_at": null,
|
|
288
|
-
"shipped_at": null,
|
|
289
|
-
"shipped_by": null,
|
|
290
|
-
"value_summary": null,
|
|
291
|
-
"created_at": "2026-06-04T22:07:48.159Z",
|
|
292
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
293
|
-
"kind": "feature",
|
|
294
|
-
"parent_task_id": null,
|
|
295
|
-
"actual_minutes": null,
|
|
296
|
-
"scoping_confidence": null,
|
|
297
|
-
"discipline": "unclassified",
|
|
298
|
-
"parallel_safe": null,
|
|
299
|
-
"newcomer_friendly": false,
|
|
300
|
-
"requires_rank": "xenos",
|
|
301
|
-
"needs_migration": false,
|
|
302
|
-
"security_sensitive": false,
|
|
303
|
-
"sandbox_review": null,
|
|
304
|
-
"goal_id": "6",
|
|
305
|
-
"module_key": null,
|
|
306
|
-
"reward_gate_exempt": true,
|
|
307
|
-
"credits_awarded": 0,
|
|
308
|
-
"est_minutes_calibrated": 9
|
|
309
|
-
},
|
|
310
|
-
{
|
|
311
|
-
"id": "646",
|
|
312
|
-
"version_id": "V2",
|
|
313
|
-
"title": "NPC sprite brief: counter clerk in luxury smock, lore herald with caduceus, ambient shoppers — Emerald proportions + boutique aesthetic",
|
|
314
|
-
"description": "## Summary\n\nA pixel art character brief for the interior NPCs — counter clerk and ambient shoppers — drawn from the Pokémon Emerald sprite style in graphics3.png and the luxury boutique aesthetic from interior3.png and interiorShelving1.png.\n\n---\n\n## What the reference images show\n\n### graphics3.png (Pokémon Emerald Poke Mart — NPC reference)\nThe Emerald Poke Mart has two distinct NPC types visible:\n\n**Counter clerks** (behind the desk):\n- Wear a **blue/indigo uniform** — a collared shirt or smock in a deep blue-purple tone. Not navy, closer to a medium indigo.\n- Short hair, simple face — 2 pixels for eyes, 1 pixel for mouth, small nose hint. No individual features, just enough to read as a person.\n- Facing the player (south-facing sprite) — arms at sides or slightly in front as if resting on the counter.\n- The uniform colour makes them immediately readable as staff — you know who to talk to.\n- Proportions: classic Pokémon Emerald — head is roughly 40% of total body height. Arms are visible but stubby. No hands detailed, just arm shapes.\n\n**Ambient NPCs** (shoppers in the room):\n- Varied colour clothing — the NPC in the middle of graphics3 wears a hat and lighter clothing.\n- Facing various directions — they are not all facing the player.\n- Same proportions as the clerk but no uniform — coloured tops, varying hair.\n- Simple walk cycles: Emerald NPCs have a 2–4 frame walk (left foot, neutral, right foot, neutral).\n\n---\n\n## Luxury overlay — from interior3.png and interiorShelving1.png\n\nThe Emerald sprite style is the technical reference but the clothing and attitude comes from the luxury boutique references:\n\n**Counter clerk — the Off the Boats version**:\n- **Uniform**: a simple, clean smock or apron in **cream/off-white** with a single accent colour (either the container red or a deep indigo — matching the Poke Mart clerk's blue). Think: the kind of uniform a barista at a premium coffee shop or an Apple Store employee wears — minimal, intentional.\n- **Name tag**: a 2×4 pixel white rectangle on the chest — just enough to read as a name tag, no text needed at this resolution.\n- **Hair**: kept, tidy. Not elaborate. Suggest a bun or short cut — the kind of hair that reads as \"professional and approachable.\"\n- **Expression**: slight forward lean suggests engagement. This is a helpful person, not a bored checkout operator.\n- **Animation**: 2 idle frames (very slight bob or blink), 1 talking frame (mouth opens slightly, minor body tilt toward player).\n\n**Lore helper NPC — the philosopher/herald**:\n- Ancient Greek aesthetic: a simple chiton or tunic (cream/natural linen colour), belted at the waist.\n- **Distinctive feature**: a caduceus detail (staff of Hermes) — this marks them as a messenger/herald. In pixel art: a small 4×8 pixel brown vertical line with two tiny wing pixels at the top.\n- Older — slightly wider base sprite, suggesting a rounder, elder character. Not threatening, wise.\n- Could wear a sun hat or a simple wreath crown — 2–3 pixels of olive green arc at the top of the head.\n- Wanders the exterior area, stops to face the player when in range.\n\n**Ambient shoppers (interior)**:\n- Modern-dressed — not ancient Greek, not uniformed. Casual luxury: minimal palette clothing (white, cream, black, one accent colour per NPC).\n- 3–4 variants, each with a different clothing colour combination.\n- Slow wander cycle — they browse, they stop, they look at shelves.\n\n---\n\n## Sprite sheet structure (per character, Emerald convention)\n\nEach character needs 4 directions × 3 frames = 12 total frames:\n- North (walking away), South (walking toward player), East, West\n- Frame 1: left foot forward, Frame 2: neutral/stand, Frame 3: right foot forward\n- Plus 1 additional idle \"breathing\" frame (very slight torso shift, 1px down) = 13 frames per character\n\nAt 32×32 pixels per sprite (matching tile size), the full character sprite sheet is 13 × 32px wide by 32px tall.\n\n---\n\n## Mood target\n\nThe clerk is the face of Hermeslines. They should read immediately as: **helpful, trustworthy, and slightly special** — not a generic shop worker, not a dressed-up avatar. The lore helper should read as: **ancient, a little mysterious, completely comfortable in their own skin**. Both characters should feel like they belong in both a Pokémon game AND a luxury boutique simultaneously — which is exactly where you are.\n\n---\nPromoted from idea_inbox #165 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
315
|
-
"status": "ready",
|
|
316
|
-
"touches": [],
|
|
317
|
-
"est_minutes": 120,
|
|
318
|
-
"est_cost_usd": null,
|
|
319
|
-
"manual_degree": null,
|
|
320
|
-
"priority": 2,
|
|
321
|
-
"automation_tag": null,
|
|
322
|
-
"credits_reward": 6,
|
|
323
|
-
"source": "idea_inbox",
|
|
324
|
-
"source_ref": "idea:165",
|
|
325
|
-
"promoted_at": null,
|
|
326
|
-
"shipped_at": null,
|
|
327
|
-
"shipped_by": null,
|
|
328
|
-
"value_summary": null,
|
|
329
|
-
"created_at": "2026-06-04T22:07:53.135Z",
|
|
330
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
331
|
-
"kind": "feature",
|
|
332
|
-
"parent_task_id": null,
|
|
333
|
-
"actual_minutes": null,
|
|
334
|
-
"scoping_confidence": null,
|
|
335
|
-
"discipline": "unclassified",
|
|
336
|
-
"parallel_safe": null,
|
|
337
|
-
"newcomer_friendly": false,
|
|
338
|
-
"requires_rank": "xenos",
|
|
339
|
-
"needs_migration": false,
|
|
340
|
-
"security_sensitive": false,
|
|
341
|
-
"sandbox_review": null,
|
|
342
|
-
"goal_id": "6",
|
|
343
|
-
"module_key": null,
|
|
344
|
-
"reward_gate_exempt": true,
|
|
345
|
-
"credits_awarded": 0,
|
|
346
|
-
"est_minutes_calibrated": 9
|
|
347
|
-
},
|
|
348
|
-
{
|
|
349
|
-
"id": "647",
|
|
350
|
-
"version_id": "V2",
|
|
351
|
-
"title": "Overworld exterior brief: Emerald-style grass/sand/sea tiles, olive trees, ruins, coastal Mediterranean world with container as centrepiece",
|
|
352
|
-
"description": "## Summary\n\nA detailed pixel art brief for the overworld exterior — the world the player walks through before reaching the container building — drawn from graphics1.png (Pokémon Emerald overworld) and the Mediterranean coastal setting described in the project lore.\n\n---\n\n## What graphics1.png shows\n\n### Terrain\n- **Grass**: medium-saturated green, clearly distinct from paths. Emerald's grass has a subtle darker-green shadow on the lower-left of each grass tile and a lighter highlight toward the upper-right. Not a flat fill — there is implied light direction. At 32×32, expect 3–4 subtle shade variations within a single grass tile.\n- **Paths/roads**: light tan/beige — the same light sandy colour that reads as packed earth or stone in ancient Greek context. Perfectly tileable. Emerald paths have a very subtle horizontal grain (2px lighter strip every 8px suggesting stone flags or packed earth ridges).\n- **Grass-path edge**: this is where the autotile system earns its keep. The Emerald overworld shows smooth curved transitions from grass to path — no jagged pixel stairstepping. The corner tiles have a rounded grass edge meeting the path beneath.\n\n### Trees\n- **Silhouette**: round, almost circular dark green canopy — like a lollipop from above. This is the top-down view of a tree.\n- **Colour**: dark forest green for the main canopy mass, with a lighter bright green highlight on the upper-left (light source from upper-left).\n- **Shadow**: a very subtle darker green or near-brown at the base of the canopy (the trunk junction and shadow on the ground).\n- **Pokémon Emerald distinction**: Emerald trees have slightly more detail than FireRed — an additional highlight pixel cluster on the upper-right of the canopy gives a rounder, more three-dimensional feel.\n\n### The Poke Mart building (exterior, top-down)\n- A small rectangular structure — roughly 4×3 tiles in the top-down view.\n- **Roof**: the most visible element from above. Emerald Poke Mart has a BLUE roof with a subtle darker edge at the perimeter (the overhanging eave). For our container building: the roof is flat container-coloured (red or black) with the corner castings as small dark squares.\n- **Facade**: only the front 1-tile strip of the building facade is visible from directly above. Shows the glass door and a strip of container wall.\n- **Entrance path**: a 1–2 tile approach strip of stone/paving directly in front of the building entrance, distinct from the surrounding path material.\n\n---\n\n## Coastal Mediterranean additions (beyond Pokémon Emerald)\n\nThe project world is ancient Greece on the coast — Emerald's inland-town overworld needs these additions:\n\n### Sea/water\n- **Colour**: deep Mediterranean turquoise-blue, distinct from the interior blue. Darker at distance, lighter near shore.\n- **Animation**: subtle wave shimmer — 2-frame tile cycle (standard Pokémon water tile approach). Upper frame: base turquoise with small white highlights. Lower frame: highlights shift 2px left and slightly fade.\n- **Shore edge**: sandy beach transition — the autotile system handles grass-to-sand, sand-to-sea edges with soft curves.\n\n### Sand/beach\n- **Colour**: warm tan (#C9A96E range) — not white, not orange. Sun-baked Mediterranean sand.\n- **Texture**: subtle — 3–4 very small (1px) darker tan dots scattered randomly within each tile suggesting grain. The pipeline's procedural pass handles this naturally.\n- **Sand-to-sea edge**: the wettest sand (dark wet sand, 1–2 shades darker, slightly cooler) sits in a 1-tile strip between the dry sand and the water.\n\n### Ruins / world details\n- **Stone ruins**: isolated column stumps, broken amphora, fallen marble blocks — all as object overlays on the grass/sand tiles. These are the world's ambient storytelling.\n- **Olive trees**: distinct from Pokémon's round canopy trees — elongated, slightly silver-green, with a more irregular silhouette. 2 tile tall (trunk tile + canopy tile). The canopy is oval, not perfectly round, with a grey-green colour (#8A9B6E range).\n\n---\n\n## Key tile assets needed (priority order for exterior overworld)\n\n1. **Grass tile** — Emerald style, light-directional shading (see above)\n2. **Sand tile** — warm tan, subtle grain texture\n3. **Stone path tile** — light beige, horizontal seam grain\n4. **Grass→path autotile set** — 16-tile blob set for edges and corners\n5. **Grass→sand autotile set** — same structure, different colour pair\n6. **Sand→sea autotile set** — beach edge transitions\n7. **Sea/water tile** — animated, 2-frame shimmer, Mediterranean turquoise\n8. **Round tree canopy tile** — Emerald-style, dark green with highlight\n9. **Olive tree tiles** — 2-part (trunk + oval grey-green canopy)\n10. **Stone ruin overlays** — column stump, amphora, marble block (3 variants)\n\n---\n\n## Mood target\n\nThe overworld should feel like a **discovered place** — not a tourist map, not a theme park. An ancient coast that has been here forever, with something new and strange sitting on the shore (the container building). The grass is lush, the sea is warm and blue, the ruins hint at what came before. And then there is the container — bold, red (or black), unmistakably modern, impossibly out of place in the best possible way. The contrast between ancient world and the container is the entire visual thesis of the game.\n\n---\nPromoted from idea_inbox #166 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
353
|
-
"status": "ready",
|
|
354
|
-
"touches": [],
|
|
355
|
-
"est_minutes": 120,
|
|
356
|
-
"est_cost_usd": null,
|
|
357
|
-
"manual_degree": null,
|
|
358
|
-
"priority": 2,
|
|
359
|
-
"automation_tag": null,
|
|
360
|
-
"credits_reward": 6,
|
|
361
|
-
"source": "idea_inbox",
|
|
362
|
-
"source_ref": "idea:166",
|
|
363
|
-
"promoted_at": null,
|
|
364
|
-
"shipped_at": null,
|
|
365
|
-
"shipped_by": null,
|
|
366
|
-
"value_summary": null,
|
|
367
|
-
"created_at": "2026-06-04T22:07:53.490Z",
|
|
368
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
369
|
-
"kind": "feature",
|
|
370
|
-
"parent_task_id": null,
|
|
371
|
-
"actual_minutes": null,
|
|
372
|
-
"scoping_confidence": null,
|
|
373
|
-
"discipline": "unclassified",
|
|
374
|
-
"parallel_safe": null,
|
|
375
|
-
"newcomer_friendly": false,
|
|
376
|
-
"requires_rank": "xenos",
|
|
377
|
-
"needs_migration": false,
|
|
378
|
-
"security_sensitive": false,
|
|
379
|
-
"sandbox_review": null,
|
|
380
|
-
"goal_id": "6",
|
|
381
|
-
"module_key": null,
|
|
382
|
-
"reward_gate_exempt": true,
|
|
383
|
-
"credits_awarded": 0,
|
|
384
|
-
"est_minutes_calibrated": 9
|
|
385
|
-
},
|
|
386
|
-
{
|
|
387
|
-
"id": "650",
|
|
388
|
-
"version_id": "V2",
|
|
389
|
-
"title": "Sealed ruins zones: three discoverable secret locations (treasure chest, ruins column, ladder) that unlock progressively on the world map",
|
|
390
|
-
"description": "## Summary\n\nThe world map concept shows at least three marked secret locations beyond the ship and container building — a treasure chest, a stone ruins column, and a ladder. These are the \"sealed ruins\" of the chart's title: discoverable zones that unlock over time as the player explores.\n\n## What the concept art shows\n\nScattered across the \"Sealed Ruins Chart\" parchment are small pixel art POI (point of interest) markers:\n- **Treasure chest** — centre-right of the map. Classic pixel art chest, brown with gold latch. 16×12 pixels.\n- **Stone ruins column** — left-centre. A broken or standing Greek column stump. 12×20 pixels, marble-white with grey shadow.\n- **Ladder** — right side. A simple wooden or stone ladder, suggesting a climbable surface or underground access point. 8×16 pixels.\n\nReference file: `art/references/concept-art-original/world-map/Map Item Pop Up Concept.webp`\n\n## The \"sealed\" mechanic\n\n\"Sealed Ruins Chart\" implies the map reveals itself progressively. On first opening:\n- The ship and container building are visible — these are known.\n- The three POI markers are present but their locations are marked with a seal/lock symbol rather than the full icon.\n- As the player visits and unlocks each location, the seal breaks and the full icon appears.\n- The swirling current arrows in the sealed areas are denser and more chaotic — the map is harder to read where the ruins are hidden.\n\n## The three zones — design sketch\n\n### Zone 1: The Chest — \"The Buried Manifest\"\n- A buried cache somewhere in the world — beneath sand or behind a rock formation.\n- Contains: a rare item, a lore scroll, or a product unlock (an exclusive item only available to players who find it).\n- Discovery method: an NPC gives a cryptic clue, or it's visible on the map only after talking to the lore herald.\n- Pixel art asset: a half-buried treasure chest, sand spilling over the lid, partially uncovered.\n\n### Zone 2: The Column — \"The Old Agora\"\n- Ancient Greek ruins — broken columns, cracked marble paving, a collapsed archway.\n- A ghost NPC or ancient inscription here delivers deep world lore.\n- Could be the site of the original Amazonprimea settlement — before the container arrived.\n- Pixel art assets: 3–4 ruin tile variants (standing column, fallen column section, cracked marble slab, archway ruin).\n\n### Zone 3: The Ladder — \"The Underdock\"\n- A ladder leading down to a underground or undersea area — a cave beneath the cliffs, or the space beneath the dock where the ship is moored.\n- Secret room aesthetic: darker, cooler palette, torchlight.\n- Possible contents: the back-room equivalent for the exterior world — a second vendor, a hidden passage to the container building's basement, or purely lore.\n- Pixel art assets: ladder tile (climbable surface indicator), cave entrance, torch overlay.\n\n## Map marker art spec (for the scroll)\n\nEach POI marker on the scroll is a small standalone pixel art icon, rendered in the same warm brown/tan palette as the parchment with slightly darker outlines:\n- **Sealed state**: an icon of a wax seal — circular, with a simple embossed symbol (anchor, eye, or flame). 12×12 pixels, deep red wax colour.\n- **Unsealed state**: the full location icon (chest, column, ladder) in warm brown outline, no fill colour — like a map cartographer's illustration rather than a full colour sprite.\n- **Visited state**: a small checkmark or star added to the corner of the icon — 4×4 pixels, gold colour.\n\n## Why this matters\n\nThe sealed ruins are the game's sense of depth. The container building is visible immediately — the world's first impression. But the chart tells the player there is more. Much more. The ruins predate the container. They are why Hermes chose *this* shore. The player is not just shopping — they are archaeologists.\n\n---\nPromoted from idea_inbox #171 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
391
|
-
"status": "ready",
|
|
392
|
-
"touches": [],
|
|
393
|
-
"est_minutes": 120,
|
|
394
|
-
"est_cost_usd": null,
|
|
395
|
-
"manual_degree": null,
|
|
396
|
-
"priority": 2,
|
|
397
|
-
"automation_tag": null,
|
|
398
|
-
"credits_reward": 6,
|
|
399
|
-
"source": "idea_inbox",
|
|
400
|
-
"source_ref": "idea:171",
|
|
401
|
-
"promoted_at": null,
|
|
402
|
-
"shipped_at": null,
|
|
403
|
-
"shipped_by": null,
|
|
404
|
-
"value_summary": null,
|
|
405
|
-
"created_at": "2026-06-04T22:07:54.682Z",
|
|
406
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
407
|
-
"kind": "feature",
|
|
408
|
-
"parent_task_id": null,
|
|
409
|
-
"actual_minutes": null,
|
|
410
|
-
"scoping_confidence": null,
|
|
411
|
-
"discipline": "unclassified",
|
|
412
|
-
"parallel_safe": null,
|
|
413
|
-
"newcomer_friendly": false,
|
|
414
|
-
"requires_rank": "xenos",
|
|
415
|
-
"needs_migration": false,
|
|
416
|
-
"security_sensitive": false,
|
|
417
|
-
"sandbox_review": null,
|
|
418
|
-
"goal_id": "6",
|
|
419
|
-
"module_key": null,
|
|
420
|
-
"reward_gate_exempt": true,
|
|
421
|
-
"credits_awarded": 0,
|
|
422
|
-
"est_minutes_calibrated": 9
|
|
423
|
-
},
|
|
424
|
-
{
|
|
425
|
-
"id": "735",
|
|
426
|
-
"version_id": "BONGOS-V1",
|
|
427
|
-
"title": "NL intake enrichment + routing layer on top of Discord #ideas inbound",
|
|
428
|
-
"description": "Promoted from idea_inbox #177. The headline of #177 is already shipped: Discord #ideas → idea_inbox inbound (Phase 3 F6, ADR 0033) with B2 auto-classify lets a builder dump raw natural language in Discord and have the bot file it. This task builds the RESIDUAL layer that #177 also asked for and that is not yet built:\n\n1. Enrichment — a scheduled routine that processes freshly-filed raw intake entries and enriches them where inferable: done-when, touches[], discipline, est_minutes.\n2. Routing by kind — don't dump everything into idea_inbox. Classify each entry and route: ideas → idea_inbox; bugs → tasks with kind=bug; rough task specs → tasks with status=backlog. Today everything lands in idea_inbox regardless.\n3. (Stretch / separate follow-up if it grows) non-Discord capture surfaces — phone/email/watched-file intake feeding the same routine. Keep out of this task unless trivial; the Discord surface is the natural first home now that the bot exists.\n\nScope note: respect the trust boundary (ADR 0016) — auto-creating tasks from inbound chat is a write path; route it through the same service-principal/audited path the #ideas inbound uses, and keep promotion-to-task gated where appropriate rather than letting arbitrary chat create claimable work unreviewed. Overlaps GDS-V4 territory; if it balloons, split.",
|
|
429
|
-
"status": "ready",
|
|
430
|
-
"touches": [
|
|
431
|
-
"scripts/gds/intake-enrich.js",
|
|
432
|
-
".claude/scheduled-tasks/intake-enrich/run.md",
|
|
433
|
-
"src/gds/discord-inbound.js"
|
|
434
|
-
],
|
|
435
|
-
"est_minutes": 240,
|
|
436
|
-
"est_cost_usd": null,
|
|
437
|
-
"manual_degree": null,
|
|
438
|
-
"priority": 2,
|
|
439
|
-
"automation_tag": null,
|
|
440
|
-
"credits_reward": 30,
|
|
441
|
-
"source": "idea_inbox",
|
|
442
|
-
"source_ref": "idea:177",
|
|
443
|
-
"promoted_at": null,
|
|
444
|
-
"shipped_at": null,
|
|
445
|
-
"shipped_by": null,
|
|
446
|
-
"value_summary": null,
|
|
447
|
-
"created_at": "2026-06-06T09:58:03.525Z",
|
|
448
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
449
|
-
"kind": "decision",
|
|
450
|
-
"parent_task_id": null,
|
|
451
|
-
"actual_minutes": null,
|
|
452
|
-
"scoping_confidence": null,
|
|
453
|
-
"discipline": "unclassified",
|
|
454
|
-
"parallel_safe": null,
|
|
455
|
-
"newcomer_friendly": false,
|
|
456
|
-
"requires_rank": "xenos",
|
|
457
|
-
"needs_migration": false,
|
|
458
|
-
"security_sensitive": false,
|
|
459
|
-
"sandbox_review": null,
|
|
460
|
-
"goal_id": "3",
|
|
461
|
-
"module_key": null,
|
|
462
|
-
"reward_gate_exempt": true,
|
|
463
|
-
"credits_awarded": 0,
|
|
464
|
-
"est_minutes_calibrated": 24
|
|
465
|
-
},
|
|
466
|
-
{
|
|
467
|
-
"id": "1165",
|
|
468
|
-
"version_id": "BONGOS-V1",
|
|
469
|
-
"title": "Blocker-solve sessions: /blocker-solve N — guided solve -> verify -> auto-resolve (interactive core)",
|
|
470
|
-
"description": "",
|
|
471
|
-
"status": "ready",
|
|
472
|
-
"touches": [],
|
|
473
|
-
"est_minutes": null,
|
|
474
|
-
"est_cost_usd": null,
|
|
475
|
-
"manual_degree": null,
|
|
476
|
-
"priority": 2,
|
|
477
|
-
"automation_tag": null,
|
|
478
|
-
"credits_reward": 30,
|
|
479
|
-
"source": "manual",
|
|
480
|
-
"source_ref": null,
|
|
481
|
-
"promoted_at": null,
|
|
482
|
-
"shipped_at": null,
|
|
483
|
-
"shipped_by": null,
|
|
484
|
-
"value_summary": null,
|
|
485
|
-
"created_at": "2026-06-16T23:09:41.692Z",
|
|
486
|
-
"updated_at": "2026-07-04T15:33:19.682Z",
|
|
487
|
-
"kind": "feature",
|
|
488
|
-
"parent_task_id": null,
|
|
489
|
-
"actual_minutes": 3,
|
|
490
|
-
"scoping_confidence": null,
|
|
491
|
-
"discipline": "engineer",
|
|
492
|
-
"parallel_safe": null,
|
|
493
|
-
"newcomer_friendly": false,
|
|
494
|
-
"requires_rank": "xenos",
|
|
495
|
-
"needs_migration": false,
|
|
496
|
-
"security_sensitive": false,
|
|
497
|
-
"sandbox_review": null,
|
|
498
|
-
"goal_id": "25",
|
|
499
|
-
"module_key": null,
|
|
500
|
-
"reward_gate_exempt": true,
|
|
501
|
-
"credits_awarded": 0,
|
|
502
|
-
"est_minutes_calibrated": null
|
|
503
|
-
},
|
|
504
|
-
{
|
|
505
|
-
"id": "1380",
|
|
506
|
-
"version_id": "BONGOS-V1",
|
|
507
|
-
"title": "Unify the grader: one multimodal engine, rubric-by-type, one regen loop",
|
|
508
|
-
"description": "Lars's requirement (ADR 0079): every task shares ONE grader and ONE regen flow — no second grader set.\n\nCollapse the two grader systems (the code panel src/gds/grader.js + the Gemini art pipeline art/pipeline/review.py) into one engine parameterized by type: a rubric registry keyed by task type (code-quality / visual / UI+a11y), evidence chosen by type (git diff for code+UI; render→screenshot for visual), a single MULTIMODAL Claude grade call that subsumes the separate Gemini vision pass, and one shared regen loop (spec → generate → grade → fail? regenerate → pass? commit) for all types.\n\nNOTE: touches the grader + ship pipeline = the gate-review HARD FLOOR (ADR 0043). Needs owner Gate approval even for Archon; security-review the multimodal call path.\n\n**Done when:** art + code + UI tasks all flow through the one grader, the standalone Gemini review path is retired, and the regen loop is identical across types.",
|
|
509
|
-
"status": "ready",
|
|
510
|
-
"touches": [
|
|
511
|
-
"src/gds/grader.js",
|
|
512
|
-
"art/pipeline/review.py",
|
|
513
|
-
"scripts/gds/ship.js"
|
|
514
|
-
],
|
|
515
|
-
"est_minutes": 480,
|
|
516
|
-
"est_cost_usd": null,
|
|
517
|
-
"manual_degree": 2,
|
|
518
|
-
"priority": 2,
|
|
519
|
-
"automation_tag": null,
|
|
520
|
-
"credits_reward": 80,
|
|
521
|
-
"source": "planning-session",
|
|
522
|
-
"source_ref": "design-layer-unified-grader",
|
|
523
|
-
"promoted_at": null,
|
|
524
|
-
"shipped_at": null,
|
|
525
|
-
"shipped_by": null,
|
|
526
|
-
"value_summary": null,
|
|
527
|
-
"created_at": "2026-06-21T13:39:38.861Z",
|
|
528
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
529
|
-
"kind": "feature",
|
|
530
|
-
"parent_task_id": null,
|
|
531
|
-
"actual_minutes": 5,
|
|
532
|
-
"scoping_confidence": null,
|
|
533
|
-
"discipline": "engineer",
|
|
534
|
-
"parallel_safe": null,
|
|
535
|
-
"newcomer_friendly": false,
|
|
536
|
-
"requires_rank": "metic",
|
|
537
|
-
"needs_migration": false,
|
|
538
|
-
"security_sensitive": false,
|
|
539
|
-
"sandbox_review": null,
|
|
540
|
-
"goal_id": "3",
|
|
541
|
-
"module_key": null,
|
|
542
|
-
"reward_gate_exempt": true,
|
|
543
|
-
"credits_awarded": 0,
|
|
544
|
-
"est_minutes_calibrated": 36
|
|
545
|
-
},
|
|
546
|
-
{
|
|
547
|
-
"id": "1840",
|
|
548
|
-
"version_id": "BONGOS-V1",
|
|
549
|
-
"title": "BV1.R92 — Fix stale branch-protection docs (ADR 0043 + canonical-permissions)",
|
|
550
|
-
"description": "**Why:** ADR 0043 and canonical-permissions.md still say the repo is a free private repo with no GitHub branch protection, so main-audit.js is the only net. That is now FALSE — main has live branch protection (required checks unit + trufflehog + gate-review, code-owner review, direct push blocked). Surfaced by the 2026-07-03 authority sweep.\n\n**Done when:** both docs describe the live state (branch protection on; main-audit.js is defense-in-depth, not the sole net). Independent of the rest of the goal — can land anytime.",
|
|
551
|
-
"status": "ready",
|
|
552
|
-
"touches": [
|
|
553
|
-
"docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md",
|
|
554
|
-
"docs/canonical-permissions.md"
|
|
555
|
-
],
|
|
556
|
-
"est_minutes": 40,
|
|
557
|
-
"est_cost_usd": null,
|
|
558
|
-
"manual_degree": 1,
|
|
559
|
-
"priority": 2,
|
|
560
|
-
"automation_tag": null,
|
|
561
|
-
"credits_reward": 20,
|
|
562
|
-
"source": "planning-session",
|
|
563
|
-
"source_ref": "bongos-v1-gov-r92",
|
|
564
|
-
"promoted_at": null,
|
|
565
|
-
"shipped_at": null,
|
|
566
|
-
"shipped_by": null,
|
|
567
|
-
"value_summary": null,
|
|
568
|
-
"created_at": "2026-07-03T13:20:07.941Z",
|
|
569
|
-
"updated_at": "2026-07-03T14:13:30.283Z",
|
|
570
|
-
"kind": "bug",
|
|
571
|
-
"parent_task_id": null,
|
|
572
|
-
"actual_minutes": null,
|
|
573
|
-
"scoping_confidence": null,
|
|
574
|
-
"discipline": "engineer",
|
|
575
|
-
"parallel_safe": null,
|
|
576
|
-
"newcomer_friendly": false,
|
|
577
|
-
"requires_rank": "metic",
|
|
578
|
-
"needs_migration": false,
|
|
579
|
-
"security_sensitive": false,
|
|
580
|
-
"sandbox_review": null,
|
|
581
|
-
"goal_id": "30",
|
|
582
|
-
"module_key": null,
|
|
583
|
-
"reward_gate_exempt": false,
|
|
584
|
-
"credits_awarded": 0,
|
|
585
|
-
"est_minutes_calibrated": 5
|
|
586
|
-
},
|
|
587
|
-
{
|
|
588
|
-
"id": "1916",
|
|
589
|
-
"version_id": "BONGOS-V1",
|
|
590
|
-
"title": "ship.js: surface publish-branch failure step + reason (bare publish_failed hid a non-FF push)",
|
|
591
|
-
"description": "From the task-1899 landing incident (2026-07-03, learning 128). POST /tasks/:id/publish-branch already returns { error: publish_failed, step, reason } with the credential-scrubbed git stderr (routes/tasks.js ~1548, added by task 1547) — but ciLandServer in scripts/gds/ship.js prints only r.data.message || r.data.error, so the builder sees a bare publish_failed and retries blind. Today that hid a non-fast-forward rejection (the server had freshened the branch itself) across multiple retry laps. FIX: when the publish response carries step/reason, print both; when the reason matches fetch first / non-fast-forward, print the specific remedy hint: the server moved the branch — reset onto origin/claude/<worktree> (the box ref-sync has it), re-run the generators, and re-ship so the push fast-forwards. Keep it to output plumbing (no behavior change); add/extend a unit test on the message-formatting helper if ship.js exports one.",
|
|
592
|
-
"status": "ready",
|
|
593
|
-
"touches": [
|
|
594
|
-
"scripts/gds/ship.js"
|
|
595
|
-
],
|
|
596
|
-
"est_minutes": 15,
|
|
597
|
-
"est_cost_usd": null,
|
|
598
|
-
"manual_degree": null,
|
|
599
|
-
"priority": 2,
|
|
600
|
-
"automation_tag": null,
|
|
601
|
-
"credits_reward": 15,
|
|
602
|
-
"source": "manual",
|
|
603
|
-
"source_ref": "session-2026-07-03-publish-failed-diagnostics",
|
|
604
|
-
"promoted_at": "2026-07-03T16:55:34.843Z",
|
|
605
|
-
"shipped_at": null,
|
|
606
|
-
"shipped_by": null,
|
|
607
|
-
"value_summary": null,
|
|
608
|
-
"created_at": "2026-07-03T16:55:34.843Z",
|
|
609
|
-
"updated_at": "2026-07-03T16:55:34.843Z",
|
|
610
|
-
"kind": "infra",
|
|
611
|
-
"parent_task_id": null,
|
|
612
|
-
"actual_minutes": null,
|
|
613
|
-
"scoping_confidence": null,
|
|
614
|
-
"discipline": "engineer",
|
|
615
|
-
"parallel_safe": null,
|
|
616
|
-
"newcomer_friendly": false,
|
|
617
|
-
"requires_rank": "metic",
|
|
618
|
-
"needs_migration": false,
|
|
619
|
-
"security_sensitive": false,
|
|
620
|
-
"sandbox_review": null,
|
|
621
|
-
"goal_id": "24",
|
|
622
|
-
"module_key": null,
|
|
623
|
-
"reward_gate_exempt": false,
|
|
624
|
-
"credits_awarded": 0,
|
|
625
|
-
"est_minutes_calibrated": 1
|
|
626
|
-
},
|
|
627
|
-
{
|
|
628
|
-
"id": "2068",
|
|
629
|
-
"version_id": "BONGOS-V1",
|
|
630
|
-
"title": "Rotate metrics.cloudbongos.com creds (Caddy basic-auth + Grafana admin) after session exposure",
|
|
631
|
-
"description": "The Caddy basic-auth password (user 'archon') and Grafana admin password for metrics.cloudbongos.com were surfaced inside a Claude user session and are treated as compromised. Rotate BOTH on control-plane droplet 161.35.132.201: (1) new bcrypt via `caddy hash-password`, replace archon's hash on the basic_auth line in /etc/caddy/Caddyfile, `caddy validate` then `systemctl reload caddy`; (2) `grafana-cli admin reset-admin-password --password-from-stdin` for user 'admin' (Grafana 13.1). Plaintext entered interactively ON THE BOX only, never in a session or a command arg. Repo Caddyfile keeps its dummy placeholder hash (real secret is owner-held). No repo/code change — box-config only. Refs: infra/grafana/README.md, infra/Caddyfile, ADR 0127.",
|
|
632
|
-
"status": "ready",
|
|
633
|
-
"touches": [],
|
|
634
|
-
"est_minutes": 20,
|
|
635
|
-
"est_cost_usd": null,
|
|
636
|
-
"manual_degree": null,
|
|
637
|
-
"priority": 2,
|
|
638
|
-
"automation_tag": null,
|
|
639
|
-
"credits_reward": 20,
|
|
640
|
-
"source": "planning",
|
|
641
|
-
"source_ref": "ops-rotate-metrics-creds-2026-07-05",
|
|
642
|
-
"promoted_at": null,
|
|
643
|
-
"shipped_at": null,
|
|
644
|
-
"shipped_by": null,
|
|
645
|
-
"value_summary": null,
|
|
646
|
-
"created_at": "2026-07-05T21:24:32.099Z",
|
|
647
|
-
"updated_at": "2026-07-05T21:25:12.774Z",
|
|
648
|
-
"kind": "infra",
|
|
649
|
-
"parent_task_id": null,
|
|
650
|
-
"actual_minutes": null,
|
|
651
|
-
"scoping_confidence": null,
|
|
652
|
-
"discipline": "engineer",
|
|
653
|
-
"parallel_safe": null,
|
|
654
|
-
"newcomer_friendly": false,
|
|
655
|
-
"requires_rank": "xenos",
|
|
656
|
-
"needs_migration": false,
|
|
657
|
-
"security_sensitive": false,
|
|
658
|
-
"sandbox_review": null,
|
|
659
|
-
"goal_id": "3",
|
|
660
|
-
"module_key": null,
|
|
661
|
-
"reward_gate_exempt": false,
|
|
662
|
-
"credits_awarded": 0,
|
|
663
|
-
"est_minutes_calibrated": 2
|
|
664
|
-
},
|
|
665
|
-
{
|
|
666
|
-
"id": "2170",
|
|
667
|
-
"version_id": "BONGOS-V1",
|
|
668
|
-
"title": "Work board redesign: tabs, filter diet, denser cards",
|
|
669
|
-
"description": "**What:** The Work page's job is \"find and claim work\" — one queue at a time. Restructure five stacked sections into hash-synced tabs on OTBKit tabs: **Ready (default) | In Progress | Backlog | Completed**, with deep links (/work#in-progress) and back/forward support. Tabs toggle [hidden]; window stays the only scroller. Primer-gate notice stays above the tabs.\n\n**Scope:**\n1. **Filter diet 9 -> 3 + overflow:** primary row = Search, Sort, Version; Goal/Kind/Discipline/Newcomer/Run-mode move behind a \"More filters\" disclosure with an active-count badge (`Filters - 2`) + removable chips + clear-all. Filter state persists in the URL query (shareable). Use OTBKit filterBar.\n2. **Denser Ready cards (owner call 2026-07-10: cards, not table):** tighten task cards to a compact 2-line layout — title+id+claim CTA line, then meta line (kind, discipline, touches count, rank tag, credits).\n3. **Works-summary stat row** (project-wide momentum) moves inside the Completed tab head — it is not \"my board\" data.\n4. **Bulk toolbar kept as-is** (appears on selection); selection state scoped per tab.\n5. All four pagers -> OTBKit pager (keep existing localStorage keys: otb.work.*PerPage). Ledgers -> makeLedger where straightforward.\n6. The ~211-line inline <style> block in work.html moves to a new `modules/hall-ui/public/work.css` (the primer.css precedent; ?v= stamping is automatic — just reference /builders/work.css). Genuinely shared idioms found in it (count-pill etc.) already exist in style.css — do not duplicate; do NOT touch style.css in this task.\n\n**Acceptance:** Ready above the fold as default tab; tab counts in labels; URL round-trips filters+tab; bulk claim/release + copy-prompt flows work per tab; no inline <style> left in work.html; existing per-page prefs survive.\n\n**Verify:** hall preview harness (scripts/hall-preview, task hallux-t02) + Playwright — screenshots {light,dark}x{1280w,390w}, seam assertions (window is the only scroller; #/idea/N overlay + #/task/N navigation intact; module widgets mount and vanish with modules off). Run `node scripts/gds/fitness.js` + `node --check` on edited JS before ship.",
|
|
670
|
-
"status": "ready",
|
|
671
|
-
"touches": [
|
|
672
|
-
"modules/hall-ui/public/work.html",
|
|
673
|
-
"modules/hall-ui/public/work.js",
|
|
674
|
-
"modules/hall-ui/public/work.css"
|
|
675
|
-
],
|
|
676
|
-
"est_minutes": 240,
|
|
677
|
-
"est_cost_usd": null,
|
|
678
|
-
"manual_degree": null,
|
|
679
|
-
"priority": 2,
|
|
680
|
-
"automation_tag": null,
|
|
681
|
-
"credits_reward": 80,
|
|
682
|
-
"source": "hall-ux-redesign",
|
|
683
|
-
"source_ref": "hallux-t5",
|
|
684
|
-
"promoted_at": "2026-07-10T18:28:51.046Z",
|
|
685
|
-
"shipped_at": null,
|
|
686
|
-
"shipped_by": null,
|
|
687
|
-
"value_summary": null,
|
|
688
|
-
"created_at": "2026-07-10T18:16:55.804Z",
|
|
689
|
-
"updated_at": "2026-07-10T18:28:51.046Z",
|
|
690
|
-
"kind": "refactor",
|
|
691
|
-
"parent_task_id": null,
|
|
692
|
-
"actual_minutes": null,
|
|
693
|
-
"scoping_confidence": null,
|
|
694
|
-
"discipline": "ui",
|
|
695
|
-
"parallel_safe": null,
|
|
696
|
-
"newcomer_friendly": false,
|
|
697
|
-
"requires_rank": "xenos",
|
|
698
|
-
"needs_migration": false,
|
|
699
|
-
"security_sensitive": false,
|
|
700
|
-
"sandbox_review": null,
|
|
701
|
-
"goal_id": "25",
|
|
702
|
-
"module_key": null,
|
|
703
|
-
"reward_gate_exempt": false,
|
|
704
|
-
"credits_awarded": 0,
|
|
705
|
-
"est_minutes_calibrated": 32
|
|
706
|
-
},
|
|
707
|
-
{
|
|
708
|
-
"id": "2171",
|
|
709
|
-
"version_id": "BONGOS-V1",
|
|
710
|
-
"title": "Goals page: converge onto the kit (pagers, filter bar, invite disclosure)",
|
|
711
|
-
"description": "**What:** The Goals page is the reference layout — converge it onto the shared kit, do not restructure. Detail layout (head/actions -> 3-column band Completion|Members|Conflicts -> Work card with To-do/Completed tabs) stays.\n\n**Scope:**\n1. Replace the 4 bespoke pager implementations (renderGoalsPager + inline slice math) with OTBKit pager/makeLedger (keep localStorage keys, e.g. otb.goals.perPage).\n2. List-view filter bar (Version, Status, Membership) -> OTBKit filterBar (all three stay primary; no overflow needed).\n3. Work-card tab switch -> OTBKit tabs (hash side must NOT collide with #/goal/N routing — tabs on the detail view key off the existing sub-route state, not location.hash).\n4. Invite box collapses behind a \"+ Invite\" button (disclosure, closed by default).\n5. Empty states -> OTBKit emptyState; loading dots -> skeletonRows.\n6. Inline <style> (~168 lines in goals.html) -> new `modules/hall-ui/public/goals.css`.\n\n**Seams:** #/goal/N and #/goal/N/{conflicts,members,completion} sub-routes byte-identical behavior; DEEPLINK_RE guards for #/task|idea|blocker/N untouched; goal cards keep data-goal-id and the goal-id display from task 2163.\n\n**Acceptance:** list + detail + 3 sub-views render identically or cleaner; pager prefs survive; no inline <style> in goals.html; back button restores list from detail.\n\n**Verify:** hall preview harness (scripts/hall-preview, task hallux-t02) + Playwright — screenshots {light,dark}x{1280w,390w}, seam assertions (window is the only scroller; #/idea/N overlay + #/task/N navigation intact; module widgets mount and vanish with modules off). Run `node scripts/gds/fitness.js` + `node --check` on edited JS before ship.",
|
|
712
|
-
"status": "ready",
|
|
713
|
-
"touches": [
|
|
714
|
-
"modules/hall-ui/public/goals.html",
|
|
715
|
-
"modules/hall-ui/public/goals-page.js",
|
|
716
|
-
"modules/hall-ui/public/goals.css"
|
|
717
|
-
],
|
|
718
|
-
"est_minutes": 210,
|
|
719
|
-
"est_cost_usd": null,
|
|
720
|
-
"manual_degree": null,
|
|
721
|
-
"priority": 2,
|
|
722
|
-
"automation_tag": null,
|
|
723
|
-
"credits_reward": 70,
|
|
724
|
-
"source": "hall-ux-redesign",
|
|
725
|
-
"source_ref": "hallux-t6",
|
|
726
|
-
"promoted_at": "2026-07-10T18:28:51.046Z",
|
|
727
|
-
"shipped_at": null,
|
|
728
|
-
"shipped_by": null,
|
|
729
|
-
"value_summary": null,
|
|
730
|
-
"created_at": "2026-07-10T18:16:55.836Z",
|
|
731
|
-
"updated_at": "2026-07-10T18:28:51.046Z",
|
|
732
|
-
"kind": "refactor",
|
|
733
|
-
"parent_task_id": null,
|
|
734
|
-
"actual_minutes": null,
|
|
735
|
-
"scoping_confidence": null,
|
|
736
|
-
"discipline": "ui",
|
|
737
|
-
"parallel_safe": null,
|
|
738
|
-
"newcomer_friendly": false,
|
|
739
|
-
"requires_rank": "xenos",
|
|
740
|
-
"needs_migration": false,
|
|
741
|
-
"security_sensitive": false,
|
|
742
|
-
"sandbox_review": null,
|
|
743
|
-
"goal_id": "25",
|
|
744
|
-
"module_key": null,
|
|
745
|
-
"reward_gate_exempt": false,
|
|
746
|
-
"credits_awarded": 0,
|
|
747
|
-
"est_minutes_calibrated": 28
|
|
748
|
-
},
|
|
749
|
-
{
|
|
750
|
-
"id": "2172",
|
|
751
|
-
"version_id": "BONGOS-V1",
|
|
752
|
-
"title": "Settings regroup: 6 groups, standard panel anatomy, stable anchors",
|
|
753
|
-
"description": "**What:** Settings keeps its shape (left rail + panels) but tightens: ~15 panels regrouped into 6 groups on the OTBKit sectionRail (panel-switch mode) — **Account** (Connections, Display name, Preferred disciplines) / **Access & keys** (CLI access, Image-generation key) / **Dev box** (Your dev box, Dev box app, + a link to /pair) / **Preferences** (Wandering, Rendering) / **Sound** (Skill voices, Sounds, Event sounds) / **Extensions** (module-contributed panels, revealed only when present).\n\n**Scope:**\n1. Standardize panel anatomy: title -> one-line purpose -> control -> save-semantics note.\n2. Stable anchors per panel (/settings#cli, /settings#dev-box...) so skills and docs can deep-link; rail highlights + scrolls to anchor on load.\n3. **Preserve the contributeSettingsPanel mount contract exactly** — box-panel.js is a live consumer and tests/module_contributions.mjs checks the seam. Do not touch dom-utils.js.\n4. The ~347-line inline <style> in settings.html -> new `modules/hall-ui/public/settings.css`.\n\n**Acceptance:** every existing control works (Discord connect, display name save, CLI token re-issue, image key, wandering, rendering, sounds); box panel renders in Extensions/Dev box exactly as before; anchors deep-link; no inline <style> in settings.html.\n\n**Verify:** hall preview harness (scripts/hall-preview, task hallux-t02) + Playwright — screenshots {light,dark}x{1280w,390w}, seam assertions (window is the only scroller; #/idea/N overlay + #/task/N navigation intact; module widgets mount and vanish with modules off). Run `node scripts/gds/fitness.js` + `node --check` on edited JS before ship.",
|
|
754
|
-
"status": "ready",
|
|
755
|
-
"touches": [
|
|
756
|
-
"modules/hall-ui/public/settings.html",
|
|
757
|
-
"modules/hall-ui/public/settings.js",
|
|
758
|
-
"modules/hall-ui/public/settings.css"
|
|
759
|
-
],
|
|
760
|
-
"est_minutes": 150,
|
|
761
|
-
"est_cost_usd": null,
|
|
762
|
-
"manual_degree": null,
|
|
763
|
-
"priority": 2,
|
|
764
|
-
"automation_tag": null,
|
|
765
|
-
"credits_reward": 60,
|
|
766
|
-
"source": "hall-ux-redesign",
|
|
767
|
-
"source_ref": "hallux-t7",
|
|
768
|
-
"promoted_at": "2026-07-10T18:28:51.046Z",
|
|
769
|
-
"shipped_at": null,
|
|
770
|
-
"shipped_by": null,
|
|
771
|
-
"value_summary": null,
|
|
772
|
-
"created_at": "2026-07-10T18:16:55.863Z",
|
|
773
|
-
"updated_at": "2026-07-10T18:28:51.046Z",
|
|
774
|
-
"kind": "blocker-resolution",
|
|
775
|
-
"parent_task_id": null,
|
|
776
|
-
"actual_minutes": null,
|
|
777
|
-
"scoping_confidence": null,
|
|
778
|
-
"discipline": "ui",
|
|
779
|
-
"parallel_safe": null,
|
|
780
|
-
"newcomer_friendly": false,
|
|
781
|
-
"requires_rank": "xenos",
|
|
782
|
-
"needs_migration": false,
|
|
783
|
-
"security_sensitive": false,
|
|
784
|
-
"sandbox_review": null,
|
|
785
|
-
"goal_id": "25",
|
|
786
|
-
"module_key": null,
|
|
787
|
-
"reward_gate_exempt": false,
|
|
788
|
-
"credits_awarded": 0,
|
|
789
|
-
"est_minutes_calibrated": 12
|
|
790
|
-
},
|
|
791
|
-
{
|
|
792
|
-
"id": "2173",
|
|
793
|
-
"version_id": "BONGOS-V1",
|
|
794
|
-
"title": "Watch redesign: attention row + People/Operations/Security tabs (Archon)",
|
|
795
|
-
"description": "**What:** Watch is an Archon's dashboard, not an archive — \"what needs me today\" first, evidence behind tabs. Restructure 9 stacked cards into:\n1. **Attention row** (stat tiles at top): pending access requests, open security reports, stale claims/sessions — each tile links to its tab section below.\n2. **Three OTBKit tabs:** **People** (Roster, Reviews by builder, Review quality) / **Operations** (Dev-box costs, Sessions, Repo health) / **Security** (Security reports, Estimation accuracy). Hash-synced (/watch#security).\n\n**Scope:** same data + renderers, reorganized; tables adopt OTBKit pager/ledger where straightforward; ~192-line inline <style> -> new `modules/hall-ui/public/watch.css`; empty states -> kit.\n\n**Acceptance:** all nine data surfaces reachable within one click; tile counts match table contents; Archon page gate untouched (server-side requireArchonPage); no inline <style> in watch.html.\n\n**Verify:** hall preview harness (scripts/hall-preview, task hallux-t02) + Playwright — screenshots {light,dark}x{1280w,390w}, seam assertions (window is the only scroller; #/idea/N overlay + #/task/N navigation intact; module widgets mount and vanish with modules off). Run `node scripts/gds/fitness.js` + `node --check` on edited JS before ship.",
|
|
796
|
-
"status": "ready",
|
|
797
|
-
"touches": [
|
|
798
|
-
"modules/hall-ui/public/watch.html",
|
|
799
|
-
"modules/hall-ui/public/watch.js",
|
|
800
|
-
"modules/hall-ui/public/watch.css"
|
|
801
|
-
],
|
|
802
|
-
"est_minutes": 120,
|
|
803
|
-
"est_cost_usd": null,
|
|
804
|
-
"manual_degree": null,
|
|
805
|
-
"priority": 2,
|
|
806
|
-
"automation_tag": null,
|
|
807
|
-
"credits_reward": 50,
|
|
808
|
-
"source": "hall-ux-redesign",
|
|
809
|
-
"source_ref": "hallux-t8",
|
|
810
|
-
"promoted_at": "2026-07-10T18:28:51.046Z",
|
|
811
|
-
"shipped_at": null,
|
|
812
|
-
"shipped_by": null,
|
|
813
|
-
"value_summary": null,
|
|
814
|
-
"created_at": "2026-07-10T18:16:55.888Z",
|
|
815
|
-
"updated_at": "2026-07-10T18:28:51.046Z",
|
|
816
|
-
"kind": "blocker-resolution",
|
|
817
|
-
"parent_task_id": null,
|
|
818
|
-
"actual_minutes": null,
|
|
819
|
-
"scoping_confidence": null,
|
|
820
|
-
"discipline": "ui",
|
|
821
|
-
"parallel_safe": null,
|
|
822
|
-
"newcomer_friendly": false,
|
|
823
|
-
"requires_rank": "xenos",
|
|
824
|
-
"needs_migration": false,
|
|
825
|
-
"security_sensitive": false,
|
|
826
|
-
"sandbox_review": null,
|
|
827
|
-
"goal_id": "25",
|
|
828
|
-
"module_key": null,
|
|
829
|
-
"reward_gate_exempt": false,
|
|
830
|
-
"credits_awarded": 0,
|
|
831
|
-
"est_minutes_calibrated": 10
|
|
832
|
-
},
|
|
833
|
-
{
|
|
834
|
-
"id": "2176",
|
|
835
|
-
"version_id": "BONGOS-V1",
|
|
836
|
-
"title": "Secondary-page sweep: inline styles to per-page CSS + kit empty states",
|
|
837
|
-
"description": "**What:** The eight secondary pages — roadmap, profile, sessions, harbor, gate, pair, modules, atlas — each carry a bolted-on inline <style> block (155/—/12/119/94/69/59/113 lines). Move each into a per-page css file (`roadmap.css`, `harbor.css`... — the primer.css precedent; reference as /builders/<page>.css, ?v= stamping is automatic). Where trivial (< ~20 lines of change per page), adopt OTBKit emptyState/skeleton and pager; do NOT restructure these pages otherwise.\n\n**Acceptance:** zero inline <style> blocks >15 lines remain on these eight pages; visual parity per page (harness screenshots before/after); atlas interactive map behavior untouched.\n\n**Verify:** hall preview harness (scripts/hall-preview, task hallux-t02) + Playwright — screenshots {light,dark}x{1280w,390w}, seam assertions (window is the only scroller; #/idea/N overlay + #/task/N navigation intact; module widgets mount and vanish with modules off). Run `node scripts/gds/fitness.js` + `node --check` on edited JS before ship.",
|
|
838
|
-
"status": "ready",
|
|
839
|
-
"touches": [
|
|
840
|
-
"modules/hall-ui/public/roadmap.html",
|
|
841
|
-
"modules/hall-ui/public/profile.html",
|
|
842
|
-
"modules/hall-ui/public/sessions.html",
|
|
843
|
-
"modules/hall-ui/public/harbor.html",
|
|
844
|
-
"modules/hall-ui/public/gate.html",
|
|
845
|
-
"modules/hall-ui/public/pair.html",
|
|
846
|
-
"modules/hall-ui/public/modules.html",
|
|
847
|
-
"modules/hall-ui/public/atlas.html"
|
|
848
|
-
],
|
|
849
|
-
"est_minutes": 120,
|
|
850
|
-
"est_cost_usd": null,
|
|
851
|
-
"manual_degree": null,
|
|
852
|
-
"priority": 2,
|
|
853
|
-
"automation_tag": null,
|
|
854
|
-
"credits_reward": 50,
|
|
855
|
-
"source": "hall-ux-redesign",
|
|
856
|
-
"source_ref": "hallux-t11",
|
|
857
|
-
"promoted_at": "2026-07-10T18:28:51.046Z",
|
|
858
|
-
"shipped_at": null,
|
|
859
|
-
"shipped_by": null,
|
|
860
|
-
"value_summary": null,
|
|
861
|
-
"created_at": "2026-07-10T18:16:55.969Z",
|
|
862
|
-
"updated_at": "2026-07-10T18:28:51.046Z",
|
|
863
|
-
"kind": "refactor",
|
|
864
|
-
"parent_task_id": null,
|
|
865
|
-
"actual_minutes": null,
|
|
866
|
-
"scoping_confidence": null,
|
|
867
|
-
"discipline": "ui",
|
|
868
|
-
"parallel_safe": null,
|
|
869
|
-
"newcomer_friendly": false,
|
|
870
|
-
"requires_rank": "xenos",
|
|
871
|
-
"needs_migration": false,
|
|
872
|
-
"security_sensitive": false,
|
|
873
|
-
"sandbox_review": null,
|
|
874
|
-
"goal_id": "25",
|
|
875
|
-
"module_key": null,
|
|
876
|
-
"reward_gate_exempt": false,
|
|
877
|
-
"credits_awarded": 0,
|
|
878
|
-
"est_minutes_calibrated": 16
|
|
879
|
-
},
|
|
880
|
-
{
|
|
881
|
-
"id": "586",
|
|
882
|
-
"version_id": "V2",
|
|
883
|
-
"title": "grass_on_sand interior variety reduced 16->4 in #205 fix — restore design-intent variant count (or audit all families)",
|
|
884
|
-
"description": "Promoted from idea_inbox #39 during /idea-triage 2026-06-03. See the idea body for full context.",
|
|
885
|
-
"status": "ready",
|
|
886
|
-
"touches": [
|
|
887
|
-
"art/template/families.json",
|
|
888
|
-
"public/assets/tiles/manifest.json"
|
|
889
|
-
],
|
|
890
|
-
"est_minutes": 60,
|
|
891
|
-
"est_cost_usd": null,
|
|
892
|
-
"manual_degree": null,
|
|
893
|
-
"priority": 3,
|
|
894
|
-
"automation_tag": null,
|
|
895
|
-
"credits_reward": 30,
|
|
896
|
-
"source": "idea_inbox",
|
|
897
|
-
"source_ref": "idea:39",
|
|
898
|
-
"promoted_at": null,
|
|
899
|
-
"shipped_at": null,
|
|
900
|
-
"shipped_by": null,
|
|
901
|
-
"value_summary": null,
|
|
902
|
-
"created_at": "2026-06-03T19:26:51.582Z",
|
|
903
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
904
|
-
"kind": "bug",
|
|
905
|
-
"parent_task_id": null,
|
|
906
|
-
"actual_minutes": 1,
|
|
907
|
-
"scoping_confidence": null,
|
|
908
|
-
"discipline": "engineer",
|
|
909
|
-
"parallel_safe": null,
|
|
910
|
-
"newcomer_friendly": false,
|
|
911
|
-
"requires_rank": "xenos",
|
|
912
|
-
"needs_migration": false,
|
|
913
|
-
"security_sensitive": false,
|
|
914
|
-
"sandbox_review": null,
|
|
915
|
-
"goal_id": "6",
|
|
916
|
-
"module_key": null,
|
|
917
|
-
"reward_gate_exempt": true,
|
|
918
|
-
"credits_awarded": 0,
|
|
919
|
-
"est_minutes_calibrated": 7
|
|
920
|
-
},
|
|
921
|
-
{
|
|
922
|
-
"id": "594",
|
|
923
|
-
"version_id": "BONGOS-V1",
|
|
924
|
-
"title": "V4.R29 — Status surface v2: private repo + split uptime from build-history onto separate domains",
|
|
925
|
-
"description": "## Goal (Lars request, 2026-06-04)\nImprove the status surface on two axes:\n1. Make the status repo PRIVATE (today it is the PUBLIC repo lars589/amazonprimea-status).\n2. Split the two things currently mashed into one page onto SEPARATE DOMAINS: (a) UPTIME / is-the-site-up, and (b) the historical BUILD dashboard (how everything is being built: treasury, grades, progress, leaderboard, recent-shipped).\n\n## Current state (ADR 0029, #565/#566/#567)\nstatus.amazonprimea.com is served OFF-BOX by GitHub Pages from the PUBLIC repo lars589/amazonprimea-status, so it survives a droplet outage. One page currently shows BOTH the availability banner/uptime AND the full GDS build dashboard. The repo is public because GitHub Pages from a PRIVATE repo needs a paid plan, and public lets the page read its own uptime data with no auth token.\n\n## Desired end state\n- A focused UPTIME page (is amazonprimea.com up + recent uptime + incidents) on one domain (e.g. status.amazonprimea.com).\n- A SEPARATE build-history / dev dashboard (the GDS how-it-is-built view) on a different domain (e.g. build. / dashboard. / builders.amazonprimea.com) - Lars to pick the name.\n- The status repo PRIVATE.\n\n## Design notes (carry forward)\n- Clean split: UPTIME must stay OFF the droplet (has to survive an outage) and ideally independent of BOTH the game host (DigitalOcean) and the DNS host (Cloudflare) - do not recreate shared-fate. The BUILD dashboard pulls live data from the droplet DB and only matters when the system is UP, so it can simply be served BY the droplet at its own domain. That also removes the cross-origin/CORS + snapshot complexity that #566 took on to render droplet data on the off-box page.\n- To keep the uptime repo PRIVATE while serving live data without auth tokens or Pages build-rate-limits, pick one: GitHub Pro (~4 USD/mo, Pages from a private repo, minor data-path rework) OR Cloudflare Pages-from-private + a Worker+KV for data (more setup, weaker email alerting, and LESS independent since DNS already lives on Cloudflare). See the 2026-06-04 chat analysis.\n- Keep the external prober + email alert (today: GitHub Actions, #565) regardless of hosting - do not lose off-box detection + alert.\n\n## Needs before build\n- Lars to choose the two domain names.\n- Lars to choose the private-hosting path (GitHub Pro vs Cloudflare vs other) given the cost/independence trade-off.\n- Likely an ADR for the domain split + a planning pass to break into subtasks.\nRelates to: ADR 0029; tasks #565/#566/#567; repo lars589/amazonprimea-status.",
|
|
926
|
-
"status": "ready",
|
|
927
|
-
"touches": [
|
|
928
|
-
"public-status/",
|
|
929
|
-
"docs/adr/"
|
|
930
|
-
],
|
|
931
|
-
"est_minutes": null,
|
|
932
|
-
"est_cost_usd": null,
|
|
933
|
-
"manual_degree": null,
|
|
934
|
-
"priority": 3,
|
|
935
|
-
"automation_tag": null,
|
|
936
|
-
"credits_reward": 40,
|
|
937
|
-
"source": "manual",
|
|
938
|
-
"source_ref": "lars-request-2026-06-04-status-v2",
|
|
939
|
-
"promoted_at": "2026-06-12T10:21:37.944Z",
|
|
940
|
-
"shipped_at": null,
|
|
941
|
-
"shipped_by": null,
|
|
942
|
-
"value_summary": "A cleaner status setup: a focused uptime page and a separate build-history dashboard, on their own domains, from a private repo.",
|
|
943
|
-
"created_at": "2026-06-04T07:50:47.317Z",
|
|
944
|
-
"updated_at": "2026-07-03T21:17:16.516Z",
|
|
945
|
-
"kind": "feature",
|
|
946
|
-
"parent_task_id": null,
|
|
947
|
-
"actual_minutes": 4,
|
|
948
|
-
"scoping_confidence": null,
|
|
949
|
-
"discipline": "engineer",
|
|
950
|
-
"parallel_safe": null,
|
|
951
|
-
"newcomer_friendly": false,
|
|
952
|
-
"requires_rank": "xenos",
|
|
953
|
-
"needs_migration": false,
|
|
954
|
-
"security_sensitive": false,
|
|
955
|
-
"sandbox_review": null,
|
|
956
|
-
"goal_id": "25",
|
|
957
|
-
"module_key": null,
|
|
958
|
-
"reward_gate_exempt": true,
|
|
959
|
-
"credits_awarded": 0,
|
|
960
|
-
"est_minutes_calibrated": null
|
|
961
|
-
},
|
|
962
|
-
{
|
|
963
|
-
"id": "636",
|
|
964
|
-
"version_id": "V2",
|
|
965
|
-
"title": "Audio design: Emerald-inspired music + ambient environmental sounds for exterior and interior",
|
|
966
|
-
"description": "## Summary\n\nA full audio design layer: background music inspired by Pokémon Emerald's soundtrack, ambient environmental sounds for both exterior and interior, and UI/interaction sound effects.\n\n## Music\n\n- **Exterior theme**: a slow, atmospheric track. Mediterranean feel — light percussion, strings, a sense of discovery. Pokémon Emerald's route themes as reference (especially the coastal/water routes).\n- **Interior theme**: warmer, more intimate. Like Emerald's Poke Mart theme but with a hint of modern luxury retail — think lo-fi or light jazz undertones layered over the retro structure.\n- **Transition cue**: a brief musical shift or stab when the player enters/exits the container.\n- All music loops seamlessly.\n\n## Ambient sounds\n\n### Exterior\n- Distant sea waves.\n- Occasional gull cry.\n- Light wind.\n- Distant harbour sounds (chains, creaking, faint machinery).\n\n### Interior\n- Soft hum of climate control / container HVAC.\n- Occasional creak of the container structure.\n- Soft background chatter (indistinct).\n- Footstep sounds that change by floor material (sand outside, stone/marble inside).\n\n## UI / interaction sound effects\n\n- Dialogue box open/advance: classic Pokémon text blip, slightly warmer.\n- Item picked up / added to bag: satisfying chime.\n- Bag open/close: rustle.\n- Glass door slide: modern automatic door whoosh.\n- Purchase confirmed: a short celebratory jingle.\n\n## Implementation notes\n\n- Audio files should be lightweight (Ogg Vorbis, 96–128kbps) — load time is a hard constraint.\n- Music and ambience load separately so ambience can play during music transitions.\n- All audio respects a master mute toggle accessible from the UI.\n- Footstep sounds are triggered by the same terrain-type system as the visual terrain feedback feature.\n\n---\nPromoted from idea_inbox #155 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
967
|
-
"status": "ready",
|
|
968
|
-
"touches": [],
|
|
969
|
-
"est_minutes": 120,
|
|
970
|
-
"est_cost_usd": null,
|
|
971
|
-
"manual_degree": null,
|
|
972
|
-
"priority": 3,
|
|
973
|
-
"automation_tag": null,
|
|
974
|
-
"credits_reward": 6,
|
|
975
|
-
"source": "idea_inbox",
|
|
976
|
-
"source_ref": "idea:155",
|
|
977
|
-
"promoted_at": null,
|
|
978
|
-
"shipped_at": null,
|
|
979
|
-
"shipped_by": null,
|
|
980
|
-
"value_summary": null,
|
|
981
|
-
"created_at": "2026-06-04T22:07:49.039Z",
|
|
982
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
983
|
-
"kind": "feature",
|
|
984
|
-
"parent_task_id": null,
|
|
985
|
-
"actual_minutes": null,
|
|
986
|
-
"scoping_confidence": null,
|
|
987
|
-
"discipline": "unclassified",
|
|
988
|
-
"parallel_safe": null,
|
|
989
|
-
"newcomer_friendly": false,
|
|
990
|
-
"requires_rank": "xenos",
|
|
991
|
-
"needs_migration": false,
|
|
992
|
-
"security_sensitive": false,
|
|
993
|
-
"sandbox_review": null,
|
|
994
|
-
"goal_id": "6",
|
|
995
|
-
"module_key": null,
|
|
996
|
-
"reward_gate_exempt": true,
|
|
997
|
-
"credits_awarded": 0,
|
|
998
|
-
"est_minutes_calibrated": 9
|
|
999
|
-
},
|
|
1000
|
-
{
|
|
1001
|
-
"id": "637",
|
|
1002
|
-
"version_id": "V2",
|
|
1003
|
-
"title": "Device performance gate: show branded Time 2 Upgrade screen if game fails to load within threshold",
|
|
1004
|
-
"description": "## Summary\n\nIf a player's device cannot load the game within a threshold time, show a styled \"Time 2 Upgrade\" screen instead of a broken or degraded experience. Protect the brand by never letting a slow device show a half-loaded game.\n\n## Behaviour\n\n- On page load, start a timer.\n- If the game assets (tileset, sprites, audio) have not finished loading within N seconds (suggested: 8–12s, tunable), cancel loading and show the gate screen.\n- The gate screen is fullscreen, branded, pixel-art styled — it is itself a designed experience, not an error state.\n- Copy (per project tone): something like — *\"Your vessel isn't built for these waters. Borrow a faster ship and return.\"* — with Hermeslines/Amazonprimea branding.\n- Include a retry button (in case it was a network blip, not a device limit).\n- No ugly browser error, no half-rendered tile map, no spinning loader that never resolves.\n\n## Why this approach\n\nThe experience is the product. A luxury brand cannot afford to have visitors see a broken, stuttering, half-loaded game — it destroys the impression immediately. Better to meet them with a crafted screen that is itself on-brand than to let a slow device degrade the experience silently.\n\n## Technical notes\n\n- Threshold N should be configurable via an env var or config value, not hardcoded.\n- The gate screen itself must load in under 1s — it is a single small HTML/CSS page with minimal assets, served before the game bundle loads.\n- Consider also: a lightweight device-capability check (WebGL support, available memory via `navigator.deviceMemory`) as a faster pre-screen before attempting to load assets at all.\n- Gate screen should track analytics: how many users hit it, what device/UA they were on — useful for tuning N and understanding the audience's hardware floor.\n\n---\nPromoted from idea_inbox #156 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
1005
|
-
"status": "ready",
|
|
1006
|
-
"touches": [],
|
|
1007
|
-
"est_minutes": 120,
|
|
1008
|
-
"est_cost_usd": null,
|
|
1009
|
-
"manual_degree": null,
|
|
1010
|
-
"priority": 3,
|
|
1011
|
-
"automation_tag": null,
|
|
1012
|
-
"credits_reward": 6,
|
|
1013
|
-
"source": "idea_inbox",
|
|
1014
|
-
"source_ref": "idea:156",
|
|
1015
|
-
"promoted_at": null,
|
|
1016
|
-
"shipped_at": null,
|
|
1017
|
-
"shipped_by": null,
|
|
1018
|
-
"value_summary": null,
|
|
1019
|
-
"created_at": "2026-06-04T22:07:49.481Z",
|
|
1020
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1021
|
-
"kind": "feature",
|
|
1022
|
-
"parent_task_id": null,
|
|
1023
|
-
"actual_minutes": null,
|
|
1024
|
-
"scoping_confidence": null,
|
|
1025
|
-
"discipline": "unclassified",
|
|
1026
|
-
"parallel_safe": null,
|
|
1027
|
-
"newcomer_friendly": false,
|
|
1028
|
-
"requires_rank": "xenos",
|
|
1029
|
-
"needs_migration": false,
|
|
1030
|
-
"security_sensitive": false,
|
|
1031
|
-
"sandbox_review": null,
|
|
1032
|
-
"goal_id": "6",
|
|
1033
|
-
"module_key": null,
|
|
1034
|
-
"reward_gate_exempt": true,
|
|
1035
|
-
"credits_awarded": 0,
|
|
1036
|
-
"est_minutes_calibrated": 9
|
|
1037
|
-
},
|
|
1038
|
-
{
|
|
1039
|
-
"id": "638",
|
|
1040
|
-
"version_id": "V2",
|
|
1041
|
-
"title": "Secret areas + achievement system: hidden rooms, light puzzles, and a Pokedex-style completionist tracker",
|
|
1042
|
-
"description": "## Summary\n\nHidden areas, light puzzle elements, and an achievement system that rewards players who explore beyond the obvious path — designed to make the world feel deeper than it appears on first entry.\n\n## Secret areas\n\n- **The back room**: a door at the rear of the container interior, locked or hidden. Opened by: finding a key item, completing a NPC quest, or solving a light puzzle (e.g. interact with shelves in a specific order). Contains: exclusive items, lore notes, or a second NPC.\n- **Exterior hidden spot**: a crevice, ruin, or alcove near the container not visible on the main path. Rewards: a lore item, a cosmetic, or a hint about the back room.\n- **Rooftop**: accessible via a ladder or staircase on the container exterior. Gives a view of the broader world; possibly a NPC or a secret item up there.\n\n## Puzzle elements (light — not complex)\n\n- Shelf-interaction sequence: interact with items in a specific order to reveal something.\n- Hidden object: a small item blended into the environment that gives a reward when found.\n- NPC quest chain: talk to the lore helper outside → bring them information from inside → they reveal a secret.\n\n## Achievement system\n\nTracked per browser session (no login required in V1 of this feature):\n\n| Achievement | Trigger |\n|---|---|\n| First Voyage | Enter the container for the first time |\n| Bag Full | Add 3+ items to your bag |\n| Merchant's Friend | Complete a purchase |\n| Lore Keeper | Read all lore helper dialogue |\n| Hidden Harbour | Find a secret area |\n| Full Manifest | Interact with every shelf/item in the store |\n| Rooftop View | Reach the container roof |\n| Completionist | Unlock all other achievements |\n\n- Achievements display as a small toast notification + pixel-art badge.\n- A \"Manifesto\" screen (like the Pokédex completion screen) shows all achievements and progress.\n\n## Why secrets matter\n\nThe brand is \"discovered secret, ancient wisdom, underground.\" Secret areas are not just gameplay — they are brand delivery. Finding the back room should feel exactly like discovering that Hermeslines exists: too good to be true, clearly made for people who know where to look.\n\n---\nPromoted from idea_inbox #157 (builder 25 art/design brief, 2026-06-04). V2 game visual scope.",
|
|
1043
|
-
"status": "ready",
|
|
1044
|
-
"touches": [],
|
|
1045
|
-
"est_minutes": 120,
|
|
1046
|
-
"est_cost_usd": null,
|
|
1047
|
-
"manual_degree": null,
|
|
1048
|
-
"priority": 3,
|
|
1049
|
-
"automation_tag": null,
|
|
1050
|
-
"credits_reward": 6,
|
|
1051
|
-
"source": "idea_inbox",
|
|
1052
|
-
"source_ref": "idea:157",
|
|
1053
|
-
"promoted_at": null,
|
|
1054
|
-
"shipped_at": null,
|
|
1055
|
-
"shipped_by": null,
|
|
1056
|
-
"value_summary": null,
|
|
1057
|
-
"created_at": "2026-06-04T22:07:49.896Z",
|
|
1058
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1059
|
-
"kind": "feature",
|
|
1060
|
-
"parent_task_id": null,
|
|
1061
|
-
"actual_minutes": null,
|
|
1062
|
-
"scoping_confidence": null,
|
|
1063
|
-
"discipline": "unclassified",
|
|
1064
|
-
"parallel_safe": null,
|
|
1065
|
-
"newcomer_friendly": false,
|
|
1066
|
-
"requires_rank": "xenos",
|
|
1067
|
-
"needs_migration": false,
|
|
1068
|
-
"security_sensitive": false,
|
|
1069
|
-
"sandbox_review": null,
|
|
1070
|
-
"goal_id": "6",
|
|
1071
|
-
"module_key": null,
|
|
1072
|
-
"reward_gate_exempt": true,
|
|
1073
|
-
"credits_awarded": 0,
|
|
1074
|
-
"est_minutes_calibrated": 9
|
|
1075
|
-
},
|
|
1076
|
-
{
|
|
1077
|
-
"id": "1140",
|
|
1078
|
-
"version_id": "BONGOS-V1",
|
|
1079
|
-
"title": "1062 ship seems to have bugged, it says the assets were tidied but they were not in comparison to the actual files.",
|
|
1080
|
-
"description": "1062 ship seems to have bugged, it says the assets were tidied but they were not in comparison to the actual files.\n\n— reported from Discord #bugs by IAMMASTERQUA",
|
|
1081
|
-
"status": "ready",
|
|
1082
|
-
"touches": [],
|
|
1083
|
-
"est_minutes": null,
|
|
1084
|
-
"est_cost_usd": null,
|
|
1085
|
-
"manual_degree": null,
|
|
1086
|
-
"priority": 3,
|
|
1087
|
-
"automation_tag": null,
|
|
1088
|
-
"credits_reward": 10,
|
|
1089
|
-
"source": "discord:bugs",
|
|
1090
|
-
"source_ref": "discord:1516302674868310046",
|
|
1091
|
-
"promoted_at": null,
|
|
1092
|
-
"shipped_at": null,
|
|
1093
|
-
"shipped_by": null,
|
|
1094
|
-
"value_summary": null,
|
|
1095
|
-
"created_at": "2026-06-16T04:46:14.318Z",
|
|
1096
|
-
"updated_at": "2026-07-02T21:03:02.890Z",
|
|
1097
|
-
"kind": "bug",
|
|
1098
|
-
"parent_task_id": null,
|
|
1099
|
-
"actual_minutes": null,
|
|
1100
|
-
"scoping_confidence": null,
|
|
1101
|
-
"discipline": "unclassified",
|
|
1102
|
-
"parallel_safe": null,
|
|
1103
|
-
"newcomer_friendly": false,
|
|
1104
|
-
"requires_rank": "xenos",
|
|
1105
|
-
"needs_migration": false,
|
|
1106
|
-
"security_sensitive": false,
|
|
1107
|
-
"sandbox_review": null,
|
|
1108
|
-
"goal_id": "24",
|
|
1109
|
-
"module_key": null,
|
|
1110
|
-
"reward_gate_exempt": true,
|
|
1111
|
-
"credits_awarded": 0,
|
|
1112
|
-
"est_minutes_calibrated": null
|
|
1113
|
-
},
|
|
1114
|
-
{
|
|
1115
|
-
"id": "1468",
|
|
1116
|
-
"version_id": "BONGOS-V1",
|
|
1117
|
-
"title": "Builders' hall: let a builder change their displayed username",
|
|
1118
|
-
"description": "From idea 363 (Discord, jaxri). Allow editing the hall display name (builders.display_name already exists) via Settings. public-builders/ + a route; guard against impersonation/dupes.",
|
|
1119
|
-
"status": "ready",
|
|
1120
|
-
"touches": [],
|
|
1121
|
-
"est_minutes": 60,
|
|
1122
|
-
"est_cost_usd": null,
|
|
1123
|
-
"manual_degree": null,
|
|
1124
|
-
"priority": 3,
|
|
1125
|
-
"automation_tag": null,
|
|
1126
|
-
"credits_reward": 30,
|
|
1127
|
-
"source": "idea_inbox",
|
|
1128
|
-
"source_ref": "idea:363",
|
|
1129
|
-
"promoted_at": null,
|
|
1130
|
-
"shipped_at": null,
|
|
1131
|
-
"shipped_by": null,
|
|
1132
|
-
"value_summary": null,
|
|
1133
|
-
"created_at": "2026-06-23T18:40:07.751Z",
|
|
1134
|
-
"updated_at": "2026-07-09T01:23:00.099Z",
|
|
1135
|
-
"kind": "feature",
|
|
1136
|
-
"parent_task_id": null,
|
|
1137
|
-
"actual_minutes": 6,
|
|
1138
|
-
"scoping_confidence": null,
|
|
1139
|
-
"discipline": "unclassified",
|
|
1140
|
-
"parallel_safe": null,
|
|
1141
|
-
"newcomer_friendly": false,
|
|
1142
|
-
"requires_rank": "xenos",
|
|
1143
|
-
"needs_migration": false,
|
|
1144
|
-
"security_sensitive": false,
|
|
1145
|
-
"sandbox_review": null,
|
|
1146
|
-
"goal_id": "25",
|
|
1147
|
-
"module_key": null,
|
|
1148
|
-
"reward_gate_exempt": false,
|
|
1149
|
-
"credits_awarded": 0,
|
|
1150
|
-
"est_minutes_calibrated": 5
|
|
1151
|
-
},
|
|
1152
|
-
{
|
|
1153
|
-
"id": "1641",
|
|
1154
|
-
"version_id": "BONGOS-V1",
|
|
1155
|
-
"title": "Migrate doc generators (repo-map / session-index / file-map) to server-side redraw on deploy",
|
|
1156
|
-
"description": "Follow-up to the Repo Atlas server-side pipeline (ADR 0093). Owner asked to \"do the same for documentation.\"\n\nToday gen-repo-map / gen-session-index / gen-file-map run on the SHIPPING BUILDER'S machine during /builder-ship (ship.js autoMerge regen, ~lines 1786–1893) and are committed into the PR; a CI freshness `--check` (fitness.js checkGeneratedArtifactsFresh, ~lines 175–191) asserts the committed copy is fresh. Move them to the same server-side deploy step as the Atlas so they redraw on the droplet, independent of who shipped or from what machine.\n\n**What changes:** (1) add the three generators to the droplet deploy step (deploy-prod.sh); (2) delete their regenerate*() calls from ship.js; (3) retire/replace their fitness.js `--check` entries + gitignore the outputs (otherwise the freshness gate fails every PR once local regen stops) — OR keep committing them via the reconciler push path (conflict-resolve.js already clones+regens+pushes server-side).\n\n**Exception — diagrams stay as-is:** gen-diagrams needs a headless browser (the droplet has none, gen-diagrams.js:16) + an authenticated GDS session for the conceptual slices (diagram-facts.js). It does NOT migrate cleanly; document the exception.\n\n**Done when:** repo-map/session-index/file-map regenerate server-side on deploy with no local ship-time step; CI no longer fails on their staleness; the diagrams exception is documented.",
|
|
1157
|
-
"status": "ready",
|
|
1158
|
-
"touches": [
|
|
1159
|
-
"scripts/gds/ship.js",
|
|
1160
|
-
"scripts/deploy/",
|
|
1161
|
-
"scripts/gds/fitness.js",
|
|
1162
|
-
".gitignore",
|
|
1163
|
-
"docs/recipes/"
|
|
1164
|
-
],
|
|
1165
|
-
"est_minutes": 240,
|
|
1166
|
-
"est_cost_usd": null,
|
|
1167
|
-
"manual_degree": 3,
|
|
1168
|
-
"priority": 3,
|
|
1169
|
-
"automation_tag": null,
|
|
1170
|
-
"credits_reward": 40,
|
|
1171
|
-
"source": "owner-request",
|
|
1172
|
-
"source_ref": "repo-atlas-doc-migration",
|
|
1173
|
-
"promoted_at": "2026-06-30T21:35:30.038Z",
|
|
1174
|
-
"shipped_at": null,
|
|
1175
|
-
"shipped_by": null,
|
|
1176
|
-
"value_summary": null,
|
|
1177
|
-
"created_at": "2026-06-27T10:21:40.730Z",
|
|
1178
|
-
"updated_at": "2026-07-02T21:03:02.890Z",
|
|
1179
|
-
"kind": "infra",
|
|
1180
|
-
"parent_task_id": null,
|
|
1181
|
-
"actual_minutes": null,
|
|
1182
|
-
"scoping_confidence": null,
|
|
1183
|
-
"discipline": "engineer",
|
|
1184
|
-
"parallel_safe": null,
|
|
1185
|
-
"newcomer_friendly": false,
|
|
1186
|
-
"requires_rank": "metic",
|
|
1187
|
-
"needs_migration": false,
|
|
1188
|
-
"security_sensitive": false,
|
|
1189
|
-
"sandbox_review": null,
|
|
1190
|
-
"goal_id": "24",
|
|
1191
|
-
"module_key": null,
|
|
1192
|
-
"reward_gate_exempt": false,
|
|
1193
|
-
"credits_awarded": 0,
|
|
1194
|
-
"est_minutes_calibrated": 20
|
|
1195
|
-
},
|
|
1196
|
-
{
|
|
1197
|
-
"id": "1654",
|
|
1198
|
-
"version_id": "BONGOS-V1",
|
|
1199
|
-
"title": "Roll out the docstring / module-header convention (ADR 0095)",
|
|
1200
|
-
"description": "Operationalize the one accepted decision in ADR 0095 (docs/adr/0095-cross-agent-context-management.md). (1) Add the docstring + module-header doc-comment convention to the conventions guidance agents read (root + nested CLAUDE.md, and the AGENTS.md adapter if/when that deferred item lands). (2) Backfill short doc-comments on high-traffic modules opportunistically; new + touched code adopts it by default. (3) Decide whether a non-blocking lint/fitness nudge is worth adding (do not make it ship-blocking without owner sign-off). Convention: every public function/class and each module gets a short natural-language doc-comment saying WHAT it does and WHY it exists (not how), using the concept words a human would search for and naming key collaborating symbols. Rationale: meaning written into version-controlled source is the zero-recurring-cost, zero-index-drift core of semantic findability — it helps literal/grep search, agentic search, and any future embedding alike. Depends on ADR 0095 (task 1651) shipping.",
|
|
1201
|
-
"status": "ready",
|
|
1202
|
-
"touches": [],
|
|
1203
|
-
"est_minutes": 180,
|
|
1204
|
-
"est_cost_usd": null,
|
|
1205
|
-
"manual_degree": 3,
|
|
1206
|
-
"priority": 3,
|
|
1207
|
-
"automation_tag": null,
|
|
1208
|
-
"credits_reward": 30,
|
|
1209
|
-
"source": "manual",
|
|
1210
|
-
"source_ref": "adr-0095-docstring-rollout",
|
|
1211
|
-
"promoted_at": "2026-06-27T17:47:40.133Z",
|
|
1212
|
-
"shipped_at": null,
|
|
1213
|
-
"shipped_by": null,
|
|
1214
|
-
"value_summary": null,
|
|
1215
|
-
"created_at": "2026-06-27T16:57:13.972Z",
|
|
1216
|
-
"updated_at": "2026-07-02T21:03:02.890Z",
|
|
1217
|
-
"kind": "refactor",
|
|
1218
|
-
"parent_task_id": null,
|
|
1219
|
-
"actual_minutes": null,
|
|
1220
|
-
"scoping_confidence": null,
|
|
1221
|
-
"discipline": "engineer",
|
|
1222
|
-
"parallel_safe": null,
|
|
1223
|
-
"newcomer_friendly": false,
|
|
1224
|
-
"requires_rank": "xenos",
|
|
1225
|
-
"needs_migration": false,
|
|
1226
|
-
"security_sensitive": false,
|
|
1227
|
-
"sandbox_review": null,
|
|
1228
|
-
"goal_id": "27",
|
|
1229
|
-
"module_key": null,
|
|
1230
|
-
"reward_gate_exempt": true,
|
|
1231
|
-
"credits_awarded": 0,
|
|
1232
|
-
"est_minutes_calibrated": 24
|
|
1233
|
-
},
|
|
1234
|
-
{
|
|
1235
|
-
"id": "1671",
|
|
1236
|
-
"version_id": "BONGOS-V1",
|
|
1237
|
-
"title": "Retroactive drachmae backfill for shipped 0-reward tasks (Archon-authorized)",
|
|
1238
|
-
"description": "(probe)",
|
|
1239
|
-
"status": "ready",
|
|
1240
|
-
"touches": [
|
|
1241
|
-
"scripts/gds/backfill-task-rewards.js",
|
|
1242
|
-
"docs/adr/"
|
|
1243
|
-
],
|
|
1244
|
-
"est_minutes": 180,
|
|
1245
|
-
"est_cost_usd": null,
|
|
1246
|
-
"manual_degree": null,
|
|
1247
|
-
"priority": 3,
|
|
1248
|
-
"automation_tag": null,
|
|
1249
|
-
"credits_reward": 40,
|
|
1250
|
-
"source": "manual",
|
|
1251
|
-
"source_ref": "econ-retroactive-reward-backfill",
|
|
1252
|
-
"promoted_at": null,
|
|
1253
|
-
"shipped_at": null,
|
|
1254
|
-
"shipped_by": null,
|
|
1255
|
-
"value_summary": "Builders who shipped 0-reward tasks get fairly paid the drachmae they earned, with a full audit trail.",
|
|
1256
|
-
"created_at": "2026-06-28T17:28:32.429Z",
|
|
1257
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1258
|
-
"kind": "decision",
|
|
1259
|
-
"parent_task_id": null,
|
|
1260
|
-
"actual_minutes": null,
|
|
1261
|
-
"scoping_confidence": null,
|
|
1262
|
-
"discipline": "engineer",
|
|
1263
|
-
"parallel_safe": null,
|
|
1264
|
-
"newcomer_friendly": false,
|
|
1265
|
-
"requires_rank": "metic",
|
|
1266
|
-
"needs_migration": false,
|
|
1267
|
-
"security_sensitive": true,
|
|
1268
|
-
"sandbox_review": null,
|
|
1269
|
-
"goal_id": "3",
|
|
1270
|
-
"module_key": null,
|
|
1271
|
-
"reward_gate_exempt": true,
|
|
1272
|
-
"credits_awarded": 0,
|
|
1273
|
-
"est_minutes_calibrated": 18
|
|
1274
|
-
},
|
|
1275
|
-
{
|
|
1276
|
-
"id": "1927",
|
|
1277
|
-
"version_id": "BONGOS-V1",
|
|
1278
|
-
"title": "ADR 0110 pt.2 — take the OpenAPI spec off the git graph (gitignore + deploy-regen + a bounded freshness bot)",
|
|
1279
|
-
"description": "Follow-up to task 1926 / ADR 0110. Apply the same gitignore + deploy-regen treatment to the whole-file API docs (docs/api/openapi.json, docs/api-reference.md, docs/routes-permissions.md) so parallel branches stop colliding on them. UNLIKE repo-map/session-index, the spec has EXTERNAL consumers (Postman/Swagger/AI tooling fetch openapi.json off disk), so a deploy-only refresh leaves a staleness window after a route change — add a bounded, poller-driven regen bot (ADR 0082 reconciler-style, lands an ordinary auto-merging PR; the App token is branch-protection-blocked from main by design). CRITICAL: gen-api-docs --check does DOUBLE duty (drift + OpenAPI 3.1 structural validity) — split it like gen-repo-map (ADR 0110): keep the structural-validity half a HARD per-PR gate, drop only the drift half. deps: 1926.",
|
|
1280
|
-
"status": "ready",
|
|
1281
|
-
"touches": [],
|
|
1282
|
-
"est_minutes": null,
|
|
1283
|
-
"est_cost_usd": null,
|
|
1284
|
-
"manual_degree": null,
|
|
1285
|
-
"priority": 3,
|
|
1286
|
-
"automation_tag": null,
|
|
1287
|
-
"credits_reward": 30,
|
|
1288
|
-
"source": "planning",
|
|
1289
|
-
"source_ref": "ADR0110-followup-openapi",
|
|
1290
|
-
"promoted_at": "2026-07-03T19:10:11.302Z",
|
|
1291
|
-
"shipped_at": null,
|
|
1292
|
-
"shipped_by": null,
|
|
1293
|
-
"value_summary": null,
|
|
1294
|
-
"created_at": "2026-07-03T18:53:36.664Z",
|
|
1295
|
-
"updated_at": "2026-07-03T19:10:11.302Z",
|
|
1296
|
-
"kind": "feature",
|
|
1297
|
-
"parent_task_id": null,
|
|
1298
|
-
"actual_minutes": null,
|
|
1299
|
-
"scoping_confidence": null,
|
|
1300
|
-
"discipline": "engineer",
|
|
1301
|
-
"parallel_safe": null,
|
|
1302
|
-
"newcomer_friendly": false,
|
|
1303
|
-
"requires_rank": "xenos",
|
|
1304
|
-
"needs_migration": false,
|
|
1305
|
-
"security_sensitive": false,
|
|
1306
|
-
"sandbox_review": null,
|
|
1307
|
-
"goal_id": "24",
|
|
1308
|
-
"module_key": null,
|
|
1309
|
-
"reward_gate_exempt": false,
|
|
1310
|
-
"credits_awarded": 0,
|
|
1311
|
-
"est_minutes_calibrated": null
|
|
1312
|
-
},
|
|
1313
|
-
{
|
|
1314
|
-
"id": "1930",
|
|
1315
|
-
"version_id": "BONGOS-V1",
|
|
1316
|
-
"title": "ADR 0110 pt.5 — main-only staleness monitor for gitignored generated artifacts",
|
|
1317
|
-
"description": "Follow-up to task 1926 / ADR 0110. The per-PR whole-file freshness gate is gone (repo-map + session-index are gitignored + deploy-regenerated), and deploy-time generators fail best-effort. Add a monitor that ALARMS when a served/on-disk generated artifact's content lags main's HEAD (the deploy generator silently broke) — model it on the search-index staleness monitor (#972). This converts silent rot into a loud signal and is the load-bearing backstop the ADR 0110 warn-only posture depends on. Advances goal 24 / gcarry-pipe-loud. deps: 1926.",
|
|
1318
|
-
"status": "ready",
|
|
1319
|
-
"touches": [],
|
|
1320
|
-
"est_minutes": null,
|
|
1321
|
-
"est_cost_usd": null,
|
|
1322
|
-
"manual_degree": null,
|
|
1323
|
-
"priority": 3,
|
|
1324
|
-
"automation_tag": null,
|
|
1325
|
-
"credits_reward": 30,
|
|
1326
|
-
"source": "planning",
|
|
1327
|
-
"source_ref": "ADR0110-followup-monitor",
|
|
1328
|
-
"promoted_at": "2026-07-03T19:10:11.302Z",
|
|
1329
|
-
"shipped_at": null,
|
|
1330
|
-
"shipped_by": null,
|
|
1331
|
-
"value_summary": null,
|
|
1332
|
-
"created_at": "2026-07-03T18:53:36.950Z",
|
|
1333
|
-
"updated_at": "2026-07-03T19:10:11.302Z",
|
|
1334
|
-
"kind": "feature",
|
|
1335
|
-
"parent_task_id": null,
|
|
1336
|
-
"actual_minutes": null,
|
|
1337
|
-
"scoping_confidence": null,
|
|
1338
|
-
"discipline": "engineer",
|
|
1339
|
-
"parallel_safe": null,
|
|
1340
|
-
"newcomer_friendly": false,
|
|
1341
|
-
"requires_rank": "xenos",
|
|
1342
|
-
"needs_migration": false,
|
|
1343
|
-
"security_sensitive": false,
|
|
1344
|
-
"sandbox_review": null,
|
|
1345
|
-
"goal_id": "24",
|
|
1346
|
-
"module_key": null,
|
|
1347
|
-
"reward_gate_exempt": false,
|
|
1348
|
-
"credits_awarded": 0,
|
|
1349
|
-
"est_minutes_calibrated": null
|
|
1350
|
-
},
|
|
1351
|
-
{
|
|
1352
|
-
"id": "2076",
|
|
1353
|
-
"version_id": "GDS-V3",
|
|
1354
|
-
"title": "Server down?",
|
|
1355
|
-
"description": "Server down?\n\n— reported from Discord #bugs by IAMMASTERQUA\n\nAttachments (2):\n\n",
|
|
1356
|
-
"status": "ready",
|
|
1357
|
-
"touches": [],
|
|
1358
|
-
"est_minutes": null,
|
|
1359
|
-
"est_cost_usd": null,
|
|
1360
|
-
"manual_degree": null,
|
|
1361
|
-
"priority": 3,
|
|
1362
|
-
"automation_tag": null,
|
|
1363
|
-
"credits_reward": 10,
|
|
1364
|
-
"source": "discord:bugs",
|
|
1365
|
-
"source_ref": "discord:1523688670492627115",
|
|
1366
|
-
"promoted_at": "2026-07-06T13:55:33.358Z",
|
|
1367
|
-
"shipped_at": null,
|
|
1368
|
-
"shipped_by": null,
|
|
1369
|
-
"value_summary": null,
|
|
1370
|
-
"created_at": "2026-07-06T13:55:33.358Z",
|
|
1371
|
-
"updated_at": "2026-07-06T13:55:33.358Z",
|
|
1372
|
-
"kind": "bug",
|
|
1373
|
-
"parent_task_id": null,
|
|
1374
|
-
"actual_minutes": null,
|
|
1375
|
-
"scoping_confidence": null,
|
|
1376
|
-
"discipline": "unclassified",
|
|
1377
|
-
"parallel_safe": null,
|
|
1378
|
-
"newcomer_friendly": false,
|
|
1379
|
-
"requires_rank": "xenos",
|
|
1380
|
-
"needs_migration": false,
|
|
1381
|
-
"security_sensitive": false,
|
|
1382
|
-
"sandbox_review": null,
|
|
1383
|
-
"goal_id": "2",
|
|
1384
|
-
"module_key": null,
|
|
1385
|
-
"reward_gate_exempt": false,
|
|
1386
|
-
"credits_awarded": 0,
|
|
1387
|
-
"est_minutes_calibrated": null
|
|
1388
|
-
},
|
|
1389
|
-
{
|
|
1390
|
-
"id": "528",
|
|
1391
|
-
"version_id": "BONGOS-V1",
|
|
1392
|
-
"title": "Claim-preserving re-grade (--regrade): re-grade a completed task with no active claim (deferred from #513; needs #526 first)",
|
|
1393
|
-
"description": "Deferred from #513. When a subagent grade fails, the claim is already consumed by resolve and the task sits at 'completed'; re-running /builder-ship hard-exits 'no active claim' (the #506 session hand-wrote a one-off regrade script). The fix: a --regrade flag that re-grades the committed diff directly (POST /tasks/:id/grade, no re-claim), re-running scanner+smoke, never auto-merging.\n\nWorking implementation + dogfize proof exist in #513 history (the path functioned correctly). It was pulled from #513 because the #513 grader (Hacker, [major]) showed it makes cross-builder credit-farming reachable via a single CLI flag: /tasks/:id/grade is requireBuilder-only and applyGrade attributes credits+shipped_by to the GRADER (req.builder.id). DEPENDS ON #526 (server-side: attribute the confirm credit/shipped_by to the task RESOLVER, and/or require the requester be the resolver for the credit-awarding transition).\n\nOnce #526 lands, re-introduce --regrade (explicit opt-in, never auto-merges). Acceptance: re-running ship on your own completed task re-grades without a re-claim; cannot bank a foreign task's credits; tests cover the flag; smoke green.",
|
|
1394
|
-
"status": "ready",
|
|
1395
|
-
"touches": [
|
|
1396
|
-
"scripts/gds/ship.js"
|
|
1397
|
-
],
|
|
1398
|
-
"est_minutes": 45,
|
|
1399
|
-
"est_cost_usd": null,
|
|
1400
|
-
"manual_degree": null,
|
|
1401
|
-
"priority": 4,
|
|
1402
|
-
"automation_tag": null,
|
|
1403
|
-
"credits_reward": 0,
|
|
1404
|
-
"source": "manual",
|
|
1405
|
-
"source_ref": null,
|
|
1406
|
-
"promoted_at": null,
|
|
1407
|
-
"shipped_at": null,
|
|
1408
|
-
"shipped_by": null,
|
|
1409
|
-
"value_summary": null,
|
|
1410
|
-
"created_at": "2026-06-02T08:17:03.713Z",
|
|
1411
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1412
|
-
"kind": "infra",
|
|
1413
|
-
"parent_task_id": null,
|
|
1414
|
-
"actual_minutes": null,
|
|
1415
|
-
"scoping_confidence": null,
|
|
1416
|
-
"discipline": "engineer",
|
|
1417
|
-
"parallel_safe": null,
|
|
1418
|
-
"newcomer_friendly": false,
|
|
1419
|
-
"requires_rank": "metic",
|
|
1420
|
-
"needs_migration": false,
|
|
1421
|
-
"security_sensitive": false,
|
|
1422
|
-
"sandbox_review": null,
|
|
1423
|
-
"goal_id": "3",
|
|
1424
|
-
"module_key": null,
|
|
1425
|
-
"reward_gate_exempt": true,
|
|
1426
|
-
"credits_awarded": 0,
|
|
1427
|
-
"est_minutes_calibrated": 4
|
|
1428
|
-
},
|
|
1429
|
-
{
|
|
1430
|
-
"id": "1186",
|
|
1431
|
-
"version_id": "V2",
|
|
1432
|
-
"title": "Generate one new in-world art asset of your choice (a prop, plant, animal, or accessory) via the pixel-art pipeline",
|
|
1433
|
-
"description": "## What you're doing\n\nAmazonprimea is a young ancient-Greek coastal world, and it always needs more to look at. Your first ship as an artist is to **generate ONE new in-world asset of your own choosing** and add it to the world. You pick the subject — that's the fun part. Good candidates, all in-world (Mediterranean coast just south of Athens, mythic 'discovered secret' tone):\n- **Props**: amphora, fishing net, basket, crate, urn, torch, market awning, oar, clay pot.\n- **Plants**: olive tree, cypress, reeds, grapevine, shrub, wild herbs.\n- **Animals**: goat, chicken, duck, donkey, fish, gull, lizard.\n- **Accessories**: a sandal, a sun hat, a length of rope, a string of beads.\n\nIt is identical for every newcomer and **always valuable**, because a growing world has effectively unbounded demand for new props, flora, fauna, and detail — every newcomer picks a different subject, so two runs never collide.\n\n## How to find your way in\n\n1. Read `art/README.md` and `docs/recipes/pixel-art-pipeline.md`, plus `art/template/style_guide.md`, `art/template/rubric.json`, and `art/template/palette.json` — that's the look you must hit: 16-bit pixel art, early-Pokémon (FireRed) touchstone, top-down, 32×32, locked 64-colour Mediterranean palette (olive greens, warm tans, turquoise sea, weathered marble — NOT spring green, NOT navy, NOT pine).\n2. **Pick ONE subject.** Keep it to a SINGLE 32×32 tile/sprite — not a whole spritesheet or family (that's a bigger task).\n3. **Check the budget first**: `python3 art/pipeline/cost_ledger.py status` (the pipeline hard-stops at $80; one asset is ~$0.05–0.45).\n4. **Generate via the pipeline — do not hand-draw or freelance.** Use the `/otb-tile-generate` skill: it appends your new entry to `art/template/vocabulary.json`, runs the generate → post-process-to-32×32 → score-against-rubric → retry orchestrator, saves the final PNG to `art/generated/tiles/<id>.png`, and logs cost. (This needs the art pipeline's `GOOGLE_AI_STUDIO_KEY`, which resolves from `~/.config/otb/env`; most builder setups have it. If yours doesn't, claim the engineer or ideator newcomer chore instead, or ask an Archon to enable it.)\n5. **Confirm it PASSED** the rubric (`art/iterations/run_summary.json` shows `status: \"pass\"`). If it only reached best-effort, regenerate with the fix_hint — never paper over a fail.\n6. **See it in-game**: `node scripts/gds/art-stage.js` rebuilds the atlas and surfaces it on your sandbox preview (`sandbox-<login>.amazonprimea.com`).\n7. Ship via `/builder-ship`; the ship notes name your asset and its rubric score.\n\n## Stay clear of (READ-ONLY)\n\nNever modify the locked palette (`art/template/palette.json`) or the rubric (`art/template/rubric.json`) — those are theme-defining and changing them needs an ADR (out of scope for a first ship). Touch only art assets/vocabulary under `art/` (and, only if your asset is a genuinely new base-tile TYPE, the `public/game/world/tilePalette.js` mapping). Do not touch any permission/pipeline-core/migration/infra file.\n\n**Done when:**\n- Exactly one NEW in-world asset (your chosen subject) was generated via the pixel-art pipeline (`/otb-tile-generate` / orchestrator.py); the final PNG exists at art/generated/tiles/<id>.png.\n- It PASSED the rubric (art/iterations/run_summary.json status 'pass', or /otb-design-review numbers reported at/above the bar) and every pixel is on the locked palette (art/template/palette.json).\n- A vocabulary.json entry was added for the new asset; the locked palette.json and rubric.json were NOT modified.\n- Only art/ files changed (plus, at most, the public/game/world/tilePalette.js wiring for a genuinely new base-tile type) — no permission, pipeline-core, migration, or infra file.\n- You staged it (`node scripts/gds/art-stage.js`) and the ship notes name the asset id and its rubric score.\n\n_Evergreen newcomer task — one of three fixed first-builder chores (one per discipline). The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1434
|
-
"status": "ready",
|
|
1435
|
-
"touches": [
|
|
1436
|
-
"art/generated/tiles/beach_rock_scatter.png",
|
|
1437
|
-
"art/template/tile_index.json",
|
|
1438
|
-
"art/template/vocabulary.json",
|
|
1439
|
-
"public/assets/tiles/atlas-bd23d615.png",
|
|
1440
|
-
"public/assets/tiles/atlas-f8d1708d.png",
|
|
1441
|
-
"public/assets/tiles/atlas-index.json",
|
|
1442
|
-
"public/assets/tiles/atlas.json",
|
|
1443
|
-
"public/assets/tiles/manifest.json",
|
|
1444
|
-
"public/assets/tiles/objects/beach_rock_scatter.png"
|
|
1445
|
-
],
|
|
1446
|
-
"est_minutes": 55,
|
|
1447
|
-
"est_cost_usd": null,
|
|
1448
|
-
"manual_degree": null,
|
|
1449
|
-
"priority": 4,
|
|
1450
|
-
"automation_tag": null,
|
|
1451
|
-
"credits_reward": 15,
|
|
1452
|
-
"source": "newcomer-template",
|
|
1453
|
-
"source_ref": "tmpl:artist:asset-generate-pass:8",
|
|
1454
|
-
"promoted_at": "2026-06-18T00:14:55.028Z",
|
|
1455
|
-
"shipped_at": null,
|
|
1456
|
-
"shipped_by": null,
|
|
1457
|
-
"value_summary": "",
|
|
1458
|
-
"created_at": "2026-06-18T00:14:55.028Z",
|
|
1459
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1460
|
-
"kind": "feature",
|
|
1461
|
-
"parent_task_id": null,
|
|
1462
|
-
"actual_minutes": 5746,
|
|
1463
|
-
"scoping_confidence": null,
|
|
1464
|
-
"discipline": "artist",
|
|
1465
|
-
"parallel_safe": null,
|
|
1466
|
-
"newcomer_friendly": true,
|
|
1467
|
-
"requires_rank": "xenos",
|
|
1468
|
-
"needs_migration": false,
|
|
1469
|
-
"security_sensitive": false,
|
|
1470
|
-
"sandbox_review": {
|
|
1471
|
-
"at": "2026-06-23T17:10:31.390619-04:00",
|
|
1472
|
-
"by": "IAMMASTERQUA",
|
|
1473
|
-
"url": null,
|
|
1474
|
-
"stamp": "14a3adbe57fc929d528aa78cebfe8fda9bf15d8ed7bd2c2d950831d3b840c62b",
|
|
1475
|
-
"method": "flag"
|
|
1476
|
-
},
|
|
1477
|
-
"goal_id": "6",
|
|
1478
|
-
"module_key": null,
|
|
1479
|
-
"reward_gate_exempt": true,
|
|
1480
|
-
"credits_awarded": 0,
|
|
1481
|
-
"est_minutes_calibrated": 4
|
|
1482
|
-
},
|
|
1483
|
-
{
|
|
1484
|
-
"id": "1220",
|
|
1485
|
-
"version_id": "BONGOS-V1",
|
|
1486
|
-
"title": "Per-builder, per-stage model allocation: wire ADR 0021 skill_model_prefs into execution + per-skill->per-stage reshape",
|
|
1487
|
-
"description": "Promoted from idea_inbox #30 (CLAUDE.md S2 explicitly names this as the V4 target that replaces the project-wide Haiku/Opus routing policy). SEQUENCED AFTER the model-agnostic/LiteLLM decision (task 1069) per owner direction — do not build the config layer twice; this task is dep-gated on 1069.\n\nGrounded by subagent: the per-builder model-preference MECHANISM already shipped under ADR 0021 (task 304, V3.R85): builders.skill_model_prefs jsonb (migration 037), src/gds/skill-prefs.js (getForBuilder), GET/PATCH /api/gds/me/skill-prefs, and the /builders UI matrix. ADR 0021 says it 'pulls forward a minimal slice of GDS-V4 idea #30.' The load-bearing GAP is the execution-time hook: no SKILL.md or Agent-tool spawn currently reads getForBuilder() at runtime, so the stored preference has zero effect today. Plus a granularity reshape from per-skill to per-stage (plumbing / research / code-ship), which the jsonb can absorb (only the helper changes).\n\nOpen questions: per-stage vs per-skill keying; native-Claude tokens vs fold into the LiteLLM/BYOK direction (#1013/#1069); interaction with the $50 per-builder budget cap (C3) and ADR 0054 cost-plus reward (cheaper allocation = incentive or quality risk?); and how a builder downgrading models squares with the grader's cross-family adversarial guarantee (grader.js selectGraderModel keys off builderModel). The reason CLAUDE.md S2 killed Sonnet for research must inform guardrails — optimize allocation against the quality grader (idea body).",
|
|
1488
|
-
"status": "ready",
|
|
1489
|
-
"touches": [
|
|
1490
|
-
"src/gds/skill-prefs.js",
|
|
1491
|
-
"src/gds/routes/me.js",
|
|
1492
|
-
"public-builders/builders.js",
|
|
1493
|
-
".claude/skills/"
|
|
1494
|
-
],
|
|
1495
|
-
"est_minutes": 240,
|
|
1496
|
-
"est_cost_usd": null,
|
|
1497
|
-
"manual_degree": null,
|
|
1498
|
-
"priority": 4,
|
|
1499
|
-
"automation_tag": null,
|
|
1500
|
-
"credits_reward": 8,
|
|
1501
|
-
"source": "idea_inbox",
|
|
1502
|
-
"source_ref": "idea:30",
|
|
1503
|
-
"promoted_at": null,
|
|
1504
|
-
"shipped_at": null,
|
|
1505
|
-
"shipped_by": null,
|
|
1506
|
-
"value_summary": null,
|
|
1507
|
-
"created_at": "2026-06-18T03:44:33.272Z",
|
|
1508
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1509
|
-
"kind": "feature",
|
|
1510
|
-
"parent_task_id": null,
|
|
1511
|
-
"actual_minutes": null,
|
|
1512
|
-
"scoping_confidence": null,
|
|
1513
|
-
"discipline": "unclassified",
|
|
1514
|
-
"parallel_safe": null,
|
|
1515
|
-
"newcomer_friendly": false,
|
|
1516
|
-
"requires_rank": "metic",
|
|
1517
|
-
"needs_migration": true,
|
|
1518
|
-
"security_sensitive": false,
|
|
1519
|
-
"sandbox_review": null,
|
|
1520
|
-
"goal_id": "3",
|
|
1521
|
-
"module_key": null,
|
|
1522
|
-
"reward_gate_exempt": true,
|
|
1523
|
-
"credits_awarded": 0,
|
|
1524
|
-
"est_minutes_calibrated": 18
|
|
1525
|
-
},
|
|
1526
|
-
{
|
|
1527
|
-
"id": "1446",
|
|
1528
|
-
"version_id": "V2",
|
|
1529
|
-
"title": "Generate one new in-world art asset of your choice (a prop, plant, animal, or accessory) via the pixel-art pipeline",
|
|
1530
|
-
"description": "## What you're doing\n\nAmazonprimea is a young ancient-Greek coastal world, and it always needs more to look at. Your first ship as an artist is to **generate ONE new in-world asset of your own choosing** and add it to the world. You pick the subject — that's the fun part. Good candidates, all in-world (Mediterranean coast just south of Athens, mythic 'discovered secret' tone):\n- **Props**: amphora, fishing net, basket, crate, urn, torch, market awning, oar, clay pot.\n- **Plants**: olive tree, cypress, reeds, grapevine, shrub, wild herbs.\n- **Animals**: goat, chicken, duck, donkey, fish, gull, lizard.\n- **Accessories**: a sandal, a sun hat, a length of rope, a string of beads.\n\nIt is identical for every newcomer and **always valuable**, because a growing world has effectively unbounded demand for new props, flora, fauna, and detail — every newcomer picks a different subject, so two runs never collide.\n\n## How to find your way in\n\n1. Read `art/README.md` and `docs/recipes/pixel-art-pipeline.md`, plus `art/template/style_guide.md`, `art/template/rubric.json`, and `art/template/palette.json` — that's the look you must hit: 16-bit pixel art, early-Pokémon (FireRed) touchstone, top-down, 32×32, locked 64-colour Mediterranean palette (olive greens, warm tans, turquoise sea, weathered marble — NOT spring green, NOT navy, NOT pine).\n2. **Pick ONE subject.** Keep it to a SINGLE 32×32 tile/sprite — not a whole spritesheet or family (that's a bigger task).\n3. **Check the budget first**: `python3 art/pipeline/cost_ledger.py status` (the pipeline hard-stops at $80; one asset is ~$0.05–0.45).\n4. **Generate via the pipeline — do not hand-draw or freelance.** Use the `/otb-tile-generate` skill: it appends your new entry to `art/template/vocabulary.json`, runs the generate → post-process-to-32×32 → score-against-rubric → retry orchestrator, saves the final PNG to `art/generated/tiles/<id>.png`, and logs cost. (This needs the art pipeline's `GOOGLE_AI_STUDIO_KEY`, which resolves from `~/.config/otb/env`; most builder setups have it. If yours doesn't, claim the engineer or ideator newcomer chore instead, or ask an Archon to enable it.)\n5. **Confirm it PASSED** the rubric (`art/iterations/run_summary.json` shows `status: \"pass\"`). If it only reached best-effort, regenerate with the fix_hint — never paper over a fail.\n6. **See it in-game**: `node scripts/gds/art-stage.js` rebuilds the atlas and surfaces it on your sandbox preview (`sandbox-<login>.amazonprimea.com`).\n7. Ship via `/builder-ship`; the ship notes name your asset and its rubric score.\n\n## Stay clear of (READ-ONLY)\n\nNever modify the locked palette (`art/template/palette.json`) or the rubric (`art/template/rubric.json`) — those are theme-defining and changing them needs an ADR (out of scope for a first ship). Touch only art assets/vocabulary under `art/` (and, only if your asset is a genuinely new base-tile TYPE, the `public/game/world/tilePalette.js` mapping). Do not touch any permission/pipeline-core/migration/infra file.\n\n**Done when:**\n- Exactly one NEW in-world asset (your chosen subject) was generated via the pixel-art pipeline (`/otb-tile-generate` / orchestrator.py); the final PNG exists at art/generated/tiles/<id>.png.\n- It PASSED the rubric (art/iterations/run_summary.json status 'pass', or /otb-design-review numbers reported at/above the bar) and every pixel is on the locked palette (art/template/palette.json).\n- A vocabulary.json entry was added for the new asset; the locked palette.json and rubric.json were NOT modified.\n- Only art/ files changed (plus, at most, the public/game/world/tilePalette.js wiring for a genuinely new base-tile type) — no permission, pipeline-core, migration, or infra file.\n- You staged it (`node scripts/gds/art-stage.js`) and the ship notes name the asset id and its rubric score.\n\n_Evergreen newcomer task — one of three fixed first-builder chores (one per discipline). The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1531
|
-
"status": "ready",
|
|
1532
|
-
"touches": [],
|
|
1533
|
-
"est_minutes": 55,
|
|
1534
|
-
"est_cost_usd": null,
|
|
1535
|
-
"manual_degree": null,
|
|
1536
|
-
"priority": 4,
|
|
1537
|
-
"automation_tag": null,
|
|
1538
|
-
"credits_reward": 15,
|
|
1539
|
-
"source": "newcomer-template",
|
|
1540
|
-
"source_ref": "tmpl:artist:asset-generate-pass:13",
|
|
1541
|
-
"promoted_at": "2026-06-22T23:09:16.240Z",
|
|
1542
|
-
"shipped_at": null,
|
|
1543
|
-
"shipped_by": null,
|
|
1544
|
-
"value_summary": null,
|
|
1545
|
-
"created_at": "2026-06-22T23:09:16.240Z",
|
|
1546
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1547
|
-
"kind": "feature",
|
|
1548
|
-
"parent_task_id": null,
|
|
1549
|
-
"actual_minutes": null,
|
|
1550
|
-
"scoping_confidence": null,
|
|
1551
|
-
"discipline": "artist",
|
|
1552
|
-
"parallel_safe": null,
|
|
1553
|
-
"newcomer_friendly": true,
|
|
1554
|
-
"requires_rank": "xenos",
|
|
1555
|
-
"needs_migration": false,
|
|
1556
|
-
"security_sensitive": false,
|
|
1557
|
-
"sandbox_review": null,
|
|
1558
|
-
"goal_id": "6",
|
|
1559
|
-
"module_key": null,
|
|
1560
|
-
"reward_gate_exempt": true,
|
|
1561
|
-
"credits_awarded": 0,
|
|
1562
|
-
"est_minutes_calibrated": 4
|
|
1563
|
-
},
|
|
1564
|
-
{
|
|
1565
|
-
"id": "1447",
|
|
1566
|
-
"version_id": "V2",
|
|
1567
|
-
"title": "Generate one new in-world art asset of your choice (a prop, plant, animal, or accessory) via the pixel-art pipeline",
|
|
1568
|
-
"description": "## What you're doing\n\nAmazonprimea is a young ancient-Greek coastal world, and it always needs more to look at. Your first ship as an artist is to **generate ONE new in-world asset of your own choosing** and add it to the world. You pick the subject — that's the fun part. Good candidates, all in-world (Mediterranean coast just south of Athens, mythic 'discovered secret' tone):\n- **Props**: amphora, fishing net, basket, crate, urn, torch, market awning, oar, clay pot.\n- **Plants**: olive tree, cypress, reeds, grapevine, shrub, wild herbs.\n- **Animals**: goat, chicken, duck, donkey, fish, gull, lizard.\n- **Accessories**: a sandal, a sun hat, a length of rope, a string of beads.\n\nIt is identical for every newcomer and **always valuable**, because a growing world has effectively unbounded demand for new props, flora, fauna, and detail — every newcomer picks a different subject, so two runs never collide.\n\n## How to find your way in\n\n1. Read `art/README.md` and `docs/recipes/pixel-art-pipeline.md`, plus `art/template/style_guide.md`, `art/template/rubric.json`, and `art/template/palette.json` — that's the look you must hit: 16-bit pixel art, early-Pokémon (FireRed) touchstone, top-down, 32×32, locked 64-colour Mediterranean palette (olive greens, warm tans, turquoise sea, weathered marble — NOT spring green, NOT navy, NOT pine).\n2. **Pick ONE subject.** Keep it to a SINGLE 32×32 tile/sprite — not a whole spritesheet or family (that's a bigger task).\n3. **Check the budget first**: `python3 art/pipeline/cost_ledger.py status` (the pipeline hard-stops at $80; one asset is ~$0.05–0.45).\n4. **Generate via the pipeline — do not hand-draw or freelance.** Use the `/otb-tile-generate` skill: it appends your new entry to `art/template/vocabulary.json`, runs the generate → post-process-to-32×32 → score-against-rubric → retry orchestrator, saves the final PNG to `art/generated/tiles/<id>.png`, and logs cost. (This needs the art pipeline's `GOOGLE_AI_STUDIO_KEY`, which resolves from `~/.config/otb/env`; most builder setups have it. If yours doesn't, claim the engineer or ideator newcomer chore instead, or ask an Archon to enable it.)\n5. **Confirm it PASSED** the rubric (`art/iterations/run_summary.json` shows `status: \"pass\"`). If it only reached best-effort, regenerate with the fix_hint — never paper over a fail.\n6. **See it in-game**: `node scripts/gds/art-stage.js` rebuilds the atlas and surfaces it on your sandbox preview (`sandbox-<login>.amazonprimea.com`).\n7. Ship via `/builder-ship`; the ship notes name your asset and its rubric score.\n\n## Stay clear of (READ-ONLY)\n\nNever modify the locked palette (`art/template/palette.json`) or the rubric (`art/template/rubric.json`) — those are theme-defining and changing them needs an ADR (out of scope for a first ship). Touch only art assets/vocabulary under `art/` (and, only if your asset is a genuinely new base-tile TYPE, the `public/game/world/tilePalette.js` mapping). Do not touch any permission/pipeline-core/migration/infra file.\n\n**Done when:**\n- Exactly one NEW in-world asset (your chosen subject) was generated via the pixel-art pipeline (`/otb-tile-generate` / orchestrator.py); the final PNG exists at art/generated/tiles/<id>.png.\n- It PASSED the rubric (art/iterations/run_summary.json status 'pass', or /otb-design-review numbers reported at/above the bar) and every pixel is on the locked palette (art/template/palette.json).\n- A vocabulary.json entry was added for the new asset; the locked palette.json and rubric.json were NOT modified.\n- Only art/ files changed (plus, at most, the public/game/world/tilePalette.js wiring for a genuinely new base-tile type) — no permission, pipeline-core, migration, or infra file.\n- You staged it (`node scripts/gds/art-stage.js`) and the ship notes name the asset id and its rubric score.\n\n_Evergreen newcomer task — one of three fixed first-builder chores (one per discipline). The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1569
|
-
"status": "ready",
|
|
1570
|
-
"touches": [],
|
|
1571
|
-
"est_minutes": 55,
|
|
1572
|
-
"est_cost_usd": null,
|
|
1573
|
-
"manual_degree": null,
|
|
1574
|
-
"priority": 4,
|
|
1575
|
-
"automation_tag": null,
|
|
1576
|
-
"credits_reward": 15,
|
|
1577
|
-
"source": "newcomer-template",
|
|
1578
|
-
"source_ref": "tmpl:artist:asset-generate-pass:14",
|
|
1579
|
-
"promoted_at": "2026-06-22T23:10:43.832Z",
|
|
1580
|
-
"shipped_at": null,
|
|
1581
|
-
"shipped_by": null,
|
|
1582
|
-
"value_summary": null,
|
|
1583
|
-
"created_at": "2026-06-22T23:10:43.832Z",
|
|
1584
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1585
|
-
"kind": "feature",
|
|
1586
|
-
"parent_task_id": null,
|
|
1587
|
-
"actual_minutes": null,
|
|
1588
|
-
"scoping_confidence": null,
|
|
1589
|
-
"discipline": "artist",
|
|
1590
|
-
"parallel_safe": null,
|
|
1591
|
-
"newcomer_friendly": true,
|
|
1592
|
-
"requires_rank": "xenos",
|
|
1593
|
-
"needs_migration": false,
|
|
1594
|
-
"security_sensitive": false,
|
|
1595
|
-
"sandbox_review": null,
|
|
1596
|
-
"goal_id": "6",
|
|
1597
|
-
"module_key": null,
|
|
1598
|
-
"reward_gate_exempt": true,
|
|
1599
|
-
"credits_awarded": 0,
|
|
1600
|
-
"est_minutes_calibrated": 4
|
|
1601
|
-
},
|
|
1602
|
-
{
|
|
1603
|
-
"id": "1452",
|
|
1604
|
-
"version_id": "BONGOS-V1",
|
|
1605
|
-
"title": "Docs-hygiene sweep: fix one piece of real drift (broken link, dead anchor, or bare #NNN ref) in a Markdown doc",
|
|
1606
|
-
"description": "## What you're doing\n\nThe project's docs are a living index — ~167 Markdown files under `docs/` plus `README.md`, recipes, and session logs — and because most work lands by direct push, they drift constantly: files get renamed out from under links, heading anchors go dead, formatting breaks, and bare `#NNN` task references creep back in (a bare `#123` autolinks to GitHub's issue space and 404s — see CLAUDE.md §8). This is the manual, first-timer-safe cousin of the autonomous `repo-simplify-sweep` janitor: you find **one** genuine piece of drift in **one** doc and ship the fix.\n\nIt is identical for every newcomer and **always valuable**, because docs never stop drifting — there is no \"done\" state, and unlike art (which a quantizer keeps clean) nothing auto-repairs link/anchor rot.\n\n## How to find a real target (don't ship a no-op)\n\nThere are several reliable sources of drift — use whichever turns up something concrete:\n1. **Broken/renamed file links** (the deepest well): open a doc and check its `](path)` links resolve to a real file. Cross-check `docs/file-map.md`. Renamed-away targets are common.\n2. **Dead heading anchors**: `](#some-heading)` where that heading no longer exists in the target doc.\n3. **Bare `#NNN` refs**: run `node scripts/gds/linkify-refs.js` (read-only) — it lists docs with bare/upgradeable refs. (This queue is sometimes empty; if so, use source 1 or 2.)\n4. **Formatting drift**: a broken list nest, an unclosed code fence, a mangled table.\n\nPick **one** non-protected file (see below), fix **one** concrete instance. For a bare-ref fix, let the tool do it: `node scripts/gds/linkify-refs.js --apply <your-file.md>`.\n\n## Verify + ship\n\nRun `node scripts/gds/linkify-refs.js --check <your-file.md>` (scoped to YOUR file — exit 0) and confirm any link you touched resolves, then `/builder-ship`. The ship notes must name the specific drift you fixed and the one file.\n\n## Protected — READ-ONLY for you, never pick or change the meaning of\n\nA newcomer (Xenos/Thetes, sub-Metic) must stay clear of the authority/pipeline core. Do NOT pick any of these as your target file: `CLAUDE.md`, `docs/canonical-permissions.md`, any ADR that defines authority/ranks/trust boundary (e.g. 0016, 0043), and anything under `migrations/`, `infra/`, `.github/`, `.husky/`, `.claude/hooks/`, plus `package.json` and the ship/grade/deploy scripts. (The authoritative protected glob is in `src/gds/permission-path-check.js` — if in doubt, it wins.) Good targets: a recipe under `docs/recipes/`, a session log, `docs/architecture.md`, `docs/file-map.md`, `docs/TRACKS.md`, a non-authority ADR, or `README.md`.\n\n**Done when:**\n- Exactly one non-protected Markdown file was changed, and the change is a genuine hygiene fix (a broken/renamed link path corrected, a dead heading anchor fixed, a bare `#NNN` ref linkified, or formatting drift repaired) — not a content/meaning edit and not a cosmetic no-op.\n- `node scripts/gds/linkify-refs.js --check <your-file.md>` (scoped to the one file you changed) exits 0.\n- No protected path was modified (none of the globs in src/gds/permission-path-check.js: migrations/, infra/, .github/, .husky/, .claude/hooks/, CLAUDE.md, canonical-permissions.md, authority ADRs, ship/grade/deploy scripts, package.json).\n- Any link the fix points to actually resolves: an internal file link points at a path that exists (cross-checked vs docs/file-map.md); an anchor link points at a heading that exists in the target doc.\n- The ship notes name the specific drift fixed and the one file touched.\n\n_Evergreen newcomer task — one of three fixed first-builder chores (one per discipline). The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1607
|
-
"status": "ready",
|
|
1608
|
-
"touches": [],
|
|
1609
|
-
"est_minutes": 40,
|
|
1610
|
-
"est_cost_usd": null,
|
|
1611
|
-
"manual_degree": null,
|
|
1612
|
-
"priority": 4,
|
|
1613
|
-
"automation_tag": null,
|
|
1614
|
-
"credits_reward": 15,
|
|
1615
|
-
"source": "newcomer-template",
|
|
1616
|
-
"source_ref": "tmpl:engineer:docs-hygiene-pass:9",
|
|
1617
|
-
"promoted_at": "2026-06-23T00:10:05.253Z",
|
|
1618
|
-
"shipped_at": null,
|
|
1619
|
-
"shipped_by": null,
|
|
1620
|
-
"value_summary": null,
|
|
1621
|
-
"created_at": "2026-06-23T00:10:05.253Z",
|
|
1622
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1623
|
-
"kind": "cleanup",
|
|
1624
|
-
"parent_task_id": null,
|
|
1625
|
-
"actual_minutes": null,
|
|
1626
|
-
"scoping_confidence": null,
|
|
1627
|
-
"discipline": "engineer",
|
|
1628
|
-
"parallel_safe": null,
|
|
1629
|
-
"newcomer_friendly": true,
|
|
1630
|
-
"requires_rank": "xenos",
|
|
1631
|
-
"needs_migration": false,
|
|
1632
|
-
"security_sensitive": false,
|
|
1633
|
-
"sandbox_review": null,
|
|
1634
|
-
"goal_id": "3",
|
|
1635
|
-
"module_key": null,
|
|
1636
|
-
"reward_gate_exempt": true,
|
|
1637
|
-
"credits_awarded": 0,
|
|
1638
|
-
"est_minutes_calibrated": 4
|
|
1639
|
-
},
|
|
1640
|
-
{
|
|
1641
|
-
"id": "1456",
|
|
1642
|
-
"version_id": "BONGOS-V1",
|
|
1643
|
-
"title": "Docs-hygiene sweep: fix one piece of real drift (broken link, dead anchor, or bare #NNN ref) in a Markdown doc",
|
|
1644
|
-
"description": "## What you're doing\n\nThe project's docs are a living index — ~167 Markdown files under `docs/` plus `README.md`, recipes, and session logs — and because most work lands by direct push, they drift constantly: files get renamed out from under links, heading anchors go dead, formatting breaks, and bare `#NNN` task references creep back in (a bare `#123` autolinks to GitHub's issue space and 404s — see CLAUDE.md §8). This is the manual, first-timer-safe cousin of the autonomous `repo-simplify-sweep` janitor: you find **one** genuine piece of drift in **one** doc and ship the fix.\n\nIt is identical for every newcomer and **always valuable**, because docs never stop drifting — there is no \"done\" state, and unlike art (which a quantizer keeps clean) nothing auto-repairs link/anchor rot.\n\n## How to find a real target (don't ship a no-op)\n\nThere are several reliable sources of drift — use whichever turns up something concrete:\n1. **Broken/renamed file links** (the deepest well): open a doc and check its `](path)` links resolve to a real file. Cross-check `docs/file-map.md`. Renamed-away targets are common.\n2. **Dead heading anchors**: `](#some-heading)` where that heading no longer exists in the target doc.\n3. **Bare `#NNN` refs**: run `node scripts/gds/linkify-refs.js` (read-only) — it lists docs with bare/upgradeable refs. (This queue is sometimes empty; if so, use source 1 or 2.)\n4. **Formatting drift**: a broken list nest, an unclosed code fence, a mangled table.\n\nPick **one** non-protected file (see below), fix **one** concrete instance. For a bare-ref fix, let the tool do it: `node scripts/gds/linkify-refs.js --apply <your-file.md>`.\n\n## Verify + ship\n\nRun `node scripts/gds/linkify-refs.js --check <your-file.md>` (scoped to YOUR file — exit 0) and confirm any link you touched resolves, then `/builder-ship`. The ship notes must name the specific drift you fixed and the one file.\n\n## Protected — READ-ONLY for you, never pick or change the meaning of\n\nA newcomer (Xenos/Thetes, sub-Metic) must stay clear of the authority/pipeline core. Do NOT pick any of these as your target file: `CLAUDE.md`, `docs/canonical-permissions.md`, any ADR that defines authority/ranks/trust boundary (e.g. 0016, 0043), and anything under `migrations/`, `infra/`, `.github/`, `.husky/`, `.claude/hooks/`, plus `package.json` and the ship/grade/deploy scripts. (The authoritative protected glob is in `src/gds/permission-path-check.js` — if in doubt, it wins.) Good targets: a recipe under `docs/recipes/`, a session log, `docs/architecture.md`, `docs/file-map.md`, `docs/TRACKS.md`, a non-authority ADR, or `README.md`.\n\n**Done when:**\n- Exactly one non-protected Markdown file was changed, and the change is a genuine hygiene fix (a broken/renamed link path corrected, a dead heading anchor fixed, a bare `#NNN` ref linkified, or formatting drift repaired) — not a content/meaning edit and not a cosmetic no-op.\n- `node scripts/gds/linkify-refs.js --check <your-file.md>` (scoped to the one file you changed) exits 0.\n- No protected path was modified (none of the globs in src/gds/permission-path-check.js: migrations/, infra/, .github/, .husky/, .claude/hooks/, CLAUDE.md, canonical-permissions.md, authority ADRs, ship/grade/deploy scripts, package.json).\n- Any link the fix points to actually resolves: an internal file link points at a path that exists (cross-checked vs docs/file-map.md); an anchor link points at a heading that exists in the target doc.\n- The ship notes name the specific drift fixed and the one file touched.\n\n_Evergreen newcomer task — one of three fixed first-builder chores (one per discipline). The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1645
|
-
"status": "ready",
|
|
1646
|
-
"touches": [],
|
|
1647
|
-
"est_minutes": 40,
|
|
1648
|
-
"est_cost_usd": null,
|
|
1649
|
-
"manual_degree": null,
|
|
1650
|
-
"priority": 4,
|
|
1651
|
-
"automation_tag": null,
|
|
1652
|
-
"credits_reward": 15,
|
|
1653
|
-
"source": "newcomer-template",
|
|
1654
|
-
"source_ref": "tmpl:engineer:docs-hygiene-pass:10",
|
|
1655
|
-
"promoted_at": "2026-06-23T02:17:18.153Z",
|
|
1656
|
-
"shipped_at": null,
|
|
1657
|
-
"shipped_by": null,
|
|
1658
|
-
"value_summary": null,
|
|
1659
|
-
"created_at": "2026-06-23T02:17:18.153Z",
|
|
1660
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1661
|
-
"kind": "cleanup",
|
|
1662
|
-
"parent_task_id": null,
|
|
1663
|
-
"actual_minutes": null,
|
|
1664
|
-
"scoping_confidence": null,
|
|
1665
|
-
"discipline": "engineer",
|
|
1666
|
-
"parallel_safe": null,
|
|
1667
|
-
"newcomer_friendly": true,
|
|
1668
|
-
"requires_rank": "xenos",
|
|
1669
|
-
"needs_migration": false,
|
|
1670
|
-
"security_sensitive": false,
|
|
1671
|
-
"sandbox_review": null,
|
|
1672
|
-
"goal_id": "3",
|
|
1673
|
-
"module_key": null,
|
|
1674
|
-
"reward_gate_exempt": true,
|
|
1675
|
-
"credits_awarded": 0,
|
|
1676
|
-
"est_minutes_calibrated": 4
|
|
1677
|
-
},
|
|
1678
|
-
{
|
|
1679
|
-
"id": "1458",
|
|
1680
|
-
"version_id": "BONGOS-V1",
|
|
1681
|
-
"title": "Docs-hygiene sweep: fix one piece of real drift (broken link, dead anchor, or bare #NNN ref) in a Markdown doc",
|
|
1682
|
-
"description": "## What you're doing\n\nThe project's docs are a living index — ~167 Markdown files under `docs/` plus `README.md`, recipes, and session logs — and because most work lands by direct push, they drift constantly: files get renamed out from under links, heading anchors go dead, formatting breaks, and bare `#NNN` task references creep back in (a bare `#123` autolinks to GitHub's issue space and 404s — see CLAUDE.md §8). This is the manual, first-timer-safe cousin of the autonomous `repo-simplify-sweep` janitor: you find **one** genuine piece of drift in **one** doc and ship the fix.\n\nIt is identical for every newcomer and **always valuable**, because docs never stop drifting — there is no \"done\" state, and unlike art (which a quantizer keeps clean) nothing auto-repairs link/anchor rot.\n\n## How to find a real target (don't ship a no-op)\n\nThere are several reliable sources of drift — use whichever turns up something concrete:\n1. **Broken/renamed file links** (the deepest well): open a doc and check its `](path)` links resolve to a real file. Cross-check `docs/file-map.md`. Renamed-away targets are common.\n2. **Dead heading anchors**: `](#some-heading)` where that heading no longer exists in the target doc.\n3. **Bare `#NNN` refs**: run `node scripts/gds/linkify-refs.js` (read-only) — it lists docs with bare/upgradeable refs. (This queue is sometimes empty; if so, use source 1 or 2.)\n4. **Formatting drift**: a broken list nest, an unclosed code fence, a mangled table.\n\nPick **one** non-protected file (see below), fix **one** concrete instance. For a bare-ref fix, let the tool do it: `node scripts/gds/linkify-refs.js --apply <your-file.md>`.\n\n## Verify + ship\n\nRun `node scripts/gds/linkify-refs.js --check <your-file.md>` (scoped to YOUR file — exit 0) and confirm any link you touched resolves, then `/builder-ship`. The ship notes must name the specific drift you fixed and the one file.\n\n## Protected — READ-ONLY for you, never pick or change the meaning of\n\nA newcomer (Xenos/Thetes, sub-Metic) must stay clear of the authority/pipeline core. Do NOT pick any of these as your target file: `CLAUDE.md`, `docs/canonical-permissions.md`, any ADR that defines authority/ranks/trust boundary (e.g. 0016, 0043), and anything under `migrations/`, `infra/`, `.github/`, `.husky/`, `.claude/hooks/`, plus `package.json` and the ship/grade/deploy scripts. (The authoritative protected glob is in `src/gds/permission-path-check.js` — if in doubt, it wins.) Good targets: a recipe under `docs/recipes/`, a session log, `docs/architecture.md`, `docs/file-map.md`, `docs/TRACKS.md`, a non-authority ADR, or `README.md`.\n\n**Done when:**\n- Exactly one non-protected Markdown file was changed, and the change is a genuine hygiene fix (a broken/renamed link path corrected, a dead heading anchor fixed, a bare `#NNN` ref linkified, or formatting drift repaired) — not a content/meaning edit and not a cosmetic no-op.\n- `node scripts/gds/linkify-refs.js --check <your-file.md>` (scoped to the one file you changed) exits 0.\n- No protected path was modified (none of the globs in src/gds/permission-path-check.js: migrations/, infra/, .github/, .husky/, .claude/hooks/, CLAUDE.md, canonical-permissions.md, authority ADRs, ship/grade/deploy scripts, package.json).\n- Any link the fix points to actually resolves: an internal file link points at a path that exists (cross-checked vs docs/file-map.md); an anchor link points at a heading that exists in the target doc.\n- The ship notes name the specific drift fixed and the one file touched.\n\n_Evergreen newcomer task — one of three fixed first-builder chores (one per discipline). The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1683
|
-
"status": "ready",
|
|
1684
|
-
"touches": [],
|
|
1685
|
-
"est_minutes": 40,
|
|
1686
|
-
"est_cost_usd": null,
|
|
1687
|
-
"manual_degree": null,
|
|
1688
|
-
"priority": 4,
|
|
1689
|
-
"automation_tag": null,
|
|
1690
|
-
"credits_reward": 15,
|
|
1691
|
-
"source": "newcomer-template",
|
|
1692
|
-
"source_ref": "tmpl:engineer:docs-hygiene-pass:11",
|
|
1693
|
-
"promoted_at": "2026-06-23T16:14:49.036Z",
|
|
1694
|
-
"shipped_at": null,
|
|
1695
|
-
"shipped_by": null,
|
|
1696
|
-
"value_summary": null,
|
|
1697
|
-
"created_at": "2026-06-23T16:14:49.036Z",
|
|
1698
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1699
|
-
"kind": "cleanup",
|
|
1700
|
-
"parent_task_id": null,
|
|
1701
|
-
"actual_minutes": null,
|
|
1702
|
-
"scoping_confidence": null,
|
|
1703
|
-
"discipline": "engineer",
|
|
1704
|
-
"parallel_safe": null,
|
|
1705
|
-
"newcomer_friendly": true,
|
|
1706
|
-
"requires_rank": "xenos",
|
|
1707
|
-
"needs_migration": false,
|
|
1708
|
-
"security_sensitive": false,
|
|
1709
|
-
"sandbox_review": null,
|
|
1710
|
-
"goal_id": "3",
|
|
1711
|
-
"module_key": null,
|
|
1712
|
-
"reward_gate_exempt": true,
|
|
1713
|
-
"credits_awarded": 0,
|
|
1714
|
-
"est_minutes_calibrated": 4
|
|
1715
|
-
},
|
|
1716
|
-
{
|
|
1717
|
-
"id": "1500",
|
|
1718
|
-
"version_id": "V2",
|
|
1719
|
-
"title": "Generate one new in-world art asset of your choice (a prop, plant, animal, or accessory) via the pixel-art pipeline",
|
|
1720
|
-
"description": "## What you're doing\n\nAmazonprimea is a young ancient-Greek coastal world, and it always needs more to look at. Your first ship as an artist is to **generate ONE new in-world asset of your own choosing** and add it to the world. You pick the subject — that's the fun part. Good candidates, all in-world (Mediterranean coast just south of Athens, mythic 'discovered secret' tone):\n- **Props**: amphora, fishing net, basket, crate, urn, torch, market awning, oar, clay pot.\n- **Plants**: olive tree, cypress, reeds, grapevine, shrub, wild herbs.\n- **Animals**: goat, chicken, duck, donkey, fish, gull, lizard.\n- **Accessories**: a sandal, a sun hat, a length of rope, a string of beads.\n\nIt is identical for every newcomer and **always valuable**, because a growing world has effectively unbounded demand for new props, flora, fauna, and detail — every newcomer picks a different subject, so two runs never collide.\n\n## How to find your way in\n\n1. Read `art/README.md` and `docs/recipes/pixel-art-pipeline.md`, plus `art/template/style_guide.md`, `art/template/rubric.json`, and `art/template/palette.json` — that's the look you must hit: 16-bit pixel art, early-Pokémon (FireRed) touchstone, top-down, 32×32, locked 64-colour Mediterranean palette (olive greens, warm tans, turquoise sea, weathered marble — NOT spring green, NOT navy, NOT pine).\n2. **Pick ONE subject.** Keep it to a SINGLE 32×32 tile/sprite — not a whole spritesheet or family (that's a bigger task).\n3. **Check the budget first**: `python3 art/pipeline/cost_ledger.py status` (the pipeline hard-stops at $80; one asset is ~$0.05–0.45).\n4. **Generate via the pipeline — do not hand-draw or freelance.** Use the `/otb-tile-generate` skill: it appends your new entry to `art/template/vocabulary.json`, runs the generate → post-process-to-32×32 → score-against-rubric → retry orchestrator, saves the final PNG to `art/generated/tiles/<id>.png`, and logs cost. (This needs the art pipeline's `GOOGLE_AI_STUDIO_KEY`, which resolves from `~/.config/otb/env`; most builder setups have it. If yours doesn't, claim the engineer or ideator newcomer chore instead, or ask an Archon to enable it.)\n5. **Confirm it PASSED** the rubric (`art/iterations/run_summary.json` shows `status: \"pass\"`). If it only reached best-effort, regenerate with the fix_hint — never paper over a fail.\n6. **See it in-game**: `node scripts/gds/art-stage.js` rebuilds the atlas and surfaces it on your sandbox preview (`sandbox-<login>.amazonprimea.com`).\n7. Ship via `/builder-ship`; the ship notes name your asset and its rubric score.\n\n## Stay clear of (READ-ONLY)\n\nNever modify the locked palette (`art/template/palette.json`) or the rubric (`art/template/rubric.json`) — those are theme-defining and changing them needs an ADR (out of scope for a first ship). Touch only art assets/vocabulary under `art/` (and, only if your asset is a genuinely new base-tile TYPE, the `public/game/world/tilePalette.js` mapping). Do not touch any permission/pipeline-core/migration/infra file.\n\n**Done when:**\n- Exactly one NEW in-world asset (your chosen subject) was generated via the pixel-art pipeline (`/otb-tile-generate` / orchestrator.py); the final PNG exists at art/generated/tiles/<id>.png.\n- It PASSED the rubric (art/iterations/run_summary.json status 'pass', or /otb-design-review numbers reported at/above the bar) and every pixel is on the locked palette (art/template/palette.json).\n- A vocabulary.json entry was added for the new asset; the locked palette.json and rubric.json were NOT modified.\n- Only art/ files changed (plus, at most, the public/game/world/tilePalette.js wiring for a genuinely new base-tile type) — no permission, pipeline-core, migration, or infra file.\n- You staged it (`node scripts/gds/art-stage.js`) and the ship notes name the asset id and its rubric score.\n\n_Evergreen newcomer chore — a fixed first-builder task for this discipline. The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1721
|
-
"status": "ready",
|
|
1722
|
-
"touches": [],
|
|
1723
|
-
"est_minutes": 55,
|
|
1724
|
-
"est_cost_usd": null,
|
|
1725
|
-
"manual_degree": null,
|
|
1726
|
-
"priority": 4,
|
|
1727
|
-
"automation_tag": null,
|
|
1728
|
-
"credits_reward": 15,
|
|
1729
|
-
"source": "newcomer-template",
|
|
1730
|
-
"source_ref": "tmpl:artist:asset-generate-pass:15",
|
|
1731
|
-
"promoted_at": "2026-06-23T23:36:54.014Z",
|
|
1732
|
-
"shipped_at": null,
|
|
1733
|
-
"shipped_by": null,
|
|
1734
|
-
"value_summary": null,
|
|
1735
|
-
"created_at": "2026-06-23T23:36:54.014Z",
|
|
1736
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1737
|
-
"kind": "feature",
|
|
1738
|
-
"parent_task_id": null,
|
|
1739
|
-
"actual_minutes": null,
|
|
1740
|
-
"scoping_confidence": null,
|
|
1741
|
-
"discipline": "artist",
|
|
1742
|
-
"parallel_safe": null,
|
|
1743
|
-
"newcomer_friendly": true,
|
|
1744
|
-
"requires_rank": "xenos",
|
|
1745
|
-
"needs_migration": false,
|
|
1746
|
-
"security_sensitive": false,
|
|
1747
|
-
"sandbox_review": null,
|
|
1748
|
-
"goal_id": "6",
|
|
1749
|
-
"module_key": null,
|
|
1750
|
-
"reward_gate_exempt": true,
|
|
1751
|
-
"credits_awarded": 0,
|
|
1752
|
-
"est_minutes_calibrated": 4
|
|
1753
|
-
},
|
|
1754
|
-
{
|
|
1755
|
-
"id": "1538",
|
|
1756
|
-
"version_id": "V2",
|
|
1757
|
-
"title": "Idea-seed pass: file 5-8 fresh in-world ideas (names, lore, or builder-UX) into the idea inbox",
|
|
1758
|
-
"description": "## What you'll do\n\nThe seed of almost everything built here is the **idea_inbox** — a queue anyone can drop ideas into, which trusted builders later triage into real tasks. Your first ship as an ideator is simple and concrete: **add a small batch of fresh ideas to that inbox.** You write no code, touch no game, change no system — you think, write a few short well-shaped ideas, and file them with one command each.\n\nIt is identical for every newcomer and **always valuable**: the inbox is never \"done\" — every triage pass consumes ideas (promote/discard/merge), so it is permanently hungry for fresh input, and a world the size of Amazonprimea always wants more names, more lore, more texture. Your batch is brand-new content, so it can never duplicate \"the work\" — the supply IS the work.\n\n## Pick ONE branch\n\n- **Branch A — PRODUCT flavour (default).** Ideas that grow the world players see: **names + one line of lore** for a character, structure, landmark, district, ship, or festival; or a world-background snippet (a custom, a superstition, a line a named NPC says). Tone: mythic, mysterious, a \"discovered secret\"; Mediterranean ancient-Greek coast (just south of Athens); NOT modern, NOT tongue-in-cheek-modern. Ground it in CLAUDE.md §3/§6/§7.\n- **Branch B — INTERNAL / builder-UX.** Small user-experience improvement ideas for the GDS / builders' hall (the surfaces builders use, not the game): a clearer label, a confusing onboarding message, a quality-of-life tweak to a status page or a slash-command's output. See `docs/TRACKS.md` for product vs internal.\n\n## How to find your way in\n\n1. (Branch A) Read CLAUDE.md §3/§6/§7 for tone. (Branch B) Skim `docs/TRACKS.md` and click around https://amazonprimea.com/builders for the rough edge you'll write up.\n2. See what's already filed so you don't repeat it: `node scripts/gds/api.js GET /api/gds/inbox`.\n3. File each idea with `node scripts/gds/capture.js \"<title>\" --body-file <path>` (filing an idea is the open-to-all path — a Xenos/Thetes session is allowed to do it; you just can't triage them). Put one line of detail + a `track: product` or `track: internal` line in each body file.\n\n**Done when:**\n- You filed 5–8 fresh ideas into the idea_inbox via `node scripts/gds/capture.js` (each prints a `Captured idea #N` confirmation), all in ONE branch (A product, or B internal/UX).\n- Each idea has a clear title and a body with at least one sentence of detail — for Branch A, one line of in-world lore (who/what it is); for Branch B, what the rough edge is and what 'better' looks like.\n- Branch A ideas are in the world's voice and consistent with CLAUDE.md §3/§6/§7 (ancient-Greek coast, Amazonprimea, mythic 'discovered secret' tone — not modern/anachronistic).\n- Each idea body declares its track on a `track: product` or `track: internal` line so triage can route it.\n- Before filing you ran `GET /api/gds/inbox` and confirmed your ideas are not near-duplicates of open ones.\n- You touched only the idea_inbox via capture.js — no code, no migrations, no infra, no permission/pipeline files; nothing committed to the repo.\n\n_Evergreen newcomer chore — a fixed first-builder task for this discipline. The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1759
|
-
"status": "ready",
|
|
1760
|
-
"touches": [],
|
|
1761
|
-
"est_minutes": 45,
|
|
1762
|
-
"est_cost_usd": null,
|
|
1763
|
-
"manual_degree": null,
|
|
1764
|
-
"priority": 4,
|
|
1765
|
-
"automation_tag": null,
|
|
1766
|
-
"credits_reward": 12,
|
|
1767
|
-
"source": "newcomer-template",
|
|
1768
|
-
"source_ref": "tmpl:ideator:idea-seed-pass:6",
|
|
1769
|
-
"promoted_at": "2026-06-25T21:44:22.673Z",
|
|
1770
|
-
"shipped_at": null,
|
|
1771
|
-
"shipped_by": null,
|
|
1772
|
-
"value_summary": null,
|
|
1773
|
-
"created_at": "2026-06-25T21:44:22.673Z",
|
|
1774
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1775
|
-
"kind": "feature",
|
|
1776
|
-
"parent_task_id": null,
|
|
1777
|
-
"actual_minutes": null,
|
|
1778
|
-
"scoping_confidence": null,
|
|
1779
|
-
"discipline": "ideator",
|
|
1780
|
-
"parallel_safe": null,
|
|
1781
|
-
"newcomer_friendly": true,
|
|
1782
|
-
"requires_rank": "xenos",
|
|
1783
|
-
"needs_migration": false,
|
|
1784
|
-
"security_sensitive": false,
|
|
1785
|
-
"sandbox_review": null,
|
|
1786
|
-
"goal_id": "6",
|
|
1787
|
-
"module_key": null,
|
|
1788
|
-
"reward_gate_exempt": true,
|
|
1789
|
-
"credits_awarded": 0,
|
|
1790
|
-
"est_minutes_calibrated": 3
|
|
1791
|
-
},
|
|
1792
|
-
{
|
|
1793
|
-
"id": "1585",
|
|
1794
|
-
"version_id": "V2",
|
|
1795
|
-
"title": "V2.W03 — warp-into-full-room spike: queue handoff at destination cap",
|
|
1796
|
-
"description": "Design the hard case: warping into a destination map already at its 100-cap (graceful queue handoff). Output feeds E5 (V2.W10). Criterion connected-warps.",
|
|
1797
|
-
"status": "ready",
|
|
1798
|
-
"touches": [],
|
|
1799
|
-
"est_minutes": 150,
|
|
1800
|
-
"est_cost_usd": null,
|
|
1801
|
-
"manual_degree": 3,
|
|
1802
|
-
"priority": 4,
|
|
1803
|
-
"automation_tag": null,
|
|
1804
|
-
"credits_reward": 30,
|
|
1805
|
-
"source": "planning-session",
|
|
1806
|
-
"source_ref": "v2world-S4",
|
|
1807
|
-
"promoted_at": "2026-06-26T22:26:24.795Z",
|
|
1808
|
-
"shipped_at": null,
|
|
1809
|
-
"shipped_by": null,
|
|
1810
|
-
"value_summary": null,
|
|
1811
|
-
"created_at": "2026-06-26T22:24:18.867Z",
|
|
1812
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1813
|
-
"kind": "spike",
|
|
1814
|
-
"parent_task_id": null,
|
|
1815
|
-
"actual_minutes": null,
|
|
1816
|
-
"scoping_confidence": null,
|
|
1817
|
-
"discipline": "engineer",
|
|
1818
|
-
"parallel_safe": null,
|
|
1819
|
-
"newcomer_friendly": false,
|
|
1820
|
-
"requires_rank": "metic",
|
|
1821
|
-
"needs_migration": false,
|
|
1822
|
-
"security_sensitive": false,
|
|
1823
|
-
"sandbox_review": null,
|
|
1824
|
-
"goal_id": "6",
|
|
1825
|
-
"module_key": "game",
|
|
1826
|
-
"reward_gate_exempt": true,
|
|
1827
|
-
"credits_awarded": 0,
|
|
1828
|
-
"est_minutes_calibrated": 23
|
|
1829
|
-
},
|
|
1830
|
-
{
|
|
1831
|
-
"id": "1587",
|
|
1832
|
-
"version_id": "V2",
|
|
1833
|
-
"title": "V2.W02 — multi-tile structure spike: slice the temple reference to 32×32",
|
|
1834
|
-
"description": "Slice the Olympia temple reference into 32×32 `structures/` members; verify the seam row lines up and the 64-color palette holds. Informs E4 (V2.W11). Criterion olympia-art-set.",
|
|
1835
|
-
"status": "ready",
|
|
1836
|
-
"touches": [],
|
|
1837
|
-
"est_minutes": 180,
|
|
1838
|
-
"est_cost_usd": null,
|
|
1839
|
-
"manual_degree": 4,
|
|
1840
|
-
"priority": 4,
|
|
1841
|
-
"automation_tag": null,
|
|
1842
|
-
"credits_reward": 40,
|
|
1843
|
-
"source": "planning-session",
|
|
1844
|
-
"source_ref": "v2world-S2",
|
|
1845
|
-
"promoted_at": "2026-06-26T22:26:24.795Z",
|
|
1846
|
-
"shipped_at": null,
|
|
1847
|
-
"shipped_by": null,
|
|
1848
|
-
"value_summary": null,
|
|
1849
|
-
"created_at": "2026-06-26T22:24:19.171Z",
|
|
1850
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1851
|
-
"kind": "spike",
|
|
1852
|
-
"parent_task_id": null,
|
|
1853
|
-
"actual_minutes": null,
|
|
1854
|
-
"scoping_confidence": null,
|
|
1855
|
-
"discipline": "artist",
|
|
1856
|
-
"parallel_safe": null,
|
|
1857
|
-
"newcomer_friendly": false,
|
|
1858
|
-
"requires_rank": "xenos",
|
|
1859
|
-
"needs_migration": false,
|
|
1860
|
-
"security_sensitive": false,
|
|
1861
|
-
"sandbox_review": null,
|
|
1862
|
-
"goal_id": "6",
|
|
1863
|
-
"module_key": "art-pipeline",
|
|
1864
|
-
"reward_gate_exempt": true,
|
|
1865
|
-
"credits_awarded": 0,
|
|
1866
|
-
"est_minutes_calibrated": 27
|
|
1867
|
-
},
|
|
1868
|
-
{
|
|
1869
|
-
"id": "1588",
|
|
1870
|
-
"version_id": "V2",
|
|
1871
|
-
"title": "V2.W04 — ingest the 4 reference sheets + capture style rules",
|
|
1872
|
-
"description": "Ingest the 4 reference sheets into `art/references/`; capture style rules via otb-feedback-capture (3/4 tilt, orange-tile roofs, marble tone, river/forest). Gates the rest of the art lane. Criterion olympia-art-set.",
|
|
1873
|
-
"status": "ready",
|
|
1874
|
-
"touches": [],
|
|
1875
|
-
"est_minutes": 90,
|
|
1876
|
-
"est_cost_usd": null,
|
|
1877
|
-
"manual_degree": 3,
|
|
1878
|
-
"priority": 4,
|
|
1879
|
-
"automation_tag": null,
|
|
1880
|
-
"credits_reward": 15,
|
|
1881
|
-
"source": "planning-session",
|
|
1882
|
-
"source_ref": "v2world-A0",
|
|
1883
|
-
"promoted_at": "2026-06-26T22:26:24.795Z",
|
|
1884
|
-
"shipped_at": null,
|
|
1885
|
-
"shipped_by": null,
|
|
1886
|
-
"value_summary": null,
|
|
1887
|
-
"created_at": "2026-06-26T22:24:19.327Z",
|
|
1888
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1889
|
-
"kind": "feature",
|
|
1890
|
-
"parent_task_id": null,
|
|
1891
|
-
"actual_minutes": null,
|
|
1892
|
-
"scoping_confidence": null,
|
|
1893
|
-
"discipline": "artist",
|
|
1894
|
-
"parallel_safe": null,
|
|
1895
|
-
"newcomer_friendly": false,
|
|
1896
|
-
"requires_rank": "xenos",
|
|
1897
|
-
"needs_migration": false,
|
|
1898
|
-
"security_sensitive": false,
|
|
1899
|
-
"sandbox_review": null,
|
|
1900
|
-
"goal_id": "6",
|
|
1901
|
-
"module_key": "art-pipeline",
|
|
1902
|
-
"reward_gate_exempt": true,
|
|
1903
|
-
"credits_awarded": 0,
|
|
1904
|
-
"est_minutes_calibrated": 7
|
|
1905
|
-
},
|
|
1906
|
-
{
|
|
1907
|
-
"id": "1647",
|
|
1908
|
-
"version_id": "V2",
|
|
1909
|
-
"title": "Idea-seed pass: file 5-8 fresh in-world ideas (names, lore, or builder-UX) into the idea inbox",
|
|
1910
|
-
"description": "## What you'll do\n\nThe seed of almost everything built here is the **idea_inbox** — a queue anyone can drop ideas into, which trusted builders later triage into real tasks. Your first ship as an ideator is simple and concrete: **add a small batch of fresh ideas to that inbox.** You write no code, touch no game, change no system — you think, write a few short well-shaped ideas, and file them with one command each.\n\nIt is identical for every newcomer and **always valuable**: the inbox is never \"done\" — every triage pass consumes ideas (promote/discard/merge), so it is permanently hungry for fresh input, and a world the size of Amazonprimea always wants more names, more lore, more texture. Your batch is brand-new content, so it can never duplicate \"the work\" — the supply IS the work.\n\n## Pick ONE branch\n\n- **Branch A — PRODUCT flavour (default).** Ideas that grow the world players see: **names + one line of lore** for a character, structure, landmark, district, ship, or festival; or a world-background snippet (a custom, a superstition, a line a named NPC says). Tone: mythic, mysterious, a \"discovered secret\"; Mediterranean ancient-Greek coast (just south of Athens); NOT modern, NOT tongue-in-cheek-modern. Ground it in CLAUDE.md §3/§6/§7.\n- **Branch B — INTERNAL / builder-UX.** Small user-experience improvement ideas for the GDS / builders' hall (the surfaces builders use, not the game): a clearer label, a confusing onboarding message, a quality-of-life tweak to a status page or a slash-command's output. See `docs/TRACKS.md` for product vs internal.\n\n## How to find your way in\n\n1. (Branch A) Read CLAUDE.md §3/§6/§7 for tone. (Branch B) Skim `docs/TRACKS.md` and click around https://amazonprimea.com/builders for the rough edge you'll write up.\n2. See what's already filed so you don't repeat it: `node scripts/gds/api.js GET /api/gds/inbox`.\n3. File each idea with `node scripts/gds/capture.js \"<title>\" --body-file <path>` (filing an idea is the open-to-all path — a Xenos/Thetes session is allowed to do it; you just can't triage them). Put one line of detail + a `track: product` or `track: internal` line in each body file.\n\n**Done when:**\n- You filed 5–8 fresh ideas into the idea_inbox via `node scripts/gds/capture.js` (each prints a `Captured idea #N` confirmation), all in ONE branch (A product, or B internal/UX).\n- Each idea has a clear title and a body with at least one sentence of detail — for Branch A, one line of in-world lore (who/what it is); for Branch B, what the rough edge is and what 'better' looks like.\n- Branch A ideas are in the world's voice and consistent with CLAUDE.md §3/§6/§7 (ancient-Greek coast, Amazonprimea, mythic 'discovered secret' tone — not modern/anachronistic).\n- Each idea body declares its track on a `track: product` or `track: internal` line so triage can route it.\n- Before filing you ran `GET /api/gds/inbox` and confirmed your ideas are not near-duplicates of open ones.\n- You touched only the idea_inbox via capture.js — no code, no migrations, no infra, no permission/pipeline files; nothing committed to the repo.\n\n_Evergreen newcomer chore — a fixed first-builder task for this discipline. The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1911
|
-
"status": "ready",
|
|
1912
|
-
"touches": [],
|
|
1913
|
-
"est_minutes": 45,
|
|
1914
|
-
"est_cost_usd": null,
|
|
1915
|
-
"manual_degree": null,
|
|
1916
|
-
"priority": 4,
|
|
1917
|
-
"automation_tag": null,
|
|
1918
|
-
"credits_reward": 12,
|
|
1919
|
-
"source": "newcomer-template",
|
|
1920
|
-
"source_ref": "tmpl:ideator:idea-seed-pass:7",
|
|
1921
|
-
"promoted_at": "2026-06-27T15:26:04.401Z",
|
|
1922
|
-
"shipped_at": null,
|
|
1923
|
-
"shipped_by": null,
|
|
1924
|
-
"value_summary": null,
|
|
1925
|
-
"created_at": "2026-06-27T15:26:04.401Z",
|
|
1926
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1927
|
-
"kind": "feature",
|
|
1928
|
-
"parent_task_id": null,
|
|
1929
|
-
"actual_minutes": null,
|
|
1930
|
-
"scoping_confidence": null,
|
|
1931
|
-
"discipline": "ideator",
|
|
1932
|
-
"parallel_safe": null,
|
|
1933
|
-
"newcomer_friendly": true,
|
|
1934
|
-
"requires_rank": "xenos",
|
|
1935
|
-
"needs_migration": false,
|
|
1936
|
-
"security_sensitive": false,
|
|
1937
|
-
"sandbox_review": null,
|
|
1938
|
-
"goal_id": "6",
|
|
1939
|
-
"module_key": null,
|
|
1940
|
-
"reward_gate_exempt": true,
|
|
1941
|
-
"credits_awarded": 0,
|
|
1942
|
-
"est_minutes_calibrated": 3
|
|
1943
|
-
},
|
|
1944
|
-
{
|
|
1945
|
-
"id": "1668",
|
|
1946
|
-
"version_id": "BONGOS-V1",
|
|
1947
|
-
"title": "Add a unit test for an untested pure exported helper (assert its real behaviour)",
|
|
1948
|
-
"description": "## What you're doing\n\nThe repo's safety net is its **unit suite** — every `tests/*.mjs` file, run by `scripts/gds/run-unit-tests.js` in CI on every PR. New pure tests are **auto-discovered** (there is no allowlist to edit), so the moment you add one it joins the gate. Your first ship as an engineer: pick ONE exported helper that has thin or no test coverage and add a focused, DB-free unit test for it.\n\nIt is identical for every newcomer and **always valuable** — coverage is never \"done\", the codebase has hundreds of small pure helpers, and a good test both guards behaviour and teaches you how a corner of the system works. It is also **safe to auto-ship**: you add ONE file under `tests/`, which is not a protected surface, so a clean test merges on green with no owner approval.\n\n## How to pick a target (a PURE helper)\n\nPick a **pure** function — deterministic, with no database, network, filesystem, or live-server dependency — so the test runs standalone. Good hunting grounds (look for an exported function with little or no matching `tests/` coverage):\n- `src/gds/path-match.js` (`touchesOverlap`, `matchOne`), `src/gds/llm-pricing.js` (`familyFor`, `canonicalizeModelId`), `src/gds/task-classifier.js`, `src/gds/render-prefs.js`, `src/gds/wandering-prefs.js`.\n- pure parsing/format helpers exported from `scripts/gds/*.js`.\n\nCheck `tests/` first: if a helper already has a thorough test file, add a missing case to a DIFFERENT helper, or pick another module — don't duplicate existing coverage.\n\n## How to write it (mirror an existing test — there is no framework)\n\nThese tests are plain Node scripts using `node:assert`; there is no test runner. Open a small existing one as your model — for example `tests/criterion_ref_parse.mjs` or `tests/task_classifier_vocab.mjs` — and copy the shape:\n1. `import` / `require` the helper from its module.\n2. Assert **several** cases, including at least one **edge / boundary** case (empty input, null, a tricky value).\n3. Print a one-line success message at the end (an assert that throws exits non-zero, which is how the gate sees a failure).\n\nName the file `tests/<helper-or-module>.mjs`.\n\n## Verify + ship\n\nRun BOTH and confirm both are green:\n- `node tests/<your-file>.mjs` — your test alone, exits 0.\n- `node scripts/gds/run-unit-tests.js` — the whole gate, with your test auto-included.\n\nThen `/builder-ship`. The ship notes must name the helper and file you tested.\n\n## Stay safe (off-limits)\n\nAdd exactly ONE new file under `tests/`. Do NOT edit `scripts/gds/run-unit-tests.js` (it auto-discovers your test, and it is a protected file you may not touch), and do NOT change the helper you are testing. Your test must be **DB-free**: anything needing Postgres, the network, or a live server belongs in the integration gate and will fail standalone here. Touch no permission, pipeline, migration, or infra file.\n\n**Done when:**\n- A NEW tests/<name>.mjs file was added (it did not exist before) that unit-tests a PURE exported helper — no Postgres, network, filesystem, or live server.\n- `node tests/<name>.mjs` exits 0 and the test makes real assertions about the helper's behaviour — at least two cases including one edge/boundary case — not a trivial always-true assertion.\n- `node scripts/gds/run-unit-tests.js` passes with the new test auto-included, so it must be DB-free and currently green (it must NOT need adding to any exclusion set).\n- Only the one new tests/ file was added — run-unit-tests.js was NOT edited, the helper under test was NOT changed, and no permission/pipeline/migration/infra path was touched.\n- The ship notes name the helper and the test file.\n\n_Evergreen newcomer chore — a fixed first-builder task for this discipline. The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1949
|
-
"status": "ready",
|
|
1950
|
-
"touches": [],
|
|
1951
|
-
"est_minutes": 45,
|
|
1952
|
-
"est_cost_usd": null,
|
|
1953
|
-
"manual_degree": null,
|
|
1954
|
-
"priority": 4,
|
|
1955
|
-
"automation_tag": null,
|
|
1956
|
-
"credits_reward": 15,
|
|
1957
|
-
"source": "newcomer-template",
|
|
1958
|
-
"source_ref": "tmpl:engineer:unit-test-pass:4",
|
|
1959
|
-
"promoted_at": "2026-06-28T15:45:24.222Z",
|
|
1960
|
-
"shipped_at": null,
|
|
1961
|
-
"shipped_by": null,
|
|
1962
|
-
"value_summary": null,
|
|
1963
|
-
"created_at": "2026-06-28T15:45:24.222Z",
|
|
1964
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
1965
|
-
"kind": "feature",
|
|
1966
|
-
"parent_task_id": null,
|
|
1967
|
-
"actual_minutes": null,
|
|
1968
|
-
"scoping_confidence": null,
|
|
1969
|
-
"discipline": "engineer",
|
|
1970
|
-
"parallel_safe": null,
|
|
1971
|
-
"newcomer_friendly": true,
|
|
1972
|
-
"requires_rank": "xenos",
|
|
1973
|
-
"needs_migration": false,
|
|
1974
|
-
"security_sensitive": false,
|
|
1975
|
-
"sandbox_review": null,
|
|
1976
|
-
"goal_id": "3",
|
|
1977
|
-
"module_key": null,
|
|
1978
|
-
"reward_gate_exempt": true,
|
|
1979
|
-
"credits_awarded": 0,
|
|
1980
|
-
"est_minutes_calibrated": 3
|
|
1981
|
-
},
|
|
1982
|
-
{
|
|
1983
|
-
"id": "1678",
|
|
1984
|
-
"version_id": "BONGOS-V1",
|
|
1985
|
-
"title": "Add a unit test for an untested pure exported helper (assert its real behaviour)",
|
|
1986
|
-
"description": "## What you're doing\n\nThe repo's safety net is its **unit suite** — every `tests/*.mjs` file, run by `scripts/gds/run-unit-tests.js` in CI on every PR. New pure tests are **auto-discovered** (there is no allowlist to edit), so the moment you add one it joins the gate. Your first ship as an engineer: pick ONE exported helper that has thin or no test coverage and add a focused, DB-free unit test for it.\n\nIt is identical for every newcomer and **always valuable** — coverage is never \"done\", the codebase has hundreds of small pure helpers, and a good test both guards behaviour and teaches you how a corner of the system works. It is also **safe to auto-ship**: you add ONE file under `tests/`, which is not a protected surface, so a clean test merges on green with no owner approval.\n\n## How to pick a target (a PURE helper)\n\nPick a **pure** function — deterministic, with no database, network, filesystem, or live-server dependency — so the test runs standalone. Good hunting grounds (look for an exported function with little or no matching `tests/` coverage):\n- `src/gds/path-match.js` (`touchesOverlap`, `matchOne`), `src/gds/llm-pricing.js` (`familyFor`, `canonicalizeModelId`), `src/gds/task-classifier.js`, `src/gds/render-prefs.js`, `src/gds/wandering-prefs.js`.\n- pure parsing/format helpers exported from `scripts/gds/*.js`.\n\nCheck `tests/` first: if a helper already has a thorough test file, add a missing case to a DIFFERENT helper, or pick another module — don't duplicate existing coverage.\n\n## How to write it (mirror an existing test — there is no framework)\n\nThese tests are plain Node scripts using `node:assert`; there is no test runner. Open a small existing one as your model — for example `tests/criterion_ref_parse.mjs` or `tests/task_classifier_vocab.mjs` — and copy the shape:\n1. `import` / `require` the helper from its module.\n2. Assert **several** cases, including at least one **edge / boundary** case (empty input, null, a tricky value).\n3. Print a one-line success message at the end (an assert that throws exits non-zero, which is how the gate sees a failure).\n\nName the file `tests/<helper-or-module>.mjs`.\n\n## Verify + ship\n\nRun BOTH and confirm both are green:\n- `node tests/<your-file>.mjs` — your test alone, exits 0.\n- `node scripts/gds/run-unit-tests.js` — the whole gate, with your test auto-included.\n\nThen `/builder-ship`. The ship notes must name the helper and file you tested.\n\n## Stay safe (off-limits)\n\nAdd exactly ONE new file under `tests/`. Do NOT edit `scripts/gds/run-unit-tests.js` (it auto-discovers your test, and it is a protected file you may not touch), and do NOT change the helper you are testing. Your test must be **DB-free**: anything needing Postgres, the network, or a live server belongs in the integration gate and will fail standalone here. Touch no permission, pipeline, migration, or infra file.\n\n**Done when:**\n- A NEW tests/<name>.mjs file was added (it did not exist before) that unit-tests a PURE exported helper — no Postgres, network, filesystem, or live server.\n- `node tests/<name>.mjs` exits 0 and the test makes real assertions about the helper's behaviour — at least two cases including one edge/boundary case — not a trivial always-true assertion.\n- `node scripts/gds/run-unit-tests.js` passes with the new test auto-included, so it must be DB-free and currently green (it must NOT need adding to any exclusion set).\n- Only the one new tests/ file was added — run-unit-tests.js was NOT edited, the helper under test was NOT changed, and no permission/pipeline/migration/infra path was touched.\n- The ship notes name the helper and the test file.\n\n_Evergreen newcomer chore — a fixed first-builder task for this discipline. The definition never changes, but running it is always valuable. A fresh copy is stamped the moment one is claimed, so there is always one waiting. If it turns out bigger than it looks, release it and an Archon will re-scope._",
|
|
1987
|
-
"status": "ready",
|
|
1988
|
-
"touches": [],
|
|
1989
|
-
"est_minutes": 45,
|
|
1990
|
-
"est_cost_usd": null,
|
|
1991
|
-
"manual_degree": null,
|
|
1992
|
-
"priority": 4,
|
|
1993
|
-
"automation_tag": null,
|
|
1994
|
-
"credits_reward": 15,
|
|
1995
|
-
"source": "newcomer-template",
|
|
1996
|
-
"source_ref": "tmpl:engineer:unit-test-pass:5",
|
|
1997
|
-
"promoted_at": "2026-06-29T16:01:25.723Z",
|
|
1998
|
-
"shipped_at": null,
|
|
1999
|
-
"shipped_by": null,
|
|
2000
|
-
"value_summary": null,
|
|
2001
|
-
"created_at": "2026-06-29T16:01:25.723Z",
|
|
2002
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
2003
|
-
"kind": "feature",
|
|
2004
|
-
"parent_task_id": null,
|
|
2005
|
-
"actual_minutes": null,
|
|
2006
|
-
"scoping_confidence": null,
|
|
2007
|
-
"discipline": "engineer",
|
|
2008
|
-
"parallel_safe": null,
|
|
2009
|
-
"newcomer_friendly": true,
|
|
2010
|
-
"requires_rank": "xenos",
|
|
2011
|
-
"needs_migration": false,
|
|
2012
|
-
"security_sensitive": false,
|
|
2013
|
-
"sandbox_review": null,
|
|
2014
|
-
"goal_id": "3",
|
|
2015
|
-
"module_key": null,
|
|
2016
|
-
"reward_gate_exempt": false,
|
|
2017
|
-
"credits_awarded": 0,
|
|
2018
|
-
"est_minutes_calibrated": 3
|
|
2019
|
-
},
|
|
2020
|
-
{
|
|
2021
|
-
"id": "1748",
|
|
2022
|
-
"version_id": "BONGOS-V1",
|
|
2023
|
-
"title": "Cloud Bongos sky-whale: regenerate the REAR (tail-on) view — proportions good, resolve discrepancies",
|
|
2024
|
-
"description": "Follow-up to task 1743 (Cloud Bongos sky-whale multi-angle turnaround). Owner feedback: the REAR (tail-on) view has GREAT proportions (tucked pectoral fins, single horizontal tail) but too many DISCREPANCIES vs the rest of the set — regenerate it to resolve them while KEEPING those proportions.\n\nKnown discrepancies to fix:\n- A faint vertical mark runs down the mid-back = the dorsal fin seen edge-on from directly behind; it reads like a stray mark. Either remove it or render it as one clean, thin, subtle line.\n- Make sure it matches the CANONICAL traits locked in 1743 (see handoff): smooth head (no tubercles); muted peach-tan back; cloud-blue+grey belly; moderate grooves; moderate fins; small hooked dorsal fin; ONE subtle follow-cam-style blowhole (small faint dimple); clean surface.\n\nMethod: brand/cloud-bongos/world pipeline. Entry = \"creature-whale-rear\" in world/manifest.json (currently refs \"whale-hero\"). Set the art key in ~/.config/otb/env, then: python3 brand/cloud-bongos/world/gen_world.py --only creature-whale-rear --force ; python3 brand/cloud-bongos/world/key_cutouts.py --only creature-whale-rear ; then despeckle + re-crop. Review against the 5-source set (side / 3-4-front / head-on / rear / follow-cam). Handoff: docs/session-logs/2026-07-03-cloud-bongos-whale-multiangle-turnaround.md.\n\nDone when: the rear (tail-on) is on-model + consistent with the set (canonical traits, clean back, subtle blowhole) with its current good proportions preserved; owner sees + approves.",
|
|
2025
|
-
"status": "ready",
|
|
2026
|
-
"touches": [
|
|
2027
|
-
"brand/cloud-bongos/world/manifest.json",
|
|
2028
|
-
"brand/cloud-bongos/world/assets/creatures/"
|
|
2029
|
-
],
|
|
2030
|
-
"est_minutes": 20,
|
|
2031
|
-
"est_cost_usd": null,
|
|
2032
|
-
"manual_degree": 2,
|
|
2033
|
-
"priority": 4,
|
|
2034
|
-
"automation_tag": null,
|
|
2035
|
-
"credits_reward": 6,
|
|
2036
|
-
"source": "owner-request",
|
|
2037
|
-
"source_ref": "cloud-bongos-whale-rear-regen",
|
|
2038
|
-
"promoted_at": "2026-07-03T09:26:03.614Z",
|
|
2039
|
-
"shipped_at": null,
|
|
2040
|
-
"shipped_by": null,
|
|
2041
|
-
"value_summary": null,
|
|
2042
|
-
"created_at": "2026-07-03T09:21:09.466Z",
|
|
2043
|
-
"updated_at": "2026-07-04T12:07:54.624Z",
|
|
2044
|
-
"kind": "feature",
|
|
2045
|
-
"parent_task_id": null,
|
|
2046
|
-
"actual_minutes": null,
|
|
2047
|
-
"scoping_confidence": null,
|
|
2048
|
-
"discipline": "artist",
|
|
2049
|
-
"parallel_safe": null,
|
|
2050
|
-
"newcomer_friendly": false,
|
|
2051
|
-
"requires_rank": "xenos",
|
|
2052
|
-
"needs_migration": false,
|
|
2053
|
-
"security_sensitive": false,
|
|
2054
|
-
"sandbox_review": null,
|
|
2055
|
-
"goal_id": "9",
|
|
2056
|
-
"module_key": null,
|
|
2057
|
-
"reward_gate_exempt": false,
|
|
2058
|
-
"credits_awarded": 0,
|
|
2059
|
-
"est_minutes_calibrated": 2
|
|
2060
|
-
},
|
|
2061
|
-
{
|
|
2062
|
-
"id": "2025",
|
|
2063
|
-
"version_id": "BONGOS-V1",
|
|
2064
|
-
"title": "Publish the Cloud Bongos core to npm as `cloudbongos` (rename from @cloudbongos/core) + chase the bare `bongos` name",
|
|
2065
|
-
"description": "Owner (Besoz/archon) branding + distribution decision, 2026-07-04: the public install line for the core is the unscoped `npm install -g cloudbongos`, NOT the scoped `@cloudbongos/core`. The daily command stays `bongos` (bin/bongos.js `bin` mapping is unchanged and name-independent), so `npm install -g cloudbongos` -> `bongos init` works.\n\nSCOPE (rename the core's self-name, ~4 code spots + docs):\n- package-core.js: `buildPackageJson` name field `@cloudbongos/core` -> `cloudbongos`; ARTIFACT_NAME `cloudbongos-core` -> `cloudbongos` (tarball becomes cloudbongos-<ver>.tgz).\n- upgrade.js: CORE_PKG + ARTIFACT constants.\n- claude-materialize.js: the comment ref (path resolution is param-based via coreRoot, so no code change needed there).\n- docs (8 files) incl. ADR 0108 -- record the deliberate scope->unscoped reversal (add an ADR note).\n\nSAFE (verified): DB migrations are namespaced by the literal `core_` prefix, not the package name, so the rename cannot re-run/orphan migrations. The Cloud Bongos brand ships verbatim through mirror-redact (only instance/OTB literals are redacted). Only consumer (emersonian-circles) pins a vendored file: tarball, unaffected; optional follow-up to migrate it to the npm-published name.\n\nPLAN: rename -> build the redacted core tarball (package-core.js) -> local-install + smoke the `bongos` CLI (version/help/init --help) BEFORE any permanent step -> owner runs the one-time authenticated `npm publish` (permanent; npm login + 2FA; unscoped = no --access flag). In parallel: file an npm support request to release the bare `bongos` security-holding package, leveraging ownership of the `bongos` npm org (+10 defensive *bongos orgs).",
|
|
2066
|
-
"status": "ready",
|
|
2067
|
-
"touches": [],
|
|
2068
|
-
"est_minutes": null,
|
|
2069
|
-
"est_cost_usd": null,
|
|
2070
|
-
"manual_degree": null,
|
|
2071
|
-
"priority": 4,
|
|
2072
|
-
"automation_tag": null,
|
|
2073
|
-
"credits_reward": 30,
|
|
2074
|
-
"source": "manual",
|
|
2075
|
-
"source_ref": null,
|
|
2076
|
-
"promoted_at": null,
|
|
2077
|
-
"shipped_at": null,
|
|
2078
|
-
"shipped_by": null,
|
|
2079
|
-
"value_summary": null,
|
|
2080
|
-
"created_at": "2026-07-04T13:13:29.173Z",
|
|
2081
|
-
"updated_at": "2026-07-04T13:14:01.563Z",
|
|
2082
|
-
"kind": "infra",
|
|
2083
|
-
"parent_task_id": null,
|
|
2084
|
-
"actual_minutes": null,
|
|
2085
|
-
"scoping_confidence": null,
|
|
2086
|
-
"discipline": "engineer",
|
|
2087
|
-
"parallel_safe": null,
|
|
2088
|
-
"newcomer_friendly": false,
|
|
2089
|
-
"requires_rank": "xenos",
|
|
2090
|
-
"needs_migration": true,
|
|
2091
|
-
"security_sensitive": false,
|
|
2092
|
-
"sandbox_review": null,
|
|
2093
|
-
"goal_id": "3",
|
|
2094
|
-
"module_key": null,
|
|
2095
|
-
"reward_gate_exempt": false,
|
|
2096
|
-
"credits_awarded": 0,
|
|
2097
|
-
"est_minutes_calibrated": null
|
|
2098
|
-
},
|
|
2099
|
-
{
|
|
2100
|
-
"id": "1219",
|
|
2101
|
-
"version_id": "BONGOS-V1",
|
|
2102
|
-
"title": "Postgres-backed CI harness for GDS lifecycle triggers + fix mig-009 blocker-resolve ignoring unshipped deps",
|
|
2103
|
-
"description": "Promoted from idea_inbox #277. Verified-real gap: scripts/gds/run-unit-tests.js is genuinely DB-free (explicitly excludes an INTEGRATION set needing a live Postgres/server), the only required PR check (pr-unit-tests.yml) runs no-DB, and NO CI workflow has a Postgres service container — the 'integration-smoke gate with a Postgres service container' the runner comments reference is aspirational and was never built. The only round-trip for the lifecycle triggers is scripts/gds/smoke-dependencies.sh, which hits PROD (creates real tasks).\n\nBuild a throwaway-Postgres harness so trigger logic gets real CI assertions: prefer a real postgres:16 service container seeded by scripts/migrate.sh (pg-mem does NOT faithfully execute plpgsql triggers and would give false confidence). Triggers under test: migration 020 promote_dependents_on_ship, migration 009 trg_promote_tasks_on_blocker_resolve.\n\nReal bug the subagent confirmed by reading the SQL: migration 009's trg_promote_tasks_on_blocker_resolve flips every linked task blocked->ready on blocker resolve with ZERO task_dependencies check — violating the deps-shipped invariant. Fix it and pin it with a regression assertion as the harness's first case.\n\nNote: the idea's 'unblocks #953' framing is STALE — #953 is status=ready (already worked, scope was migration 020, a different trigger). The durable value is the harness + the mig-009 fix, not unblocking #953. Decide whether the DB harness is a required PR check or an advisory integration-smoke gate (matching the existing DB-free/integration split).",
|
|
2104
|
-
"status": "ready",
|
|
2105
|
-
"touches": [
|
|
2106
|
-
"scripts/gds/run-unit-tests.js",
|
|
2107
|
-
".github/workflows/pr-unit-tests.yml",
|
|
2108
|
-
"migrations/009_pms_v2_blockers_table.sql",
|
|
2109
|
-
"migrations/020_task_dependencies.sql",
|
|
2110
|
-
"tests/"
|
|
2111
|
-
],
|
|
2112
|
-
"est_minutes": 240,
|
|
2113
|
-
"est_cost_usd": null,
|
|
2114
|
-
"manual_degree": null,
|
|
2115
|
-
"priority": 5,
|
|
2116
|
-
"automation_tag": null,
|
|
2117
|
-
"credits_reward": 8,
|
|
2118
|
-
"source": "idea_inbox",
|
|
2119
|
-
"source_ref": "idea:277",
|
|
2120
|
-
"promoted_at": "2026-06-18T03:44:31.873Z",
|
|
2121
|
-
"shipped_at": null,
|
|
2122
|
-
"shipped_by": null,
|
|
2123
|
-
"value_summary": null,
|
|
2124
|
-
"created_at": "2026-06-18T03:44:31.873Z",
|
|
2125
|
-
"updated_at": "2026-07-02T21:03:02.890Z",
|
|
2126
|
-
"kind": "feature",
|
|
2127
|
-
"parent_task_id": null,
|
|
2128
|
-
"actual_minutes": null,
|
|
2129
|
-
"scoping_confidence": null,
|
|
2130
|
-
"discipline": "unclassified",
|
|
2131
|
-
"parallel_safe": null,
|
|
2132
|
-
"newcomer_friendly": false,
|
|
2133
|
-
"requires_rank": "metic",
|
|
2134
|
-
"needs_migration": true,
|
|
2135
|
-
"security_sensitive": false,
|
|
2136
|
-
"sandbox_review": null,
|
|
2137
|
-
"goal_id": "24",
|
|
2138
|
-
"module_key": null,
|
|
2139
|
-
"reward_gate_exempt": true,
|
|
2140
|
-
"credits_awarded": 0,
|
|
2141
|
-
"est_minutes_calibrated": 18
|
|
2142
|
-
},
|
|
2143
|
-
{
|
|
2144
|
-
"id": "1580",
|
|
2145
|
-
"version_id": "V2",
|
|
2146
|
-
"title": "V2.W01 — Map-format spike: JSON schema + derived-collision rule",
|
|
2147
|
-
"description": "Pin the map-file format: design the layered JSON shape (ground/decoration/objects/overlay + structures/warps/spawns) and the rule that derives collision from it. Deliver a `mapFormat` parse/validate stub + one fixture. Output feeds E1 (V2.W05). See criterion world-data.",
|
|
2148
|
-
"status": "ready",
|
|
2149
|
-
"touches": [],
|
|
2150
|
-
"est_minutes": 150,
|
|
2151
|
-
"est_cost_usd": null,
|
|
2152
|
-
"manual_degree": 3,
|
|
2153
|
-
"priority": 5,
|
|
2154
|
-
"automation_tag": null,
|
|
2155
|
-
"credits_reward": 40,
|
|
2156
|
-
"source": "planning-session",
|
|
2157
|
-
"source_ref": "v2world-S1",
|
|
2158
|
-
"promoted_at": "2026-06-26T22:26:24.795Z",
|
|
2159
|
-
"shipped_at": null,
|
|
2160
|
-
"shipped_by": null,
|
|
2161
|
-
"value_summary": null,
|
|
2162
|
-
"created_at": "2026-06-26T22:24:18.085Z",
|
|
2163
|
-
"updated_at": "2026-07-03T13:10:08.072Z",
|
|
2164
|
-
"kind": "spike",
|
|
2165
|
-
"parent_task_id": null,
|
|
2166
|
-
"actual_minutes": null,
|
|
2167
|
-
"scoping_confidence": null,
|
|
2168
|
-
"discipline": "engineer",
|
|
2169
|
-
"parallel_safe": null,
|
|
2170
|
-
"newcomer_friendly": false,
|
|
2171
|
-
"requires_rank": "metic",
|
|
2172
|
-
"needs_migration": true,
|
|
2173
|
-
"security_sensitive": false,
|
|
2174
|
-
"sandbox_review": null,
|
|
2175
|
-
"goal_id": "6",
|
|
2176
|
-
"module_key": "game",
|
|
2177
|
-
"reward_gate_exempt": true,
|
|
2178
|
-
"credits_awarded": 0,
|
|
2179
|
-
"est_minutes_calibrated": 23
|
|
2180
|
-
},
|
|
2181
|
-
{
|
|
2182
|
-
"id": "1838",
|
|
2183
|
-
"version_id": "BONGOS-V1",
|
|
2184
|
-
"title": "BV1.R90 — Governance architecture — ADR + finalized permission catalog",
|
|
2185
|
-
"description": "**Why:** the whole goal anchors on the model. Settle it in an ADR before building.\n\n**Done when:** an ADR records the decision — permissions-as-atom, ranks become seeded roles, first-class principals + session-scopes + ownership-scoped permissions, and a protected-surface registry with \"policy owns / substrate enforces\"; the compatibility-seed strategy is specified; and the FULL permission catalog is enumerated (every key + `system` flag), grounded in the 2026-07-03 authority sweep. Output feeds R93/R94 and refines downstream sub-tasks.\n\n**Cross-refs:** builds on ADR 0016 (trust boundary), ADR 0043 (git/ssh boundary), ADR 0062 (core/host split), ADR 0083 (modules). Gates most of the goal.",
|
|
2186
|
-
"status": "ready",
|
|
2187
|
-
"touches": [],
|
|
2188
|
-
"est_minutes": 240,
|
|
2189
|
-
"est_cost_usd": null,
|
|
2190
|
-
"manual_degree": 3,
|
|
2191
|
-
"priority": 5,
|
|
2192
|
-
"automation_tag": null,
|
|
2193
|
-
"credits_reward": 70,
|
|
2194
|
-
"source": "planning-session",
|
|
2195
|
-
"source_ref": "bongos-v1-gov-r90",
|
|
2196
|
-
"promoted_at": null,
|
|
2197
|
-
"shipped_at": null,
|
|
2198
|
-
"shipped_by": null,
|
|
2199
|
-
"value_summary": null,
|
|
2200
|
-
"created_at": "2026-07-03T13:20:07.867Z",
|
|
2201
|
-
"updated_at": "2026-07-03T14:21:06.630Z",
|
|
2202
|
-
"kind": "spike",
|
|
2203
|
-
"parent_task_id": null,
|
|
2204
|
-
"actual_minutes": null,
|
|
2205
|
-
"scoping_confidence": null,
|
|
2206
|
-
"discipline": "engineer",
|
|
2207
|
-
"parallel_safe": null,
|
|
2208
|
-
"newcomer_friendly": false,
|
|
2209
|
-
"requires_rank": "archon",
|
|
2210
|
-
"needs_migration": false,
|
|
2211
|
-
"security_sensitive": false,
|
|
2212
|
-
"sandbox_review": null,
|
|
2213
|
-
"goal_id": "30",
|
|
2214
|
-
"module_key": null,
|
|
2215
|
-
"reward_gate_exempt": false,
|
|
2216
|
-
"credits_awarded": 0,
|
|
2217
|
-
"est_minutes_calibrated": 36
|
|
2218
|
-
},
|
|
2219
|
-
{
|
|
2220
|
-
"id": "1839",
|
|
2221
|
-
"version_id": "BONGOS-V1",
|
|
2222
|
-
"title": "BV1.R91 — Add 'governance' module key + widen the Governance goal scope",
|
|
2223
|
-
"description": "**Why:** the module dir modules/governance/ needs a scope-map key before goal members can author tasks touching it (planning-session prep rule).\n\n**Done when:** `module-scope-map.js` MODULE_GLOBS gains a `governance` key covering modules/governance/** + config/governance*.json (protected, since it overlaps the authz core); and goal 30's scope is widened to include it (`POST /goals/30/scope`). Kernel-scoped → Archon.",
|
|
2224
|
-
"status": "ready",
|
|
2225
|
-
"touches": [
|
|
2226
|
-
"src/gds/module-scope-map.js"
|
|
2227
|
-
],
|
|
2228
|
-
"est_minutes": 45,
|
|
2229
|
-
"est_cost_usd": null,
|
|
2230
|
-
"manual_degree": 2,
|
|
2231
|
-
"priority": 5,
|
|
2232
|
-
"automation_tag": null,
|
|
2233
|
-
"credits_reward": 25,
|
|
2234
|
-
"source": "planning-session",
|
|
2235
|
-
"source_ref": "bongos-v1-gov-r91",
|
|
2236
|
-
"promoted_at": null,
|
|
2237
|
-
"shipped_at": null,
|
|
2238
|
-
"shipped_by": null,
|
|
2239
|
-
"value_summary": null,
|
|
2240
|
-
"created_at": "2026-07-03T13:20:07.902Z",
|
|
2241
|
-
"updated_at": "2026-07-03T14:14:01.147Z",
|
|
2242
|
-
"kind": "refactor",
|
|
2243
|
-
"parent_task_id": null,
|
|
2244
|
-
"actual_minutes": 1,
|
|
2245
|
-
"scoping_confidence": null,
|
|
2246
|
-
"discipline": "engineer",
|
|
2247
|
-
"parallel_safe": null,
|
|
2248
|
-
"newcomer_friendly": false,
|
|
2249
|
-
"requires_rank": "archon",
|
|
2250
|
-
"needs_migration": false,
|
|
2251
|
-
"security_sensitive": false,
|
|
2252
|
-
"sandbox_review": null,
|
|
2253
|
-
"goal_id": "30",
|
|
2254
|
-
"module_key": null,
|
|
2255
|
-
"reward_gate_exempt": false,
|
|
2256
|
-
"credits_awarded": 0,
|
|
2257
|
-
"est_minutes_calibrated": 6
|
|
2258
|
-
},
|
|
2259
|
-
{
|
|
2260
|
-
"id": "1920",
|
|
2261
|
-
"version_id": "BONGOS-V1",
|
|
2262
|
-
"title": "__smoke__ batch-claim 20260703-181302-A1",
|
|
2263
|
-
"description": "smoke",
|
|
2264
|
-
"status": "ready",
|
|
2265
|
-
"touches": [
|
|
2266
|
-
"__smoke__/batch/20260703-181302/a1"
|
|
2267
|
-
],
|
|
2268
|
-
"est_minutes": 1,
|
|
2269
|
-
"est_cost_usd": null,
|
|
2270
|
-
"manual_degree": 1,
|
|
2271
|
-
"priority": 5,
|
|
2272
|
-
"automation_tag": "overnight-safe",
|
|
2273
|
-
"credits_reward": 5,
|
|
2274
|
-
"source": "smoke",
|
|
2275
|
-
"source_ref": "20260703-181302-A1",
|
|
2276
|
-
"promoted_at": "2026-07-03T18:13:02.598Z",
|
|
2277
|
-
"shipped_at": null,
|
|
2278
|
-
"shipped_by": null,
|
|
2279
|
-
"value_summary": null,
|
|
2280
|
-
"created_at": "2026-07-03T18:13:02.598Z",
|
|
2281
|
-
"updated_at": "2026-07-03T18:13:02.598Z",
|
|
2282
|
-
"kind": "feature",
|
|
2283
|
-
"parent_task_id": null,
|
|
2284
|
-
"actual_minutes": null,
|
|
2285
|
-
"scoping_confidence": null,
|
|
2286
|
-
"discipline": "unclassified",
|
|
2287
|
-
"parallel_safe": null,
|
|
2288
|
-
"newcomer_friendly": false,
|
|
2289
|
-
"requires_rank": "xenos",
|
|
2290
|
-
"needs_migration": false,
|
|
2291
|
-
"security_sensitive": false,
|
|
2292
|
-
"sandbox_review": null,
|
|
2293
|
-
"goal_id": "3",
|
|
2294
|
-
"module_key": null,
|
|
2295
|
-
"reward_gate_exempt": false,
|
|
2296
|
-
"credits_awarded": 0,
|
|
2297
|
-
"est_minutes_calibrated": 1
|
|
2298
|
-
},
|
|
2299
|
-
{
|
|
2300
|
-
"id": "1921",
|
|
2301
|
-
"version_id": "BONGOS-V1",
|
|
2302
|
-
"title": "__smoke__ batch-claim 20260703-181302-A2",
|
|
2303
|
-
"description": "smoke",
|
|
2304
|
-
"status": "ready",
|
|
2305
|
-
"touches": [
|
|
2306
|
-
"__smoke__/batch/20260703-181302/a2"
|
|
2307
|
-
],
|
|
2308
|
-
"est_minutes": 1,
|
|
2309
|
-
"est_cost_usd": null,
|
|
2310
|
-
"manual_degree": 1,
|
|
2311
|
-
"priority": 5,
|
|
2312
|
-
"automation_tag": "overnight-safe",
|
|
2313
|
-
"credits_reward": 5,
|
|
2314
|
-
"source": "smoke",
|
|
2315
|
-
"source_ref": "20260703-181302-A2",
|
|
2316
|
-
"promoted_at": "2026-07-03T18:13:02.993Z",
|
|
2317
|
-
"shipped_at": null,
|
|
2318
|
-
"shipped_by": null,
|
|
2319
|
-
"value_summary": null,
|
|
2320
|
-
"created_at": "2026-07-03T18:13:02.993Z",
|
|
2321
|
-
"updated_at": "2026-07-03T18:13:02.993Z",
|
|
2322
|
-
"kind": "feature",
|
|
2323
|
-
"parent_task_id": null,
|
|
2324
|
-
"actual_minutes": null,
|
|
2325
|
-
"scoping_confidence": null,
|
|
2326
|
-
"discipline": "unclassified",
|
|
2327
|
-
"parallel_safe": null,
|
|
2328
|
-
"newcomer_friendly": false,
|
|
2329
|
-
"requires_rank": "xenos",
|
|
2330
|
-
"needs_migration": false,
|
|
2331
|
-
"security_sensitive": false,
|
|
2332
|
-
"sandbox_review": null,
|
|
2333
|
-
"goal_id": "3",
|
|
2334
|
-
"module_key": null,
|
|
2335
|
-
"reward_gate_exempt": false,
|
|
2336
|
-
"credits_awarded": 0,
|
|
2337
|
-
"est_minutes_calibrated": 1
|
|
2338
|
-
},
|
|
2339
|
-
{
|
|
2340
|
-
"id": "1922",
|
|
2341
|
-
"version_id": "BONGOS-V1",
|
|
2342
|
-
"title": "__smoke__ batch-claim 20260703-181302-B1",
|
|
2343
|
-
"description": "smoke",
|
|
2344
|
-
"status": "ready",
|
|
2345
|
-
"touches": [
|
|
2346
|
-
"__smoke__/batch/20260703-181302/shared"
|
|
2347
|
-
],
|
|
2348
|
-
"est_minutes": 1,
|
|
2349
|
-
"est_cost_usd": null,
|
|
2350
|
-
"manual_degree": 1,
|
|
2351
|
-
"priority": 5,
|
|
2352
|
-
"automation_tag": "overnight-safe",
|
|
2353
|
-
"credits_reward": 5,
|
|
2354
|
-
"source": "smoke",
|
|
2355
|
-
"source_ref": "20260703-181302-B1",
|
|
2356
|
-
"promoted_at": "2026-07-03T18:13:03.550Z",
|
|
2357
|
-
"shipped_at": null,
|
|
2358
|
-
"shipped_by": null,
|
|
2359
|
-
"value_summary": null,
|
|
2360
|
-
"created_at": "2026-07-03T18:13:03.550Z",
|
|
2361
|
-
"updated_at": "2026-07-03T18:13:03.550Z",
|
|
2362
|
-
"kind": "feature",
|
|
2363
|
-
"parent_task_id": null,
|
|
2364
|
-
"actual_minutes": null,
|
|
2365
|
-
"scoping_confidence": null,
|
|
2366
|
-
"discipline": "unclassified",
|
|
2367
|
-
"parallel_safe": null,
|
|
2368
|
-
"newcomer_friendly": false,
|
|
2369
|
-
"requires_rank": "xenos",
|
|
2370
|
-
"needs_migration": false,
|
|
2371
|
-
"security_sensitive": false,
|
|
2372
|
-
"sandbox_review": null,
|
|
2373
|
-
"goal_id": "3",
|
|
2374
|
-
"module_key": null,
|
|
2375
|
-
"reward_gate_exempt": false,
|
|
2376
|
-
"credits_awarded": 0,
|
|
2377
|
-
"est_minutes_calibrated": 1
|
|
2378
|
-
},
|
|
2379
|
-
{
|
|
2380
|
-
"id": "1923",
|
|
2381
|
-
"version_id": "BONGOS-V1",
|
|
2382
|
-
"title": "__smoke__ batch-claim 20260703-181302-B2",
|
|
2383
|
-
"description": "smoke",
|
|
2384
|
-
"status": "ready",
|
|
2385
|
-
"touches": [
|
|
2386
|
-
"__smoke__/batch/20260703-181302/shared"
|
|
2387
|
-
],
|
|
2388
|
-
"est_minutes": 1,
|
|
2389
|
-
"est_cost_usd": null,
|
|
2390
|
-
"manual_degree": 1,
|
|
2391
|
-
"priority": 5,
|
|
2392
|
-
"automation_tag": "overnight-safe",
|
|
2393
|
-
"credits_reward": 5,
|
|
2394
|
-
"source": "smoke",
|
|
2395
|
-
"source_ref": "20260703-181302-B2",
|
|
2396
|
-
"promoted_at": "2026-07-03T18:13:03.816Z",
|
|
2397
|
-
"shipped_at": null,
|
|
2398
|
-
"shipped_by": null,
|
|
2399
|
-
"value_summary": null,
|
|
2400
|
-
"created_at": "2026-07-03T18:13:03.816Z",
|
|
2401
|
-
"updated_at": "2026-07-03T18:13:03.816Z",
|
|
2402
|
-
"kind": "feature",
|
|
2403
|
-
"parent_task_id": null,
|
|
2404
|
-
"actual_minutes": null,
|
|
2405
|
-
"scoping_confidence": null,
|
|
2406
|
-
"discipline": "unclassified",
|
|
2407
|
-
"parallel_safe": null,
|
|
2408
|
-
"newcomer_friendly": false,
|
|
2409
|
-
"requires_rank": "xenos",
|
|
2410
|
-
"needs_migration": false,
|
|
2411
|
-
"security_sensitive": false,
|
|
2412
|
-
"sandbox_review": null,
|
|
2413
|
-
"goal_id": "3",
|
|
2414
|
-
"module_key": null,
|
|
2415
|
-
"reward_gate_exempt": false,
|
|
2416
|
-
"credits_awarded": 0,
|
|
2417
|
-
"est_minutes_calibrated": 1
|
|
2418
|
-
}
|
|
2419
|
-
]
|
|
2420
|
-
}
|