Skip to content

#29 co-core 0.32.0: XML and feed extractors, refusals as goldens - #51

Merged
gregoryfoster merged 11 commits into
mainfrom
29-co-core-0.32.0
Oct 12, 2026
Merged

gregoryfoster merged 11 commits into
mainfrom
29-co-core-0.32.0

Conversation

@gregoryfoster

@gregoryfoster gregoryfoster commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Refs #29. (Refs, not Closes: Watcher's acknowledgement on watcher#366, the deploy and the live gate come after the merge.)

Plan: docs/plans/2026-10-12-29-co-core-0.32.0.md. It was reviewed before implementation, and every proposed case was run through 0.32.0's chain.

What changes

  • The pin moves 0.19.7 → 0.32.0. This is the catch-up jump, carrying cannobserv#523. processor_version becomes 0.32.0+1; LOCAL_GENERATION stays 1 (ask 2). The lock moves only co-core, co-core-aio and co-core-sync: no dependency of theirs changes.
  • No change to the code that runs, except a docstring. The four XML essences now dispatch to XmlExtractor. A spec co-core can't honour raises UnsupportedExtractionError. That error propagates, the child reports it raised, and the handler publishes extraction_error, terminal (spec §4).
  • Refusals are goldens. gen_parity_goldens.py records a refused case as {"refused": "UnsupportedExtractionError"}. It catches that error alone: a parse failure, which is a plain ValueError, still names its case and writes nothing.
  • 16 new cases:
    • RSS: co-core's trimmed Tailscale feed, verbatim, under text/xml and under application/rss+xml;
    • an Atom feed, a feed with no items (empty), a generic XML document, and an xpath on XML;
    • 10 refusals, covering both layers that refuse: extraction_config_from_spec and each extractor.
  • Docs: the spec (with an amendment entry), AGENTS.md, and DEPLOYMENT.md's bump procedure.

The catch-up reading (0.19.7 → 0.32.0)

I checked these with git diff between the tags, not only the CHANGELOG:

  • Unchanged: the bus (streams.py changed in comments only), the stores, canonical_text, spec_fingerprint, and the content.process / content.derived models (a changes.py docstring aside).
  • No security fixes are recorded anywhere in the range.
  • The contract change is resolve_dispatch_essence: .xml, .rss and .atom now map to the XML essences. Processor never re-resolves the essence, so whichever side moves first, a URL like that behind an ambiguous header stays on the HTML path, as it is today. Coordination is on watcher#366.

Bump note

Regenerated co-core-direct on 0.32.0: 16 moved, all added. None of the 13 existing goldens moved.

feed_atom, feed_no_items, feed_rss, feed_rss_rss_essence, xml_document, xml_xpath: added
refused_css_on_csv, refused_css_on_pdf, refused_css_on_xml, refused_empty_xpath,
refused_invalid_xpath, refused_jsonpath, refused_regex, refused_unknown_algorithm,
refused_xpath_on_csv, refused_xpath_on_html: added
  • feed_rss = sha256:78e284978faf41fbe8ccd8dc06e6d2803d9788097fca633486dfbbbdc024be09. That is co-core's hand-pinned digest for the same fixture, and a test now holds it.
  • The real corpus passes unchanged, 9/9 (all text/html + css).
  • The whole corpus runs through the child under required containment (Landlock ABI 6): the XML extractor stays inside the allowlist, and every refusal comes back raised.

Verification

  • uv run pytest: 650 passed, 14 skipped. Every skip is a secret that isn't readable here.
  • uv run pytest -m integration: 56 passed.
  • ruff check, ruff format --check and uv lock --locked are clean.

Review

Two rounds of review, with each fix in its own CR N commit:

  • Round 1: CR 1, 2 and 6 correct the spec. CR 3 adds a pin test that holds build_wheelhouse.sh's default tag to the pin. CR 4 adds a test that the generator lists a case moving between a digest and a refusal (cannobserv#557 will move one). CR 5 names each layer's refusals in the coverage test, instead of counting them.
  • Round 2: CR 9 names the default tag in the pin test's docstring.

Watcher coordination

Posted on watcher#366: the notice, with the new processor_version, the bump note and why either order is safe, and a correction: xpath on PDF / CSV is refused too.

After merge

  1. Deploy once Watcher acknowledges on watcher#366, or once the operator rules that the acknowledgement isn't needed.
  2. Run scripts/deploy.sh.
  3. Live-spec gate. The journal doesn't record specs, but the same 4 info sources have run since 2026-10-05, with 204 of 204 commands complete. The first command from each must complete, and no extraction_error may carry UnsupportedExtractionError. If either fails, roll back.

🤖 Generated with Claude Code

gregoryfoster and others added 4 commits October 12, 2026 17:40
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pin moves 0.19.7 → 0.32.0 (processor_version 0.32.0+1; LOCAL_GENERATION
stays 1). The lock moves only co-core, co-core-aio and co-core-sync.

gen_parity_goldens.py records a spec co-core refuses (UnsupportedExtractionError,
cannobserv#523) as {"refused": ...}; any other raise still names its case.

Bump note, regenerated co-core-direct on 0.32.0: 16 moved, all added; none of
the 13 existing goldens moved.
  feed_atom, feed_no_items, feed_rss, feed_rss_rss_essence, xml_document,
  xml_xpath: added
  refused_css_on_csv, refused_css_on_pdf, refused_css_on_xml,
  refused_empty_xpath, refused_invalid_xpath, refused_jsonpath, refused_regex,
  refused_unknown_algorithm, refused_xpath_on_csv, refused_xpath_on_html: added
feed_rss is co-core's own pinned digest (sha256:78e28497…). The real corpus
passes unchanged, 9/9.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the bump procedure

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gregoryfoster and others added 7 commits October 12, 2026 18:10
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ump note

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ogress

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t tag

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant