JuliusBrussee/caveman · error · CatalogError
{label}: unreviewed sync proposal marker on line(s) {', '.jo
Error message
{label}: unreviewed sync proposal marker on line(s) {', '.join(str(number) for number in offending)}: the proposal bumped verified_at, so merging with the marker intact attests a price check nobody performed -- confirm each row against its sources, then delete the {REVIEW_MARKER!r} line What it means
Raised by check_review_markers(), which scans the RAW text of catalog/current.yaml for lines starting with '# proposed-by:' (REVIEW_MARKER). scripts/catalog_sync_modelsdev.py writes that marker on every row it touched when proposing price changes; because YAML comments are invisible to the parsed rows, only a raw-text scan can enforce that a human confirmed the proposal. Merging with the marker intact would let verified_at (price provenance attested by signed receipts) advance on work nobody performed.
Source
Thrown at shared/provider-catalog/validate_catalog.py:183
if verified_at < now - timedelta(days=120):
raise CatalogError(f"{label}: verified_at is older than 120 days")
return identity[0], identity[1], identity[2]
def check_review_markers(text: str, label: str) -> None:
"""Refuse a catalog that still carries an unreviewed sync proposal.
YAML comments are invisible to the parsed rows, so this reads the raw file:
a rubber-stamped merge must not be able to advance price provenance while
the line saying "nobody has confirmed this yet" is still in the file.
"""
offending = [
index + 1
for index, line in enumerate(text.splitlines())
if line.lstrip().startswith(REVIEW_MARKER)
]
if offending:
raise CatalogError(
f"{label}: unreviewed sync proposal marker on line(s) "
f"{', '.join(str(number) for number in offending)}: the proposal bumped "
"verified_at, so merging with the marker intact attests a price check "
"nobody performed -- confirm each row against its sources, then delete "
f"the {REVIEW_MARKER!r} line"
)
def pricing_identity(row: dict[str, Any]) -> dict[str, Any]:
"""The part of a row the immutable dated snapshot pins.
Present-with-a-value and absent are different attestations, so only the
price-affecting capability keys the row actually carries are recorded:
adding one to a row that had none changes that row's price and must break
the pin exactly like editing one that was already there.
"""
identity = {key: row.get(key) for key in PRICING_IDENTITY_KEYS}
capabilities = row.get("capabilities") or {}View on GitHub (pinned to 27d5a3981a)
Solutions
- Open catalog/current.yaml, go to the listed line numbers, and confirm each marked row's pricing against its `sources` URLs on the vendor's own pricing page.
- Delete the '# proposed-by: ...' comment line(s) — that deletion IS the review attestation the validator waits for.
- If any proposed number is wrong, correct it (and mint the correct dated snapshot) rather than just deleting the marker.
- Re-run validate_catalog.py; also ensure any new verified_at date has a matching catalog/<date>.yaml snapshot or you will hit the snapshot-pin error next.
Example fix
# current.yaml (before) - provider: anthropic model: claude-* # proposed-by: catalog_sync_modelsdev.py 2026-08-14 verified_at: "2026-08-14T00:00:00Z" # after — reviewer confirmed prices, marker deleted - provider: anthropic model: claude-* verified_at: "2026-08-14T00:00:00Z"
Defensive patterns
Strategy: validation
Validate before calling
REVIEW_MARKER = "# proposed-by:"
def has_unreviewed_markers(yaml_text: str) -> list[int]:
return [i + 1 for i, line in enumerate(yaml_text.splitlines())
if line.lstrip().startswith(REVIEW_MARKER)] Try / catch
try:
validate_catalog()
except CatalogError as e:
if "unreviewed sync proposal" in str(e):
# open the named lines, confirm rows against sources, delete markers
request_human_review(e)
raise Prevention
- Treat '# proposed-by:' lines as merge blockers in review checklists — deleting one is the attestation.
- Never merge a branch from catalog_sync_modelsdev.py without a human confirming each marked row.
- Configure CI to run the validator so marker-bearing merges fail automatically.
When it happens
Trigger: validate_catalog() runs while current.yaml still contains any line whose stripped form starts with '# proposed-by:' — i.e. a sync proposal was merged (or left in the working tree) without a reviewer deleting the marker lines. Line numbers of every offending marker are included in the message.
Common situations: An automated modelsdev sync PR is rubber-stamped merged; a developer runs the sync script locally to preview changes and then commits the file; a merge conflict resolution keeps the proposed block including its comment.
Related errors
- {label}: verified_at is in the future
- {label}: verified_at is older than 120 days
- {label}: pricing changed without a new verified_at snapshot
- {label}: dropped or replaced a source from its immutable sna
- caveman agent: value is not canonically serializable
AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15).
Data as JSON: /api/errors/75bf73f354694047.
Report an issue: GitHub.