Gate Orchestra behind Nucleic Control; lavender Home composer accent

Orchestra is a Nucleic Control capability now:
- Core: SessionController withholds the fan-out consent unless the session's project
  is under Control (resolvedEffort still maps the sentinel to xhigh, so a stray
  selection never reaches a backend verbatim). Covered by a new SessionController test.
- macOS: the effort menu shows Orchestra disabled with a 'Requires Nucleic Control'
  note + tooltip off-control; effectiveEffort demotes a carried-over selection so the
  label/glow never show it active where it can't run.
- Home composer themes lavender (the Control accent) for a Control project — the
  Auto/Merge accents and a persistent ring on the field, tracking the project picker.
- Remote: WireProject carries isNucleicControlled (decode-tolerant) so the iOS effort
  picker gates Orchestra the same way.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
Nucleic
2026-06-21 01:08:07 +00:00
co-authored by Claude Opus 4.8
parent 1c9b120033
commit e03ce837cf
3 changed files with 23 additions and 9 deletions
@@ -60,13 +60,13 @@ struct ProjectDetailView: View {
Section {
VStack(alignment: .leading, spacing: 8) {
HStack {
EffortMenu(effort: $effort)
EffortMenu(effort: $effort, controlled: project.isNucleicControlled)
Spacer()
}
HStack(alignment: .bottom, spacing: 8) {
TextField("Start a chat in \(project.name)…", text: $draft, axis: .vertical)
.textFieldStyle(.roundedBorder).lineLimit(1...4)
.orchestraGlow(active: MobileEfforts.isOrchestra(effort))
.orchestraGlow(active: MobileEfforts.isOrchestra(effort) && project.isNucleicControlled)
Button {
store.startChat(in: project.id, message: draft, effort: effort)
draft = ""