@orchestraworks/cli 0.5.8 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/api/approval.js +3 -3
  3. package/dist/cli/commands/outpost/local.js +3 -3
  4. package/dist/cli/commands/outpost/machine-names.d.ts +17 -0
  5. package/dist/cli/commands/outpost/machine-names.js +22 -0
  6. package/dist/cli/commands/outpost/up.js +7 -5
  7. package/dist/cli/commands/worker/enroll.d.ts +4 -3
  8. package/dist/cli/commands/worker/enroll.js +4 -3
  9. package/dist/cli/core/auth.d.ts +11 -1
  10. package/dist/cli/core/auth.js +21 -4
  11. package/dist/cli/core/session-body.d.ts +1 -1
  12. package/dist/cli/core/session-body.js +1 -1
  13. package/dist/cli/firstRun.js +2 -2
  14. package/dist/cli/main.js +4 -3
  15. package/dist/constructs/environment.d.ts +24 -11
  16. package/dist/constructs/environment.js +76 -12
  17. package/dist/constructs/secret.d.ts +17 -7
  18. package/dist/constructs/secret.js +24 -16
  19. package/dist/core/labels.d.ts +32 -6
  20. package/dist/core/labels.js +70 -8
  21. package/dist/engine/diff.js +38 -11
  22. package/dist/engine/gateway-key-reconcile.d.ts +1 -2
  23. package/dist/engine/gateway-key-reconcile.js +19 -15
  24. package/dist/engine/pipeline-reconcile.js +2 -2
  25. package/dist/engine/pipeline-workflow-reconcile.js +15 -9
  26. package/dist/engine/reconcile.js +48 -15
  27. package/dist/engine/refusals.d.ts +0 -5
  28. package/dist/engine/refusals.js +1 -5
  29. package/dist/engine/secrets-apply.d.ts +10 -14
  30. package/dist/engine/secrets-apply.js +12 -17
  31. package/dist/engine/workflow-reconcile.d.ts +1 -1
  32. package/dist/generated/cli-commands.json +170 -34
  33. package/dist/generated/providers.d.ts +40 -0
  34. package/dist/generated/providers.js +30 -0
  35. package/docs/REFERENCE.md +9 -7
  36. package/node_modules/@orchestraworks/client/dist/esm/models/ApiErrorDetail.d.ts +1 -1
  37. package/node_modules/@orchestraworks/client/dist/esm/models/CreateEnvironmentRequest.d.ts +7 -0
  38. package/node_modules/@orchestraworks/client/dist/esm/models/CreateEnvironmentRequest.js +3 -0
  39. package/node_modules/@orchestraworks/client/dist/esm/models/CreateSecretRequest.d.ts +4 -3
  40. package/node_modules/@orchestraworks/client/dist/esm/models/Environment.d.ts +7 -0
  41. package/node_modules/@orchestraworks/client/dist/esm/models/Environment.js +3 -0
  42. package/node_modules/@orchestraworks/client/dist/esm/models/EnvironmentCredential.d.ts +38 -0
  43. package/node_modules/@orchestraworks/client/dist/esm/models/EnvironmentCredential.js +45 -0
  44. package/node_modules/@orchestraworks/client/dist/esm/models/EnvironmentProvisionSpec.d.ts +1 -1
  45. package/node_modules/@orchestraworks/client/dist/esm/models/EnvironmentProvisionSpecRequest.d.ts +1 -1
  46. package/node_modules/@orchestraworks/client/dist/esm/models/EnvironmentSnapshot.d.ts +1 -1
  47. package/node_modules/@orchestraworks/client/dist/esm/models/InjectionRecipe.d.ts +6 -0
  48. package/node_modules/@orchestraworks/client/dist/esm/models/InjectionRecipe.js +2 -0
  49. package/node_modules/@orchestraworks/client/dist/esm/models/OAuthTokenRequest.d.ts +1 -1
  50. package/node_modules/@orchestraworks/client/dist/esm/models/Secret.d.ts +1 -7
  51. package/node_modules/@orchestraworks/client/dist/esm/models/Secret.js +0 -4
  52. package/node_modules/@orchestraworks/client/dist/esm/models/UpdateEnvironmentRequest.d.ts +7 -0
  53. package/node_modules/@orchestraworks/client/dist/esm/models/UpdateEnvironmentRequest.js +3 -0
  54. package/node_modules/@orchestraworks/client/dist/esm/models/UpdateSecretRequest.d.ts +4 -3
  55. package/node_modules/@orchestraworks/client/dist/esm/models/index.d.ts +1 -0
  56. package/node_modules/@orchestraworks/client/dist/esm/models/index.js +1 -0
  57. package/node_modules/@orchestraworks/client/dist/models/ApiErrorDetail.d.ts +1 -1
  58. package/node_modules/@orchestraworks/client/dist/models/CreateEnvironmentRequest.d.ts +7 -0
  59. package/node_modules/@orchestraworks/client/dist/models/CreateEnvironmentRequest.js +3 -0
  60. package/node_modules/@orchestraworks/client/dist/models/CreateSecretRequest.d.ts +4 -3
  61. package/node_modules/@orchestraworks/client/dist/models/Environment.d.ts +7 -0
  62. package/node_modules/@orchestraworks/client/dist/models/Environment.js +3 -0
  63. package/node_modules/@orchestraworks/client/dist/models/EnvironmentCredential.d.ts +38 -0
  64. package/node_modules/@orchestraworks/client/dist/models/EnvironmentCredential.js +52 -0
  65. package/node_modules/@orchestraworks/client/dist/models/EnvironmentProvisionSpec.d.ts +1 -1
  66. package/node_modules/@orchestraworks/client/dist/models/EnvironmentProvisionSpecRequest.d.ts +1 -1
  67. package/node_modules/@orchestraworks/client/dist/models/EnvironmentSnapshot.d.ts +1 -1
  68. package/node_modules/@orchestraworks/client/dist/models/InjectionRecipe.d.ts +6 -0
  69. package/node_modules/@orchestraworks/client/dist/models/InjectionRecipe.js +2 -0
  70. package/node_modules/@orchestraworks/client/dist/models/OAuthTokenRequest.d.ts +1 -1
  71. package/node_modules/@orchestraworks/client/dist/models/Secret.d.ts +1 -7
  72. package/node_modules/@orchestraworks/client/dist/models/Secret.js +0 -4
  73. package/node_modules/@orchestraworks/client/dist/models/UpdateEnvironmentRequest.d.ts +7 -0
  74. package/node_modules/@orchestraworks/client/dist/models/UpdateEnvironmentRequest.js +3 -0
  75. package/node_modules/@orchestraworks/client/dist/models/UpdateSecretRequest.d.ts +4 -3
  76. package/node_modules/@orchestraworks/client/dist/models/index.d.ts +1 -0
  77. package/node_modules/@orchestraworks/client/dist/models/index.js +1 -0
  78. package/node_modules/@orchestraworks/client/package.json +1 -1
  79. package/package.json +4 -4
  80. package/skills/orchestra/SKILL.md +132 -18
  81. package/skills/orchestra-fdk/references/authoring.md +511 -20
  82. package/skills/orchestra-fdk/references/environment.md +49 -12
  83. package/skills/orchestra-fdk/references/integrations/code-repo.md +26 -5
  84. package/skills/orchestra-fdk/references/phases/1-discover.md +1 -1
  85. package/skills/orchestra-fdk/references/phases/2-plan.md +1 -1
  86. package/skills/orchestra-fdk/references/troubleshooting.md +3 -2
  87. package/templates/bug-fix/main.ts +7 -4
  88. package/templates/engineering-team/lib/environment.ts +6 -3
  89. package/templates/engineering-team/package.json +1 -1
  90. package/templates/todo-factory/main.ts +7 -4
  91. package/templates/todo-factory/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: orchestra
3
- description: Use when you need to understand or explain an Orchestra concept - organization, role, agent, version, environment, machine, network rules, secret, reaching a model (subscription, model gateway and gateway key, own key), session, pipeline, work item, workflow rules, trigger, skill, file, plan, or the factory as code - or how the orchestra command line works, what the platform cannot do yet, and where an agent's knowledge belongs. A reference to read, not a list of steps.
3
+ description: Use when you need to understand or explain an Orchestra concept - organization, role, agent, version, environment, machine, network rules, secret, reaching a model (subscription, model gateway and gateway key, own key), session, pipeline, work item and its check gates, workflow rules and the judge, trigger, skill, file, plan, or the factory as code - or how the orchestra command line works, what the platform cannot do yet, and where an agent's knowledge belongs. A reference to read, not a list of steps.
4
4
  ---
5
5
 
6
6
  # Orchestra: the ideas behind the platform
@@ -120,8 +120,9 @@ reaches the program on its standard input. It starts like any agent:
120
120
  to the agent. A schedule trigger targets a pipeline, never an agent directly.
121
121
 
122
122
  A `script` agent cannot use skills or model settings (the platform refuses both with a 400), and it cannot
123
- judge, read or write prose the way a model does. A turn runs its whole program again, so the program must be
124
- safe to run twice. It is billed as an agent: **Settings › Plan & usage** shows the plan.
123
+ read, write or judge prose the way a model does. It can be a judge of a fixed rule, such as "the description
124
+ has a Release notes section": the program decides and writes the check itself (section 11). A turn runs its
125
+ whole program again, so the program must be safe to run twice. It is billed as an agent: **Settings › Plan & usage** shows the plan.
125
126
 
126
127
  **Cannot yet.**
127
128
  - Change an agent's harness after it is created. Make a new agent instead.
@@ -265,8 +266,8 @@ unless you set one, so it wins over the open default and over the usual allow ru
265
266
  **Live effect.** The edge reads the environment's rules on each request. So an apply that changes the rules
266
267
  reaches every machine at once, machines already running included, from their next request.
267
268
 
268
- **How it relates.** On a request a rule allows, the edge adds the secret or connection whose `hosts` cover the
269
- host, and only on `https` (section 6). Calls to the Orchestra platform itself skip these rules: the agent's
269
+ **How it relates.** On a request a rule allows, the edge adds a secret or connection whose `hosts` cover the
270
+ host, only on `https`, and only when the request names it or an environment default covers it (section 6). Calls to the Orchestra platform itself skip these rules: the agent's
270
271
  role decides them (section 1). So a machine blocked from the code host still downloads a file through
271
272
  `orchestra files get-content`. The worker points each harness's tools at the edge through proxy variables, so
272
273
  a service the agent runs in a container needs its name in `NO_PROXY` in the environment's settings.
@@ -291,10 +292,19 @@ resolved at the edge on an allow); AGENTS.md "Egress And Credentials". Kit: cli/
291
292
  **What it's for.** It lets agents use a key without seeing it. No agent, no person and no apply output ever shows
292
293
  the value.
293
294
 
294
- **What it is.** A *secret* is a stored value that can be written and never read back. It declares its `hosts`
295
- and an `injection` recipe, the headers it sets, and the network edge adds it to each allowed `https` request
296
- to one of those hosts. This is *credential injection at the network edge*. When two credentials cover one
297
- host, the request names one with a reference, `orchestra:secret/<id>`, in place of its key.
295
+ **What it is.** A *secret* is a stored value that can be written and never read back. It declares an
296
+ `injection` recipe, the headers it sets and the `hosts` it sets them on, and the network edge adds it to an
297
+ allowed `https` request to one of those hosts. A secret with no recipe is stored only, and the edge never adds it. This is *credential injection at the network edge*. The edge adds it only in two cases:
298
+
299
+ - The request names it with a reference, `orchestra:secret/<id>` or `orchestra:connection/<id>`, in place
300
+ of its key. A `Secret` or `Connection` set as an environment `env` value is written as that reference:
301
+ `ANTHROPIC_API_KEY` for claude, `GH_TOKEN` for `gh`, `GITLAB_TOKEN` for `glab`, `ORCHESTRA_GIT_CREDENTIAL`
302
+ for git. `routeModelsViaGateway({ key })` names the gateway key this way for claude and codex. The
303
+ `linear`, `slack` and `teams` commands take `--connection-id <id>`.
304
+ - The environment's `credentials` list covers the host, for a request that names nothing. The first
305
+ covering entry serves; with `replace: false`, a request carrying its own value keeps it.
306
+
307
+ A request that names nothing and that no default covers leaves as it was sent.
298
308
 
299
309
  **How it relates.** A secret is added only where a network rule lets the request leave (section 5). Never put
300
310
  a key in an environment's settings or in instructions: the machine's processes read every setting.
@@ -325,8 +335,9 @@ network rules carry the option (sections 2 and 5).
325
335
  **A Claude or Codex subscription.**
326
336
 
327
337
  - *Claude.* `claude setup-token` prints a long-lived token. It is stored as a secret, and the network edge
328
- adds it to each call to `api.anthropic.com`. The machine holds only a placeholder token and an empty API
329
- key, so no agent and no person sees the real one. Never put the token in an environment's settings: they
338
+ adds it to each call to `api.anthropic.com` that names it. The environment's `env` names the secret in
339
+ `CLAUDE_CODE_OAUTH_TOKEN` by reference, `orchestra:secret/<id>`, beside an empty API key, so no agent
340
+ and no person sees the real one. Never put the token in an environment's settings: they
330
341
  are plain text.
331
342
  - *Codex.* A personal access token, made by a ChatGPT Business or Enterprise member, or a separate ChatGPT
332
343
  sign-in kept on a `/home` volume that every machine using it shares. A Codex sign-in stays off the model
@@ -337,7 +348,8 @@ network rules carry the option (sections 2 and 5).
337
348
 
338
349
  **An Orchestra account, through the model gateway.** The model gateway is a hosted service at
339
350
  `models.orchestraworks.ai`. One endpoint reaches OpenAI, Anthropic and open models. A *gateway key* is a key
340
- to it, stored as a secret. The network edge adds it to each model call, so no agent and no person sees it.
351
+ to it, stored as a secret. `routeModelsViaGateway({ key })` names it to each harness, and the network edge
352
+ adds it to each model call, so no agent and no person sees it.
341
353
  Without it, an agent's first message fails with "Invalid API key".
342
354
 
343
355
  - *Routing.* `orchestra model-configs` sets which providers serve a model, and in which order, so a call
@@ -348,10 +360,11 @@ Without it, an agent's first message fails with "Invalid API key".
348
360
  - *A cap.* Each gateway key can carry a monthly cap, set in the console at **Settings › Gateway keys**.
349
361
 
350
362
  **Their own provider API key.** The team's Anthropic or OpenAI API key is a secret that the network edge adds
351
- to calls straight to the provider, with no gateway in between.
363
+ to calls straight to the provider, with no gateway in between. The environment names it in `ANTHROPIC_API_KEY`
364
+ or `ORCHESTRA_WORKER_OPENAI_API_KEY`, or lists it in `credentials`.
352
365
 
353
366
  **How it relates.** Each option reaches the model through an ordinary allow rule on the model's host, and a
354
- secret whose `hosts` name that host (sections 5 and 6). An agent on the model gateway turns it on in its model settings (section 2). An agent on a
367
+ secret whose recipe's `hosts` name that host (sections 5 and 6). An agent on the model gateway turns it on in its model settings (section 2). An agent on a
355
368
  subscription or its own key turns it off. For plan questions, send the person to **Settings › Plan & usage**
356
369
  in the console.
357
370
 
@@ -433,12 +446,90 @@ it, puts the code bundle's file id in it, and assigns it to an Engineer Agent.
433
446
 
434
447
  **Cannot yet.** Declare items in the factory code. Create them with `orchestra work-items create`.
435
448
 
449
+ ### Checks and gates
450
+
451
+ <!-- Sources, on develop at b155aff3a8: docs/architecture/work-plane.md:197-205 (a reopen clears every check;
452
+ one vote per writer per key; counts; nothing declares a key ahead), :274-277 (approval as an IAM-restricted
453
+ key; isAssignee; passUsers), :480-486 (what requires reads), :490-493 (POST /decisions writes nothing), :575
454
+ (one key per grant), :634 (.result is the latest write; .writer.* is the latest writer; counts read 0 when
455
+ absent), :656-657 (setCheck, clearCheck; the author holds the key at save), :673 (body {result, summary?,
456
+ evidence?}; owner and admin write every key);
457
+ docs/architecture/iam.md:48-56 (statement shape), :1055 (no managed role but owner and admin holds the
458
+ action); cli/src/constructs/pipeline.ts:218-228 (allowCheck; apply writes no IAM);
459
+ cli/src/engine/pipeline-reconcile.ts:441-455 (the printed notice); cli/src/generated/cli-commands.json,
460
+ operationId setWorkItemCheck (set-check flags: --result, --summary; evidence only through --body);
461
+ platform/src/main/kotlin/ai/livingcomputers/softwarefactory/workplane/controller/WorkplaneWorkItemController.kt:267
462
+ (the item path takes an id or a slug). -->
463
+
464
+ **What it's for.** A gate keeps an item out of a stage until the work passed a test, a review or a person's
465
+ approval.
466
+
467
+ **What it is.** A *check* is a named key on an item, such as `ci`, `review` or `approval`. Each writer has
468
+ one *vote* on a key: `PASS`, `FAIL` or `SKIP`, with an optional summary and evidence links. A writer's new
469
+ vote replaces its own earlier vote. Nobody declares a key ahead: a stage's `requires` names the keys it
470
+ reads. A *gate* is a stage's `requires` list. The platform reads it when something moves the item into the
471
+ stage, and refuses the move when a condition is false. A gate never asks anybody: it reads the stored votes.
472
+
473
+ A stage's `requires` can read these fields of a key:
474
+
475
+ | Field | Value |
476
+ |---|---|
477
+ | `checks.<key>.result` | The result of the latest vote: `PASS`, `FAIL` or `SKIP` |
478
+ | `checks.<key>.pass`, `.fail` | How many writers voted `PASS`, `FAIL` (0 when nobody voted) |
479
+ | `checks.<key>.passUsers`, `.passAgents` | How many people, agents, voted `PASS` |
480
+ | `checks.<key>.writer.isAssignee` | Whether the writer of the latest vote held the item when it voted |
481
+
482
+ `.writer.isAssignee` reads the latest vote only. With two approvers, it cannot prove that neither of them
483
+ is the assignee.
484
+
485
+ **Who can write a key.** IAM decides, one key at a time: the action `work-items:setWorkItemCheck` on the
486
+ resource `work-items/*/checks/<key>`. Owner and admin write every key. No other built-in role holds the
487
+ action, so each agent, service account or group of people that votes needs a policy for its key. A
488
+ policy is a list of statements, such as:
489
+
490
+ ```json
491
+ { "effect": "allow", "actions": ["work-items:setWorkItemCheck"], "resources": ["work-items/*/checks/ci"] }
492
+ ```
493
+
494
+ In the factory code, `pipeline.allowCheck(agent, "review")` names that grant. Apply does not write it: it
495
+ prints the statement for an administrator to attach to the agent's membership.
496
+
497
+ **How a vote is written.**
498
+
499
+ - The command: `orchestra work-items set-check <item> <key> --result PASS --summary "…"`. `<item>` is the
500
+ item's id or its slug, such as `bug-12`. Evidence links go in a JSON file passed with `--body @vote.json`.
501
+ - The API: `PUT /work-items/{id}/checks/{key}` with `{result, summary?, evidence?}`.
502
+ - A workflow rule: `setCheck` writes the rule's own vote, and `clearCheck` removes every vote on a key. The
503
+ person who applies the rule must hold the key.
504
+ - A judge: a rule's `evaluate` asks an agent to vote (section 11).
505
+
506
+ **A reopen clears every check.** A move from a closed stage (`DONE` or `CANCELED`) back to an open one
507
+ removes every vote on every key, before the target stage's gate is read.
508
+
509
+ **Not a check writer.** `POST /decisions` reads the text typed into the console's "+ Create" box and
510
+ proposes the fields of a new item. It writes nothing, and it never writes a check.
511
+
512
+ **Recipes.** The orchestra-fdk skill's `references/authoring.md`, "Check gates", has five complete
513
+ examples: a model judge, a CI result, a script judge, a two-person approval and a decision model judge.
514
+
436
515
  ## 11. Workflow rules and the judge
437
516
 
438
517
  <!-- Sources, on develop at 19459f9ebb: docs/architecture/multi-agent-workflows.md:18-30 (a workflow is a named,
439
518
  versioned list of rules for one pipeline); docs/architecture/work-plane.md:364-370 (workflow entries pick which
440
519
  version runs on which items), :266-279 (evaluate asks a judge to decide one check; refused when the judge is the
441
- assignee), :573 (rule actions); AGENTS.md "API Conventions" (no runs, no graph engine). -->
520
+ assignee), :573 (rule actions); AGENTS.md "API Conventions" (no runs, no graph engine). Judge facts, on develop
521
+ at b155aff3a8: docs/architecture/work-plane.md:279-285 (the judge writes under its own grant, else 403; a gate
522
+ never calls a judge; a failed judge turn writes no SESSION_FAILED, so an inStageFor rule re-runs evaluate), :658
523
+ (evaluate starts or wakes the judge's session); platform/src/main/kotlin/ai/livingcomputers/softwarefactory/
524
+ workplane/service/WorkItemSessionService.kt:188-208 (the turn's text names the item, the criterion and the PUT
525
+ line); worker/script-harness/index.js:682-717 (a script turn's exit code sets the session outcome, not a check).
526
+ A decision model judge, on 3664271a69: https://docs.typesafe.ai/api.md and platform/src/main/kotlin/ai/
527
+ livingcomputers/softwarefactory/integration/typesafe/TypeSafeDecisionClient.kt (choice and noul questions);
528
+ docs/architecture/work-plane.md:496-498 (a decision model picks among options and writes no text), :562-564 (the
529
+ platform's own calls run on its key). The session lookup, on 20b09bc114: WorkItemSessionService.kt:332-392
530
+ (converse finds the judge's link on the item, else startConversation starts a session with a link to that item
531
+ alone); docs/architecture/work-plane.md:193-194 (session keeps the items a link names); docs/architecture/
532
+ fwp.md:1060-1063 (ORCHESTRA_SESSION_ID on every harness process, the script's command included). -->
442
533
 
443
534
  **What it's for.** Rules do the routine moves, so people and agents do not have to: assign the next agent, move
444
535
  an item, ask for a review.
@@ -451,6 +542,25 @@ what it does: move, assign, create an item, or evaluate. There are no workflow r
451
542
  the judge's session on the item. The judge writes the check, and a stage that requires it then lets the item in.
452
543
  The item's own assignee cannot be its judge.
453
544
 
545
+ A judge can also be a script agent that asks a *decision model*, such as TypeSafe's Jev, with the customer's own
546
+ key. That model picks one of a fixed list of options, or gives the probability of yes, and writes no text. The
547
+ recipe is in section 10's Recipes.
548
+
549
+ **What a judge must know.**
550
+
551
+ - The judge's turn names the item, the key and the criterion, and the `PUT /work-items/<id>/checks/<key>`
552
+ call to make. The judge must make that call itself, for example with `orchestra work-items set-check`.
553
+ The platform does not read the judge's reply or its session outcome into the check.
554
+ - The judge's session is on that one item: a judge of two items has two sessions. A program can find its
555
+ item with `orchestra work-items list --session "$ORCHESTRA_SESSION_ID"` and read none of the turn's text.
556
+ - The judge needs its own grant on the key (section 10). Without it, its write gets a 403, and the gate
557
+ stays shut.
558
+ - A rule that names the item's assignee as the judge is refused, with a note in the item's feed.
559
+ - A failed judge turn writes no `SESSION_FAILED` entry, so no failure rule sees it. To recover, add a rule
560
+ on `inStageFor` that runs `evaluate` again while the check is still absent.
561
+ - A gate does not start a judge. Something must run `evaluate` before the move, usually a rule on entering
562
+ the stage before the gated one.
563
+
454
564
  **How it relates.** Rules move items through stages (section 9) and write to checks (section 10).
455
565
 
456
566
  **In the starter.** None yet. Agents and people move items by hand.
@@ -647,7 +757,7 @@ local/launch/modelkey.go (model key carriers per harness, the gateway address va
647
757
  worker/facts/families.json (how each harness takes the gateway address); on develop at f62fad1481,
648
758
  agents/runtime/assembly/common/placeholder-env (the images' placeholder ANTHROPIC_API_KEY),
649
759
  LauncherProperties.kt (the gallery images at Versions/latest), launcher/config/config.go (Dsv5 default);
650
- worker/facts/families.json (the ORCHESTRA_WORKER_ names), worker/service/manager_windows.go (SfdkWorker),
760
+ worker/facts/families.json (the ORCHESTRA_WORKER_ names), worker/service/service.go (OrchestraWorker, and the previous SfdkWorker),
651
761
  infra/packer/azure-windows-runtime.pkr.hcl (the startup task), launcher/cloud/cloud.go (the VM tags);
652
762
  the proven list is the test run of 2026-10-05. -->
653
763
 
@@ -677,8 +787,8 @@ the proven list is the test run of 2026-10-05. -->
677
787
  1. The environment's `env` (`provisionSpec.env`). A declared value replaces our image's placeholder,
678
788
  never a real value. The platform stores `env` values in plain text, an environment read returns
679
789
  them, and the machine's startup data carries them.
680
- 2. Baked into the team's image at machine scope: on Windows the `SfdkWorker` service's `Environment`
681
- registry value, on Linux a drop-in on `sfdk-worker.service`.
790
+ 2. Baked into the team's image at machine scope: on Windows the `OrchestraWorker` service's
791
+ `Environment` registry value, on Linux a drop-in on `orchestra-worker.service`.
682
792
  3. The `onStartAgent` hook writes the harness's own key file: `.claude/.credentials.json` for a Claude
683
793
  sign-in, `.codex/auth.json` for `codex`, `.pi/agent/auth.json` for `pi`. A raw Claude API key has
684
794
  no file.
@@ -686,6 +796,10 @@ the proven list is the test run of 2026-10-05. -->
686
796
  `ORCHESTRA_WORKER_CLAUDE_OAUTH_TOKEN` for a Claude subscription token; `ORCHESTRA_WORKER_OPENAI_API_KEY`
687
797
  or `ORCHESTRA_WORKER_CODEX_PERSONAL_ACCESS_TOKEN` for `codex`. With a gateway key, keep the agent's
688
798
  model gateway on. The platform sets the gateway address.
799
+ - An install replaces the service an earlier release registered as `SfdkWorker` on Windows,
800
+ `sfdk-worker.service` on Linux or `ai.livingcomputers.sfdk.worker` on macOS. The new ones are
801
+ `OrchestraWorker`, `orchestra-worker.service` and `ai.livingcomputers.orchestra.worker`. Change your own
802
+ scripts that name the old ones.
689
803
  - Never restart the worker service to load a key. A restart after the worker registered stops the
690
804
  machine's work, and the platform parks the VM.
691
805
  - The details: the orchestra-fdk skill's `references/environment.md`, "Tokens on a compute provider's