@@ -9,6 +9,152 @@ The format is based on the regulated environment requirements:
99
1010---
1111
12+ ## [ 2026-06-17 09:00] - Pin deploy manifest image tags to the release version; crdgen back to stdout
13+
14+ ** Author:** Erick Bourgeois
15+
16+ ### Changed
17+ - ` Makefile ` : NEW ` set-image-version VERSION=… ` target — rewrites every
18+ ` ghcr.io/finos/5-spot* ` image tag under ` deploy/ ` (controller, both
19+ spot-schedule providers, reclaim agent, kata-config agent) to the given
20+ version. Tag-suffix-only regex, so it is independent of the tag committed in
21+ git. Added to ` .PHONY ` .
22+ - ` .github/workflows/build.yaml ` (` package-deploy-manifests ` , release-only):
23+ added a "Pin deployment image versions" step running
24+ ` make set-image-version VERSION=${{ needs.extract-version.outputs.tag_name }} `
25+ before tarring, so the released ` deploy-manifests.tar.gz ` references the image
26+ variant just built/pushed. Its "Regenerate CRDs" step now runs ` make crds ` .
27+ - ` src/bin/crdgen.rs ` : reverted to ** stdout** output (the binary no longer writes
28+ files or assumes ` deploy/crds/ ` exists — matches ` crddoc ` ). No-arg prints all
29+ CRDs as a ` --- ` -separated multi-doc stream (pipe-to-` kubectl ` -friendly); a
30+ positional selector (` scheduledmachine ` / ` timebasedspotschedule ` /
31+ ` capitalmarketsschedule ` ) prints just one. The file-writing approach was only
32+ introduced in the Phase-1 multi-version commit to host the schedule/spotSchedule
33+ CEL injection, which ADR 0009 removed — so crdgen is pure serialization again.
34+ - ` Makefile ` ` crds ` target: now owns the file layout, redirecting each selector
35+ to ` deploy/crds/<selector>.yaml ` .
36+ - ` deploy/crds/capitalmarketsschedule.yaml ` : regenerated (picks up the
37+ ` TimeBasedSpotScheduleSpec ` doc-comment fix in its description).
38+
39+ ### Why
40+ The deployment manifests hardcoded ` :v0.1.0 ` ; the release pipeline built/pushed
41+ ` ghcr.io/finos/5-spot:<tag> ` but shipped manifests still pointed at the stale
42+ tag. Pinning at release time keeps the shipped manifests in lockstep with the
43+ image that was actually built. crdgen returning to stdout keeps path/layout
44+ decisions with the caller (Makefile/CI), not baked into the binary.
45+
46+ ### Impact
47+ - [ ] Breaking change
48+ - [x] Requires cluster rollout
49+ - [ ] Config change only
50+ - [ ] Documentation only
51+
52+ ---
53+
54+ ## [ 2026-06-16 13:00] - ADR 0009: examples, time-based provider deploy manifests, and prose docs
55+
56+ ** Author:** Erick Bourgeois
57+
58+ ### Changed
59+ - ` src/crd.rs ` : ` ScheduledMachineSpec.schedule ` is now a ** required**
60+ ` SpotScheduleRef ` (was ` Option<ScheduleSpec> ` ); removed ` spec.spotSchedule ` ;
61+ added top-level ` spec.enabled ` master switch; removed ` ScheduleSpec ` and the
62+ ` v1alpha1 ` ` ScheduledMachine ` module; added the ` TimeBasedSpotSchedule ` CRD
63+ (spec + status) in ` spotschedules.5spot.finos.org ` . ` is_enabled() ` now reads
64+ ` spec.enabled ` .
65+ - ` src/providers/time_based.rs ` (+tests) and ` src/bin/spot_schedule_time_based.rs ` :
66+ NEW core/default provider controller — ` is_active_at ` /` next_transition ` /
67+ ` reconcile ` , mirroring ` capital_markets ` ; publishes ` status.active ` .
68+ - ` src/reconcilers/{scheduled_machine,helpers,spot_schedule_watch}.rs ` : drive
69+ activation solely from the single ` spec.schedule ` provider verdict; removed
70+ ` evaluate_schedule ` ; simplified ` compose_should_be_active ` (verdict + hold-last
71+ -state); replaced ` validate_activation_source ` with ` validate_schedule_ref ` ;
72+ emergency-reclaim loop-breaker now patches ` spec.enabled=false ` (never the
73+ shared provider object); watch reverse-index keys off ` spec.schedule ` .
74+ - ` src/metrics.rs ` (+tests): added ` fivespot_time_based_active ` /
75+ ` fivespot_time_based_transitions_total ` + record fns.
76+ - ` src/bin/{crdgen,crddoc}.rs ` : emit the ` TimeBasedSpotSchedule ` CRD; single
77+ ` v1beta1 ` ` ScheduledMachine ` (dropped the multi-version merge + schedule/
78+ spotSchedule XOR CEL); api.md regenerated.
79+ - ` deploy/admission/validatingadmissionpolicy.yaml ` : removed the inline-schedule
80+ rules (cron/day/hour) and the "at least one" rule; the remaining schedule rule
81+ pins ` spec.schedule.apiVersion ` to the provider group; ` v1beta1 ` -only.
82+ - ` docs/adr/0009-*.md ` (+ index; amended 0006 §1/§3 and 0007);
83+ ` docs/architecture/calm/architecture.json ` (provider model + flows; validated,
84+ diagrams regenerated).
85+ - ` examples/scheduledmachine-*.yaml ` : migrated all to ` 5spot.finos.org/v1beta1 ` ,
86+ added ` spec.enabled: true ` , and replaced every inline ` schedule: ` / removed
87+ ` spotSchedule: ` block with a single ` spec.schedule: ` provider reference. Basic
88+ / weekend / tainted / bad-taint / kata / child-cluster now reference a
89+ ` TimeBasedSpotSchedule ` ; ` scheduledmachine-spot-schedule.yaml ` references
90+ ` CapitalMarketsSchedule ` (` nyse-equities ` ) alone (no more AND-composition).
91+ - ` examples/timebasedspotschedule.yaml ` : NEW companion file defining the
92+ ` business-hours ` / ` weekend-only ` (ns ` default ` ) and ` business-hours-toronto `
93+ (ns ` hosted-cluster-alpha ` ) provider objects the SM examples reference.
94+ - ` examples/capitalmarketsschedule.yaml ` , ` examples/workshop/* ` : updated
95+ comments / shape to ` spec.schedule ` reference + ` spec.enabled ` ; workshop now
96+ installs the time-based provider and toggles ` spec.enabled ` / ` tbss ` .
97+ - ` deploy/spot-schedule-providers/time-based/ ` : NEW provider deploy bundle
98+ (serviceaccount / clusterrole / clusterrolebinding / deployment /
99+ kustomization), mirroring the capital-markets bundle — least-privilege RBAC
100+ (get/list/watch ` timebasedspotschedules ` , update/patch its ` /status ` ),
101+ hardened ` Deployment ` running ` spot-schedule-time-based ` .
102+ - ` docs/src/** ` and ` docs/mkdocs.yml ` : rewrote all spot-schedule prose to the
103+ ADR 0009 shape (required ` spec.schedule ` provider ref; ` TimeBasedSpotSchedule `
104+ as the default first-party provider; ` spec.enabled ` master switch; emergency
105+ reclaim sets ` spec.enabled ` ; VAP single group-pin rule 4 / ` v1beta1 ` -only
106+ matchConstraints). Added a new ` docs/src/guides/time-based-schedule.md ` guide
107+ and listed it in the nav.
108+
109+ ### Why
110+ ADR 0009 reified the former inline ` ScheduledMachine.spec.schedule ` window into
111+ the first-party ` TimeBasedSpotSchedule ` provider, made ` spec.schedule ` a required
112+ provider reference, dropped the SM ` v1alpha1 ` version and the ` spotSchedule `
113+ field, and introduced ` spec.enabled ` . Examples, deploy manifests, and docs had
114+ to match the new contract.
115+
116+ ### Impact
117+ - [x] Breaking change (pre-release CRD contract: ` spec.schedule ` is now a
118+ required provider reference, ` spec.spotSchedule ` removed, SM ` v1alpha1 ` dropped)
119+ - [x] Requires cluster rollout (new CRD + provider controller + RBAC; re-apply
120+ ` deploy/crds/ ` and the time-based provider bundle)
121+ - [ ] Config change only
122+ - [ ] Documentation only
123+
124+ ---
125+
126+ ** Author:** Erick Bourgeois
127+
128+ ### Changed
129+ - ` docs/src/guides/create-your-own-provider.md ` : NEW standalone guide — a
130+ complete, copy-pasteable walkthrough building a minimal ` ManualSchedule `
131+ provider end to end: CRD (namespaced, ` status ` subresource), controller
132+ (status-patch reconcile, ` Ready ` semantics, event-driven not polling),
133+ least-privilege RBAC, deployment, referencing from a ` ScheduledMachine ` ,
134+ verification, and additive versioning. Language-agnostic.
135+ - ` docs/mkdocs.yml ` : grouped both provider guides under a ** Spot Schedule
136+ Providers** sub-section in Guides (CapitalMarketsSchedule + Create Your Own
137+ Provider) — makes the existing capital-markets guide more discoverable.
138+ - ` docs/src/reference/spot-schedule-contract.md ` : replaced the inline
139+ "implement your own" walkthrough with a pointer to the new guide (reference =
140+ spec, guide = how-to); added both guides to See-also.
141+ - ` docs/src/guides/capital-markets-schedule.md ` : added a See-also section
142+ cross-linking the concept, contract, and the new provider guide.
143+
144+ ### Why
145+ The "create your own provider" how-to was buried inside the contract * reference*
146+ page; operators asked for it (and the CapitalMarketsSchedule guide) as
147+ first-class entries under ** Guides** . Splitting how-to from spec also keeps the
148+ reference page focused.
149+
150+ ### Impact
151+ - [ ] Breaking change
152+ - [ ] Requires cluster rollout
153+ - [ ] Config change only
154+ - [x] Documentation only
155+
156+ ---
157+
12158## [ 2026-06-15 10:30] - Restore dropped spot-schedule metric functions (build fix)
13159
14160** Author:** Erick Bourgeois
0 commit comments