Add a promotion flag driving post listing, robots, and syndication #97
Labels
No labels
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
burndown-2026-06
burndown-2026-08
icebox
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilysiren/website#97
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
Posts are currently dark by design.
src/pages/pages.11tydata.jscomputesrobots: "noindex, nofollow"for every page undersrc/pages/except the resume,/writing/carries the same directive, andsrc/index.njklinks to/writing/from nowhere. All nine posts remain reachable by URL.Kai has selected three posts to promote:
src/pages/posts/stochastic-design-iteration.mdsrc/pages/posts/on-permissions-models-for-cloud-platform-providers.mdsrc/pages/posts/azure-openai-terraform.mdsrc/pages/posts/code-janitor.mdwas considered and explicitly excluded. The remaining five stay dark.Problem
Two things block the syndication work that depends on this.
noindexpage is self-defeating. The remote copy becomes the de facto indexed version and coilysiren.me ranks nowhere.robotsis set ineleventyComputed, which wins over front matter. Addingrobots: follow, indexto a post does nothing. The computed function has to read a different key.Required outcome
One front matter key on a post drives three behaviors, so curation lives in git next to the prose rather than in three separate lists.
src/writing.njkfilterscollections.poststo flagged posts.pages.11tydata.jscomputesfollow, indexfor flagged posts and keepsnoindex, nofollowotherwise.Key naming is the implementer's call. Something like
promoted: truereads clearly and does not collide with the existingtemplate-key,path,date,title,descriptionvocabulary.Acceptance criteria
<meta name="robots" content="follow, index">.code-janitor.md, still rendernoindex, nofollowand keep their current URLs. Nothing 404s./writing/lists exactly the three promoted posts and is itself indexable.follow, indexbehavior.ward exec buildsucceeds andward exec pre-commit-allpasses.Non-goals
/writing/from the homepage. That is tracked separately.Landed in
5e37bb6onmain. CI green on all five jobs, live and verified. Kai reconfirmed the three-post selection today before this was built.promoted: trueon a post now drives its/writing/listing, itsrobots, its sitemap entry, and the allowlist#103will read, from one key in front matter next to the prose.The trap this issue called was real.
robotsis computed inpages.11tydata.jsand beats front matter, so a post cannot opt in by settingrobotsitself. The computed function readsdata.promotedinstead. Anyone who tries the obvious thing first will lose an hour, which is presumably why it was written down.The sitemap needed no change. It derives from each page's own
robotsvalue, so flipping the flag moved three posts into it on its own. Live now:/posts/code-janitor/still servesnoindex, nofollow, and/writing/lists exactly three.Also landed, from
#125items 2 through 5All four were verified against the live site before being touched, and all four are correct under any curation policy, so they were safe to do alongside this.
h1and started ath2. Each now carries exactly one.resume.mdis excluded, because it opens with its own# Kai Sirenand a blanket change would have given that page twoh1elements. The title styling followed the tag, so.post-headernow matchesh1as well ash2.X | Kai Sirenpattern, since posts are the pages most likely to reach someone who does not know the name./writing/entry both emit<time datetime="YYYY-MM-DD">from a newisoDayfilter beside the existing date filters.BlogPostingwithdatePublishedand anauthorpinned to the sameurlthe homepagePersondeclares, so the two resolve as one entity.What this unblocks
#98and#99were both explicitly blocked on this flag and now are not.#99should scope its feed topost.data.promoted, which is the same predicate/writing/filters on.Two notes for whoever takes
#99. Its acceptance says the feed emits absolute URLs onhttps://coilysiren.me, but the canonical host moved towwwin8871872because the apex 301s, so that criterion is stale. And it specifiesward exec build, which is retired here in favour ofjust./writing/itself is stillnoindex, nofollowand unlinked from the homepage. That is#98's call rather than mine, and I left it alone deliberately.Suite
Assertions moved with the policy rather than around it. The suite now asserts the derived curated set, one non-empty
h1and the title pattern on every indexed page, and each post's<time>matching itsBlogPostingdatePublished. Both new invariants were mutation-tested, by un-promoting a post and by reverting theh1, and both fail as they should.just test-quick,just test-e2e-ciandjust pre-commit-allall pass. Eight unit tests, three Cypress specs.Correction: I closed this one criterion short
My previous comment said
/writing/was leftnoindexdeliberately, as#98's call. That was wrong. This issue's acceptance criteria say the writing index "lists exactly the three promoted posts and is itself indexable".#98owns linking it from the homepage, not its robots directive.Fixed in
8ba05ee. CI green on all five jobs, live and verified:The sitemap picked
/writing/up on its own, the same way the promoted posts did, because the derivation reads each page's ownrobots.llms.txtnames it now, since it is part of the public set. The suite's indexed set gains it, which also puts it under the one-h1and title-pattern assertions, and it already satisfied both.Every acceptance criterion in this issue is now met:
follow, indexcode-janitorincluded, still rendernoindex, nofollowat their existing URLs, nothing 404s/writing/lists exactly the three promoted posts and is itself indexablefollow, indexbehaviourjustrather than the retiredward exec#98is unchanged and still owns surfacing this from the homepage. It now has an indexable, correctly-scoped page to link to, which was the end state it was waiting for.