Skip to content

Commit d1c0827

Browse files
The loop has a desk now.
Docs for install, the walk certificate, demo analytics, and how to land a patch. Pin Action on every push. Funnel lives on this device.
1 parent b436e1a commit d1c0827

21 files changed

Lines changed: 915 additions & 46 deletions

.github/ISSUE_TEMPLATE/bug.yml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
name: Bug
2+
description: The loop lied. A button, a walk, a card.
3+
title: "[loop] "
4+
labels: ["bug"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Play it first. If this is a question, use Discussions → Q&A.
10+
- type: textarea
11+
id: walk
12+
attributes:
13+
label: Walk URL
14+
description: Paste `/walk/v1.…` if you have one. House pin is Thunder 51.
15+
placeholder: /walk/v1.HOU.90s-east.grit.22.…
16+
validations:
17+
required: false
18+
- type: dropdown
19+
id: host
20+
attributes:
21+
label: Where did you play
22+
options:
23+
- Top-level tab
24+
- Nested preview / iframe
25+
- npm run dev
26+
- Fork
27+
validations:
28+
required: true
29+
- type: input
30+
id: browser
31+
attributes:
32+
label: Browser and OS
33+
placeholder: Safari 18 · iPhone, Chrome · macOS
34+
validations:
35+
required: true
36+
- type: textarea
37+
id: clicks
38+
attributes:
39+
label: What you clicked, in order
40+
placeholder: Rip the pack → foil → five names → Lock five → Send the card → Save
41+
validations:
42+
required: true
43+
- type: textarea
44+
id: expected
45+
attributes:
46+
label: What should have happened
47+
validations:
48+
required: true
49+
- type: textarea
50+
id: got
51+
attributes:
52+
label: What happened
53+
validations:
54+
required: true

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: How to play
4+
url: https://github.com/DigitalCurrensy/first-bucket-studios/blob/main/HOW-TO-PLAY.md
5+
about: Ninety seconds. Rip, lock five, send the card.
6+
- name: Q&A and ideas
7+
url: https://github.com/DigitalCurrensy/first-bucket-studios/discussions
8+
about: Setup help, proposals, show and tell. Not bugs.
9+
- name: Security
10+
url: https://github.com/DigitalCurrensy/first-bucket-studios/security/advisories/new
11+
about: Private reports only. Never a public thread.

.github/ISSUE_TEMPLATE/idea.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: Idea
2+
description: Prefer Discussions → Ideas. Use this only if you already have a patch in mind.
3+
title: "[idea] "
4+
labels: ["idea"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Talk first in Discussions if you can. A PR that changes the mixer will be closed.
10+
- type: textarea
11+
id: loop
12+
attributes:
13+
label: Which beat
14+
description: home, rip, room, foil, lock, card, tray, save, copy, open
15+
placeholder: tray
16+
validations:
17+
required: true
18+
- type: textarea
19+
id: why
20+
attributes:
21+
label: Why the loop needs this
22+
validations:
23+
required: true
24+
- type: checkboxes
25+
id: pin
26+
attributes:
27+
label: Pin
28+
options:
29+
- label: I will not retune mulberry32 or the house table.
30+
required: true
31+
- label: I read NOTICE if this touches names, plates, or crests.
32+
required: true

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
## Loop
2+
3+
What beat does this change? (`home` `rip` `room` `foil` `lock` `card` `tray` `save` `copy`)
4+
5+
## Proof
6+
7+
- [ ] `npm run test:pin` is green
8+
- [ ] Live pack is not always Thunder 51
9+
- [ ] `public/__grok/` untouched
10+
- [ ] NOTICE read if names / plates / crests moved
11+
- [ ] Stills + tape recaptured if the face of the loop changed (`npm run capture`)
12+
13+
## Notes
14+
15+
House pin must stay:
16+
17+
`v1.OKC.positionless.even.51.chet~dort~hartenstein~jalenw~sga`

.github/workflows/pin.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
name: Pin
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
8+
jobs:
9+
pin:
10+
name: House pin + walk
11+
runs-on: ubuntu-latest
12+
timeout-minutes: 10
13+
steps:
14+
- uses: actions/checkout@v4
15+
- uses: actions/setup-node@v4
16+
with:
17+
node-version: 22
18+
cache: npm
19+
- run: npm ci
20+
- run: npm run test:pin

CONTRIBUTING.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Contributing
2+
3+
You are welcome here. The loop is small. Keep the patch small.
4+
5+
Read [NOTICE](NOTICE) first if your change touches names, crests, or plates.
6+
7+
## Before you write code
8+
9+
1. Play it. [HOW-TO-PLAY.md](HOW-TO-PLAY.md). Ninety seconds.
10+
2. If it is an idea, not a bug: open a **Discussion** (Ideas) before a PR.
11+
3. If it is a bug: open an issue with the walk URL and the browser. [SUPPORT.md](SUPPORT.md).
12+
13+
## First-time map
14+
15+
| You want to… | Start here |
16+
| --- | --- |
17+
| Copy the loop into another sport | [FORK.md](FORK.md) |
18+
| Fix copy, stills, or how-to | `HOW-TO-PLAY.md`, `docs/stills` |
19+
| Touch the mixer / house pin | Stop. See “Do not” below. |
20+
| Change foil, tray, or the card | One of those rooms. [docs/STUDIO.md](docs/STUDIO.md) |
21+
| Add a test | [docs/TESTING.md](docs/TESTING.md) |
22+
23+
## Run it
24+
25+
```bash
26+
npm install
27+
npm run dev
28+
npm run test:pin
29+
```
30+
31+
Node 22. Auth off. Database unused.
32+
33+
House pin must stay green:
34+
35+
```
36+
v1.OKC.positionless.even.51.chet~dort~hartenstein~jalenw~sga
37+
```
38+
39+
## Pull requests
40+
41+
- One room per PR. Mixer + UI + a new mode is three PRs.
42+
- Title the loop, not the ticket. “Tray copies the walk” beats “fix share.”
43+
- Run `npm run test:pin`.
44+
- If the face of the loop changed, run `npm run capture` and commit stills + tape.
45+
- Leave `public/__grok/` alone.
46+
- Do not add a shop, accounts, or a tracker that leaves the device.
47+
48+
Use the PR template. Check the pin box.
49+
50+
## Do not
51+
52+
- Retune `mulberry32`, `deriveSeed`, or the house table so the pin “looks better.”
53+
- Paste league marks into `public/emblems`.
54+
- Swap plates for likenesses.
55+
- Fake a download, a share, or a restriction.
56+
- Make every pull Thunder 51.
57+
58+
## Tone
59+
60+
Be decent. Names in the book are game tokens, not targets. No harassment, no bigotry, no “gotcha” PRs that break the pin on purpose.
61+
62+
Security reports: [SECURITY.md](SECURITY.md), not a public issue.

README.md

Lines changed: 90 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22

33
**Rip a pack. Five names. Eighty-two nights. Send the card.**
44

5-
Private repo (log in as DigitalCurrensy):
6-
7-
**https://github.com/DigitalCurrensy/first-bucket-studios**
5+
A browser basketball pack. Not a shop. Not a sportsbook. Not the NBA.
86

9-
Not the older `first-bucket-studio` (no *s*). This one.
7+
[Play](HOW-TO-PLAY.md) · [Fork](FORK.md) · [Contribute](CONTRIBUTING.md) · [MIT](LICENSE)
108

11-
A browser basketball pack. Not a shop. Not a sportsbook. Not the NBA.
9+
Private repo (log in as DigitalCurrensy):
10+
**https://github.com/DigitalCurrensy/first-bucket-studios**
1211

13-
[MIT](LICENSE) · [How to play](HOW-TO-PLAY.md) · [Fork the loop](FORK.md)
12+
Not the older `first-bucket-studio` (no *s*).
1413

1514
---
1615

@@ -36,8 +35,6 @@ About ninety seconds. Full sheet: [HOW-TO-PLAY.md](HOW-TO-PLAY.md).
3635

3736
Tape of one pull: [docs/tape/demo.mp4](docs/tape/demo.mp4)
3837

39-
### The buttons
40-
4138
| You click | What it does |
4239
| --- | --- |
4340
| **Rip the pack** | Deals a new room. New ten. |
@@ -49,68 +46,117 @@ Tape of one pull: [docs/tape/demo.mp4](docs/tape/demo.mp4)
4946

5047
There is no “copy image.” The file is the card. The URL is the walk.
5148

52-
### House job (optional)
53-
54-
Thunder · Positionless · Even is pinned as a known certificate:
49+
House job (optional) is pinned Thunder 51–31. The door is the live pack.
5550

5651
```
5752
/walk/v1.OKC.positionless.even.51.chet~dort~hartenstein~jalenw~sga
5853
```
5954

60-
51–31. Playoff lock. Same five every time. It hangs on The Wall. The main pack is live.
61-
6255
---
6356

64-
## What this is
65-
66-
A single loop you can fork.
57+
## Install
6758

68-
- **Live packs** shuffle (Fisher–Yates + mulberry32). New franchise, new ten, new walk.
69-
- **House pack** is a table, not a shuffle. [`src/lib/house-pack.ts`](src/lib/house-pack.ts).
70-
- Nights recompute from ids. The walk URL is the certificate, not a replay file.
71-
- Saves live on this device. Export a studio file if you want the desk to travel.
72-
73-
## What this is not
74-
75-
| It is not | Why |
76-
| --- | --- |
77-
| A company | No shop. No raise. No accounts. |
78-
| An NBA product | [NOTICE](NOTICE). MIT is the code, not the names. |
79-
| A sportsbook | Games and tools only. |
80-
| A sports-card marketplace | One pack. One PNG. One URL. |
81-
82-
## Run it
59+
Node 22. Auth off. Database unused.
8360

8461
```bash
62+
git clone https://github.com/DigitalCurrensy/first-bucket-studios.git
63+
cd first-bucket-studios
8564
npm install
8665
npm run dev
8766
```
8867

89-
Node 22. Auth off. Database unused.
68+
Then rip. If Save is swallowed, you are in a nested preview — open a top-level tab.
9069

9170
```bash
92-
npm run typecheck
93-
node --experimental-strip-types --test src/lib/house-pack.test.ts src/lib/nba.test.ts src/lib/walk.test.ts
71+
npm run test:pin
9472
```
9573

96-
The house pin must stay green:
74+
The house pin must stay green. That is the lock test.
9775

98-
```
99-
v1.OKC.positionless.even.51.chet~dort~hartenstein~jalenw~sga
100-
```
76+
More: [docs/STUDIO.md](docs/STUDIO.md) (update flow, themes).
10177

102-
## Stack
78+
---
10379

104-
TanStack Start · React 19 · Tailwind v4. Foil is a small WebGL layer. Share is the Web Share API with a file tray fallback.
80+
## Documentation
10581

106-
## Legal
82+
| Doc | What it is |
83+
| --- | --- |
84+
| [HOW-TO-PLAY.md](HOW-TO-PLAY.md) | The ninety seconds |
85+
| [docs/TESTING.md](docs/TESTING.md) | E2E layers: pin, funnel, demo eval, stills |
86+
| [docs/ANALYTICS.md](docs/ANALYTICS.md) | Booth funnel. Local. No pixel. |
87+
| [docs/WALK.md](docs/WALK.md) | Walk certificate (the wire format) |
88+
| [docs/STUDIO.md](docs/STUDIO.md) | Specialists, themes, updates, performance, Action |
89+
| [FORK.md](FORK.md) | Copy the loop. Swap the sport. |
90+
| [NOTICE](NOTICE) | MIT is the code, not the names |
91+
| [SUPPORT.md](SUPPORT.md) | How to ask |
92+
| [SECURITY.md](SECURITY.md) | How to report a hole |
93+
| [CONTRIBUTING.md](CONTRIBUTING.md) | How to land a patch |
10794

108-
Read [NOTICE](NOTICE) before you ship a fork with names on it.
95+
### Install
10996

110-
Plates, initials, and house crests are mitigations. They are not a license.
97+
See above. Node 22. `npm install` · `npm run dev`.
11198

112-
Built with Grok. Leave `public/__grok/` in place.
99+
### Update flow
100+
101+
`git pull``npm install` if the lockfile moved → `npm run test:pin`. Walk `v1` is frozen. Mixer does not move. Details in [docs/STUDIO.md](docs/STUDIO.md#update-flow).
102+
103+
### Themes
104+
105+
Night arena (default) or light studio. Rail toggle. Stored on this device. Reduced motion skips the ticker.
106+
107+
### Walk certificate
108+
109+
`/walk/v1.{ABBR}.{era}.{luck}.{wins}.{five-ids}` is the save file. Nights recompute. [docs/WALK.md](docs/WALK.md).
110+
111+
### Specialists
112+
113+
Live pack, house pack, walk, foil, lithograph, tray, plates. One room per PR. [docs/STUDIO.md](docs/STUDIO.md#specialists).
114+
115+
### GitHub Action
116+
117+
[`.github/workflows/pin.yml`](.github/workflows/pin.yml) runs `npm run test:pin` on every push and pull request. Demo eval stays local (`npm run test:demo`) because it needs a running studio.
118+
119+
### Benchmarks
120+
121+
The pin is the benchmark: house walk is 51–31, same five, same nights. Live packs must not collapse to that id. Funnel target: card in under 90s.
122+
123+
### Performance
124+
125+
Foil is one WebGL layer with CSS fallback. Share is 2D canvas, not the foil. Ticker is 110ms/night, skipped on reduced motion. [docs/STUDIO.md](docs/STUDIO.md#performance).
126+
127+
### Demo evals
128+
129+
`npm run test:demo` — Playwright rips a live pack, asserts it is not the house pin, and opens the tray. [docs/TESTING.md](docs/TESTING.md).
130+
131+
---
132+
133+
## Community
134+
135+
Talk happens in **GitHub Discussions**. There is no Discord.
136+
137+
| Category | Use it for |
138+
| --- | --- |
139+
| **Q&A** | Setup help, “how do I”, Save / Copy / Open |
140+
| **Ideas** | Feature proposals and design before any PR |
141+
| **Show and tell** | Forks, other sports, stills, workflows |
142+
| **Announcements** | Releases from the maintainers |
143+
144+
For a good Q&A answer fast, include the walk URL if you have one, your OS and browser, how you ran it, and whether Save was in a top-level tab or a nested preview. See [SUPPORT.md](SUPPORT.md). Bugs belong in issues. Security reports follow [SECURITY.md](SECURITY.md), never a public thread.
145+
146+
---
147+
148+
## Contributing
149+
150+
Contributions are welcome. Read [CONTRIBUTING.md](CONTRIBUTING.md), run `npm run test:pin`, and open a focused pull request.
151+
152+
Security reports should follow [SECURITY.md](SECURITY.md).
153+
154+
---
113155

114156
## License
115157

116158
[MIT](LICENSE). Invite the rip — [FORK.md](FORK.md).
159+
160+
Read [NOTICE](NOTICE) before you ship a fork with names on it. Plates, initials, and house crests are mitigations. They are not a license.
161+
162+
Built with Grok. Leave `public/__grok/` in place.

0 commit comments

Comments
 (0)