Problem
Two templates independently decide which KEPs are publishable, using two copies of the same rule (stage in alpha/beta/stable/deprecated or status in implementable/implemented).
content/en/resources/keps/_content.gotmpl uses it to decide whether to AddPage.
layouts/shortcodes/keps-data.html uses its own copy ($hasPage) to decide whether a row links to /resources/keps/N/ or falls back to features.k8s.io/N.
$hasPage never checks that the page exists — it predicts what the generator did by re-deriving the same rule.
Suggested fix
One partial owning the rule, both callers reading it:
{{/* layouts/partials/kep-data.html — returns the filtered KEP slice */}}
{{- $out := slice -}}
{{- range $kep := $kepData -}}
{{- if or (in $validStages $kep.stage) (in $validStatuses $kep.status) -}}
{{- $out = $out | append $kep -}}
{{- end -}}
{{- end -}}
{{- return $out -}}
Problem
Two templates independently decide which KEPs are publishable, using two copies of the same rule (
stagein alpha/beta/stable/deprecated orstatusin implementable/implemented).content/en/resources/keps/_content.gotmpluses it to decide whether toAddPage.layouts/shortcodes/keps-data.htmluses its own copy ($hasPage) to decide whether a row links to/resources/keps/N/or falls back tofeatures.k8s.io/N.$hasPagenever checks that the page exists — it predicts what the generator did by re-deriving the same rule.Suggested fix
One partial owning the rule, both callers reading it: