chore(scope): rename @zksoju → @0xhoneyjar#5
Conversation
…dual-env workspace
Phase-0 substrate for composable-sticker-substrate-2026-05-01 cycle.
T-1 (bd-rpua · jsdom config + vitest workspace dual-env):
- Add jsdom@^24 + vitest@^2.1 at root devDeps
- vitest.workspace.ts defines node + jsdom projects (same tests/, dual env)
- Root scripts: test + test:watch
- Honors SDD §7.1 (strict-universal verification: same test files run under both
node and jsdom envs to enforce no DOM / no Node-only imports in core)
T-2 (bd-3eyo · package skeleton):
- packages/stickers/{package.json, tsconfig.json, src/index.ts stub, README.md}
- workspace deps: @freeside-storage/client (workspace:*) + @freeside-storage/protocol
(workspace:*) + effect@^3.10
- pnpm-workspace.yaml extended to include packages/stickers
- README.md describes Schema → Service → Compositor pyramid +
universality discipline + composition with shipped @freeside-storage/client v0.1.0
Typecheck clean. pnpm install OK. Schema authoring (T-3 · sealed StickerProfile
+ branded primitives + StickerLookupResult discriminated union) lands in next
/run-resume cycle.
Source: grimoires/loa/sdd-composable-sticker-substrate-2026-05-01.md §7.1 · §8.1
PRD decisions ratified: D-1 placement A · D-4 Phase-3 deferred indefinitely
Vault session: [[2026-05-01-midi-foundation-kickoff]]
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sprint-1 of composable-sticker-substrate-2026-05-01 cycle. Implements @freeside-storage/stickers sub-package per architect's design + dual-env test infrastructure. Phase-0 (Schema substrate): - src/profile.ts — sealed StickerProfile Effect Schema with branded primitives (ExpressionId, VariantId, LifecyclePhase) + closed enums (StickerWorld, DaemonState, FallbackStrategy) + Schema.optional daemon-stage axes for V0.7+ forward-compat - src/service.ts — StickerService Context tag + StickerProfileDecodeError Data.TaggedError + StickerServiceLive Phase-0 placeholder Layer - src/lookup.ts — composition skeleton (lookupGrail + manifest fetch + Schema.decodeUnknown chain) — Phase-1 dead code per SDD §10.3 A-3 - src/adapter.ts — synthesizeStickerProfile (LOAD-BEARING) + checkManifestDrift helper (encapsulates synthesize+decode for cross-Effect-version-skew resilience) Phase-0 (Tests · 26 tests · dual-env): - profile.roundtrip.test.ts (7 · encode/decode symmetry · branded primitives · optional axes present + absent · all 4 daemon states) - profile.drift.test.ts (9 · 7 mutations + 1 control + 1 inverse · ≥5 target met) - profile.live-manifest.snapshot.test.ts (3 · 2026-05-01 mibera fixture decodes Right + grail variant + manifestVersion propagation) - profile.adapter.test.ts (7 · synthesizer purity + known-good + grail + skipped + malformed manifest + variant propagation) Per-package vitest configs (vitest.config.ts node + vitest.config.jsdom.ts) satisfy SDD §7.1 dual-env requirement. jsdom@^24.1.0 added to stickers devDeps. vitest.workspace.ts simplified to ASCII. Doctrines: [[contracts-as-bridges]] · [[url-contract-as-bridge]] · [[continuous-metadata-as-daemon-substrate]] · [[migration-tail-as-bug-source]] · [[fallback-shape-divergence]]. Closes beads bd-1c7e (T-3) · bd-3itb (T-4) · bd-3sq9 (T-5) · bd-27r4 (T-6) · bd-1ygz (T-7) · bd-2iaz (T-8 · P0 LOAD-BEARING) parts of epic bd-1mu2. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Addresses Bridgebuilder review feedback on PR #4: - F5 (HIGH confidence 0.9): `String(decoded.left)` for Effect ParseError yields '[object Object]' rather than the structured issue tree. Replaced with `ParseResult.TreeFormatter.formatErrorSync(decoded.left)` so `checkManifestDrift` consumers (Phase-1 dimensions wiring) get a human-readable drift signal instead of an opaque coercion. - F13 (MEDIUM): docstring on `StickerProfile` claimed `additionalProperties: false` is implicit via `Schema.Struct`. Effect's `Schema.Struct` is permissive on extras by default — extras decode through silently. Updated comment to reflect actual behavior: required-field surface is sealed via literal/branded validation; drift is detected via missing/malformed required fields, not via unexpected extras. Adds 2 regression tests in `tests/profile.adapter.test.ts`: - `checkManifestDrift ok=true` returns empty issues string - `checkManifestDrift ok=false` issues is human-readable (not `[object Object]`) and mentions the rejecting field Test count: 26 → 28 (per env). Both node + jsdom matrices green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Operator team perms on @0xHoneyJar npm org sorted 2026-05-02. Migrating the 3 published packages to the canonical org scope. Renamed: - @zksoju/freeside-storage-protocol → @0xhoneyjar/freeside-storage-protocol - @zksoju/freeside-storage-client → @0xhoneyjar/freeside-storage-client - @zksoju/freeside-storage-stickers → @0xhoneyjar/freeside-storage-stickers Files: 9 source/config across protocol + storage-client + stickers + adapters/s3. Cross-references: workspace:* deps + JSDoc + service tag string + vitest config regex. Versions same (0.0.1 / 0.1.0 / 0.0.1) — these are the same packages, just under the canonical org. @zkSoju versions deprecated on npm with redirect message pointing consumers to @0xHoneyJar. Build clean, 28 tests pass dual-env (node + jsdom). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5159257055
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| "@aws-sdk/client-sts": "^3.620.0", | ||
| "@aws-sdk/s3-request-presigner": "^3.620.0", | ||
| "@freeside-storage/protocol": "workspace:*" | ||
| "@0xhoneyjar/freeside-storage-protocol": "workspace:*" |
There was a problem hiding this comment.
Update S3 adapter imports to the new protocol scope
This dependency was switched to @0xhoneyjar/freeside-storage-protocol, but packages/adapters/s3/src/S3Adapter.ts still imports types from @freeside-storage/protocol (line 32 there), so the adapter package will fail module resolution/typecheck once built in this workspace. Because this commit is the rename cutover, leaving the old import path in code creates an immediate build break for packages/adapters/s3.
Useful? React with 👍 / 👎.
| const virtual = synthesizeStickerProfile( | ||
| globalManifest as GlobalManifest, |
There was a problem hiding this comment.
Handle null manifests before profile synthesis
checkManifestDrift accepts unknown input but unconditionally casts and forwards it to synthesizeStickerProfile; if a caller passes null (a valid JSON value for malformed payloads), synthesizeStickerProfile dereferences globalManifest.skippedTokenIds and throws instead of returning a structured { ok: false, issues } drift result. This turns malformed-manifest detection into a runtime exception path for consumers.
Useful? React with 👍 / 👎.
Migrate 3 published packages to canonical org scope. @zkSoju versions deprecated on npm with redirect.
All 3 published to @0xHoneyJar registry already. Consumer (mibera-dimensions) updates in companion PR.
Build clean. 28 tests pass dual-env.