v1 plan questions — 28 decisions to lock (4 blockers, 10 strong defaults, 14 minors) #3
harshitsinghbhandari
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
A planning worker (session
age-1) brainstormed the v1 implementation and surfaced 28 decisions not pinned down by Discussion #2. The plan can't be finalized until these are answered.Split into:
🚨 Critical finding worth reading first: B1. The spec calls for
@agentlabas the curator handle, butgithub.com/agentlabalready exists as a real organization (AutoML/Linked Data, agentlab.eu, Portugal, 173 repos, created 2012). Because the spec invariant isagentlab.in/<id> ↔ github.com/<id>, using "agentlab" as our curator handle would impersonate that org — exactly the risk the spec calls out forkarpathy. Pick an alternative in B1.The same content is also committed at
docs/v1-plan-questions.mdon branchsession/age-1for reference.How to reply (paste at bottom of this thread):
v1 Plan — Open Product Questions
These decisions came up while brainstorming the v1 implementation plan. They are NOT pinned down by Discussion #2. They are split into:
Total: 28 decisions surfaced.
BLOCKERS — please answer before I write the plan
B1.
@agentlabcurator handle conflicts with a real GitHub orgThe locked spec says distilled posts go under a
@agentlabcurator account. I just checked:github.com/agentlabalready exists as a real organization (AutoML / Linked Data, blogagentlab.eu, Portugal-based, 173 public repos, created 2012). Because our URL rule isagentlab.in/<github-login> ↔ github.com/<github-login>, publishing distilled work under "agentlab" would impersonate that org — the exact risk the spec calls out forkarpathy.How do you want to handle the curator identity?
agentlab-curator,agentlab-distillery,agentlab-editorial). Harshit registers the bot account on GitHub, holds the OAuth credentials, signs in as it to publish.account_aliasestable; the alias is NOT a real GitHub user, has no/<handle>profile page (or has a special non-<username>route like/editorial).I recommend A (cleanest fit with the "username = GitHub login, always" invariant). It does require Harshit to register the bot handle on GitHub before launch.
B2. How do org accounts publish? (e.g.
@anthropicas author)Spec says org accounts are supported. GitHub OAuth logs in a user, not an org. To publish "as Anthropic," we need a way to tie the post's author to an org rather than the signed-in user.
agentlab.in/anthropicas a profile page that exists (auto-created when first viewed, populated from GitHub org data), but only Anthropic members posting under their own handles fill the catalog. Org "ownership" of posts is post-v1.I recommend A for v1 — getting OAuth-only working in 2 weeks already crowds the schedule. Org profile pages can exist (read-only) without org-authored posts.
B3. MDX component allowlist
Spec: "MDX with an allowlist of components we ship (Callouts, embeds, etc.)" — but no concrete list. The allowlist directly drives renderer architecture and what authors can express.
My proposed initial set (please add/remove):
<Callout type="info|tip|warning|danger" /><Embed url="..." /><Figure src="" caption="" alt="" /><Aside /><Detail summary="...">```mermaidfenced blockNOT including (verify): video embeds, custom React, iframes, raw HTML, code sandboxes, polls, audio.
OK to ship with this list? Anything you want to add/remove for launch?
B4.
[[wikilinks]]resolution semanticsThis affects link-storage schema and backlink correctness. The spec says "auto-link
[[Pattern Name]]" but not how to resolve ambiguity.Sub-decisions:
[[Trust Gate]], do we (a) search across ALL posts globally, (b) only within my own posts, (c) only within posts tagged the same, or (d) only within posts of the same type (pattern)?[[Trust Gate]](e.g. one by me, one by another author), what wins? Options: (a) highest like count, (b) most recent, (c) my own posts > others, (d) show as ambiguous "broken-link" until disambiguated with[[Trust Gate|author/post/slug]]syntax.[[Nonexistent Thing]]render as? Options: (a) plain text, (b) a styled "broken wikilink" with hover-state, (c) a "create this post?" CTA (probably v2).My recommendations: (1) global; (2) own > others, then highest like count, then most recent; (3) styled broken-link with no CTA in v1; (4) resolve at save-time, store in
post_linkstable for backlinks, re-resolve when a post is deleted/restored.OK to go with these?
STRONG DEFAULTS — recommend, but please ack or override
S1. Reserved usernames (route collisions)
agentlab.in/<username>must NOT collide with platform routes. Proposed reserved list (case-insensitive, blocked at signup AND if a user with this name attempts to sign in, we show "AgentLab needs to reserve your GitHub handle — please contact support" — vanishingly rare given they'd need to match an existing GitHub login):(Plus we'll add the curator handle from B1 to this list automatically.)
OK?
S2. Sign-up gate enforcement step
GitHub account ≥30 days old AND ≥1 public repo. I'll enforce in NextAuth
signIncallback using the GitHub/userAPI (already in OAuth scope), checked every sign-in attempt (not just the first) so users who get rejected at day-29 can come back at day-30 without manual intervention.Rejection page: friendly message with the exact reason ("Your GitHub account needs to be 30 days old. You're at 27 days — come back on May 31, 2026.") and a "back to homepage" CTA. No appeals form in v1.
OK?
S3. Heat-score formula for "For You" + mixed feed
Pure HN-style decay with a tag-affinity nudge. Hidden constants we can tune later without a schema change. Score computed at read-time over a candidate set (top N by recency + top N by likes, deduped); not stored.
OK?
S4. Tag approval workflow
When an author types a new tag in the editor (autocomplete misses):
is_approved = false, attached to the post./tag/<slug>landing pages, search results, related-posts logic, or the curated tag picker for other authors./admin/tags; can approve, reject (which detaches from post), or merge into an existing tag.OK?
S5. Staging deployment topology
mainbranch → Vercel Production env →agentlab.instagingbranch → Vercel "Preview" pinned alias →staging.agentlab.instaging(soak onstaging.agentlab.in) → fast-forwardmainagentlab-prodandagentlab-staging(separate DBs, separate Storage buckets). Schema migrated to staging first viasupabase db push, manually promoted to prod after soak. Env vars per Vercel env.OK on the topology and the two-Supabase-project decision?
S6. Comments — author edit window, delete, depth
OK?
S7. Bookmarks visibility
/bookmarks(note: this is a reserved path, not a username route).OK?
S8. Notifications
In-app inbox only at
/notifications. Notify on:No email notifications in v1. No web push. Inbox shows unread count badge on the nav.
OK?
S9. Admin tooling
A
/adminroute gated by a hardcoded admin allowlist (env varADMIN_GITHUB_LOGINS=harshitsinghbhandari). Pages:/admin— overview (counts: pending tags, open reports, recent signups)/admin/tags— approve/reject/merge tags/admin/reports— work the report queue/admin/users— search, view, block/unblock/admin/posts— search, soft-deleteAd-hoc DB work still goes through Supabase dashboard. OK?
S10. Post deletion semantics
is_deleted = true). Post page returns 410 Gone with "this post was deleted by the author." Comments, likes, bookmarks remain in DB but the post is removed from feeds, profile, tag pages, search, and backlinks. Counts on the author's profile reflect non-deleted posts only.OK?
MINOR DEFAULTS — proceeding with these unless you object
(One-liners. These shape the plan but aren't worth a meeting.)
body_mdANDbody_html. Re-render on edit. Fast reads, no client compute, no XSS surface from per-request rendering.rehype-sanitizewith a schema matching the MDX allowlist. Run after MDX compile, before storingbody_html.-2. Slug is immutable after first publish; title changes don't change slug./Harshit...→/harshit...(301).post_versions, capped at last 20 versions per post; older versions GC'd. Public surface: just an "edited 2 days ago" timestamp linking to nothing (no version browser in v1).posts.view_countcolumn, throttled to 1 per (post, viewer-fingerprint) per 24h. Fingerprint = signed-in user ID or hashed IP+UA for anonymous. View count visible only to author.covers/bucket. URL embeds passed through as-is.github_repos_cache (user_id, fetched_at, repos jsonb)— refresh on profile-page view if stale (>24h) AND on sign-in. Top 6 repos by stars surfaced on profile.agentlab.draft.newfor un-published drafts;agentlab.draft.edit.<postId>for edits. JSON{ title, body, type, tags, summary, savedAt, schemaVersion }. Auto-save every 30s. On editor open, if a draft exists, prompt "restore unsaved changes? (y/n)." For edits, if serverupdated_at > savedAt, warn "this post was edited elsewhere — discard your local draft?"/rss.xml), per-author (/<username>/rss.xml), per-tag (/tag/<slug>/rss.xml). Latest 20 items each. Cached via Next.js ISR (revalidate 5 min)./sitemap.xmlindex pointing tositemap-posts.xml,sitemap-users.xml,sitemap-tags.xml. Generated via ISR (revalidate 1 hour).How to respond
Easiest format:
Once I have these, I write
docs/v1-plan.mdand commit.All reactions