Skip to content

Cover fan-out degrade refinements (0069)#164

Merged
chris-colinsky merged 2 commits into
mainfrom
feature/0069-fan-out-degrade-refinements
Jun 17, 2026
Merged

Cover fan-out degrade refinements (0069)#164
chris-colinsky merged 2 commits into
mainfrom
feature/0069-fan-out-degrade-refinements

Conversation

@chris-colinsky

Copy link
Copy Markdown
Member

Summary

Adopts proposal 0069 (spec v0.59.0), which refines 0066's fan-out degrade contribution rules. python's runtime already satisfied all three refinements, so this PR is conformance coverage with no library behavior change.

The three refinements (all already conformant):

  1. An omitted extra_outputs source contributes a positional null slot (index-aligned with target_field), not "not contributed".
  2. An absent collect_field on any fan-in path is a null slot and the fan-in does not raise, with the caveat that under a strict-element reducer (concat_flatten / merge_all) a null contribution still raises ReducerError. python does not suppress it: the reducer runs in the engine merge, downstream of the fan-in.
  3. A degraded slot survives a checkpoint + resume round-trip.

Third of four PRs folding the v0.14.0 consolidated spec-review findings (0068 through 0071) into the release.

Changes

  • Fixture 069 split. 069 is a mixed fixture: its FI-degrade cases (1-2) run in the pipeline-utilities runner; its degrade + crash_injection + resume case (3) runs in the checkpoint runner. The two runners partition cases on a checkpointer / resume / crash_injection marker. The checkpoint runner gains a small static-degrade FailureIsolationMiddleware translator (the only degrade shape its fixtures use; the callable forms stay with pipeline-utilities) and leaves non-failure_isolation instance middleware unwired, as before.
  • Strict-reducer unit test. A callable degrade that nulls a slot under concat_flatten raises ReducerError (callable form because a static degrade omitting collect_field is a 0066 compile error).
  • Pin to v0.59.0: conformance.toml (spec_pin + [proposals."0069"]), the three spec-version sync points, regenerated AGENTS.md; CHANGELOG pin-summary.

Testing

  • uv run pytest tests/: 1320 passed, 376 skipped.
  • ruff and pyright clean.
  • Verified the split partitions every case to exactly one runner (no silently-skipped checkpoint fixtures).

Adopt proposal 0069 (spec v0.59.0), which refines 0066's fan-out degrade
contribution. python's runtime already satisfied all three refinements,
so this is conformance coverage with no library behavior change:

- Fixture 069 is a mixed fixture; its FI-degrade cases run in the
  pipeline-utilities runner and its crash_injection/resume case in the
  checkpoint runner. The two runners partition cases on a checkpointer /
  resume / crash_injection marker. The checkpoint runner gains a small
  static-degrade FailureIsolationMiddleware translator for the degrade.
- A unit test pins the strict-element-reducer caveat: a degrade that
  nulls a slot under concat_flatten / merge_all still raises ReducerError
  (the engine merge runs the reducer; the fan-in does not suppress it).

Advance the pinned spec to v0.59.0.
Copilot AI review requested due to automatic review settings June 17, 2026 21:33

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the repo to openarmature-spec v0.59.0 (proposal 0069) and adds conformance coverage for the refined fan-out degrade contribution rules, without changing runtime library behavior.

Changes:

  • Added a focused unit test asserting ReducerError when a degraded (null) slot hits a strict-element reducer (concat_flatten).
  • Split fixture 069 coverage across runners by skipping checkpoint-concern cases in test_pipeline_utilities.py and adding fixture 069 to the checkpoint runner (plus a minimal FI instance-middleware translator there).
  • Bumped spec pin/version sync points to v0.59.0 and recorded proposal 0069 in conformance.toml and the changelog.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tests/unit/test_fan_out.py Adds strict-reducer degrade/null-slot unit coverage for proposal 0069 caveat.
tests/test_smoke.py Updates __spec_version__ assertion to 0.59.0.
tests/conformance/test_pipeline_utilities.py Includes fixture 069 and skips checkpoint-concern cases in this runner.
tests/conformance/test_checkpoint.py Includes fixture 069 checkpoint case handling and translates FI instance middleware (static form).
src/openarmature/AGENTS.md Regenerates bundled agent doc header for spec v0.59.0.
src/openarmature/init.py Updates __spec_version__ to 0.59.0.
pyproject.toml Updates tool.openarmature.spec_version to 0.59.0.
conformance.toml Pins spec to v0.59.0 and marks proposal 0069 as implemented.
CHANGELOG.md Updates the consolidated spec-pin summary to include v0.59.0 / proposal 0069.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread tests/conformance/test_pipeline_utilities.py
Comment thread tests/conformance/test_checkpoint.py
Comment thread tests/conformance/test_checkpoint.py
Address PR review on the fixture-069 split:

- Both cases-loops now count the cases they drive and assert at least
  one ran, so a cases-shaped fixture whose cases are all skipped (a
  routing mistake) fails loudly instead of passing vacuously. This is
  the structural guard for the silent-skip hazard the split introduced.
- _translate_fi_instance_middleware validates that a failure_isolation
  entry carries a degraded_update and names the fan-out node in its
  errors, so a malformed fixture fails actionably instead of with a
  bare KeyError.
@chris-colinsky chris-colinsky merged commit bf770ed into main Jun 17, 2026
6 checks passed
@chris-colinsky chris-colinsky deleted the feature/0069-fan-out-degrade-refinements branch June 17, 2026 21:44
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.

2 participants