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