Repository navigation
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
The single issue that replaces #294 and #296, both closed as shipped. Everything larger has landed:
spec.suspend, status.placement, the ambiguous-root refusal and the reconcile-request annotation
(#326), useKustomize and serializeNamespace (#328), the commitWindow / commit.message move and
the source-scope deletion (#330), the reference collapse onto meta.LocalObjectReference, the
ClusterWatchRule.spec.rules[].scope removal and the by_type / default metric split (#333).
What is left is small and additive. None of it needs a breaking release.
Legibility (from #296)
- Express the canonical path as a template constant rendered through
RenderPlacementTemplate,
pinned byte-for-byte againstResourceIdentifier.ToGitPath()across cluster-scoped, core,
grouped and sensitive identities. Retires the hand-writtencanonicalPathin
internal/manifestanalyzer/placement.go. -
{kindLower}as a placement template variable, plus the single-namespace recipe and its
identity caveat indocs/configuration.md. - One name for the built-in path across
docs/architecture.md,docs/configuration.mdand the
CRD comments: "canonical", sinceplacement.defaultis a user declaration.
Riders (from #294)
-
CommitRequest.spec.author, SAR-guarded (consumer ask ci(deps): Bump softprops/action-gh-release from 1 to 2 #5). - The
CommitRequestlifecycle hole: a TTL or an ownerRef, and thedeleteverb (F10). - The
defaultClusterProvidernot-found message (B6).
Decided, and dropped
- No
corev1.Eventon the GitTarget for a fall-back to canonical. The metric names the target and
the missingbyTypekey, andstatus.placementis the durable record. Two surfaces are enough. - No
TooManyStreamscap. It was queued to bound the per-namespace fan-out ofsourceNamespace: "*",
which feat(api)!: move commit batching onto GitTarget, delete allowedSourceNamespaces, and make sourceNamespace "*" cluster-wide #330 deleted outright. It was never in code; the docs no longer promise it. - No movable destination (consumer ask deps(deps): Bump github.com/onsi/gomega from 1.36.1 to 1.38.0 #6,
status.observedDestination).gitProviderRef,branch
andpathstay immutable; a folder moves by delete-and-recreate.
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request
Activity
docs: close the API wave and placement-visibility issues, and drop th…
sunib commentedon Sep 29, 2026
Everything on this issue is now resolved; #400 closes it on merge.
Legibility
BuiltinPlacementTemplate = "{namespace}/{groupPath}/{resource}/{name}{sensitiveSuffix}", rendered throughRenderPlacementTemplate. The placement ladder, the Git writer, the SOPS filename and the analyzer's plan output all call it, and a test pins it byte for byte againstToGitPath(). (feat!: expire finished CommitRequests and name the placement fallback the built-in path #400){kindLower}, with the single-namespace recipe and its identity caveat indocs/configuration.md. (feat!: expire finished CommitRequests and name the placement fallback the built-in path #400)spec.placement.defaultis a user declaration. This changes one metric label value:gitopsreverser_placements_total{source="canonical"}is nowsource="builtin"(seedocs/UPGRADING.md). (feat!: expire finished CommitRequests and name the placement fallback the built-in path #400)Riders
CommitRequest.spec.authoris declined. The principle is now written down indocs/spec/attribution.md: authorship is established, never asserted. A commit names the identity the API server authenticated, or says it is unknown. A name in a spec is only a claim, even behind a permission check, and it travels with the object when it is applied from Git. To commit under your own name, authenticate as yourself, for example through OIDC.configbutler.ai/delete-after: <RFC 3339>onto it (--commit-request-ttl, default48h) and deletes the request once that time has passed. Remove or edit the annotation to keep a request or move its deletion, or set it at creation. Requests that finished before the upgrade carry no annotation and are kept. (feat!: expire finished CommitRequests and name the placement fallback the built-in path #400)defaultClusterProvider not-found message already names the fix, since fix(watch): enforce ClusterProvider admission wherever rules compile #258.