feat(entry): §22.4c unreviewed/reviewed_at/reviewed_by frontmatter fields

This commit is contained in:
Ben Stull
2026-06-03 22:28:11 -07:00
parent dd72f913a3
commit 597f6bc92b
2 changed files with 61 additions and 0 deletions
+19
View File
@@ -50,6 +50,13 @@ class Entry:
# operator credentials per §18 are used. The binding is inert until
# the named user has a funder_consents row (the hybrid two-key rule).
funder: str | None = None
# §22.4c: an `active` entry that landed without a human review gate
# carries unreviewed=True until an owner clears it. Orthogonal to
# `state`; only meaningful for active entries. reviewed_at/reviewed_by
# are the provenance of the clear, paralleling graduated_at/by.
unreviewed: bool = False
reviewed_at: str | None = None
reviewed_by: str | None = None
body: str = ""
@@ -66,6 +73,7 @@ def parse(text: str) -> Entry:
models = [str(m) for m in raw_models]
raw_funder = fm.get("funder")
funder = str(raw_funder).strip() if raw_funder else None
unreviewed = bool(fm.get("unreviewed") or False)
return Entry(
slug=str(fm.get("slug") or ""),
title=str(fm.get("title") or ""),
@@ -81,6 +89,9 @@ def parse(text: str) -> Entry:
tags=list(fm.get("tags") or []),
models=models,
funder=funder,
unreviewed=unreviewed,
reviewed_at=fm.get("reviewed_at") or None,
reviewed_by=fm.get("reviewed_by") or None,
body=body,
)
@@ -110,6 +121,14 @@ def serialize(entry: Entry) -> str:
# second meaning here as with `models:`; one set of semantics.
if entry.funder:
fm["funder"] = entry.funder
# §22.4c: emit unreviewed only when True (a super-draft / reviewed
# active entry leaves the key absent → frontmatter stays minimal).
if entry.unreviewed:
fm["unreviewed"] = True
if entry.reviewed_at:
fm["reviewed_at"] = entry.reviewed_at
if entry.reviewed_by:
fm["reviewed_by"] = entry.reviewed_by
yaml_text = yaml.safe_dump(fm, sort_keys=False, default_flow_style=False).rstrip()
body = entry.body.lstrip("\n")
if body: