skip to content

Under pull-based delivery, a merged manifest is denied by cluster policy - where does that denial surface, and who sees it?

level: middleimportance: should knowfreq 48%

answer

  1. not on the pull request
  2. the applier reports it, not the forge
  3. sync condition and agent logs
  4. platform team sees it first
  5. minutes to hours after merge

basics

~20 s

It surfaces on the reconciler: a failed sync condition and a degraded or unhealthy status carrying the rejection message, plus the agent logs. It never reaches the pull request, which closed green before the apply was attempted.

solid answer

~40 s

The denial lands where the write was attempted, which is the reconciler, not the change. You see it as a sync failure condition on whatever the agent groups the manifests into, with the rejection text carried in the status, and in the agent logs. What you do not see is any change to the pull request: it merged, the run went green, and nothing writes back to a closed change. The reconciler retries on its own cadence, so the failure can appear minutes or hours after the merge, and the people watching those conditions are the platform team, not the author. Practically that means a violation authored by one team is first noticed by another, and the only way back is a corrective commit, since the merged branch is still the desired state.

go deeper

for a junior

Know that the rejection appears on the delivery agent as a failed sync and in its logs, and that a closed pull request never turns red afterwards.

for a middle

Explain the three reasons the author is not told: the change closed before the write, the signal flows back to the agent, and nothing maps the failing unit to a person.

for a senior

Show the operational fix: a denial message that names rule, object and remedy, and event routing that reaches the owning team without the platform team acting as a pager relay.

for a principal

Own the cost of the broken loop across many teams. Decide how much correlation plumbing is worth building versus how much you push back into pre-merge feedback, and who carries the pager meanwhile.

## The failure has a distinctive shape A change merges. Every check is green. The pull request closes. Then nothing happens, or something halfway happens, and hours later someone in a different team notices a red condition on a dashboard and starts asking whose change this was. That is the signature of a policy denial in a pull-based pipeline, and it is worth being able to describe precisely, because the diagnosis is entirely about *where signals live*. ## Where the denial actually appears The reconciler attempted a write to the API server. That write was refused, and the refusal came back to the caller. The caller is the agent, so the agent is where the information now lives, in three places: - **A sync or apply failure condition** on whatever unit the agent tracks (an application, a set, a namespace bundle), usually carrying the rejection text verbatim. - **A health status** that stops being healthy, because part of the desired state is not present. - **The agent logs**, which have the full detail and the timestamps. All three belong to the delivery system. None of them belong to the change. ## Why nothing reaches the author Three separate reasons stack up, and naming all three is what separates a good answer from a partial one. 1. **Time.** The pull request closed before the write was attempted. The reconciler picks the commit up on its own schedule, so by the time the API server refuses anything, the change is history. 2. **Direction.** The signal flows from the API server back to the agent. There is no channel from the agent to the forge unless someone built one. 3. **Correlation.** The failing unit is keyed to an application or a namespace, not to a commit author. Even if you did push a notification, something has to map the failing unit back to the commit and the commit back to a person. That mapping does not exist by default. ## Who is first to know, and why that is a problem The platform team, because they own the reconciler and its alerts. So the first responder to a violation is someone who did not write it, cannot judge whether the workload really needs those limits, and has no context on the change. They become a routing layer: read the condition, find the commit, find the author, ping them. That human relay is the real cost of the broken loop, and it scales badly across many teams. ## Rolling back is a commit, not a button One more consequence that catches people out. The merge succeeded, so the branch still describes the non-compliant state. Nothing about the denial undoes that. Until a corrective commit lands, the desired state and the live state disagree, and the cluster may sit in a partly-applied condition where some objects from the change went in and one did not. The way back is another change through the same path, which is a slower rollback than a pipeline that simply failed before applying anything. ## What to fix, in order of value **Invest in the denial message first.** It is the only text that travels with the failure to whoever reads it hours later, and that reader is almost never the person who wrote the rule. A message that names the rule, the offending field, the object, and the concrete fix turns a red condition into a self-service correction. A message that says the request was rejected by policy turns it into a support ticket. **Then build the correlation.** Route the agent failure events into the owning team channel, keyed by the path or namespace that team owns, so the platform team is not a pager relay. Carrying the commit in the event makes the mapping from failure to author mechanical. **Then reduce the volume that gets this far.** Keep the pre-merge check running so most violations are caught while the author is still holding the change, and reserve the late path for the residue that only the cluster can decide. ## The claims that are wrong That the failed apply turns the pull request red: nothing writes back to a closed change. That the denial rolls back the merge: the branch is untouched. That the author is alerted by default: nothing correlates the failing unit to a person. And that the change was never merged because it never deployed: merging and applying are separate events, and only the second one failed.

  • Why does the author not get notified automatically?
    Because the failing unit is keyed to an application or namespace, not to a commit author, and the signal flows from the API server back to the agent rather than out to the forge. Correlating a failed sync to a person needs a mapping from unit to commit to owner, and nothing builds that for you.
  • Why is the denial message the highest-value thing to invest in here?
    It is the only text that travels with the failure to whoever reads the condition hours later, and that reader is usually neither the rule author nor the change author. Naming the rule, the object, the offending field and the fix turns a degraded status into a self-service correction instead of a support ticket.
  • The change is already merged. What does rolling back look like?
    Another commit. The branch still describes the non-compliant desired state, and the denial does nothing to it, so until a corrective change lands the cluster stays in disagreement with git. There is no local artifact to discard, which makes this a slower recovery than a pipeline that failed before applying anything.

saying these in an interview costs you the question

  • Expects the failed apply to turn the pull request red
  • Thinks a denied apply reverts the merge commit
  • Assumes the change author is alerted by default
  • Says the change was never merged because it never deployed
  • Looks only in the build logs for the rejection text

context