Skip to content

feat(sources): admit Claude Workflow artifacts through OriginSpec#3088

Merged
Sinity merged 2 commits into
masterfrom
feature/sources/claude-workflow-admission
Jul 18, 2026
Merged

feat(sources): admit Claude Workflow artifacts through OriginSpec#3088
Sinity merged 2 commits into
masterfrom
feature/sources/claude-workflow-admission

Conversation

@Sinity

@Sinity Sinity commented Jul 18, 2026

Copy link
Copy Markdown
Owner

Summary

Admits all six Claude Code Workflow artifact families (coordinator session streams, run-state snapshots, mutable journals, attempt transcripts, attempt metadata sidecars, adopt manifests) through the existing OriginSpec contract, with raw-revision retention in source.db and an atomic claude-workflow:* work-evidence materialization pass.

Problem

polylogue-2qx.2 (mandate-critical): Workflow artifacts produced by Claude Code orchestration were watched but not admitted — no OriginSpec classification, no retention of journal revisions, no evidence graphs. Ref polylogue-2qx.2.

Solution

External GPT-Pro delivery mandate-01-claude-workflow-admission-r01, applied verbatim at its declared authority snapshot bf8191b3f, then rebase-integrated onto current master by the coordinator:

  • Commit 1: the delivery as authored (OriginSpec rules + watcher suffixes, parser/orchestration, claude_workflow_evidence/claude_workflow_materializer, convergence stage, synthetic wf_54d4fb2e-841 corpus integration test), topology regenerated.
  • Commit 2: integration fixes for post-snapshot master drift — typed ParseBatchObservation workflow keys (nested summary, no untyped ** expansion), IngestDiagnostics annotation, walk-tuple unpacking, Literal association_state, warning log on artifact parse fallback (degrade-loudly gate).

Verification

  • devtools test tests/unit/insights/test_claude_workflow_evidence.py tests/unit/sources/test_live_watcher.py tests/unit/sources/test_origin_specs.py tests/integration/test_claude_workflow_admission.py91 passed (real devshell, no shims — the delivery's own env used import shims).
  • devtools verify --quick — all steps ok (format, lint, mypy --strict, render-all check, topology, layering, degrade-loudly).

Delivery custody: .agent/handoffs/external-agent-campaigns/2026-07-17-gpt-pro-wave-2/results/mandate-01/r01/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01QUsH3Rhq6oAZpYPWcsZqnZ

Sinity and others added 2 commits July 18, 2026 14:23
External GPT-Pro delivery mandate-01 (2qx.2), applied verbatim at its
declared authority snapshot bf8191b before rebase.

Ref polylogue-2qx.2

Co-Authored-By: GPT-Pro external agent <noreply@openai.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUsH3Rhq6oAZpYPWcsZqnZ
Rebase-integration fixes for the mandate-01 delivery against moved
master: typed ParseBatchObservation workflow keys (nested summary instead
of untyped expansion), IngestDiagnostics annotation, tuple unpacking for
walk paths, Literal association_state, and a warning log on the artifact
parse fallback (degrade-loudly).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUsH3Rhq6oAZpYPWcsZqnZ
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@Sinity, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 14 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: a5bcf100-9e05-434c-a13e-b40d02694531

📥 Commits

Reviewing files that changed from the base of the PR and between 3f7f655 and 4a66d80.

📒 Files selected for processing (22)
  • docs/plans/topology-target.yaml
  • docs/topology-status.md
  • polylogue/archive/artifact_taxonomy/models.py
  • polylogue/daemon/convergence_stages.py
  • polylogue/insights/claude_workflow_evidence.py
  • polylogue/insights/claude_workflow_materializer.py
  • polylogue/insights/work_evidence.py
  • polylogue/pipeline/payload_types.py
  • polylogue/pipeline/services/archive_ingest.py
  • polylogue/pipeline/services/parsing_workflow.py
  • polylogue/sources/live/batch.py
  • polylogue/sources/live/watcher.py
  • polylogue/sources/origin_specs.py
  • polylogue/sources/parsers/claude/orchestration.py
  • polylogue/storage/sqlite/queries/work_evidence.py
  • tests/integration/test_claude_workflow_admission.py
  • tests/unit/daemon/test_convergence_stages.py
  • tests/unit/insights/test_claude_workflow_evidence.py
  • tests/unit/insights/test_work_evidence.py
  • tests/unit/sources/test_artifact_taxonomy.py
  • tests/unit/sources/test_live_watcher.py
  • tests/unit/sources/test_origin_specs.py
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/sources/claude-workflow-admission

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Sinity
Sinity merged commit 1e0246d into master Jul 18, 2026
3 checks passed
@Sinity
Sinity deleted the feature/sources/claude-workflow-admission branch July 18, 2026 12:39
Sinity added a commit that referenced this pull request Jul 18, 2026
…, misc-01 r01-loose)

mandate-01 integrated (PR #3088, 91 focused tests green after rebase
integration); ann-04 filed as needs_rebase_review (41ow judgment
transaction, patch conflicts with moved master — adjudication input for
the 41ow lane item); misc-01 loose-file second copy recorded as
superseded by merged #3079. Clipboard FINAL-SUMMARY for ann-04 captured
alongside its loose files. Wave 2 custody now covers 32/32 missions +
mandate/support portfolio.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QUsH3Rhq6oAZpYPWcsZqnZ
Sinity added a commit that referenced this pull request Jul 18, 2026
Custody-only: receipts + index entries for mandate-01 (integrated via PR
#3088), ann-04 (needs_rebase_review — 41ow judgment transaction),
misc-01 loose-file second copy (superseded by #3079). No code.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01QUsH3Rhq6oAZpYPWcsZqnZ

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sinity added a commit that referenced this pull request Jul 19, 2026
…lution deliveries (#3177)

## Summary

Re-triages two ChatGPT-Pro handoff packages staged at
`/realm/tmp/gpt-pro-intake-0719/` (`judgment-*.md/.diff`,
`config-*.md/.diff`), targeting snapshot
`536a53efac0cbe4a2473ad379e4db49ef3fce74d`
(#3046). Both are byte-identical duplicate downloads of packages already
on
file as `results/ann-04/r01` and `results/misc-01/r01`. Per the custody
policy (`results/README.md`: "Duplicated browser downloads with
identical
SHA-256 values are deliberately not copied twice", precedent:
`lin-01/r01`),
this PR does **not** mint a second package-revision identity or
duplicate
raw/extracted artifact bytes — it records the 2026-07-20 reassessment as
a
dated `reassessments` entry inside each existing `r01` receipt, with the
top-level `state` updated where the evidence changed. No patch is
applied to
master; no bead is closed or reopened.

## Problem

Both files were flagged as fresh wave-2 deliveries needing triage.
Master has
moved ~180 commits (33+ merges) past the stated snapshot.

## Solution

**Pairing verification (step 0):** `judgment-*` files cross-reference
polylogue-41ow/37t.12/mrxt and match mission
`ann-04-judgment-transaction`;
`config-*` files cross-reference polylogue-fd2s/9gh1 and match mission
`misc-01-config-closure`. The mapping was correct as staged.

**Commission identification (step 1):** both missions already have `r01`
result entries on disk. SHA-256 of every one of the 8 delivered files is
byte-identical to the corresponding `results/ann-04/r01` and
`results/misc-01/r01` artifacts (`diff -q` reports no differences) —
these
are re-submissions of packages already triaged 2026-07-18, not new
deliveries.

**Triage (step 2), recorded as `reassessments` entries in the existing
`r01`
receipts:**

- `git apply --check` passes cleanly for both patches against the stated
  snapshot (integrity confirmed) and fails for both against current
`origin/master`, re-checked three times as master advanced during triage
(`e963e87f5` → `1c0f4eccd` → `610ce8d9`, none of the intervening commits
  touch the affected core files).

- **ann-04 (judgment-transaction): `r01` state `needs_rebase_review` →
`superseded`.** bd `polylogue-41ow` (closed, PR #3101+#3110)
independently
fixed the writer-slot TOCTOU race; bd `polylogue-2o3d` (closed, PR
#3138)
independently ported the delivery's entire non-overlapping additive
scope
  (evidence previews, queue health, judge-command consolidation, capture
idempotency) after its own line-by-line audit found the MCP-surface
hunks
  obsolete (six-tool cutover) and the delivery's transaction mechanism
redundant with #3101. Supersession is now total — every
acceptance-matrix
row this delivery claims already has an independent, merged, adjudicated
  master implementation.

- **misc-01 (config-resolution-closure): `r01` state stays `superseded`,
rationale now explicit.** PR #3079 (merged 2026-07-18, explicitly
sourced
  from an earlier revision of this same GPT-Pro packet family) already
shipped `ResolvedRuntimeConfig`, the single resolver, the `archive_root`
  TOML fix, and deep-merge for nested health tables (live-checked
  `polylogue/config.py:1514` `_merge_toml`/`_deep_merge_table`).
  `needs_rebase_review` does not apply here: there is no viable rebase
  target for this patch against the current config API — #3079 shipped a
differently-shaped `ResolvedRuntimeConfig` with no common ancestor, so
any
further work must be **re-derived against the landed API, not revived**
  from this diff. The genuine residual (bd `polylogue-uu8r`'s env-bypass
  migration scope — spot-checked `polylogue/daemon/backup.py:695` and
  `polylogue/pipeline/services/archive_ingest.py:48`, both still direct
  `os.environ.get()` reads on master) is tracked durably as
  `polylogue-uu8r` directly, not as a pending state on this package.

Also noted, out of scope for this PR: `polylogue-fd2s`/`polylogue-9gh1`
still read `status=open` in `bd` despite #3079's landing — likely
bookkeeping lag, flagged in the bead notes for a separate housekeeping
pass.
A stray `clipboard-current.txt` in the intake directory is unrelated
leftover clipboard text for the already-integrated `mandate-01` delivery
(same SHA as `results/mandate-01/r01`, PR #3088, merged) — not part of
either package, not touched by this PR.

## Verification

- `sha256sum` on all 8 delivered files, cross-checked against existing
`r01`
  records: identical.
- `git apply --check` against
`536a53efac0cbe4a2473ad379e4db49ef3fce74d`:
  clean for both patches (detached worktree).
- `git apply --check` against `origin/master`, checked at `e963e87f5`,
  `1c0f4eccd`, and `610ce8d9` as master advanced during triage: fails
identically every time (20 production files for judgment, 21 for config;
  some judgment files/tests no longer exist post six-tool MCP cutover).
- `bd show polylogue-41ow/fd2s/9gh1/cxlk/uu8r/2o3d --json` to confirm
current
  close/open state and what each merged PR actually covers.
- `grep -rl ResolvedRuntimeConfig polylogue/` plus a read of
`polylogue/config.py:1514` (`_merge_toml`/`_deep_merge_table`) to
confirm
  the architecture is live on master, not just claimed by a PR title.
- `devtools verify --quick`: 16/16 green (pre-push hook, this branch,
each
  push).
- Triage notes appended to `polylogue-41ow` and `polylogue-fd2s` (plus a
  correction note on both retracting the earlier, policy-violating `r02`
  framing) via `bd update --append-notes` + `bd export`.

Ref polylogue-41ow, polylogue-fd2s, polylogue-9gh1, polylogue-2o3d

Co-authored-by: Claude <noreply@anthropic.com>
Sinity added a commit that referenced this pull request Jul 21, 2026
## Summary

Closes the remaining conformance-law gaps in the OriginSpec admission
kernel
(`polylogue/sources/origin_specs.py`) against every clause of
`polylogue-2qx.1.1`'s acceptance criteria: a
public-origin/Provider-token leak
guard, a stream/parser binding parity check against dispatch, and a live
proof of the `lifecycle="reserved"` admission path.

## Problem

`polylogue-2qx.1.1` asked for the OriginSpec admission kernel (built on
the
`polylogue/declarations` DeclarationSpec kernel from `polylogue-o21.1`)
plus a
conformance law where missing parser, stream/parser conflict, ambiguous
detector order, absent fixture, undeclared coverage, leaked Provider
token,
and non-injective Provider-to-Origin collision each yield a
source-locatable
diagnostic.

Auditing the live repo found the kernel **already exists on master** —
`polylogue/sources/origin_specs.py` landed incrementally via unrelated
feature PRs (#3051, #3087, #3088, #3092, #3201, #3228: Claude Workflow
admission, Hermes ATOF/ATIF, the Grok parser, provider_completeness
migration) without ever citing this bead, so `bd`'s tracking never
reflected
it — the 2026-07-18 warroom sweep found no bead-tagged commits and reset
the
bead to open even though the code was there. It already covers all 11
`Origin` tokens, consumes the declarations kernel correctly, and is
wired
into `provider_completeness.py`, the artifact taxonomy, the live
watcher, and
Claude Code orchestration.

Auditing it clause-by-clause against the AC found three real gaps:

1. No diagnostic caught a public origin `public_name` colliding with a
raw
   `Provider`-wire token — the doctrine in
`docs/provider-origin-identity.md` ("no provider wording on public
origin
   surfaces") was enforced only indirectly (public_name must equal
   `origin.value`, and no current `Origin`/`Provider` pair happens to
collide), with no explicit guard or diagnostic for a future collision.
2. No check parity-verified declared `stream_parser_path` presence
against
`sources/dispatch.py:STREAM_RECORD_PROVIDERS` — a stream/parser binding
could silently drift from dispatch's actual streaming behavior with no
   diagnostic.
3. The module docstring still claimed a live "reserved origin" pilot,
but
Grok shipped a real parser (`polylogue-611`, #3201) after this bead was
written, so no `OriginSpec` is currently `lifecycle="reserved"` and that
   admission path had no live proof.

## Solution

- Added `_PROVIDER_TOKEN_VALUES` and a guard in
`OriginSpecRegistry.register()`
that rejects a declaration whose `public_name` collides with any
`Provider`
enum value, ordered before the existing public-name/origin equality
check
  so it is independently testable (a synthetic declaration can trip it
  without also tripping the equality check).
- Added `validate_stream_parser_parity()`, parity-checked against
  `sources/dispatch.py:STREAM_RECORD_PROVIDERS` the same way
`validate_dispatch_precedence()` already parity-checks detector
tightness
order. **Zero edits to `dispatch.py`** — only a new read-only import of
its
  existing `STREAM_RECORD_PROVIDERS` constant, respecting this slice's
ownership boundary with the concurrent `ingest_worker.py`/`decoders.py`
  lane.
- Updated the module docstring to honestly state Grok's promotion from
reserved to executable, and point at the new synthetic
reserved-lifecycle
test as the live proof of that admission path (since no real production
  `Origin` is currently reserved).
- Added five tests to `tests/unit/sources/test_origin_specs.py`:
undeclared-
  coverage rejection, provider-token-leak rejection, a synthetic
`lifecycle="reserved"` registration (built via `replace()` of the real
Grok
spec) proving the reserved admission contract requires no
parser/detector
tightness while still requiring coverage/fixture evidence, and positive
  plus negative stream/parser parity checks.

## Verification

- `devtools test tests/unit/sources/test_origin_specs.py` → 8 passed
- `devtools test tests/unit/sources/test_dispatch_ordering.py
tests/unit/sources/test_dispatch_payloads.py` → 21 passed
- `devtools test -k "provider_completeness or origin_specs or
dispatch_ordering"` → 26 passed
- `mypy --strict polylogue/sources/origin_specs.py
tests/unit/sources/test_origin_specs.py` → Success, no issues found
- `devtools verify --quick` → exit 0 (all 16 steps ok: format, lint,
mypy, render all, topology, layering, closure-matrix, schema roundtrip,
manifests, ci-workflows, doc-commands, docs-coverage,
test-infra-currency, test-clock-hygiene, pytest-timeout-overrides,
degrade-loudly)
- No new module/file added, so no topology projection regen was
required.

## AC matrix

| # | AC | Status |
| --- | --- | --- |
| 1 | `origin_specs.py` defines complete typed fields/lifecycle states,
consumes `polylogue/declarations` without adding source semantics to
that kernel | Satisfied (pre-existing on master; verified by reading
`polylogue/declarations/*` and confirming `origin_specs.py` only wraps
`DeclarationSpec`/`DeclarationRegistry`, adding no kernel-layer
semantics) |
| 2 | Claude Code / ChatGPT / reserved Grok pilots derive/validate
deterministic tightness, parser/assembly registration, public origin
values, coverage/completeness rows, fixtures, docs, reparse consequences
from one declaration each | Satisfied for Claude Code (executable,
tightness 60, stream+artifact-rule bindings) and ChatGPT (executable,
tightness 70). Grok itself is now executable (real parser shipped after
this bead was written, #3201) rather than reserved; the
reserved-lifecycle admission contract is proven live by this PR's new
synthetic test rather than by a real reserved origin, since every
current public `Origin` token is admitted as executable or
compatibility-only |
| 3 | `dispatch.py` uses derived registration/order or is parity-checked
by it; adding a synthetic executable origin requires one OriginSpec +
adapter + fixtures | Satisfied — `validate_dispatch_precedence()`
(pre-existing) plus this PR's new `validate_stream_parser_parity()`
parity-check `dispatch.py`'s
`RECORD_DETECTOR_PROVIDER_ORDER`/`STREAM_RECORD_PROVIDERS` without
restructuring dispatch.py |
| 4 | Missing parser / stream-parser conflict / ambiguous or cyclic
detector order / absent fixture / undeclared coverage / leaked Provider
token / non-injective collision each yield a source-locatable diagnostic
+ repair | Satisfied — missing parser, absent fixture, and non-injective
collision without policy were pre-existing `ValueError` raises (now also
covered by a dedicated undeclared-coverage test in this PR); ambiguous
detector order was pre-existing (`ambiguous_detector_tightness`); this
PR adds the previously-missing stream/parser-conflict diagnostic
(`stream_parser_parity_mismatch`) and leaked-Provider-token guard.
"Cyclic" detector order has no distinct failure mode beyond ambiguous
tightness, since tightness is a total order, not a graph |
| 5 | Provider stays in adapters, Origin is the public vocabulary,
Gemini/Drive-style collisions require an explicit collision policy |
Satisfied (pre-existing `collision_policy` field + registration guard,
exercised by `aistudio-drive`'s `Provider.GEMINI`/`Provider.DRIVE`
fiber) |
| 6 | Focused
declaration/dispatch/public-schema/completeness/fixture/mutation/render/quick
verification passes | Satisfied — see Verification section above |

`polylogue-2qx.1.2` (migrate every current origin onto OriginSpec,
delete
parallel inventories) is explicitly out of this slice's scope per the
bead's
own design text — it is largely already superseded in practice too (all
11
origins are already declared here and `provider_completeness.py` already
projects from `ORIGIN_SPECS`), but a formal audit of that bead's own AC
(exact-eleven-token enumeration, parallel-inventory deletion, dispatch
golden fixture) is left to whoever picks it up.

Ref polylogue-2qx.1.1

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
  * Prevented origin names from exposing internal provider terminology.
* Added validation to ensure origin evidence is complete before
registration.
  * Improved consistency checks for origins that support streaming data.
* **New Features**
* Added support for reserved-lifecycle origins used in fixtures,
including required supporting evidence without requiring parser
configuration.
* Added diagnostics for mismatches between streaming capabilities and
origin configuration.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Claude <noreply@anthropic.com>
Sinity added a commit that referenced this pull request Jul 21, 2026
…gue-2qx.1.2) (#3250)

## Summary

Audits and closes the remaining gap in polylogue-2qx.1.2 ("migrate every
current origin onto OriginSpec"). Most of this bead's scope was already
shipped to `master` untagged across
#3051/#3087/#3088/#3092/#3201/#3228/#3246
(closing `polylogue-2qx.1.1`'s notes confirm this). This PR verifies
that
prior work end-to-end, proves the parity checks actually catch
regressions
(not just pass today), and closes one concrete residual gap: a second,
un-declared provider-to-assembly-hook dispatch that Claude Code, Codex,
and
AI Studio/Drive depend on.

## Problem

`polylogue/sources/origin_specs.py` already declares all eleven `Origin`
tokens with lifecycle/detector-tightness/parser/fixture/coverage
bindings,
and `polylogue/sources/provider_completeness.py` already derives its
rows
from `ORIGIN_SPECS` (`PACKAGE_MODE_SPECS` is a tuple comprehension over
it,
parity-proven by
`test_provider_completeness_is_a_projection_of_every_origin_spec`).
Dispatch-order and stream-parser-binding parity are also already
mechanically checked (`validate_dispatch_precedence`,
`validate_stream_parser_parity`) against the real production values in
`sources/dispatch.py` (`RECORD_DETECTOR_PROVIDER_ORDER`,
`STREAM_RECORD_PROVIDERS`).

What was genuinely missing: the bead's design explicitly calls for
"Claude
Code and Codex specs [to] expose typed
assembly/orchestration/title/action
extension hooks (consumed later by 2qx.2, j2zz, ih67) — a typed field on
the spec, not another registry."
`polylogue.sources.assembly.get_assembly_spec()`
is exactly that second, un-declared provider dispatch
(`ProviderAssemblySpec` factory for
`Provider.CLAUDE_CODE`/`Provider.CODEX`/
`Provider.GEMINI`) — it existed in production but had no OriginSpec
declaration or parity check, so a caller had no way to discover the hook
from `origin_specs.py` and no test would catch it drifting from the real
registry.

Also: `docs/provider-origin-identity.md` documented
Provider/Origin/Source
doctrine but never pointed at `origin_specs.py` as the per-origin
admission
authority a reader should trust over any hand-maintained list.

## Solution

- `polylogue/sources/origin_specs.py`: added
`OriginSpec.assembly_spec_path`
  (`"module/path.py:ClassName"` or `None`) declaring which
`ProviderAssemblySpec` a given origin's provider wire binds. Populated
for
  the three origins with a real live hook: `claude-code-session` →
  `assembly_claude_code.py:ClaudeCodeAssemblySpec`, `codex-session` →
  `assembly_codex.py:CodexAssemblySpec`, `aistudio-drive` →
`assembly_gemini.py:GeminiAssemblySpec` (its `Provider.GEMINI` wire is
the
one `get_assembly_spec` keys on). Added
`validate_assembly_spec_parity()`,
  following the exact idiom of `validate_dispatch_precedence`/
`validate_stream_parser_parity`: it checks the declared field against
the
live `get_assembly_spec(provider)` return value rather than replacing
that
  registry with a second one in `origin_specs.py`.
- `tests/unit/sources/test_origin_specs.py`: two new tests — one
asserting
the three declared hook paths (and `None` for two origins without a live
hook), one asserting `validate_assembly_spec_parity(get_assembly_spec)
== ()`
plus the mutation shape (a resolver that always returns `None` makes
every
origin that declares a hook path report
`assembly_spec_parity_mismatch`).
- `docs/provider-origin-identity.md`: added an "Origin admission"
section
  naming `origin_specs.py` as the per-origin declaration authority and
  pointing at both live-production parity checks.
- No parallel hand-maintained inventory was deleted, because the audit
found
none left inside my ownership (`polylogue/sources/**`) — see the
residual
  below for the one still outstanding elsewhere.

### Residual found outside owned scope

`polylogue/cli/shell_completion_values.py:_ORIGIN_DESCRIPTIONS` is a
hand-maintained `dict[str, str]` of 8 of the 11 origin tokens (missing
`beads-issue`, `grok-export`, `unknown-export`) used for
shell-completion
help text, and it is **not** parity-checked against
`Origin`/`ORIGIN_SPECS`
the way `polylogue/agent_integration/spec.py:ORIGIN_MEANINGS` already is
(that one has a `RuntimeError` guard requiring exact `Origin`-enum order
match — already satisfies AC4, no action needed there). `cli/**` is out
of
this lane's ownership (per dispatch instructions, another lane owns it
concurrently); flagging as a follow-up rather than touching it here.

## Verification

- `devtools test tests/unit/sources/test_origin_specs.py
tests/unit/sources/test_provider_completeness.py` → **15 passed**
- `devtools test tests/unit/sources/ -k "origin_specs or
provider_completeness or dispatch or assembly"` → **144 passed**
- `devtools test tests/unit/sources/test_parsers_props.py` (protected
file) → **43 passed**
- `devtools verify --quick` → all 16 steps `ok`, `"exit_code": 0` (ruff
format/check, mypy --strict, render all,
topology/layering/closure-matrix, manifests, ci-workflows, doc-commands,
docs-coverage, test-infra-currency, test-clock-hygiene,
pytest-timeout-overrides, degrade-loudly)
- Anti-vacuity mutations, run manually then reverted (`git checkout
--`), each confirmed the *existing* production dependency actually fails
on the mutation before I added anything:
- Removing `_grok_spec()` from the registration loop →
`ORIGIN_SPEC_REGISTRY.diagnostics()` reports `missing_origin_spec` for
`grok-export`.
- Dropping Claude Code's `detector_tightness` below
`gemini_cli_session`'s (contradicting its real last-in-branch-order
position) →
`validate_dispatch_precedence(RECORD_DETECTOR_PROVIDER_ORDER)` reports
`dispatch_tightness_mismatch`.
- Deleting Codex's new `assembly_spec_path` declaration →
`validate_assembly_spec_parity(get_assembly_spec)` reports
`assembly_spec_parity_mismatch` for `codex-session` (this is the
mutation the new code in this PR is proven against).

## AC matrix (polylogue-2qx.1.2)

1. **Satisfied (pre-existing).** All eleven `Origin` tokens are declared
exactly once in `ORIGIN_SPECS`; `set(by_origin) == set(Origin)` is
asserted in
`test_origin_specs_cover_the_public_enum_and_admission_lifecycles`, and
`OriginSpecRegistry.diagnostics()` emits `missing_origin_spec` for any
omission (proven above).
2. **Satisfied (pre-existing + this PR).** Every executable origin
declares acquisition modes,
detector/parser/stream-parser/fixture/coverage/fidelity/reparse fields;
`claude-code-session` additionally declares 6 typed
`OriginArtifactRule`s for its
workflow/journal/transcript/sidecar/adopt-manifest/coordinator-stream
family. `grok-export` is `lifecycle="executable"` today (it shipped a
real parser via #3201/polylogue-611 after 2qx.1.1's pilot design assumed
it would stay reserved — documented at the top of `origin_specs.py`);
the `reserved` lifecycle contract itself is proven against a synthetic
variant since no current `Origin` is genuinely reserved.
`unknown-export` is `lifecycle="compatibility-only"` with explicit
fallback semantics; `beads-issue` is executable with `issue-jsonl`
acquisition and its own non-`accepted` completeness maturity caveat (no
harvested schema sample yet). This PR adds the Claude/Codex/AI-Studio
assembly hook declaration.
3. **Satisfied (pre-existing).**
`validate_dispatch_precedence`/`validate_stream_parser_parity`
parity-check tightness and stream-binding against
`sources/dispatch.py`'s real
`RECORD_DETECTOR_PROVIDER_ORDER`/`STREAM_RECORD_PROVIDERS`;
mutation-proven above (deleting/reordering a declaration fails).
4. **Satisfied (pre-existing) for `provider_completeness.py`; this PR
extends it to the assembly-hook axis.** `PACKAGE_MODE_SPECS` is a direct
tuple comprehension over `ORIGIN_SPECS`, parity-proven by
`test_provider_completeness_is_a_projection_of_every_origin_spec`.
`agent_integration/spec.py:ORIGIN_MEANINGS` is separately parity-guarded
against `Origin` at import time. **Deferred**:
`cli/shell_completion_values.py:_ORIGIN_DESCRIPTIONS` remains a stale,
un-parity-checked hand-maintained inventory — out of this lane's
ownership (`cli/**`), flagged as a residual above rather than a named
follow-up bead (small, mechanical, single-file fix for whichever lane
next touches CLI completions).
5. **Satisfied (pre-existing).** `aistudio-drive`'s
`provider_wires=(Provider.GEMINI, Provider.DRIVE)` with
`collision_policy` is registration-enforced
(`OriginSpecRegistry.register` raises `ValueError` if
`len(provider_wires) > 1` without a `collision_policy`, tested in
`test_origin_spec_rejects_missing_fixture_and_noninjective_collision_without_policy`);
`docs/provider-origin-identity.md` already documented the non-reversal
doctrine, and this PR adds the pointer from that doc to the enforcing
code.
6. **Misframed — recorded honestly rather than claimed satisfied.**
`polylogue-2qx.2` (Claude Code orchestration artifact admission) already
closed via PR #3088, and its own close reason states it shipped as a
`claude_workflow_materializer` convergence stage *without* the
OriginSpec migration this bead was meant to gate — the blocking edge was
explicitly force-closed as "over-blocking" because the merged
implementation disproves that ordering. So AC6 as written ("Claude/Codex
extension hooks are the only admission path used by 2qx.2...") cannot be
retroactively true for `2qx.2`. `j2zz` (Codex child-action lowering) and
`ih67` (Codex title enrichment) are still open; this PR's new
`assembly_spec_path`/`validate_assembly_spec_parity` gives them a real
typed admission point to consume going forward, but I did not modify
`assembly_codex.py`/`ih67`/`j2zz` scope — those remain their own beads'
work, not migrated by me here.

## Files touched

- `polylogue/sources/origin_specs.py`
- `tests/unit/sources/test_origin_specs.py`
- `docs/provider-origin-identity.md`

Ref polylogue-2qx.1.2

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Documentation**
- Added guidance on how origin metadata is declared, validated, and kept
aligned with runtime behavior.
- Documented checks for provider completeness and assembly-related
configuration.

- **Improvements**
- Added validation to detect mismatches between declared origin
capabilities and available assembly behavior.
- Added assembly configuration metadata for Claude Code, Codex, and AI
Studio origins.

- **Tests**
- Added coverage confirming assembly declarations and runtime parity
checks behave as expected.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude <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