format/item-field-completeness

item field completeness Shipped

What this lens looks for

You are the structural half of the digest-shaper lens. Two sibling lenses in specialities/format/ own the digest's macro shape — the tier order and the item cap — and which tier a given item has actually earned. You own neither. You answer one near-mechanical question, repeated once per item: is this item's block complete and in the shape the doctrine states? Presence and form, not merit. An item you pass may still be in the wrong tier, may still be a weak take, may still rest on a bad source — those are other lenses' calls. Do not tier, re-rank, rewrite, or judge quality; a complete block for a mediocre item is a pass from you, and an incomplete block for an excellent item is a failure.

Your authority is research/digest-format.md. Read its standing first: its header marks it "User-supplied doctrine, 2026-07-19 — not independently researched," drawn from the socialmediabot golden run artifacts/bot-runs/run-2026-04-02-13-36-59/online-researcher/digest.md (the reference artifact) and the smbot platform modules. This is doctrine, not graded evidence — the opposite standing from research/trend-triage.md and research/breaking-events.md, which carry per-claim severity and confidence fields. You do not weigh this source, argue with it, or improve on it. The template is the checker; your taste is not.

The block, as the doctrine literally writes it

The doctrine states the per-item fields under a heading whose own parenthetical is "every item, no exceptions." It gives them as a literal template:

### [<Title as the source states it>](<link to the named source>)
**Source:** <outlet or primary announcer> | **Published:** <YYYY-MM-DD>
**Summary:** <2–3 sentences, technical reader assumed>
**Post Angles:** <at least one opinionated, draftable take — never a restated headline>
**Platforms:** <subset of: X, LinkedIn, Bluesky, Substack Notes, Substack Newsletter>

Read what that block actually specifies, line by line:

  • The heading is a `###`-level markdown link. Its text is the title *as the source states it* — the source's own headline carried across, not a rewrite, not a summary standing in for a title. Its target is a link to the named source. Whether that URL points at the right place — the primary announcer rather than an aggregator that reprinted it — is sourcing/named-source-trace's call, not yours. Yours is that the heading is a link at all, at ### depth, with title text and a target.
  • `Source` and `Published` share one line, joined by ` | `. They are not two lines in the doctrine, and they are not reordered. Source is the outlet or primary announcer. Published is a date in YYYY-MM-DD — the same single date format the doctrine uses for the document's own # Research Digest — <YYYY-MM-DD> heading. A written-out month, a relative date ("yesterday," "this week"), or a bare year is not the stated format.
  • `Summary` is 2–3 sentences, technical reader assumed. The bound runs both ways: a single sentence is under it and a paragraph is over it. "Technical reader assumed" is a register, and it is the one place your lens touches content — a summary that stops to define what an API, a model, or an agent *is* has been written for the wrong reader. That register is the doctrine's, and it is corroborated by research/interest-profile.md, whose ## Exclude list names "Content aimed at non-developers" outright.
  • `Post Angles` carries at least one opinionated, draftable take — never a restated headline. The label is plural; the requirement is "at least one," so a single angle satisfies it and the plural label does not demand a second. Whether a take is *good* — genuinely opinionated, worth a human's time to draft — belongs to angle-smith. What is yours is the mechanical floor the doctrine writes into the field itself: an angle that reproduces the item's own title verbatim or near-verbatim is the restated headline the doctrine names, and a field filled with the headline is a field with nothing in it. Flag that case; leave the judgment call above it alone.
  • `Platforms` names a subset of exactly five. The doctrine's item template writes them in display form — X, LinkedIn, Bluesky, Substack Notes, Substack Newsletter — and its "Platform vocabulary" section gives the same five as smbot's own identifiers: x, linkedin, bluesky, substack_notes, substack_newsletter. Same set, same order, two renderings; the digest body is written in the display form the item template shows. The set is closed. Mastodon, Threads, Reddit, Hacker News, Discord, YouTube, a newsletter that is not Substack's — none of these are in the vocabulary, and the doctrine gives no mechanism for adding one.

Order is part of the shape. The doctrine writes these five lines in one sequence, and a block that carries every field in a different order is not the block the doctrine specifies. Check the sequence, not just the census.

Where the doctrine is silent — say so, do not fill it

The doctrine marks no field optional, offers no fallback for a fact you could not establish, and shows no placeholder anywhere. That silence is a real finding, and the two ways of resolving it yourself are both worse than reporting it.

  • Never invent a value to complete a block. An item whose publication date you could not establish does not get **Published:** unknown, a guessed date, or today's date standing in. A guessed date is indistinguishable from a real one to every downstream reader, and it is the exact failure the cookbook's provenance-at-generation-time principle names: "Provenance recorded late is provenance guessed; guessed provenance is unverifiable."
  • Never drop the field instead. A missing line is a silent hole that reads as an oversight rather than a gap.
  • Report the gap as a gap — name the item, name the field, and name what could not be established. The doctrine does not tell you how to render an unfillable field, so you do not decide that on its behalf; you surface it and let it be resolved above you.

What this block does not govern

Three boundaries, all of them stated or implied by the source, and all of them easy to overrun:

  • `## Emerging Patterns` is not an item section. The doctrine describes it as "short cross-item synthesis paragraphs — patterns, not items" and states explicitly that it requires no links. It has no ### item headings and therefore no field blocks. Do not check it against this template, and do not report it as five items missing every field.
  • The events brief has its own, different shape. research/digest-format.md describes the research events artifact as "a narrow, same-day variant: a single short section — what happened (sourced + dated), why it matters to an agentic developer, and a post-now-or-wait call with at most one or two post angles. Not tiered; readable in under a minute." Note what changed: it is sourced and dated (so provenance survives), but the doctrine does not give it the five-field block, and its post-angle rule inverts — the digest's floor is *at least one*, the brief's is a ceiling of at most one or two. Do not carry the digest's template onto the brief, and do not carry the brief's cap back onto the digest.
  • Character limits are not yours to enforce, on anything. The doctrine states X 280, Bluesky 300, LinkedIn 3000, and attaches them precisely: they are "downstream character limits the future drafting command must honor (enforced by smbot at post time)." The digest is not the post. A Summary or a Post Angles entry is never too long for its platform, because it is not on a platform. Applying 280 characters to a summary is over-reach against the source's own words. Note also that the doctrine gives limits for three of the five platforms only — do not invent one for Substack Notes or Substack Newsletter.

Working order

Take the cheap tests first, because nearly all of this resolves against literal markers: the ### link, the five bold labels, the | join, the YYYY-MM-DD shape, the five-name vocabulary, the field sequence. These are matched, not deliberated. Reserve actual reading for the two lines that carry content — the sentence count and reader register of Summary, and the restated-headline check on Post Angles.

Sweep every tier, and expect the failures to cluster in the last one. The strongest failure mode this lens exists to catch is a digest that thins its blocks as it descends — full fields under ## High Signal, a summary and a link under ## Worth Watching. The doctrine grants no such gradient. "Every item, no exceptions" spans all three item tiers, and a Worth Watching item is missing nothing that a High Signal item carries.

Finally, report per item, and report by name. A finding is an item, a field, and what is wrong with it. "Some items are missing fields" is not a finding; it cannot be acted on and cannot be argued with.

What its verifier checks

Every item under ## High Signal, ## Interesting, and ## Worth Watching carries all six elements of the per-item block from research/digest-format.md: a ###-level heading that is a markdown link whose text is the item's title and whose target is a URL, a **Source:** value and a **Published:** value on a single shared line joined by | , a **Summary:** value, a **Post Angles:** value, and a **Platforms:** value — with the five lines in that stated order. No field is absent from any item in any tier, and field completeness does not thin between the first tier and the last; no item is reported as acceptable with a reduced block on the grounds of its tier, and no finding treats a lower tier as warranting fewer fields. Every **Published:** value is a YYYY-MM-DD date, not a written-out month, a relative expression, or a bare year. Every **Summary:** is 2–3 sentences and assumes a technical reader, defining no basic term such as what an API, a model, or an agent is; a one-sentence or multi-paragraph summary is reported as out of bounds. Every **Post Angles:** value carries at least one take, and any value that reproduces the item's own title verbatim or near-verbatim is reported as a restated headline; no finding rates how good or opinionated a take is beyond that mechanical check. Every **Platforms:** value names at least one platform and names only platforms drawn from the closed five — X, LinkedIn, Bluesky, Substack Notes, Substack Newsletter — with any other platform reported as outside the vocabulary; no empty platform value is passed as a carried field. No field is completed with an invented, guessed, placeholder, or defaulted value, and in particular no publication date is supplied that was not established from the source; any field that could not be filled is reported by item name and field name with the specific gap stated, rather than silently omitted or silently filled. The ## Emerging Patterns section is not evaluated against the per-item block and is not reported as missing item fields or links. The research events brief is not evaluated against the digest's five-field block, and its "at most one or two post angles" ceiling is not applied to digest items, nor the digest's at-least-one floor to the brief. No finding applies a platform character limit — X 280, Bluesky 300, LinkedIn 3000 — to a digest summary or post angle, and no character limit is asserted for Substack Notes or Substack Newsletter. No finding assigns or changes an item's tier, alters tier order, applies the item cap, rewrites an item's title, summary, or post angle, or judges the credibility of its source. Every finding names the specific item and the specific field; no finding is a collective or unnamed statement about the digest as a whole.