sync: v17.0 phase 137-140 catch-up - #45
Merged
Merged
Conversation
…ified CHIME-01/02/03 research complete: zero Sigra.* compile-time references confirmed in chimeway source; Resolver.Denial usage classified as legitimate (core dep, not boundary violation); clean-room smoke test enabled?() defect identified; phase71 redistribution from sigra to chimeway package specified. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…e from core - Create packages/crosswake_chimeway/ with mix.exs (@Version 0.1.0, no engine dep, no crosswake_sigra dep, D-11/D-13 env-conditional crosswake_dep) - Move all 7 chimeway files (facade + 6 sub-modules) preserving Crosswake.Companions.Chimeway.* namespace (non-breaking, CHIME-01) - Add auth_context: map() guard note to NotificationOpenEvidence moduledoc (CHIME-02 / T-138-01 / D-8) - Remove Crosswake.Companions.Chimeway from core application/0 env and Phase-138 comment - Add crosswake_chimeway to core mix companions.test alias for dress-rehearsal - Remove Crosswake.Companions.Chimeway.Telemetry from core docs groups_for_modules (extracted) - resolver.ex retains alias Crosswake.Shell.Denial + Denial.new calls (no Finding-boundary refactor — chimeway diverges from sigra)
…x post-extraction core suite
- Add Crosswake.TestSupport.StubChimewayAbsentCompanion to test/support/stub_companion.ex
(companion_id: :chimeway, validate_dependency returns {:error, [Crosswake.Companions.Chimeway]},
no auth_authority?/0 — chimeway is notification-only, not an auth authority, CHIME-02)
- Delete chimeway unit tests from core (chimeway_test.exs + 5 sub-module tests): these move to
packages/crosswake_chimeway/test/ in Plan 02; their presence in core after source extraction
caused compile errors (Rule 3 auto-fix)
- Delete test/crosswake/proof/phase59_chimeway_contract_test.exs: split in Plan 02 — package
tests move to crosswake_chimeway, SupportMatrix assertion stays in core as phase59_support_truth
- Update test/crosswake/guides/companions_test.exs: remove Code.ensure_loaded! + function_exported?
guards for Crosswake.Companions.Chimeway (extracted to package; guards now in package test lane)
- Add crosswake_chimeway row to guides/companion_compatibility.md (Rule 2: drift test enforcement)
- Core suite: 987 tests, 0 failures after extraction
…truth stays in core) - MOVE 5 chimeway-internal unit tests (contracts, denial_codes, redaction, resolver, telemetry) from core test/crosswake/companions/chimeway/ to packages/crosswake_chimeway/test/crosswake/companions/chimeway/ - MOVE chimeway_test.exs (facade) to packages/crosswake_chimeway/test/crosswake/companions/ - SPLIT phase59_chimeway_contract_test.exs: 4 chimeway-internal tests (TOKN-02 lifecycle, raw-token absence, struct aliases, delivery_accepted) move to the package; companion state assertion (report_state().details) moves with them since Chimeway modules are not available in core (no chimeway runtime dep per D-21) - ADD test/crosswake/proof/phase59_chimeway_support_truth_test.exs: core-retained SupportMatrix.notification_support_truth/0 assertion — static function returning 1 element (non-vacuous: always populated with the expected notification truth); no put_env required since the function does not source from :companions registry - Package lane: 42 tests, 0 failures (moved unit + contract tests + facade) - Core support-truth test: 1 test, 0 failures
…ke_sigra dep
- MOVE phase71_notification_workflow_proof_test.exs from crosswake_sigra package
to crosswake_chimeway package (primary subject is Chimeway.Resolver — the test
proves Chimeway+Sigra notification-auth integration end-to-end)
- DELETE packages/crosswake_sigra/test/crosswake/proof/phase71_...exs (sigra no
longer depends on chimeway after extraction; Chimeway.Resolver would not resolve)
- ADD {:crosswake_sigra, path: "../../packages/crosswake_sigra", only: :test} dep
to packages/crosswake_chimeway/mix.exs deps/0 — required because phase71 builds
a real validated %SigraContracts.AuthContext{} (via new_session_authority_lane/1
+ new_auth_context/1) and pattern-matches %SigraContracts.AuthContext{}; plain
map literals cannot reproduce sigra's validation + evaluation (CHIME-02 preserved:
only: :test; the files: allowlist excludes test/ so tarball/clean-room never see it)
- phase71 passes in chimeway package: 6 tests, 0 failures (Chimeway.Resolver + real
registered Sigra evaluator produce the auth.step_up.* codes end-to-end)
…idden keys + CHIME-02)
Add packages/crosswake_chimeway/test/crosswake/proof/phase138_chimeway_cleanroom_test.exs:
Test 1 — telemetry events non-vacuity: with chimeway registered in :companions,
Crosswake.Telemetry.events/0 includes all 10 chimeway notification events.
Non-vacuous: without registration, companion_events/build_reserved_events both
return [] and the filter would pass vacuously. Code.ensure_loaded!(Chimeway) in
setup forces BEAM module loading so function_exported?/3 returns true.
Test 2 — forbidden keys at attach time (RESEARCH A2 correction): after
attach_default_logger/0, reads handler.config[:forbidden_keys] MapSet via
:telemetry.list_handlers([:crosswake]) and asserts every key from
ChimewayTelemetry.forbidden_metadata_keys() is present. Uses the REAL seam
(DECOUPLE-05); Crosswake.Telemetry.forbidden_metadata_keys/0 does NOT exist.
Test 3 — not an auth authority: refute function_exported?(Chimeway, :auth_authority?, 0).
Chimeway is notification-only; auth_authority?/0 belongs only to sigra (CHIME-02).
Test 4 — no runtime sigra dep: reads Mix.Project.config()[:deps] and confirms
{:crosswake_sigra, ..., only: :test} is the only sigra dep; a non-test sigra dep
would violate CHIME-02.
Deviation note: Code.ensure_loaded!(Chimeway) required in setup — ExUnit does not
auto-load BEAM modules; function_exported?/3 returns false for unloaded modules
causing vacuous test passes. This is the correct pattern for companion clean-room
proofs from package-scoped test suites.
Full chimeway package suite: 52 tests, 0 failures.
Core dress rehearsal: 988 tests, 0 failures.
- 138-02-SUMMARY.md: 3 tasks completed, 52 chimeway pkg tests green, 988 core dress-rehearsal tests green, CHIME-01/02 coverage D7-D11
- guard enabled?(%{}) assertion by package: assert for chimeway (defaults true),
refute for all other no-engine companions (default false); exactly one form emitted
- add Chimeway.Telemetry.event_names/0 == 10 canary (vacuity-safe: proves Telemetry
sub-module shipped in tarball with sigra absent — CHIME-02)
- update usage comment to document chimeway invocation form
- sigra/rulestead/rindle paths unchanged (additive only)
…se component
- add crosswake_chimeway block to release-please-config.json (elixir, separate-pull-requests,
release-as 0.1.0 one-shot, NOT in linked-versions lockstep group — D-8)
- add packages/crosswake_chimeway: 0.1.0 to .release-please-manifest.json
- add {:crosswake_chimeway, path: ...} path dep to examples/phoenix_host/mix.exs
(guides/companion_compatibility.md chimeway row was already present from prior wave)
- add chimeway_release_created/tag_name/version outputs (per-component dot-alias) - add publish-hex-chimeway job: CROSSWAKE_RELEASE=1, per-component gate on chimeway_release_created (never aggregate releases_created — D-8/D-07) - add clean-room-proof-chimeway job: no-engine invocation (no sigra arg), chimeway-correct smoke test via Task-1 patch (CHIME-02 no-sigra-dep at CI level) - extend release-as-cleanup: chimeway_release_created in if: + strip block - extend release-failure-alert: publish-hex-chimeway + clean-room-proof-chimeway in needs: and issue body (T-138-08/T-138-09 mitigations)
…table suite)
Seven tests captured `Application.get_env(:crosswake, :companions)` WITHOUT the
`, []` default that every production read site uses. When `:companions` is unset
(the default — there is no config/ dir configuring it), the bare capture returns
`nil`, and the `on_exit` restore does `put_env(:crosswake, :companions, nil)`,
explicitly setting the key to nil. Every later `get_env(:crosswake, :companions, [])`
then returns `nil` (key present) instead of `[]`, so `Enum.flat_map(nil, ...)` in
Telemetry.events/0 and Doctor.run/1 raises Protocol.UndefinedError — violating the
documented D-10 fail-closed contract ("with no companions configured ... never raises").
Latent since the pattern was introduced; exposed by Phase 138 chimeway extraction
reordering the suite (test count dropped as chimeway tests moved to the package lane).
Fix mirrors production: capture with the `, []` default so an unset key restores as
`[]`, never nil. Applied to the same latent bug in 4 crosswake_sigra package tests.
Verified: core dress-rehearsal green across seeds 0/1/42/137 (was red on seed 0);
chimeway (52) and sigra (131) package lanes green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ly batch Phase 138 crosswake_chimeway extraction: waves 1-3 executed green in-tree (extraction, test move + non-vacuous clean-room proof, independent release-please CI pipeline). Wave 4 (human-gated Hex publish) intentionally deferred to the batched family publish, mirroring Phase 137 sigra. Plus seed-stability gap-closure. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…cision (plan-checker PASS)
…onal-Phoenix guards, move source + EEX templates, wire test-only core dep
- Create packages/crosswake_threadline/mix.exs (v0.1.0, {:plug, optional: true}, {:phoenix_live_view, optional: true}, {:nimble_options}, {:telemetry}, files: includes "priv", NO sibling companion dep)
- Scaffold config/config.exs, README.md, CHANGELOG.md, LICENSE, test/test_helper.exs
- Move threadline source (namespace preserved, non-breaking): threadline/{id,telemetry}.ex, audit/ledger.ex, plug/threadline.ex, live/threadline.ex, mix/tasks/{crosswake.threadline,crosswake.gen.audit}.ex
- Move priv/templates/crosswake/audit/{ledger.ex.eex,migration.exs.eex} (verbatim)
- Wrap Crosswake.Plug.Threadline in Code.ensure_loaded?(Plug.Conn), Crosswake.Live.Threadline in Code.ensure_loaded?(Phoenix.LiveView) (PromEx precedent; neither uses a use macro)
- Fix gen.audit.ex app_dir atom: :crosswake -> :crosswake_threadline (both lines), File.exists? cwd fallback preserved
- Add {:crosswake_threadline, path: "packages/crosswake_threadline", only: :test} to core mix.exs (keeps phase133 TELEM-04 Side-A compiling)
- Add companions.test alias lines for crosswake_threadline; update comment to include threadline
- Remove threadline from core docs groups_for_modules (module now in package)
- Verified: package compiles --warnings-as-errors; zero sibling deps; app-dir fixed; priv in files; Code.ensure_loaded? guards present
…ing sites (SITE 1 support_matrix freeze + SITE 2 telemetry baseline curated-floor delta) SITE 1 (support_matrix.ex): Remove alias Crosswake.Threadline.Telemetry. Convert @audit_ledger_support_truth (which called ThreadlineTelemetry.event_names/metadata_keys/forbidden_metadata_keys at module-eval, stale-beam trap) to @audit_ledger_support_truth_static with frozen literal values. Accessor def audit_ledger_support_truth/0 returns [@audit_ledger_support_truth_static]. Mirrors the @notification_support_truth_static (L263) / @auth_contract_truth_static (L133) pattern. SITE 2 (telemetry.ex): Cut static Crosswake.Threadline.Telemetry.forbidden_metadata_keys() call in attach_default_logger/1. Replace with MapSet.new(@baseline_forbidden_keys ++ companion_forbidden_keys). Remove "Threadline stays in-tree for Phase 136" comment. Expand @baseline_forbidden_keys from 10 to 11 keys: add :actor_ref as the curated universal-floor delta (D-5) — the HMAC-anonymized audit identity anchor that must be scrubbed with zero companions present. OAuth/passkey-ceremony keys (device/org/credential/PKCE/provider) are companion-domain and stay companion-local. Update phase136_decouple_proof_test.exs: DECOUPLE-05 assertion updated from 10-atom to 11-atom set (adds :actor_ref per D-5 Phase 139 expansion). Core compiles --warnings-as-errors with zero Crosswake.Threadline.* compile references in lib/.
…PII-floor test
- Move 10 threadline test files from core test/ to packages/crosswake_threadline/test/
(id_test, telemetry_test, plug/threadline_test, live/threadline_test, audit/ledger_test,
mix/tasks/crosswake.gen.audit_test, mix/tasks/crosswake.threadline_test,
phase91/phase92/phase96 closeout proof tests)
- Delete 10 test files from core (moved verbatim; phase96 path fixed ../../guides/)
- Add anti-drift PII-floor test to core telemetry_test.exs (D-5): core_baseline ⊆
union(companion forbidden_metadata_keys) with two stub companions; non-vacuous guard
- Add baseline count assertion: exactly 11 atoms post-Phase-139
- Fix circular-dep bug (Rule 1): remove {:crosswake_threadline, path:...} from core
mix.exs — crosswake_threadline→crosswake path dep created MixProject double-load error;
rewrite phase133 TELEM-04 to emit threadline events via :telemetry.execute directly
- Fix support_matrix_test: remove Crosswake.Threadline.Telemetry.* calls (module now in
pkg); assert frozen literal values directly (SITE 1 freeze post-extraction)
- Add crosswake_threadline row to companion_compatibility.md (drift test required it)
- Pre-add 6 failing assertions to package tests for Tasks 2 + 4 (RED phase)
- Core suite: 910 tests, 0 failures
… on_conflict, advisory moduledoc - Add advisory @moduledoc: row_hash/prev_hash are fingerprints NOT tamper-evidence; idempotency_key UNIQUE index is the real integrity guarantee - Add handle_event/4 telemetry handler with try/rescue crash-isolation: write failures log via Logger.error and return :ok — NEVER reraise (reraise auto-detaches handler causing silent audit blackout) - Add on_conflict: :nothing, conflict_target: :idempotency_key to both handle_event (direct insert) and record_in_multi/3 (Ecto.Multi insert) for idempotent replay - Add attach/2 convenience function to attach as :telemetry handler - Fix: remove all 'reraise' text from template (test refutes its presence) - Package gen.audit test lane: 5 tests, 0 failures
…tion (async: true) - 4 canary tests: Telemetry.event_names/0 == 3, Plug.Threadline.init([]) header_name, Audit.Ledger.actor_ref/2 → 64-char hex, zero-sibling-dep guard (reads real dep list) - async: true (threadline NOT a :companions registrant, no Application.put_env) - Vacuity-safe: dep list non-empty check + refute :crosswake_sigra + :crosswake_chimeway - No setup block, no companion-behaviour assertions (threadline is not a Companion) - 4 tests, 0 failures
…ac_secret app-env key - actor_ref/2 raise message now explicitly names: (1) the :secret keyword option — actor_ref(id, secret: "...") (2) the :audit_hmac_secret Application env key for config-based resolution - Stays a hard ArgumentError (fail-loud; not silent — DoS mitigation T-139-17) - Follows brandbook §6 voice: calm, specific, actionable; names exact keys/paths - 6 ledger tests, 0 failures
…s-guard) - add no-engine non-companion branch for crosswake_threadline (if/elif/else structure) - three module-shipment canaries: Telemetry.event_names/0 == 3, Plug.Threadline.init/1 header_name, Audit.Ledger.actor_ref/2 64-char hex - zero-sibling-dep invariant test: refutes crosswake_sigra + crosswake_chimeway in deps - suppress-guard (PACKAGE != crosswake_threadline) on default companion-behaviour assertions (enabled?/1, companion_id/0, validate_dependency/0 — threadline has none; calling them raises) - step 6 config: threadline skips :companions registration (not a Crosswake.Companion implementor) - update usage comment with threadline non-companion no-engine invocation form - bash -n parses clean; all three grep verifications pass
…ease component
- release-please-config.json: add packages/crosswake_threadline block (elixir, separate-pull-requests,
one-shot release-as 0.1.0, _TODO_release_as citing Phase 139) — NOT in linked-versions (D-8)
- .release-please-manifest.json: add packages/crosswake_threadline: 0.1.0
- examples/phoenix_host/mix.exs: add {:crosswake_threadline, path: '../../packages/crosswake_threadline'}
path dep after chimeway; update deps comment to include Phase 139
- guides/companion_compatibility.md: update crosswake_threadline row companion_id to N/A
(not a :companions registrant — wired via Plug/LiveView on_mount, not the registry; engine dep none)
- both JSON files valid; threadline not in linked-versions lockstep group
- add threadline_release_created/tag_name/version outputs (double-dash path alias contract) - add publish-hex-threadline job: gates on threadline_release_created (never aggregate), CROSSWAKE_RELEASE=1, checkout at threadline_tag_name, packages/crosswake_threadline working-dir, deps+compile+test+dry-run+publish, Hex.pm propagation poll (36 attempts) - add clean-room-proof-threadline job: needs [release-please, publish-hex-threadline], no ENGINE arg (no-engine non-companion mode; installs crosswake + crosswake_threadline, NOT sigra, NOT chimeway), invokes verify_companion_cleanroom.sh crosswake_threadline version (module-shipment canaries) - extend release-as-cleanup if: condition to include threadline_release_created; add strip block for crosswake_threadline (python3 script/strip_release_as.py crosswake_threadline) - extend release-failure-alert needs + body to cover publish-hex-threadline and clean-room-proof-threadline - all threadline jobs gate on threadline_release_created (D-8 per-component gate, THREAD-03) - YAML valid; no real publish (publish is human-gated Wave 4, deferred to family batch)
…sions - Collapse Threadline row prose-in-cell into one-liners (D-05): Companion ID -> N/A (observer), Engine Dependency -> optional plug/lv - Move Crosswake.Plug.Threadline / on_mount wiring to new ## Threadline wiring prose section below the table - Set all five Current Version cells to backticked unpublished (D-06) - Add anti-hand-edit HTML comment above the table; preserve compat-03 contract comment the drift test keys on - Update Current Version prose to reflect the unpublished pre-publish state
…ift test - proof.compat_03.no_inter_companion_columns (D-07): parse header row, drop col 0 (Hex Package), refute any header cell matching crosswake_\w+ — makes the 'no inter-companion columns' invariant machine-checked so a future 'Requires crosswake_sigra' column fails CI (matrix stays O(N)) - proof.compat_03.version_cell_format (D-08): each Current Version cell must be `unpublished` or a bare backticked semver; FORMAT only, no specific version asserted (hex.pm stays authority) - Add header_row_cells/1 + current_version_column_index/1 helpers, sharing the existing '^\|.*Hex Package.*\|' header-detection idiom - Add core-1.0 compound-'or' constraint TODO near extract_hex_req_from_if/1 (D-09) - No existing Phase 132 assertion removed or renamed
…chimeway - Iterate event_names/0 live (never hardcoded), drive Telemetry.execute/3 - Assert supplied declared metadata keys present via subset Map.has_key? - No exact-count assertion (avoids >=24 cross-package coupling) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…xception - Part (a): iterate event_names/0 live, assert :thread_id present (subset) - Part (b): drive Plug.Threadline error path so :exception fires + reraise asserted - Sanitized :exception metadata is empty (kind/reason not allowlisted) — PII-safe Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…t regression - proof.telem_04.no_reserved_count_assertion inspects file source, asserts the length(...) >= N idiom count on non-comment lines is 0 (D-15) - Guard pattern assembled so it does not self-invalidate - Note anti-drift subset invariant home (telemetry_test.exs) — not duplicated (D-18) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add numbered Step 0 blocking gate (pure/compile-coupled/observer triage) - Observer row names both threadline sites (@audit_ledger freeze + telemetry cut) - Replace broken '&& echo FAIL || echo CLEAN' with 'if grep -rn --exclude-dir=packages...; then exit 1; fi' - Widen scope to lib/ test/ mix.exs, both ref forms + a lib/crosswake/ module-attribute pass - Add exit-code-trap comment + D-13 flagged-legit-core-file (EXTRACT-03 behavior-not-module) instruction
- Add '> If this step fails:' recovery callouts after Step 10 (verify script) and Step 11 (guards) - Footer now tags all five companions by type: rulestead/rindle (pure), sigra/chimeway (compile-coupled), threadline (observer) - Update Next line (family complete) + bump Recipe version to Phase 140
- Author 'Pipeline primitives (verified present)' section of new docs/COMPANION-PUBLISH-RUNBOOK.md - Record confirmed on-disk locations for all three companions: release-please-config component blocks (separate-pull-requests + release-as 0.1.0 + _TODO_release_as), manifest 0.1.0 baselines, publish-hex-<name> jobs (per-component gate), within-run clean-room-proof-<name> needs edges, release-failure-alert coverage - Document D-02: no cross-companion needs: edge exists or should be added (needs cannot span workflow runs; sequencing is runbook discipline) - All primitives present, no BLOCKER; no CI/config/script file modified
- Preconditions (D-01): origin-sync landed + 137/138/139 execution-verified; deferred != indefinite - Per-companion publish loop (D-03): merge ONE Release PR -> wait publish-hex + clean-room-proof green -> confirm hexdocs resolves -> merge release-as-cleanup PR -> next; fixed order sigra -> chimeway -> threadline (observer last) - Hex ~60-min revert window (mix hex.retire, not re-push) + 'if release-failure-alert fires, STOP' hard stop - Ship-gate ordering (D-04): register_required_checks.sh green-first DRY_RUN=1 then DRY_RUN=0; hard rule that publish-hex-*/clean-room-proof-* must NOT be registered as required checks (permanent PR deadlock) - Scope reconciliation (D-01): readiness = complete Phase-140 FAMILY-04 deliverable; execution deferred to autonomous:false plan 140-05 - Documentation only: no hex publish, no registration, no CI-edge change
Wave 1 executed sequentially on main (worktree isolation degraded: local main 44 commits ahead of origin, #683). All 4 plans green. Wave 2 (140-05 batched family publish) is human-gated and deferred. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lished) Bring [Unreleased] Deferred-non-shipped claims current: sigra/chimeway/ threadline all extracted (phases 137-139) with Side-A telemetry contract tests + disciplined compat rows (phase 140); batched hex publish still a deferred human gate. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…esis Untracked planning artifacts belonging on origin. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Phase 71 notification workflow proof moved from core into the chimeway package during CHIME-01 extraction (phase 138), but phase71-proof.yml still ran it from packages/crosswake_sigra (the phase-137 wiring assumed sigra). mix test could not find the path -> the merge-blocking notification lane failed. Point working-directory at packages/crosswake_chimeway where the test now lives (verified green: 6 tests, 0 failures). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Scope
Local
mainis a clean superset oforigin/main— 60 commits ahead, 0 divergence (fast-forwardable). This boundary PR lands the accumulated v17.0 "Companion Family Completion" work (phases 137–140) onto origin. No hex publish happens here — the batched family publish stays a deferred human gate.Why
Per
docs/MILESTONE-BOUNDARY-HYGIENE.md: Crosswake accumulates on protected localmainand syncs via a single boundary PR at natural checkpoints. This is the phase-140 checkpoint — it unblocks the origin-sync precondition for the eventual family publish (140-05).Shape (planning vs code split)
packages/crosswake_sigra,crosswake_chimeway,crosswake_threadline), core:companions-registry decoupling, per-package Side-A telemetry contract tests, compat-matrix drift guards (O(N) column + version-cell format), hardened extraction recipe, publish runbook.Tests
Phase-140 gates green: compat drift proof-132 6/0, telemetry proof-133 9/0, companion telemetry suites sigra 4/0 · chimeway 6/0 · threadline 14/0. Earlier phases executed green in-tree (137/138/139 verified). Main CI is green.
Deferred / admin follow-ups
🤖 Generated with Claude Code