Skip to content

Reject work dependencies whose producer cannot serve the consumer objective - #234

Merged
bigboateng merged 2 commits into
mainfrom
fix/work-output-target-coverage
Aug 21, 2026
Merged

Reject work dependencies whose producer cannot serve the consumer objective#234
bigboateng merged 2 commits into
mainfrom
fix/work-output-target-coverage

Conversation

@bigboateng

Copy link
Copy Markdown
Contributor

Summary

  • normalizeWorkInputProducers (and the transition-parameter work-output path) prove only predicate and priority ordering, so a valid program can attach producer work to plan.abandon (supported only for safely-abandoned) and dependent consumer work to publication.observe (supported for published-pr targets). Compilation and runtime-manifest construction accepted both.
  • During a published-pr run, publication.observe is selected, the missing work output redirects to plan.abandon, targeted resolution refuses plan.abandon for that objective, and the unchanged state selects publication.observe again — a permanent zero-progress path.
  • Definition.RuntimeManifest now requires, after trusted TargetIDs are projected (including the plan.abandon selection-class upgrade), that every work-output producer's projected target set covers its consumer's target set. Both dependency edge kinds are checked: transition parameter bindings and foreground-work inputs. Per-edge coverage extends transitively across chains.
  • Enforcement lives at the manifest boundary because compile-time checks operate on IR before trusted TargetIDs exist. Hard rejection, no compatibility shim (alpha).
  • A formal review with Locus (supervisory-control analysis) certified the pre-fix runtime as blocking — every reachable state of a published-pr run had no path to a target state — and the fixed design as nonblocking (fail-closed rejection at manifest construction).

Test plan

  • New TestWorkOutputProducerMustCoverConsumerTargets: extends the abandonment-entry fixture with the uncovered dependency; the document compiles (demonstrating the gap) and RuntimeManifest rejects it.
  • Positive case in the same test: the identical dependency with a covering producer (plan.validate, which supports every trusted class the consumer supports) stays admissible.
  • go test ./flow/softwaredelivery/... passes; full module suite matches origin/main (the only failures are pre-existing TypeScript-frontend conformance tests that fail identically on a clean checkout).

…ective

Compilation proves only predicate and priority ordering for work-output
dependencies, so a program could attach producer work to plan.abandon
(safely-abandoned only) and dependent consumer work to publication.observe
(published-pr). A published-pr run then selects the consumer, redirects to
the missing producer output, targeted resolution refuses plan.abandon for
that objective, and the unchanged state re-selects the consumer: a
permanent zero-progress path.

RuntimeManifest now requires, after trusted TargetIDs are projected, that
every work-output producer's target set covers its consumer's target set,
over both transition-parameter and foreground-work-input edges.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Codex automated review

Verdict: patch is correct
Confidence: 0.93

The new manifest validation consistently covers work-output dependencies in transition parameters and foreground-work inputs after trusted target projection. No actionable regression was established. Model-level verification is not required before merge.

@bigboateng
bigboateng merged commit fffbab0 into main Aug 21, 2026
18 checks passed
@bigboateng
bigboateng deleted the fix/work-output-target-coverage branch August 21, 2026 00:52
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