Skip to content

decision(quotient): rebind project_level after burn-in — pipeline_stage vs orchestrator #146

Closed

Description

@zaebee

Context

Since #144 the k=1 quotient graph (domains as nodes) is scored observe-only (enforce: false) against pipeline_stage. It stably measures drift 0.700 — exact arithmetic, not noise: the cross-domain census is 021D-dominated because cgis.pipeline imports/calls every other domain (orchestrator reality), while pipeline_stage ideal expects a 021C chain (extraction→resolution→storage).

Decision needed (after ~2-3 weeks of burn-in, i.e. around 2026-07-01)

Pick one:

  1. Rebind to orchestrator — accept reality: cgis at domain level is a hub-and-spoke around the pipeline. Drift would drop to ~0; quotient could then be enforced.
  2. Keep pipeline_stage as aspiration — treat 0.700 as a measured architectural debt: the pipeline module should shrink to thin wiring and domains should hand off in a chain. Keep observe-only until refactored.
  3. Hybrid — rebind to orchestrator with a tight tolerance now (regression guard), open a separate refactoring issue for the chain aspiration.

Data to collect during burn-in

  • Does quotient drift move at all as code changes land? (If it's static, observe-only adds no signal and we should just decide.)
  • tests/self_parsing/test_drift.py::test_py_quotient_drift_observed_not_enforced prints the report on every run — check CI logs.

Blocks: enforcing project_level (and the unresolved_ratio plumbing (#149) only matters once enforced).

🤖 Generated with Claude Code

Activity

  1. zaebee commented on Oct 14, 2026

    @zaebee
    OwnerAuthor

    Closing: the question this issue asked — what topology cgis should drift toward, and how to keep it there as languages are added — is answered by the language-packs migration (spec docs/specs/2026-10-14-language-packs-design.md, steps 0–6, every step graph-identical on cgis src@715cd9a, owner-api@8de2245 and ui/).

    The answer is not a quotient pattern but enforced boundaries. The cgis-project → pipeline_stage binding never fit (the measured quotient was an orchestrator star) and stayed observe-only; it is retired (#605). What enforces the topology now is the forbidden-edge gate in tests/self_parsing/test_architecture.py, with exact shrinking allowlists:

    How it got there

    Follow-ups: #603 (IngestionPipeline.run complexity), #604 (language residue in the resolver's text). Step 7 — the Go pilot — is next and does not block this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    architecturequestionFurther information is requestedshould-haveImportant for scale and quality

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions