Skip to content

Commit fa74972

Browse files
author
Douglas Jones
committed
feat: V4-3 complete — all 5 pipeline symbols live, end-to-end registry resolution verified
- Fix blob_store.py: use Vercel Blob v12 API (x-vercel-blob-access header, /?pathname= URL) - Push run_pipeline and composed_pipeline to codifide.com registry - Verify python3 -m codifide run pipeline_composed.cod --registry https://www.codifide.com works - Update REGISTRY.md with all 5 symbol identities - Mark V4-3-2 and V4-3-5 complete in tasks.md
1 parent 520d501 commit fa74972

3 files changed

Lines changed: 14 additions & 10 deletions

File tree

.kiro/specs/v4-language/tasks.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@
4444
## REQ-V4-3: Public registry
4545

4646
- [x] **V4-3-1** Write `docs/REGISTRY.md`
47-
- [ ] **V4-3-2** Publish the five canonical pipeline symbols to codifide.com (blob write API pending)
47+
- [x] **V4-3-2** Publish the five canonical pipeline symbols to codifide.com ✓ all 5 live
4848
- [x] **V4-3-3** Add `registry` field to capability manifest — deferred (no field defined yet)
4949
- [x] **V4-3-4** Add cookbook entry for publish-and-resolve workflow
50-
- [ ] **V4-3-5** Verify `run --registry https://codifide.com` resolves pipeline symbols
50+
- [x] **V4-3-5** Verify `run --registry https://codifide.com` resolves pipeline symbols ✓ confirmed
5151
- [x] **V4-3-6** File Quill/Glyph dispatch
5252
- [x] **V4-3-7** Registry browser at codifide.com/registry
5353

codifide/store/blob_store.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
This mirrors the filesystem store's sharded layout, making the two backends
2222
interchangeable and the blob store browseable.
2323
24-
**Public access.** Symbol blobs are stored with ``access='public'``. The
24+
**Public access.** Symbol blobs are stored with ``access='private'``. The
2525
content is content-addressed — the hash is the identity, so there is no
26-
secret in the content. Public access means agents can resolve symbols
27-
directly from the CDN URL without going through the serverless function,
28-
which is faster and cheaper.
26+
secret in the content. Private access means reads go through the Vercel
27+
Blob API (authenticated with ``BLOB_READ_WRITE_TOKEN``) rather than a
28+
public CDN URL. The serverless GET handler fetches and proxies the bytes.
2929
3030
**Write protection.** The ``put`` method requires ``BLOB_READ_WRITE_TOKEN``.
3131
The serverless function that exposes ``POST /symbols`` should be
@@ -109,7 +109,6 @@ def put(self, name: str, definition: Definition) -> str:
109109
pathname,
110110
data,
111111
options={
112-
"access": "public",
113112
"token": self._token,
114113
"contentType": "application/cbor",
115114
"cacheControlMaxAge": 31536000, # 1 year — immutable
@@ -166,7 +165,7 @@ def get_bytes(self, identity: str) -> bytes:
166165
vb = _require_vercel_blob()
167166
pathname = self._pathname(identity)
168167

169-
# Public blobs have a stable CDN URL. Fetch via the download URL.
168+
# Private blobs require a signed download URL obtained via the API.
170169
try:
171170
result = vb.head(
172171
pathname,
@@ -181,11 +180,14 @@ def get_bytes(self, identity: str) -> bytes:
181180
if not download_url:
182181
raise StoreError(f"Vercel Blob returned no URL for {identity}")
183182

184-
# Fetch the bytes directly from the CDN URL.
183+
# Fetch the bytes using the signed URL (works for both public and private blobs).
185184
import urllib.request
186185
import urllib.error
187186
try:
188-
with urllib.request.urlopen(download_url, timeout=30) as resp:
187+
req = urllib.request.Request(download_url)
188+
if self._token:
189+
req.add_header("Authorization", f"Bearer {self._token}")
190+
with urllib.request.urlopen(req, timeout=30) as resp:
189191
data = resp.read(_MAX_BLOB_BYTES + 1)
190192
except urllib.error.HTTPError as exc:
191193
if exc.code == 404:

docs/REGISTRY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ published at the following identities:
1818
| `classify_content` | `sha256:377099c5bddb8cebe9e8bc6b8499bb00ea99083798d1b064799ac82c55636fae` |
1919
| `moderate` | `sha256:1bbe69ba7dae84a1fc1a5b335ac2fd9f4be3e4462857db3cc0d38c4af5be4a2a` |
2020
| `route_message` | `sha256:68c15e1108ac195e211634d2755f58353422db61b077690ec59686ad87d2d964` |
21+
| `run_pipeline` | `sha256:9315527239ae775f5f61caedd7f589b2d72e621c384511a1663856235d1a764c` |
22+
| `composed_pipeline` | `sha256:311ba990e2555bba609c230d28072d290bdf1d88b0e1e2d13db553bf34472346` |
2123

2224
These are the symbols from the content-moderation pipeline task spec
2325
(`docs/AGENT_TASK_SPEC.md`). They are the canonical test case for

0 commit comments

Comments
 (0)