Multi-Venue Publishing Lifecycle and Canonical Ownership
Context and Problem Statement
joelclaw grew up with one obvious public venue: joelclaw.com.
That assumption is now wrong.
The system has multiple public venues with different audiences and product contracts:
joelclaw.comwizardshit.ai- Gremlin reference/operator surfaces
- future venue-specific sites that should not be forced through Joel’s personal site first
The current failure mode is subtle but nasty:
- an operator asks to publish or migrate a piece,
- the system defaults to the joelclaw pipeline because that path is best-developed,
- the piece lands on the wrong venue,
- downstream docs/ADRs start rationalizing the mistake instead of catching it.
Recent evidence made the bug obvious:
- the Wizard Frame / agent cantrips piece was supposed to become a Wizardshit article, not a joelclaw post
- Gremlin ADR-0056 then tried to explain the venue mistake by reclassifying the wrong Wizardshit resource (
/local-ai-jobs-launchd) instead of fixing the publishing policy - venue choice, content shape, deletion policy, and migration semantics were all getting blurred together
That is a control-plane bug, not just a content-model bug.
Decision
1. Venue selection is a first-class publishing decision
Before any public content is drafted, published, migrated, or republished, the system must resolve the intended venue explicitly.
Venue selection is not allowed to hide inside:
- a generic “write article” request
- a convenience fallback to
joelclaw.com - a repo-local default that happens to be implemented first
For public long-form content, the system must know:
- what the thing is (article, tutorial, page, note, etc.)
- where it belongs (joelclaw, Wizardshit, another venue)
These are separate decisions.
2. No implicit default-to-joelclaw publishing for cross-venue content
When venue is ambiguous, the system must stop and resolve it instead of silently publishing to joelclaw.com.
Acceptable resolution paths are:
- explicit operator instruction
- a workflow that already carries durable venue metadata
- a venue-specific command surface
- a structured clarification step
“joelclaw is the easiest path right now” is not a valid routing policy.
3. Each published resource has one canonical public venue at a time
A public resource may be mirrored temporarily during migration or recovery, but steady-state ownership is singular.
This means:
- one canonical public venue per piece at a time
- duplicate hosting across venues is migration debt, not normal operation
- documentation must describe the canonical venue truthfully
4. Migration is an explicit lifecycle, not an accidental duplicate
When a piece moves from one venue to another, the lifecycle is:
- resolve destination venue
- publish or stage in the destination venue
- verify the destination surface
- remove the old venue copy unless the operator explicitly asks for a redirect or a retained migration notice
The default posture is do not keep accidental duplicates alive.
For short-lived mistaken publishes, deletion from the old venue is the normal cleanup path.
5. Venue policy lives in joelclaw operator surfaces, not inside Gremlin content-shape ADRs
Gremlin decides content shape and product semantics. joelclaw decides publishing venue, migration policy, and operator routing.
This means Gremlin ADRs should not be forced to answer:
- which site should own a piece
- whether an old joelclaw URL should redirect or disappear
- whether a cross-site migration should preserve duplicate hosting
Those are joelclaw publishing-control decisions.
6. Operator-facing publish contracts must carry venue metadata
The gateway, CLI, content skills, and any publish orchestration must preserve venue choice as structured data, not just prose in a prompt.
At minimum, publish requests need enough contract to answer:
- target venue
- content kind
- canonical ownership state
- migration vs fresh publish
- old-venue cleanup policy when migration is involved
Implementation Plan
Required skills before implementation
content-publish— current joelclaw publishing pipeline and where it over-assumes joelclaw surfacesjoelclaw-web— joelclaw.com content/runtime behavior and removal rulesgateway— operator-intent routing and clarification pathsadr-skill— ADR grooming and follow-on decision hygienegremlin-wizardshit-publishing— Wizardshit publish boundaries when the target venue iswizardshit.ai
Affected surfaces
SYSTEM.mdandTOOLS.mdtrigger language that currently defaults article intents into joelclaw flowsskills/content-publish/SKILL.mdskills/joelclaw-web/SKILL.md- gateway intent-routing / clarification logic
- operator-facing CLI publish surfaces
- any content workflow that assumes public long-form means
joelclaw.com
Required follow-on slices
-
Intent contract hardening
- add explicit venue selection or venue clarification before public publish flows run
- remove ambiguous prompt shortcuts that silently route to joelclaw
-
Venue-aware operator surfaces
- extend CLI/gateway publish contracts so venue is structured and inspectable
- ensure handoffs and background agents preserve that field
-
Migration lifecycle support
- support explicit “migrate from X to Y” flows with destination verification and old-venue cleanup
- default mistaken short-lived publishes to deletion rather than shadow duplicates
-
Skill and docs cleanup
- update content/publishing skills so they stop promising a universal joelclaw-first route
- document venue-selection rules in the canonical operator docs
Verification
- Ambiguous public-writing intents no longer auto-route to
joelclaw.com - Operator-facing publish commands/workflows preserve venue as structured data
- Migration flows distinguish destination publish from old-venue cleanup
- Content-shape ADRs in Gremlin stop carrying joelclaw venue policy
- A Wizardshit-bound article can be routed without first appearing as joelclaw content
Consequences
Positive
- wrong-venue publishes become harder to trigger accidentally
- content type and venue become separate, inspectable decisions
- migration cleanup stops being improvised after the fact
- Gremlin and joelclaw keep cleaner responsibility boundaries
Tradeoffs
- ambiguous operator asks now need clarification or durable venue metadata
- the simplest joelclaw-only content shortcut becomes less magical
- implementation touches multiple operator surfaces, not just one repo file
Neutral
- this ADR does not decide every future venue in advance
- this ADR does not force redirects as the default migration behavior
- this ADR does not replace venue-specific content models
Alternatives Considered
Alternative 1: Keep joelclaw.com as the implicit default venue
Description: continue routing generic article/publish asks to the joelclaw pipeline unless the operator says otherwise.
Why rejected: this is the bug. Convenience is producing wrong canonical ownership and leaking cleanup debt into downstream ADRs.
Alternative 2: Let each product repo solve venue choice locally
Description: treat venue selection as a repo-specific concern handled ad hoc in Gremlin, joelclaw, or elsewhere.
Why rejected: venue selection is a network-wide operator concern. Local fixes do not prevent the same wrong-default bug from reappearing elsewhere.
Alternative 3: Allow multi-venue duplicate hosting as a normal steady state
Description: let the same piece live on multiple public venues unless someone cleans it up manually.
Why rejected: that destroys canonical ownership, splits metadata responsibility, and makes migration indistinguishable from drift.
References
skills/content-publish/SKILL.mdskills/joelclaw-web/SKILL.md~/.joelclaw/TOOLS.md~/Vault/docs/decisions/0168-convex-canonical-content-lifecycle.md~/Code/badass-courses/gremlin/docs/adr/0057-launchd-tutorial-and-imported-article-boundaries.mdhttps://joelclaw.com/cool/agent-cantrips-zero-cost-primitives-wizard-frame