1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
[]
= "polyc-controller"
= true
= "Conversation CRD + kube reconciler for the polychrome control plane."
= true
= true
= true
= true
= true
[]
# Software-system layer — see docs/architecture/. A Component composed
# into Containers; depends inward only (never on a Container).
= "component"
# Logical plane role in the separated state, projection, and query topology
# (#1565, chunk A1) — a different question than `layer` above. The canonical
# policy is arch-capabilities.toml; scripts/check_plane_capabilities.py checks it.
= "shared"
[]
= { = "=2026.9.0", = "../k8s-types" }
# ToolService health checks dial the connector's MCP endpoint via the shared
# streamable-HTTP client. `polychrome-tools` does NOT depend on this crate, so
# this path dep introduces no dependency cycle.
= { = "=2026.9.0", = "../tools" }
# For the `ToolExecutor` trait, whose `specs()` reads the connector's cached
# tool catalogue. `polychrome-agent` does NOT depend on this crate (no cycle).
= { = "=2026.9.0", = "../agent" }
# For `ToolSpec` — the shape `ToolExecutor::specs()` returns, mapped into the
# reflected `ToolDescriptor` catalog. Already in the graph via agent/tools.
= { = "=2026.9.0", = "../llm" }
= true
# `control_plane` helpers return `anyhow::Result` — the shared shape both the CLI
# (`polychrome send`) and the TUI cockpit already consume for pod resolution.
= true
= { = true, = ["client", "runtime", "derive", "rustls-tls"] }
= true
= true
= true
# `crdgen`'s CRD emission (`src/bin/crdgen.rs`) — kubectl sniffs a leading `{`
# and treats an entire JSON-documents-joined-by-`---` stream as one JSON blob
# (#1233), so the committed `manifests/crds/crds.yaml` needs real YAML
# documents. The same maintained fork `polyc-control-plane`/`polyc-harness`/
# `polyc-runtime` already pin crate-local (`serde_yaml` is deprecated
# upstream); kept crate-local here too rather than promoted to
# `[workspace.dependencies]`, matching those crates' precedent.
= "0.10"
= true
= true
= true
= true
= true
# `tokio::join!` to drive the Conversation and ToolService controllers
# concurrently from the single `run` entrypoint. Only the macro is needed here
# (the binary owns the runtime), so no runtime feature is pulled in.
# `time` for the ServiceDefinition pre-flight retry sleep (the watch stays
# dormant until the apps namespace/RBAC is provisioned).
= { = true, = ["macros", "time"] }
# RFC3339 timestamps for the ToolService status `lastCheckedAt`, plus parsing
# them back to compute health-check staleness. Already in the dependency graph
# (k8s-openapi's `Time` wraps `chrono::DateTime`); pinned to the locked 0.4
# line. `plan` stays pure by taking "now" as an argument — chrono is only used
# to format/parse the timestamp string.
= { = "0.4", = false, = ["clock", "std"] }
# Standard five-field cron-expression validation for `RoutineSpec.schedule`
# (`Routine`'s pure spec validator) AND the actual next-fire prediction
# (`routine_next_fire`, #1491) the in-process scheduler, the confirmation
# card, and the inspector all share (INV-RL10). Kept crate-local — no other
# crate parses cron expressions, so this is not promoted to
# `[workspace.dependencies]`.
= "0.1.0"
# IANA zone-name validation for `RoutineSpec.timezone` (`Routine`'s pure spec
# validator), and the wall-clock composition `routine_next_fire` needs to turn
# a `cron` schedule's local time into real UTC instants (the "fake UTC" trick
# documented on that module) — handling a nonexistent (spring-forward) or
# ambiguous (fall-back) local time via `LocalResult`. Kept crate-local — no
# other crate validates zone names, so this is not promoted to
# `[workspace.dependencies]`.
= "0.10"
# `CancellationToken` for `fanout::await_watchable_cancellable` (#1370 review
# finding 3) — the in-process routine scheduler's own shutdown must be able
# to unwind its watch preflight, not just tests' use of the same type below.
= { = true }
[]
# `test-util` backs `fanout::tests`' `#[tokio::test(start_paused = true)]`
# (review finding 3's cancellation-during-retry-sleep test), mirroring
# `polyc-control-plane`'s own precedent for the same attribute.
= { = true, = ["macros", "rt", "rt-multi-thread", "net", "time", "test-util"] }
# Fake `kube::Client` for the `RollHarness` concurrency-cap test (a hand-rolled
# `tower::service_fn` + `kube::Client::new`, the same pattern
# `polyc-control-plane`'s `lease.rs` already uses for `Api<Lease>` — see that
# module's `fakes::fake_client`). Test-only: production never constructs a
# `tower::Service` directly.
= { = "0.5", = ["util"] }
= { = true }
# Seam-3 fixture (tests/toolservice_catalog.rs): stand up an in-process MCP
# server so `health_check` reflects a real `list_tools` (schema + annotations)
# into the status catalog. Mirrors the `polyc-tools` round-trip fixture.
= { = "3", = [
"server",
"transport-streamable-http-server",
] }
= { = true }
= true
# e2e only: pin a rustls crypto provider so the kube client's TLS can pick one
# deterministically (rustls 0.23 refuses to auto-select when several are present).
= { = "0.23", = false, = ["ring"] }
[]
# Live-cluster e2e tests (tests/e2e.rs). Off by default and never run in CI,
# which is Linux + cluster-less; run locally against the current kube context
# with `cargo test -p polyc-controller --features e2e`.
= []
[]
= true