Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions docs/specs/2026-09-29-processor-service-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -525,8 +525,9 @@ reclaim re-running (not re-publishing) the extraction.
old extractor on an old Processor, and the new one on a new Processor. Such a
bump is **notice**: it carries that reasoning and the moved digests, which
already show any dispatch change for an essence Watcher sends today. It
becomes coordination again only if Processor starts resolving essences
itself, and `tests/test_pin.py` fails first if it does.
becomes coordination again only if Processor starts calling co-core's
resolvers itself, and `tests/test_pin.py` fails if it does. (Resolving any
other way is Section 3's to forbid, and a co-core bump wouldn't move it.)
- Until watcher#350 (2026-10-10) both sides extracted, so the pin was in
lockstep with Watcher's, and both repos moved together or neither did.

Expand Down
14 changes: 12 additions & 2 deletions tests/test_pin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
co-core-direct and every moved digest in the bump note.

Whether a bump is notice or coordination turns on the contract (§5). Essence
resolution is outside it only because Processor never resolves an essence itself, and
a test holds that premise (processor#57).
resolution is outside it only because Processor never calls co-core's resolvers
(``resolve_dispatch_essence``, ``extension_media_type``), and a test holds that
premise (processor#57).
"""

import ast
Expand Down Expand Up @@ -90,6 +91,15 @@ def test_processor_version_is_co_core_plus_generation() -> None:
("# resolve_dispatch_essence is the issuer's", False),
("from co_core.pure.extract.dispatch import extractor_for_essence", False),
],
ids=[
"from-import",
"from-import-as",
"attribute",
"name",
"docstring",
"comment",
"dispatch-call",
],
)
def test_the_guard_catches_code_not_text(source: str, caught: bool) -> None:
assert bool(_resolver_uses(source)) is caught
Expand Down
Loading