WolfDavid commited on
Commit
d3359f1
Β·
1 Parent(s): 16c6052

docs(01-01): record the ZeroGPU hosting decision and wire the Space remote

Browse files

- Chosen path: zerogpu-free on WolfDavid/japanese-learning-avatar (public)
- cpu-basic Gradio creation was rejected with HTTP 402 Payment Required;
the identical request on zero-a10g succeeded with no charge
- 1 of 2 free ZeroGPU slots consumed, 1 remains
- Records why runtime.hardware.current is null pre-deploy (stage NO_APP_FILE)
- Flags the auto-generated README front-matter conflict (sdk_version 6.26.0
vs the pinned 6.22.0, python_version '3.12' vs 3.12.12) for plan 01-05
- Adds the 'space' git remote; no application code pushed

Files changed (1) hide show
  1. docs/HOSTING.md +145 -0
docs/HOSTING.md ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Hosting (DPLY-01)
2
+
3
+ **Decided:** 2026-08-27
4
+ **Chosen path:** `zerogpu-free`
5
+
6
+ | Field | Value |
7
+ |---|---|
8
+ | Space | WolfDavid/japanese-learning-avatar |
9
+ | Space page | https://huggingface.co/spaces/WolfDavid/japanese-learning-avatar |
10
+ | SPACE_URL (direct, used by E2E `--space-url`) | https://wolfdavid-japanese-learning-avatar.hf.space |
11
+ | Visibility | public (`private: false`) |
12
+ | Hardware requested | `zero-a10g` (ZeroGPU) |
13
+ | Hardware applied | not yet allocated β€” `runtime.hardware.current` is `null` because `runtime.stage` is `NO_APP_FILE`. See "Why `hardware.current` is null" below. |
14
+ | sdk / sdk_version | gradio / **6.26.0 on the Space today** β€” must be corrected to **6.22.0** by plan 01-05. See "Open handoff to plan 01-05". |
15
+ | python_version | **`'3.12'` on the Space today** β€” must be corrected to **3.12.12** by plan 01-05. |
16
+ | Sleep timeout | 48 h (`gcTimeout: 172800`) |
17
+ | Space repo SHA at time of writing | `b70455dcf67ff7db6b1f48f08153982d37a63dd2` (two files: `.gitattributes`, `README.md`) |
18
+ | Created | 2026-08-27T02:13:12Z |
19
+
20
+ ## The decisive finding: `cpu-basic` is no longer creatable, and it fails with a payment error
21
+
22
+ Creating this Space on the default `cpu-basic` hardware was **rejected with HTTP 402 Payment
23
+ Required**. The message, verbatim:
24
+
25
+ > Static Spaces are free for everyone, but hosting Gradio and Docker Spaces on free cpu-basic
26
+ > requires a PRO subscription.
27
+
28
+ Re-issuing the identical creation request with ZeroGPU (`space_hardware="zero-a10g"`) **succeeded
29
+ immediately, with no payment prompt and no charge.**
30
+
31
+ This is empirical confirmation of the claim in `01-RESEARCH.md` and `CLAUDE.md` that Gradio Spaces
32
+ on a free personal account are PRO-gated *except* for the ZeroGPU carve-out. It is no longer a
33
+ documentation reading β€” it is an observed platform response on this account.
34
+
35
+ **Consequence:** ZeroGPU is now the **only** free hosting path for this project. A future phase
36
+ **cannot** silently fall back to `cpu-basic` to save a ZeroGPU slot β€” that fallback does not exist
37
+ for a Gradio Space on a non-PRO personal account. Any plan that proposes it is proposing a $9/mo
38
+ purchase.
39
+
40
+ ## Account eligibility evidence (verified against the live public API, 2026-08-27)
41
+
42
+ Queried in this task, not quoted from RESEARCH:
43
+
44
+ - `isPro: false`; account created `2023-11-27T01:45:12.000Z` β€” about 2.7 years old, so the ZeroGPU
45
+ ">30 days in good standing" criterion is satisfied with enormous margin.
46
+ - Email: verified (account is in good standing; ZeroGPU allocation was accepted, which requires it).
47
+ - **8 pre-existing Gradio Spaces, every one of them `requested: cpu-basic`, and zero on ZeroGPU** β€”
48
+ so both free ZeroGPU slots were open before this Space was created:
49
+
50
+ | Space | sdk_version | python | hardware requested | stage |
51
+ |---|---|---|---|---|
52
+ | `WolfDavid/dino` | 6.9.0 | 3.11 | cpu-basic | RUNNING |
53
+ | `WolfDavid/fea-surrogate` | 5.9.1 | 3.11 | cpu-basic | SLEEPING |
54
+ | `WolfDavid/mechspec-qwen-demo` | 5.9.1 | 3.11 | cpu-basic | SLEEPING |
55
+ | `WolfDavid/agentic-market-analyzer` | 5.9.1 | 3.11 | cpu-basic | SLEEPING |
56
+ | `WolfDavid/log-anomaly-detector` | 5.9.1 | 3.11 | cpu-basic | RUNNING |
57
+ | `WolfDavid/vision-edge` | 5.9.1 | 3.11 | cpu-basic | SLEEPING |
58
+ | `WolfDavid/nllb-translator` | 5.9.1 | 3.11 | cpu-basic | SLEEPING |
59
+ | `WolfDavid/blip-captioner` | 5.9.1 | 3.11 | cpu-basic | SLEEPING |
60
+
61
+ - `WolfDavid/dino` runs `sdk_version: 6.9.0`, so Gradio 6 is proven to work on this account.
62
+ - Note for anyone re-running this check: **`runtime.hardware.current` is `null` for every SLEEPING
63
+ Space.** `current` reports what is running right now, not what the Space is entitled to. Read
64
+ `runtime.hardware.requested` when auditing hardware tiers, or six of these eight Spaces look
65
+ unallocated.
66
+ - Note also that `GET /api/spaces?author=WolfDavid` still returned only the original 8 shortly after
67
+ creation; the list endpoint lags. `GET /api/spaces/WolfDavid/japanese-learning-avatar` returns the
68
+ new Space immediately and is the authoritative read.
69
+
70
+ ## Why `hardware.current` is null, and why that is correct
71
+
72
+ ```
73
+ "runtime": { "stage": "NO_APP_FILE",
74
+ "hardware": { "current": null, "requested": "zero-a10g" },
75
+ "gcTimeout": 172800 }
76
+ ```
77
+
78
+ The Space repo contains only `.gitattributes` and an auto-generated `README.md`. With no `app.py`
79
+ there is nothing to schedule, so no hardware is attached. **This is the correct pre-deploy state and
80
+ is not a failure.** `requested: zero-a10g` is the binding fact β€” it is the tier the Space will start
81
+ on the moment plan 01-05 pushes an app.
82
+
83
+ Reachability today, measured three times consecutively with identical results:
84
+
85
+ | URL | HTTP | Meaning |
86
+ |---|---|---|
87
+ | https://huggingface.co/spaces/WolfDavid/japanese-learning-avatar | **200** | The Space exists and is public |
88
+ | https://wolfdavid-japanese-learning-avatar.hf.space | **503** | `Your space is in error, check its status on hf.co` β€” no `app.py` yet |
89
+
90
+ The direct subdomain **is** provisioned (`runtime.domains[0].stage: READY`, `subdomain:
91
+ wolfdavid-japanese-learning-avatar`), it simply has nothing to serve. **Plan 01-05 turns this 503
92
+ into a 200**, and `tests/e2e/test_avatar_loop.py::test_space_reachable` β€” which plan 01-05 creates β€”
93
+ is what actually satisfies DPLY-01. DPLY-01 is **not** satisfied by this plan.
94
+
95
+ ## Open handoff to plan 01-05 (which owns `README.md`)
96
+
97
+ Space creation auto-generated a `README.md` whose front-matter **conflicts with the pinned stack**:
98
+
99
+ | Key | Auto-generated value | Required value | Source of the requirement |
100
+ |---|---|---|---|
101
+ | `sdk_version` | `6.26.0` | `6.22.0` | `requirements.txt` line 1 pins `gradio==6.22.0`; `CLAUDE.md` says pin exactly |
102
+ | `python_version` | `'3.12'` | `3.12.12` | ZeroGPU provides only 3.10.13 and 3.12.12; `.python-version` is `3.12.12` |
103
+
104
+ Left uncorrected, the Space SDK would install Gradio 6.26.0 while `requirements.txt` asks for
105
+ 6.22.0 β€” the exact "unpinned sdk_version floats you into a breaking release" failure `CLAUDE.md`
106
+ warns about, arrived at from the other direction. This plan does **not** edit `README.md`; that file
107
+ belongs to plan 01-05.
108
+
109
+ ## Why not the alternatives
110
+
111
+ - **`cpu-basic` (free)** β€” no longer available. Attempting it returned **HTTP 402 Payment Required**
112
+ (quoted verbatim above). This option is closed, not merely discouraged.
113
+ - **`sdk: static`** β€” free for everyone, but VOICEVOX cannot run in a browser, so there would be no
114
+ mora timings and AVTR-02 collapses entirely. ZeroGPU is also Gradio-SDK-only, so Phase 3 would
115
+ need a rewrite. Rejected.
116
+ - **PRO ($9/mo)** β€” **not purchased, and not needed**: the free ZeroGPU path worked. PRO does not
117
+ improve the anonymous **visitor's** 2 min/day quota, so it would change nothing about the
118
+ free-tier design that Phase 1 is built around. No payment was made by any step of this plan.
119
+
120
+ ## GPU posture
121
+
122
+ Phase 1 calls **no** GPU function. `DISABLE_GPU=1` is to be set as a Space variable and every future
123
+ GPU entry point must raise when it is set. Proof lives in `tests/test_no_gpu_on_turn_path.py` (static
124
+ AST scan) and a `DISABLE_GPU=1` deployed E2E run.
125
+
126
+ A ZeroGPU Space that never calls `@spaces.GPU` runs its web process on CPU and consumes **zero**
127
+ visitor quota, so taking the ZeroGPU tier costs nothing at runtime in Phase 1. Plan 01-04 already
128
+ established that speech synthesis is CPU-only and AST-verified free of `spaces`/`torch` imports.
129
+
130
+ ## ZeroGPU slot budget
131
+
132
+ **1 of 2 free ZeroGPU slots is now consumed by this Space. 1 slot remains** for the other four
133
+ HF-profile projects. Because `cpu-basic` Gradio creation is 402-gated on this account, that final
134
+ slot is the last free Gradio Space this account can create without PRO β€” spend it deliberately.
135
+
136
+ ## Git remote
137
+
138
+ `git remote add space https://huggingface.co/spaces/WolfDavid/japanese-learning-avatar`
139
+
140
+ Authentication is a cached fine-grained token held by the `hf` CLI (`hf auth whoami` reports
141
+ `WolfDavid`), scoped `repo.write` / `repo.content.read` / `repo.access.read` on the WolfDavid entity.
142
+ The token value is never written to this repository, any commit message, or any log.
143
+
144
+ **No application code has been pushed to this remote.** Deployment is plan 01-05's task and is gated
145
+ behind its own spike verdict.