@azure-id/orc 0.56.0 → 1.0.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.
- package/CHANGELOG.md +228 -0
- package/README-id.md +143 -53
- package/README.md +124 -103
- package/bin/build-agents.js +18 -11
- package/bin/cli.js +4139 -315
- package/bin/onboarding-content.js +0 -3
- package/bin/test-run.js +491 -0
- package/bin/verify-contracts.js +4256 -3277
- package/bin/verify-package.js +563 -498
- package/bin/webui/api.js +1186 -1163
- package/bin/webui/app.html +9 -0
- package/bin/webui/css/06-responsive.css +120 -108
- package/bin/webui/css/panels/extra.css +29 -0
- package/bin/webui/css/panels/lanes.css +134 -0
- package/bin/webui/css/panels/settings.css +79 -3
- package/bin/webui/fixtures/extra.js +2036 -1934
- package/bin/webui/fixtures/flow.js +2 -2
- package/bin/webui/fixtures/index.js +503 -486
- package/bin/webui/fixtures/lanes.js +218 -0
- package/bin/webui/fixtures/settings.js +261 -34
- package/bin/webui/fixtures/stats.js +3 -3
- package/bin/webui/i18n/TERMS.md +135 -134
- package/bin/webui/i18n/en/extra.json +345 -313
- package/bin/webui/i18n/en/lanes.json +29 -0
- package/bin/webui/i18n/en/nav.json +1 -0
- package/bin/webui/i18n/en/overview.json +2 -0
- package/bin/webui/i18n/en/settings.json +16 -5
- package/bin/webui/i18n/id/extra.json +345 -313
- package/bin/webui/i18n/id/lanes.json +29 -0
- package/bin/webui/i18n/id/nav.json +1 -0
- package/bin/webui/i18n/id/overview.json +2 -0
- package/bin/webui/i18n/id/settings.json +15 -4
- package/bin/webui/js/01-i18n.js +1 -0
- package/bin/webui/js/panels/extra.js +3199 -3011
- package/bin/webui/js/panels/lanes.js +259 -0
- package/bin/webui/js/panels/overview.js +10 -0
- package/bin/webui/js/panels/settings.js +149 -3
- package/package.json +3 -3
- package/templates/agents/MODEL-MAPPING.md +23 -35
- package/templates/agents/orc-executor-opus-4-7-high.md +1 -1
- package/templates/agents/orc-executor-opus-4-7-med.md +1 -1
- package/templates/agents/orc-executor-opus-4-8-high.md +1 -1
- package/templates/agents/orc-executor-opus-5-high.md +1 -1
- package/templates/agents/orc-executor-opus-5-low.md +1 -1
- package/templates/agents/orc-executor-opus-5-med.md +1 -1
- package/templates/agents/orc-retro-opus-5-med.md +73 -73
- package/templates/agents/orc-retro-sonnet-5-high.md +72 -72
- package/templates/agents/orc-trace-writer-haiku-4-5.md +107 -107
- package/templates/commands/orc-route.md +1 -1
- package/templates/commands/orc.md +1 -1
- package/templates/skills/_shared/README.md +7 -3
- package/templates/skills/_shared/config-precedence.md +198 -0
- package/templates/skills/_shared/drift-recovery.md +1 -1
- package/templates/skills/_shared/extra-dispatch.md +292 -6
- package/templates/skills/_shared/interview.md +1 -1
- package/templates/skills/_shared/opus5-only.md +9 -7
- package/templates/skills/_shared/phases/README.md +82 -0
- package/templates/skills/{orc/references → _shared/phases}/analyst-gates.md +15 -3
- package/templates/skills/_shared/phases/execution.md +143 -0
- package/templates/skills/{orc/references → _shared/phases}/house-rules.md +13 -1
- package/templates/skills/{orc/references → _shared/phases}/intake.md +15 -2
- package/templates/skills/_shared/phases/mock-example.md +56 -0
- package/templates/skills/{orc/references → _shared/phases}/plan-handoff.md +16 -3
- package/templates/skills/_shared/phases/planning.md +135 -0
- package/templates/skills/_shared/phases/preflight.md +76 -0
- package/templates/skills/_shared/phases/review.md +53 -0
- package/templates/skills/_shared/phases/scoring.md +65 -0
- package/templates/skills/{orc/references → _shared/phases}/security-checklist.md +12 -1
- package/templates/skills/_shared/phases/security.md +55 -0
- package/templates/skills/_shared/phases/ship.md +88 -0
- package/templates/skills/{orc/references/stop-and-resume.md → _shared/phases/stop-resume.md} +169 -160
- package/templates/skills/_shared/phases/summary.md +48 -0
- package/templates/skills/_shared/phases/testgen.md +51 -0
- package/templates/skills/{orc/references/trace-protocol.md → _shared/phases/trace.md} +49 -6
- package/templates/skills/_shared/phases/verify.md +70 -0
- package/templates/skills/{orc/references → _shared/phases}/wave-grouping.md +14 -2
- package/templates/skills/{orc/references → _shared/phases}/wiki-consult.md +13 -1
- package/templates/skills/_shared/read-ladder.md +48 -0
- package/templates/skills/context-combiner/SKILL.md +214 -187
- package/templates/skills/orc/README.md +148 -150
- package/templates/skills/orc/SKILL.md +70 -358
- package/templates/skills/orc/config.md +137 -389
- package/templates/skills/orc/examples/full-run-mock.md +1 -1
- package/templates/skills/orc/references/effort-and-mode.md +16 -18
- package/templates/skills/orc/references/phases/intake.md +47 -0
- package/templates/skills/orc/references/phases/integration.md +19 -0
- package/templates/skills/orc/references/preflight-report.md +4 -4
- package/templates/skills/orc/references/ultra-mode.md +117 -123
- package/templates/skills/orc/schemas/planning-output.md +279 -279
- package/templates/skills/orc/subskills/orc-planner/SKILL.md +260 -264
- package/templates/skills/orc/subskills/orc-pr/stack-gate.md +4 -1
- package/templates/skills/orc-aftermath/SKILL.md +153 -136
- package/templates/skills/orc-analyze/SKILL.md +247 -220
- package/templates/skills/orc-analyze/references/branching.md +51 -51
- package/templates/skills/orc-analyze/references/thin-input.md +1 -1
- package/templates/skills/orc-analyze-mini/SKILL.md +128 -112
- package/templates/skills/orc-boundary/SKILL.md +244 -208
- package/templates/skills/orc-brainstorm/SKILL.md +372 -339
- package/templates/skills/orc-budget/SKILL.md +243 -225
- package/templates/skills/orc-challenge/README.md +1 -1
- package/templates/skills/orc-challenge/SKILL.md +293 -255
- package/templates/skills/orc-challenge/examples/council-full-roster.md +1 -1
- package/templates/skills/orc-claude/SKILL.md +216 -199
- package/templates/skills/orc-diy/README.md +2 -1
- package/templates/skills/orc-diy/SKILL.md +129 -70
- package/templates/skills/orc-diy/references/blocks/analyze.md +1 -1
- package/templates/skills/orc-diy/references/compile.md +21 -7
- package/templates/skills/orc-diy/references/flow-schema.md +2 -2
- package/templates/skills/orc-doc/SKILL.md +44 -7
- package/templates/skills/orc-explain/SKILL.md +19 -0
- package/templates/skills/orc-export/SKILL.md +26 -5
- package/templates/skills/orc-fast/SKILL.md +215 -187
- package/templates/skills/orc-grill/SKILL.md +233 -207
- package/templates/skills/orc-handoff/SKILL.md +223 -204
- package/templates/skills/orc-learn/SKILL.md +176 -156
- package/templates/skills/orc-mini/SKILL.md +41 -23
- package/templates/skills/orc-pact/SKILL.md +250 -218
- package/templates/skills/orc-pattern/SKILL.md +149 -124
- package/templates/skills/orc-poly/SKILL.md +237 -216
- package/templates/skills/orc-poly/references/gather.md +1 -1
- package/templates/skills/orc-pr-driver/SKILL.md +196 -167
- package/templates/skills/orc-pr-driver/references/orc-run-split.md +1 -1
- package/templates/skills/orc-pr-setup/SKILL.md +212 -184
- package/templates/skills/orc-quick/README.md +2 -2
- package/templates/skills/orc-quick/SKILL.md +346 -313
- package/templates/skills/orc-quick/references/dispatch-gate.md +12 -4
- package/templates/skills/orc-retro/SKILL.md +244 -222
- package/templates/skills/orc-retro/examples/retro-mock.md +171 -171
- package/templates/skills/orc-route/SKILL.md +183 -165
- package/templates/skills/orc-verify/SKILL.md +100 -86
- package/templates/skills/orc-wiki/SKILL.md +55 -206
- package/templates/skills/orc-wiki/references/phases/phase-0.md +71 -0
- package/templates/skills/orc-wiki/references/phases/phase-1.md +35 -0
- package/templates/skills/orc-wiki/references/phases/phase-2.md +52 -0
- package/templates/skills/orc-wiki/references/phases/phase-3.md +57 -0
- package/templates/skills/orc-wiki/references/phases/phase-3c.md +36 -0
- package/templates/agents/orc-advisor-fable-5.md +0 -50
- package/templates/agents/orc-analyst-fable-5.md +0 -115
- package/templates/agents/orc-judge-fable-5.md +0 -79
- package/templates/agents/orc-planner-fable-5.md +0 -152
- package/templates/agents/orc-reviewer-fable-5.md +0 -57
- package/templates/skills/_shared/fable5-override.md +0 -56
- package/templates/skills/orc-diy/references/blocks/execution.md +0 -42
- package/templates/skills/orc-diy/references/blocks/mock-example.md +0 -22
- package/templates/skills/orc-diy/references/blocks/planning.md +0 -34
- package/templates/skills/orc-diy/references/blocks/review.md +0 -18
- package/templates/skills/orc-diy/references/blocks/scoring.md +0 -16
- package/templates/skills/orc-diy/references/blocks/security.md +0 -25
- package/templates/skills/orc-diy/references/blocks/ship.md +0 -25
- package/templates/skills/orc-diy/references/blocks/summary.md +0 -18
- package/templates/skills/orc-diy/references/blocks/testgen.md +0 -17
- package/templates/skills/orc-diy/references/blocks/trace.md +0 -28
- package/templates/skills/orc-diy/references/blocks/verify.md +0 -25
|
@@ -1,313 +1,345 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extra.title": "Extra",
|
|
3
|
-
"extra.sub": "Integrate with other AI model",
|
|
4
|
-
"extra.why": "Why it works like this",
|
|
5
|
-
"extra.tab.setup": "Setup",
|
|
6
|
-
"extra.tab.routing": "Routing",
|
|
7
|
-
"extra.tab.limits": "Limits",
|
|
8
|
-
"extra.tab.spending": "Spending",
|
|
9
|
-
"extra.tab.providers": "Providers",
|
|
10
|
-
"extra.boundary.title": "Before you connect anything, read this",
|
|
11
|
-
"extra.boundary.leaves": "What leaves this machine: the task slice ORC builds — your request, the contents of the files that task names, the tool results the worker asks for, and the code it writes back.",
|
|
12
|
-
"extra.boundary.whom": "Who receives it: the provider you configure below, at the base URL shown on its profile. Nobody else is in the path, and ORC adds no telemetry of its own.",
|
|
13
|
-
"extra.boundary.cannot": "What ORC cannot promise: how long that provider keeps your prompt, whether it trains on it, or where in the world it runs. Those are the provider's terms, not ORC's — the catalog links them, and reading them is your call to make.",
|
|
14
|
-
"extra.boundary.fence": "One engine composes the request body itself, and only that one can hold a worker to the files a task declared or carry a privacy policy. The other two send instructions and trust the tool to obey them. Each profile below says which engine it is on.",
|
|
15
|
-
"extra.boundary.probe": "This panel never talks to a model. Testing a connection runs the same command you would type, and the connection is the CLI's.",
|
|
16
|
-
"extra.strip.profiles": "profiles",
|
|
17
|
-
"extra.strip.verified": "verified",
|
|
18
|
-
"extra.strip.routed": "routed bands",
|
|
19
|
-
"extra.strip.findings": "findings",
|
|
20
|
-
"extra.strip.catalog": "catalog dated",
|
|
21
|
-
"extra.providers.title": "Providers ORC knows how to reach",
|
|
22
|
-
"extra.providers.sub": "This is the shipped catalog of providers ORC can reach, with the date it was published.",
|
|
23
|
-
"extra.providers.subWhy": "It carries base URLs, the variable each provider reads its key from, and the terms to go and read.",
|
|
24
|
-
"extra.providers.noModels": "Model names are not shipped: they change within a quarter, and a stale one is a failure in the middle of a run. Testing a connection reads the live list from the provider.",
|
|
25
|
-
"extra.providers.stale": "This catalog is older than the age ORC trusts. A base URL may have moved — check the provider's own documentation before you believe a failure.",
|
|
26
|
-
"extra.providers.engines": "engines",
|
|
27
|
-
"extra.providers.regions": "regions",
|
|
28
|
-
"extra.providers.docs": "setup guide",
|
|
29
|
-
"extra.providers.terms": "terms",
|
|
30
|
-
"extra.profiles.title": "Your connections",
|
|
31
|
-
"extra.profiles.none": "No connection configured yet.",
|
|
32
|
-
"extra.profiles.noneHint": "Nothing is routed anywhere else until you add one, test it, and map a band to it. Until then every task runs where it runs today.",
|
|
33
|
-
"extra.profiles.addWhy": "Adds a connection. Nothing is sent anywhere and no key is stored by this step.",
|
|
34
|
-
"extra.profiles.pingWhy": "The connection test. It is the gate: nothing routes to a connection that has never answered.",
|
|
35
|
-
"extra.profile.provider": "provider",
|
|
36
|
-
"extra.profile.engine": "engine",
|
|
37
|
-
"extra.profile.base": "base URL",
|
|
38
|
-
"extra.profile.region": "region",
|
|
39
|
-
"extra.profile.credential": "key",
|
|
40
|
-
"extra.profile.credentialEnv": "read from the variable {name}",
|
|
41
|
-
"extra.profile.credentialVault": "stored here, encrypted",
|
|
42
|
-
"extra.profile.present": "found",
|
|
43
|
-
"extra.profile.missing": "not found",
|
|
44
|
-
"extra.profile.verifiedAt": "answered {when} · {how}",
|
|
45
|
-
"extra.profile.latency": "{ms} ms",
|
|
46
|
-
"extra.profile.never": "never tested",
|
|
47
|
-
"extra.profile.modelsLabel": "models",
|
|
48
|
-
"extra.profile.models": "{n} model names cached",
|
|
49
|
-
"extra.profile.modelsNone": "no model names cached yet",
|
|
50
|
-
"extra.profile.fidelity": "measured on first dispatch",
|
|
51
|
-
"extra.profile.privacy": "privacy policy set",
|
|
52
|
-
"extra.vault.stored": "key stored",
|
|
53
|
-
"extra.vault.wiped": "key deleted",
|
|
54
|
-
"extra.vault.none": "nothing stored",
|
|
55
|
-
"extra.vault.attempts": "{used} of {max} wrong attempts used",
|
|
56
|
-
"extra.vault.attemptsNone": "no wrong attempts",
|
|
57
|
-
"extra.vault.wipedWhen": "deleted {when} after too many wrong passphrases. Paste a new key from your provider.",
|
|
58
|
-
"extra.findings.title": "What needs your attention",
|
|
59
|
-
"extra.findings.none": "Nothing to report.",
|
|
60
|
-
"extra.findings.notFixable": "there is no fix for this one — the text says what to do instead",
|
|
61
|
-
"extra.findings.cmdWhy": "Names every one of them, with the reason.",
|
|
62
|
-
"extra.load.providers": "The provider catalog could not be read.",
|
|
63
|
-
"extra.load.profiles": "The connection list could not be read.",
|
|
64
|
-
"extra.add.button": "Add a connection",
|
|
65
|
-
"extra.add.title": "Add a connection",
|
|
66
|
-
"extra.add.name": "name",
|
|
67
|
-
"extra.add.namePh": "cheap",
|
|
68
|
-
"extra.add.nameHint": "Your own short name for it. This is what a routing row points at.",
|
|
69
|
-
"extra.add.provider": "provider",
|
|
70
|
-
"extra.add.engine": "engine",
|
|
71
|
-
"extra.add.engineHint": "Only the ones this provider actually ships are offered.",
|
|
72
|
-
"extra.add.region": "region",
|
|
73
|
-
"extra.add.base": "base URL",
|
|
74
|
-
"extra.add.baseHint": "Leave it empty to use the one in the catalog.",
|
|
75
|
-
"extra.add.cliBin": "command",
|
|
76
|
-
"extra.add.cliBinHint": "The tool ORC runs. It must be one ORC has an adapter for, and it will say so if it is not.",
|
|
77
|
-
"extra.add.cliAgent": "agent",
|
|
78
|
-
"extra.add.cliAgentPh": "build",
|
|
79
|
-
"extra.add.credential": "credential",
|
|
80
|
-
"extra.add.sourceEnv": "the NAME of an environment variable (recommended)",
|
|
81
|
-
"extra.add.sourceVault": "paste the key and store it here, encrypted",
|
|
82
|
-
"extra.add.sourceTool": "this tool signs itself in — no key needed",
|
|
83
|
-
"extra.add.sourceToolHint": "This tool holds its own credential. ORC sends no key and never writes another tool's credential store. Choose an environment variable or the vault only if you want ORC to hold a separate key.",
|
|
84
|
-
"extra.add.envKey": "variable name",
|
|
85
|
-
"extra.add.envKeyHint": "The name only. ORC never reads the value into anything it can print.",
|
|
86
|
-
"extra.add.key": "the key",
|
|
87
|
-
"extra.add.keyPh": "paste it here",
|
|
88
|
-
"extra.add.keyHint": "It is sent once, to test the connection. It is not written anywhere unless the test passes and you give a passphrase.",
|
|
89
|
-
"extra.add.vaultWarn": "An environment variable your operating system already protects beats a passphrase you will forget. Store the key here only if you would rather not manage variables — and write the passphrase down first, because ORC cannot recover it.",
|
|
90
|
-
"extra.add.needName": "Give it a name first.",
|
|
91
|
-
"extra.probe.head": "What the test does, before you press it",
|
|
92
|
-
"extra.probe.free": "First it asks the provider for its list of models. That costs nothing and no model runs.",
|
|
93
|
-
"extra.probe.paid": "Only if that list is unavailable does it send a one-token request instead, which costs a fraction of a cent. ORC tells you afterwards which of the two actually answered.",
|
|
94
|
-
"extra.wire.you": "this machine",
|
|
95
|
-
"extra.wire.provider": "the provider",
|
|
96
|
-
"extra.test.button": "Test connection",
|
|
97
|
-
"extra.test.running": "testing…",
|
|
98
|
-
"extra.test.title": "Test {name}",
|
|
99
|
-
"extra.test.vaultedNote": "This connection's key is stored here, encrypted. Give your passphrase and ORC unlocks the key just long enough to test it — the key is never printed and never written anywhere. A wrong passphrase spends one of your attempts, the same as anywhere else.",
|
|
100
|
-
"extra.result.verified": "answered · {how}",
|
|
101
|
-
"extra.result.reverted": "The test failed, so nothing was kept: the key was discarded and the connection removed. Nothing is left half-configured.",
|
|
102
|
-
"extra.save.head": "Store this key?",
|
|
103
|
-
"extra.save.warning": "Write your passphrase down somewhere safe now. ORC does not store it and cannot recover it. If you lose it, the stored key is gone and you paste a new one from your provider. After ten wrong attempts ORC deletes the stored key on purpose.",
|
|
104
|
-
"extra.save.pass": "passphrase",
|
|
105
|
-
"extra.save.passPh": "not shown",
|
|
106
|
-
"extra.save.passHint": "Only you know this. It is never stored, never logged and never shown to a model.",
|
|
107
|
-
"extra.save.again": "again",
|
|
108
|
-
"extra.save.againPh": "type it once more",
|
|
109
|
-
"extra.save.button": "Store the key",
|
|
110
|
-
"extra.save.mismatch": "The two passphrases did not match. Nothing was stored.",
|
|
111
|
-
"extra.save.stored": "The key is stored, encrypted (pepper: {pepper}).",
|
|
112
|
-
"extra.unlock.button": "Prove the passphrase",
|
|
113
|
-
"extra.unlock.title": "Unlock {name}",
|
|
114
|
-
"extra.unlock.what": "This checks your passphrase and nothing else. The key is never printed and never leaves the vault. Getting it right resets the wrong-attempt count to zero.",
|
|
115
|
-
"extra.unlock.ok": "Correct. The wrong-attempt count is back to zero, and the key was not printed anywhere.",
|
|
116
|
-
"extra.remove.button": "Remove",
|
|
117
|
-
"extra.remove.title": "Remove {name}",
|
|
118
|
-
"extra.remove.what": "This deletes the connection {name} and every routing row that points at it. The work those rows used to send away comes back to where it runs today.",
|
|
119
|
-
"extra.remove.reason": "reason",
|
|
120
|
-
"extra.remove.reasonPh": "why are you removing it?",
|
|
121
|
-
"extra.remove.reasonHint": "Required. A change to how this repo builds with no recorded why is a change nobody can explain in three weeks.",
|
|
122
|
-
"extra.remove.done": "{name} removed.",
|
|
123
|
-
"extra.fixture": "This is fixture mode: nothing real was run and nothing was contacted.",
|
|
124
|
-
"extra.routing.title": "Where each task runs",
|
|
125
|
-
"extra.routing.sub": "Each row is one score range. Click a row to change where that range runs.",
|
|
126
|
-
"extra.routing.gapNote": "Every range you do not connect stays on Claude, and keeps its row.",
|
|
127
|
-
"extra.routing.gapWhy": "A gap is not a hole. Every range with no connection of yours on it is drawn in Claude's colour with the agent it actually resolves to, so “I left the hardest work on Claude on purpose” and “there is no top band” can never look the same.",
|
|
128
|
-
"extra.routing.legendExtra": "This work leaves your machine.",
|
|
129
|
-
"extra.routing.legendClaude": "This work stays on Claude.",
|
|
130
|
-
"extra.routing.locked": "Nothing can be routed yet.",
|
|
131
|
-
"extra.routing.lockedHint": "Test one connection first. Work is never sent to somewhere that has not answered, so the editor opens as soon as one has.",
|
|
132
|
-
"extra.routing.editNote": "Nothing is written until you press Apply. Each row is written on its own, so one the CLI refuses does not undo the others.",
|
|
133
|
-
"extra.routing.pickProfile": "pick a connection…",
|
|
134
|
-
"extra.routing.untested": "(not tested yet)",
|
|
135
|
-
"extra.routing.modelPh": "model name",
|
|
136
|
-
"extra.routing.route": "Send this range there",
|
|
137
|
-
"extra.routing.clear": "Back to Claude",
|
|
138
|
-
"extra.routing.kvProfile": "Connection",
|
|
139
|
-
"extra.routing.kvModel": "Model",
|
|
140
|
-
"extra.routing.kvSmall": "Small model",
|
|
141
|
-
"extra.routing.kvTurns": "Turn limit",
|
|
142
|
-
"extra.routing.staged": "waiting for Apply",
|
|
143
|
-
"extra.routing.stagedSet": "{target}",
|
|
144
|
-
"extra.routing.stagedClear": "back to Claude",
|
|
145
|
-
"extra.routing.modelGone": "model not listed",
|
|
146
|
-
"extra.reset.title": "Put the guardrails back to their defaults",
|
|
147
|
-
"extra.reset.body": "This removes these settings from your config file, so each one goes back to what ORC ships. Your connections and your routing are NOT touched.",
|
|
148
|
-
"extra.reset.note": "Removing a setting is not the same as setting it to its default value — the key stops being in the file at all.",
|
|
149
|
-
"extra.reset.apply": "Reset them",
|
|
150
|
-
"extra.reset.done": "{n} settings back to their defaults.",
|
|
151
|
-
"extra.reset.label": "Reset the guardrails",
|
|
152
|
-
"extra.routing.undo": "Undo",
|
|
153
|
-
"extra.slots.title": "Where each fixed job runs",
|
|
154
|
-
"extra.slots.sub": "Some lanes give no score. They give one job to one agent. Pick where each job runs.",
|
|
155
|
-
"extra.slots.subWhy": "A score is what a range needs, and four lanes never produce one. Until v0.55.0 those lanes were routed by reading the score range of the agent they pin — arithmetic on a number nobody chose. A job is now a named position with one connection and one model.",
|
|
156
|
-
"extra.slots.keepsSlotWhy": "A job with no connection keeps its row and is drawn as the Claude agent it falls back to. Hiding it would make “I left the checker on Claude on purpose” and “there is no checker” look the same.",
|
|
157
|
-
"extra.slots.asked": "you are asked at the gate, every time",
|
|
158
|
-
"extra.slots.hold": "Send this job there",
|
|
159
|
-
"extra.slots.clear": "Back to Claude",
|
|
160
|
-
"extra.slots.displaces": "This takes the job from: {agents}",
|
|
161
|
-
"extra.slots.kvDisplaces": "Takes the job from",
|
|
162
|
-
"extra.slots.stagedSet": "{slot} → {target}",
|
|
163
|
-
"extra.slots.stagedClear": "back to {agent}",
|
|
164
|
-
"extra.slots.confirmReplace": "{slot} already runs on {old}. Replace it with {next}?",
|
|
165
|
-
"extra.slots.unreachable": "These roles can be set in your config, and nothing runs them yet:",
|
|
166
|
-
"extra.guard.title": "The limits you set",
|
|
167
|
-
"extra.guard.sub": "Change a limit here, then press Apply.",
|
|
168
|
-
"extra.guard.subWhy": "These are ordinary ORC settings, shown here because this is where they matter. They read from the same file the Settings panel edits, and they are written by the same command.",
|
|
169
|
-
"extra.guard.none": "No settings were returned.",
|
|
170
|
-
"extra.cost.title": "What it ran, and what it cost",
|
|
171
|
-
"extra.cost.none": "Nothing has been sent anywhere else yet.",
|
|
172
|
-
"extra.cost.noneHint": "This fills in the first time a task really runs somewhere else. ORC writes each one down as it happens.",
|
|
173
|
-
"extra.cost.dispatches": "{n} tasks sent",
|
|
174
|
-
"extra.cost.scanned": "from {n} traces",
|
|
175
|
-
"extra.cost.sources": "{log} written down by ORC · {traces} read from traces · {backfill} recovered from saved returns",
|
|
176
|
-
"extra.cost.sourcesWhy": "ORC writes every foreign dispatch to its own log the moment the worker answers, so a cost figure never depends on a run remembering to narrate it. Traces and saved run returns are read as well, so dispatches made before that log existed still appear. The same dispatch is only ever counted once.",
|
|
177
|
-
"extra.cost.unreadable": "Some lines in the log could not be read: {n}. Those dispatches are not counted in the totals below.",
|
|
178
|
-
"extra.cost.undated": "Some saved returns have no date: {n}. A date filter leaves them out. Clear the filter to include them.",
|
|
179
|
-
"extra.cost.priceTable": "Prices are from the table dated {as_of} ({days} days old). Nothing here is priced unless ORC has a rate for it.",
|
|
180
|
-
"extra.cost.nDispatches": "{n} sent",
|
|
181
|
-
"extra.cost.never": "Nothing has run through this range yet, so there is nothing to report — not zero cost, no measurement at all.",
|
|
182
|
-
"extra.cost.unrouted": "no longer routed",
|
|
183
|
-
"extra.cost.partial": "These counts come from {got} of {of} tasks — {missing} reported no counts at all. The rest is unknown, not zero.",
|
|
184
|
-
"extra.cost.usd": "usd {usd}",
|
|
185
|
-
"extra.cost.noRate": "usd — · there is no rate for {provider} in the price table, and a figure ORC did not price itself is never printed.",
|
|
186
|
-
"extra.cost.substitutions": "You did not get the model you asked for",
|
|
187
|
-
"extra.cost.reroutes": "The model held and a different company served it",
|
|
188
|
-
"extra.cost.fallbacks": "It did not work and Claude finished the job",
|
|
189
|
-
"extra.cost.more": "…and {n} more",
|
|
190
|
-
"extra.cost.missingRates": "Pairs with no price",
|
|
191
|
-
"extra.cost.ratesWhy": "Prints the JSON to paste for every provider and model pair that has no rate.",
|
|
192
|
-
"extra.routing.recomputed": "recomputed on Apply",
|
|
193
|
-
"extra.test.passHint": "Unlocks the stored key for this test only. Leave it empty if you are pasting a replacement key below.",
|
|
194
|
-
"extra.test.replaceKey": "or paste a new key instead",
|
|
195
|
-
"extra.test.replaceKeyHint": "Only if you changed the key at the provider. This REPLACES what is stored, and it asks for a passphrase again after the test passes.",
|
|
196
|
-
"extra.gate.hidden": "Connect one provider and test it. Routing, limits and spending appear after that.",
|
|
197
|
-
"extra.gate.hiddenWhy": "They are all controls for work that cannot happen until something answers, and setting them now would only look like it did something.",
|
|
198
|
-
"extra.gate.neverTested": "You have a connection, but it has never answered. Test it — nothing is ever sent to somewhere that has not proved it works.",
|
|
199
|
-
"extra.gate.noConnection": "Nothing is connected yet, so there is nothing to route work to. Install a tool above, or add a connection to a provider and give it a key.",
|
|
200
|
-
"extra.gate.title": "Set one connection up first",
|
|
201
|
-
"extra.live.cacheRead": "read from cache",
|
|
202
|
-
"extra.live.cacheWrite": "written to cache",
|
|
203
|
-
"extra.live.input": "new input",
|
|
204
|
-
"extra.live.noReport": "this tool does not say which model answered, so if it quietly used a different one there is no way to tell from here",
|
|
205
|
-
"extra.live.output": "output",
|
|
206
|
-
"extra.live.reply": "what came back",
|
|
207
|
-
"extra.live.reported": "model that answered",
|
|
208
|
-
"extra.live.requested": "model asked for",
|
|
209
|
-
"extra.live.truncated": "Shortened. ORC keeps only the beginning of a reply.",
|
|
210
|
-
"extra.probe.cliFree": "ORC checks four free things first. The program is there. It is new enough. It has a sign-in. It lists the models your account can reach. No model runs, and nothing is charged.",
|
|
211
|
-
"extra.probe.cliPaid": "Sending a real message is a separate button. On a tool like this it is not cheap. The tool loads its own instructions first. One short message then costs thousands of words of input.",
|
|
212
|
-
"extra.test.live": "Send a real message",
|
|
213
|
-
"extra.test.model": "model to test",
|
|
214
|
-
"extra.test.modelHint": "Only used by the real-message button. A model being on this list means the provider offers it — it does not mean it works.",
|
|
215
|
-
"extra.tools.absentWhat": "This program is not installed here. There is nothing to sign in to and no models to list. Install it first, then connect.",
|
|
216
|
-
"extra.tools.altNone": "There is no way to use this one without installing it. That is not something ORC forgot to look for — this tool has no website to point at.",
|
|
217
|
-
"extra.tools.altYes": "You can also do this without installing anything, using:",
|
|
218
|
-
"extra.tools.auth": "signed in",
|
|
219
|
-
"extra.tools.authNo": "no",
|
|
220
|
-
"extra.tools.authYes": "yes",
|
|
221
|
-
"extra.tools.connect": "Connect",
|
|
222
|
-
"extra.tools.connectedAs": "connected as",
|
|
223
|
-
"extra.tools.connectedUntested": "A connection to this tool exists, and it has never answered a test. Test it before ORC routes work to it.",
|
|
224
|
-
"extra.tools.test": "Test",
|
|
225
|
-
"extra.tools.addAnother": "Add another connection",
|
|
226
|
-
"extra.tools.floor": "oldest ORC drives",
|
|
227
|
-
"extra.tools.install": "Install it for me",
|
|
228
|
-
"extra.tools.keyhelpNoProfile": "Add a connection first — which key it uses is a property of the connection, not of the tool.",
|
|
229
|
-
"extra.tools.keyhelpSub": "What this tool needs from you, and which part ORC can do for you.",
|
|
230
|
-
"extra.tools.loginManual": "ORC cannot type this for you: the tool always asks at the keyboard. Press it and ORC opens a terminal on that exact command.",
|
|
231
|
-
"extra.tools.models": "models it offers",
|
|
232
|
-
"extra.tools.more": "Details",
|
|
233
|
-
"extra.tools.neverElevates": "ORC never asks for administrator rights and never runs anything as another user. If the install needs that, you will see it ask, in your own window, and it is yours to decide.",
|
|
234
|
-
"extra.tools.noCommand": "ORC has no install command for this computer. Its own documentation is the route.",
|
|
235
|
-
"extra.tools.none": "Nothing in the catalog runs as a local program.",
|
|
236
|
-
"extra.tools.outdatedWhat": "Your version is older than the one ORC can drive. An older build takes different options. The failure then looks like a model problem, not a version problem.",
|
|
237
|
-
"extra.tools.recheck": "Check again",
|
|
238
|
-
"extra.tools.recheckWhy": "Press this after you install something in another window.",
|
|
239
|
-
"extra.tools.sub": "ORC checks these programs on your computer every time you open this page.",
|
|
240
|
-
"extra.tools.subWhy": "Some of the things ORC can hand work to are programs installed on your own computer rather than a website it calls. A program can simply not be there, so the answer is never remembered.",
|
|
241
|
-
"extra.tools.title": "Tools that live on this machine",
|
|
242
|
-
"extra.tools.unauthWhat": "It is installed, but it has no sign-in ORC can see. Here is what it takes:",
|
|
243
|
-
"extra.tools.version": "version",
|
|
244
|
-
"extra.tools.versionUnknown": "unknown — ORC could not read it, and is not treating that as too old",
|
|
245
|
-
"extra.tools.willRun": "ORC will run exactly this, in a terminal window you can watch:",
|
|
246
|
-
"extra.profile.credentialTool": "the tool holds its own sign-in — ORC has no key for this one and does not need one",
|
|
247
|
-
"extra.strip.passphrase": "passphrase until",
|
|
248
|
-
"extra.session.title": "Save the passphrase",
|
|
249
|
-
"extra.session.keepFor": "Keep this passphrase for",
|
|
250
|
-
"extra.session.keepForHint": "After this date ORC stops a run instead of moving the work back to Claude. You set the date; ORC keeps it.",
|
|
251
|
-
"extra.session.days": "{n} days",
|
|
252
|
-
"extra.session.until": "Saved until {date}.",
|
|
253
|
-
"extra.session.honesty": "While this passphrase is saved, anything that can run as you on this computer can open the connection. The deadline is what limits that. Copying the project folder to another computer does not open it.",
|
|
254
|
-
"extra.session.save": "Save",
|
|
255
|
-
"extra.session.abandon": "Do not save · disconnect this connection",
|
|
256
|
-
"extra.session.opened": "Enter the passphrase in the window that just opened.",
|
|
257
|
-
"extra.session.active": "passphrase until {date}",
|
|
258
|
-
"extra.session.expiring": "passphrase until {date} · {days} days left",
|
|
259
|
-
"extra.session.expired": "passphrase expired",
|
|
260
|
-
"extra.session.none": "no passphrase saved",
|
|
261
|
-
"extra.session.extend": "New deadline",
|
|
262
|
-
"extra.session.forget": "Forget now",
|
|
263
|
-
"extra.session.forgetWhat": "ORC deletes the saved passphrase for {name}. The stored key stays. The next run stops and asks you to connect again.",
|
|
264
|
-
"extra.lanes.title": "Which lane does a band govern",
|
|
265
|
-
"extra.lanes.sub": "Each row says whether that lane can send work off Claude.",
|
|
266
|
-
"extra.lanes.subWhy": "A band is arithmetic. Which lane it governs is the decision. ORC computes every row below; this panel only shows it.",
|
|
267
|
-
"extra.lanes.none": "No lane information yet.",
|
|
268
|
-
"extra.lanes.edges": "band {band} · edges {edges} · both edges agree: {agree}",
|
|
269
|
-
"extra.keyhelp.session": "For this terminal only",
|
|
270
|
-
"extra.keyhelp.persist": "To keep it after you close the terminal",
|
|
271
|
-
"extra.tab.recovery": "Recovery",
|
|
272
|
-
"extra.recovery.title": "Dispatches that did not finish",
|
|
273
|
-
"extra.recovery.note": "A worker that stopped part-way left its changes on disk. ORC wrote down what the files looked like before it started, so it can tell you exactly what changed.",
|
|
274
|
-
"extra.recovery.noteWhy": "Until v0.54.0 a failed foreign dispatch was re-sent from scratch, as if the repository were untouched. It usually is not: a worker that wrote five of six lines and then lost its connection leaves a half-changed file, and a replacement executor either rewrites work you already paid for or improvises against a mental model that no longer matches the disk. The journal is what makes the difference visible, and it is written by the CLI as the dispatch runs — not by a lane that could forget.",
|
|
275
|
-
"extra.recovery.none": "No foreign dispatch has been recorded yet",
|
|
276
|
-
"extra.recovery.noneHint": "ORC starts a record the moment a task is sent to a non-Claude worker. Nothing has been sent yet.",
|
|
277
|
-
"extra.recovery.count": "{n} recorded",
|
|
278
|
-
"extra.recovery.orphans": "{n} never reported back",
|
|
279
|
-
"extra.recovery.inFlight": "{n} still running",
|
|
280
|
-
"extra.recovery.retention": "kept for {days} days after a clean finish",
|
|
281
|
-
"extra.recovery.chipLive": "still running",
|
|
282
|
-
"extra.recovery.chipOrphan": "never reported back",
|
|
283
|
-
"extra.recovery.chipAttempts": "{n} attempts",
|
|
284
|
-
"extra.recovery.attempt": "attempt {n} of {of}",
|
|
285
|
-
"extra.recovery.neverReported": "This dispatch never reported back. The process ended before it could say what happened.",
|
|
286
|
-
"extra.recovery.attribution": "what caused it",
|
|
287
|
-
"extra.recovery.holdWave": "Sending this task to Claude instead would fail as well. Fix the cause first.",
|
|
288
|
-
"extra.recovery.position": "what changed on disk",
|
|
289
|
-
"extra.recovery.undeclared": "{path} changed, and this task never declared it.",
|
|
290
|
-
"extra.recovery.lastAction": "Last action: {action}",
|
|
291
|
-
"extra.recovery.torn": "{n} log line(s) were cut off and could not be read.",
|
|
292
|
-
"extra.recovery.acceptance": "what this task had to achieve",
|
|
293
|
-
"extra.recovery.blocked": "Blocked: {why}",
|
|
294
|
-
"extra.recovery.target": "who should continue it",
|
|
295
|
-
"extra.recovery.readFailed": "The reconcile command did not answer.",
|
|
296
|
-
"extra.recovery.resumeWhy": "This writes a new task file that carries what is already on disk. The worker that picks it up costs money, so ORC does not run it for you.",
|
|
297
|
-
"extra.recovery.reconcileWhy": "This read is free. It compares the files now against what ORC recorded before the dispatch started.",
|
|
298
|
-
"extra.recovery.prune.title": "Delete old records",
|
|
299
|
-
"extra.recovery.prune.note": "Only a record whose every attempt finished cleanly, and which nothing has changed for 30 days, can be deleted. A dispatch that never reported back is never deleted.",
|
|
300
|
-
"extra.recovery.prune.preview": "Show what would go",
|
|
301
|
-
"extra.recovery.prune.apply": "Delete them",
|
|
302
|
-
"extra.recovery.prune.none": "Nothing can be deleted yet.",
|
|
303
|
-
"extra.recovery.prune.would": "{n} record(s) would be deleted:",
|
|
304
|
-
"extra.rel.title": "how often each connection finishes",
|
|
305
|
-
"extra.rel.none": "Nothing has been dispatched yet.",
|
|
306
|
-
"extra.rel.counts": "{n} dispatch(es) · {failed} failed · {resumed} resumed · {orphaned} never reported back",
|
|
307
|
-
"extra.rel.tooSmall": "sample too small (needs {floor})",
|
|
308
|
-
"extra.rel.rate": "{pct}% did not finish",
|
|
309
|
-
"extra.rel.attribution": "provider {provider} · network {network} · local {local} · worker {worker} · orc {orc} · unattributed {unattributed}",
|
|
310
|
-
"extra.rel.mttf": "average time before a failure: {s}s",
|
|
311
|
-
"extra.rel.unreadable": "{n} record(s) could not be read and are not counted above.",
|
|
312
|
-
"extra.rel.noResult": "{n} attempt(s) have no result and are not counted above."
|
|
313
|
-
|
|
1
|
+
{
|
|
2
|
+
"extra.title": "Extra",
|
|
3
|
+
"extra.sub": "Integrate with other AI model",
|
|
4
|
+
"extra.why": "Why it works like this",
|
|
5
|
+
"extra.tab.setup": "Setup",
|
|
6
|
+
"extra.tab.routing": "Routing",
|
|
7
|
+
"extra.tab.limits": "Limits",
|
|
8
|
+
"extra.tab.spending": "Spending",
|
|
9
|
+
"extra.tab.providers": "Providers",
|
|
10
|
+
"extra.boundary.title": "Before you connect anything, read this",
|
|
11
|
+
"extra.boundary.leaves": "What leaves this machine: the task slice ORC builds — your request, the contents of the files that task names, the tool results the worker asks for, and the code it writes back.",
|
|
12
|
+
"extra.boundary.whom": "Who receives it: the provider you configure below, at the base URL shown on its profile. Nobody else is in the path, and ORC adds no telemetry of its own.",
|
|
13
|
+
"extra.boundary.cannot": "What ORC cannot promise: how long that provider keeps your prompt, whether it trains on it, or where in the world it runs. Those are the provider's terms, not ORC's — the catalog links them, and reading them is your call to make.",
|
|
14
|
+
"extra.boundary.fence": "One engine composes the request body itself, and only that one can hold a worker to the files a task declared or carry a privacy policy. The other two send instructions and trust the tool to obey them. Each profile below says which engine it is on.",
|
|
15
|
+
"extra.boundary.probe": "This panel never talks to a model. Testing a connection runs the same command you would type, and the connection is the CLI's.",
|
|
16
|
+
"extra.strip.profiles": "profiles",
|
|
17
|
+
"extra.strip.verified": "verified",
|
|
18
|
+
"extra.strip.routed": "routed bands",
|
|
19
|
+
"extra.strip.findings": "findings",
|
|
20
|
+
"extra.strip.catalog": "catalog dated",
|
|
21
|
+
"extra.providers.title": "Providers ORC knows how to reach",
|
|
22
|
+
"extra.providers.sub": "This is the shipped catalog of providers ORC can reach, with the date it was published.",
|
|
23
|
+
"extra.providers.subWhy": "It carries base URLs, the variable each provider reads its key from, and the terms to go and read.",
|
|
24
|
+
"extra.providers.noModels": "Model names are not shipped: they change within a quarter, and a stale one is a failure in the middle of a run. Testing a connection reads the live list from the provider.",
|
|
25
|
+
"extra.providers.stale": "This catalog is older than the age ORC trusts. A base URL may have moved — check the provider's own documentation before you believe a failure.",
|
|
26
|
+
"extra.providers.engines": "engines",
|
|
27
|
+
"extra.providers.regions": "regions",
|
|
28
|
+
"extra.providers.docs": "setup guide",
|
|
29
|
+
"extra.providers.terms": "terms",
|
|
30
|
+
"extra.profiles.title": "Your connections",
|
|
31
|
+
"extra.profiles.none": "No connection configured yet.",
|
|
32
|
+
"extra.profiles.noneHint": "Nothing is routed anywhere else until you add one, test it, and map a band to it. Until then every task runs where it runs today.",
|
|
33
|
+
"extra.profiles.addWhy": "Adds a connection. Nothing is sent anywhere and no key is stored by this step.",
|
|
34
|
+
"extra.profiles.pingWhy": "The connection test. It is the gate: nothing routes to a connection that has never answered.",
|
|
35
|
+
"extra.profile.provider": "provider",
|
|
36
|
+
"extra.profile.engine": "engine",
|
|
37
|
+
"extra.profile.base": "base URL",
|
|
38
|
+
"extra.profile.region": "region",
|
|
39
|
+
"extra.profile.credential": "key",
|
|
40
|
+
"extra.profile.credentialEnv": "read from the variable {name}",
|
|
41
|
+
"extra.profile.credentialVault": "stored here, encrypted",
|
|
42
|
+
"extra.profile.present": "found",
|
|
43
|
+
"extra.profile.missing": "not found",
|
|
44
|
+
"extra.profile.verifiedAt": "answered {when} · {how}",
|
|
45
|
+
"extra.profile.latency": "{ms} ms",
|
|
46
|
+
"extra.profile.never": "never tested",
|
|
47
|
+
"extra.profile.modelsLabel": "models",
|
|
48
|
+
"extra.profile.models": "{n} model names cached",
|
|
49
|
+
"extra.profile.modelsNone": "no model names cached yet",
|
|
50
|
+
"extra.profile.fidelity": "measured on first dispatch",
|
|
51
|
+
"extra.profile.privacy": "privacy policy set",
|
|
52
|
+
"extra.vault.stored": "key stored",
|
|
53
|
+
"extra.vault.wiped": "key deleted",
|
|
54
|
+
"extra.vault.none": "nothing stored",
|
|
55
|
+
"extra.vault.attempts": "{used} of {max} wrong attempts used",
|
|
56
|
+
"extra.vault.attemptsNone": "no wrong attempts",
|
|
57
|
+
"extra.vault.wipedWhen": "deleted {when} after too many wrong passphrases. Paste a new key from your provider.",
|
|
58
|
+
"extra.findings.title": "What needs your attention",
|
|
59
|
+
"extra.findings.none": "Nothing to report.",
|
|
60
|
+
"extra.findings.notFixable": "there is no fix for this one — the text says what to do instead",
|
|
61
|
+
"extra.findings.cmdWhy": "Names every one of them, with the reason.",
|
|
62
|
+
"extra.load.providers": "The provider catalog could not be read.",
|
|
63
|
+
"extra.load.profiles": "The connection list could not be read.",
|
|
64
|
+
"extra.add.button": "Add a connection",
|
|
65
|
+
"extra.add.title": "Add a connection",
|
|
66
|
+
"extra.add.name": "name",
|
|
67
|
+
"extra.add.namePh": "cheap",
|
|
68
|
+
"extra.add.nameHint": "Your own short name for it. This is what a routing row points at.",
|
|
69
|
+
"extra.add.provider": "provider",
|
|
70
|
+
"extra.add.engine": "engine",
|
|
71
|
+
"extra.add.engineHint": "Only the ones this provider actually ships are offered.",
|
|
72
|
+
"extra.add.region": "region",
|
|
73
|
+
"extra.add.base": "base URL",
|
|
74
|
+
"extra.add.baseHint": "Leave it empty to use the one in the catalog.",
|
|
75
|
+
"extra.add.cliBin": "command",
|
|
76
|
+
"extra.add.cliBinHint": "The tool ORC runs. It must be one ORC has an adapter for, and it will say so if it is not.",
|
|
77
|
+
"extra.add.cliAgent": "agent",
|
|
78
|
+
"extra.add.cliAgentPh": "build",
|
|
79
|
+
"extra.add.credential": "credential",
|
|
80
|
+
"extra.add.sourceEnv": "the NAME of an environment variable (recommended)",
|
|
81
|
+
"extra.add.sourceVault": "paste the key and store it here, encrypted",
|
|
82
|
+
"extra.add.sourceTool": "this tool signs itself in — no key needed",
|
|
83
|
+
"extra.add.sourceToolHint": "This tool holds its own credential. ORC sends no key and never writes another tool's credential store. Choose an environment variable or the vault only if you want ORC to hold a separate key.",
|
|
84
|
+
"extra.add.envKey": "variable name",
|
|
85
|
+
"extra.add.envKeyHint": "The name only. ORC never reads the value into anything it can print.",
|
|
86
|
+
"extra.add.key": "the key",
|
|
87
|
+
"extra.add.keyPh": "paste it here",
|
|
88
|
+
"extra.add.keyHint": "It is sent once, to test the connection. It is not written anywhere unless the test passes and you give a passphrase.",
|
|
89
|
+
"extra.add.vaultWarn": "An environment variable your operating system already protects beats a passphrase you will forget. Store the key here only if you would rather not manage variables — and write the passphrase down first, because ORC cannot recover it.",
|
|
90
|
+
"extra.add.needName": "Give it a name first.",
|
|
91
|
+
"extra.probe.head": "What the test does, before you press it",
|
|
92
|
+
"extra.probe.free": "First it asks the provider for its list of models. That costs nothing and no model runs.",
|
|
93
|
+
"extra.probe.paid": "Only if that list is unavailable does it send a one-token request instead, which costs a fraction of a cent. ORC tells you afterwards which of the two actually answered.",
|
|
94
|
+
"extra.wire.you": "this machine",
|
|
95
|
+
"extra.wire.provider": "the provider",
|
|
96
|
+
"extra.test.button": "Test connection",
|
|
97
|
+
"extra.test.running": "testing…",
|
|
98
|
+
"extra.test.title": "Test {name}",
|
|
99
|
+
"extra.test.vaultedNote": "This connection's key is stored here, encrypted. Give your passphrase and ORC unlocks the key just long enough to test it — the key is never printed and never written anywhere. A wrong passphrase spends one of your attempts, the same as anywhere else.",
|
|
100
|
+
"extra.result.verified": "answered · {how}",
|
|
101
|
+
"extra.result.reverted": "The test failed, so nothing was kept: the key was discarded and the connection removed. Nothing is left half-configured.",
|
|
102
|
+
"extra.save.head": "Store this key?",
|
|
103
|
+
"extra.save.warning": "Write your passphrase down somewhere safe now. ORC does not store it and cannot recover it. If you lose it, the stored key is gone and you paste a new one from your provider. After ten wrong attempts ORC deletes the stored key on purpose.",
|
|
104
|
+
"extra.save.pass": "passphrase",
|
|
105
|
+
"extra.save.passPh": "not shown",
|
|
106
|
+
"extra.save.passHint": "Only you know this. It is never stored, never logged and never shown to a model.",
|
|
107
|
+
"extra.save.again": "again",
|
|
108
|
+
"extra.save.againPh": "type it once more",
|
|
109
|
+
"extra.save.button": "Store the key",
|
|
110
|
+
"extra.save.mismatch": "The two passphrases did not match. Nothing was stored.",
|
|
111
|
+
"extra.save.stored": "The key is stored, encrypted (pepper: {pepper}).",
|
|
112
|
+
"extra.unlock.button": "Prove the passphrase",
|
|
113
|
+
"extra.unlock.title": "Unlock {name}",
|
|
114
|
+
"extra.unlock.what": "This checks your passphrase and nothing else. The key is never printed and never leaves the vault. Getting it right resets the wrong-attempt count to zero.",
|
|
115
|
+
"extra.unlock.ok": "Correct. The wrong-attempt count is back to zero, and the key was not printed anywhere.",
|
|
116
|
+
"extra.remove.button": "Remove",
|
|
117
|
+
"extra.remove.title": "Remove {name}",
|
|
118
|
+
"extra.remove.what": "This deletes the connection {name} and every routing row that points at it. The work those rows used to send away comes back to where it runs today.",
|
|
119
|
+
"extra.remove.reason": "reason",
|
|
120
|
+
"extra.remove.reasonPh": "why are you removing it?",
|
|
121
|
+
"extra.remove.reasonHint": "Required. A change to how this repo builds with no recorded why is a change nobody can explain in three weeks.",
|
|
122
|
+
"extra.remove.done": "{name} removed.",
|
|
123
|
+
"extra.fixture": "This is fixture mode: nothing real was run and nothing was contacted.",
|
|
124
|
+
"extra.routing.title": "Where each task runs",
|
|
125
|
+
"extra.routing.sub": "Each row is one score range. Click a row to change where that range runs.",
|
|
126
|
+
"extra.routing.gapNote": "Every range you do not connect stays on Claude, and keeps its row.",
|
|
127
|
+
"extra.routing.gapWhy": "A gap is not a hole. Every range with no connection of yours on it is drawn in Claude's colour with the agent it actually resolves to, so “I left the hardest work on Claude on purpose” and “there is no top band” can never look the same.",
|
|
128
|
+
"extra.routing.legendExtra": "This work leaves your machine.",
|
|
129
|
+
"extra.routing.legendClaude": "This work stays on Claude.",
|
|
130
|
+
"extra.routing.locked": "Nothing can be routed yet.",
|
|
131
|
+
"extra.routing.lockedHint": "Test one connection first. Work is never sent to somewhere that has not answered, so the editor opens as soon as one has.",
|
|
132
|
+
"extra.routing.editNote": "Nothing is written until you press Apply. Each row is written on its own, so one the CLI refuses does not undo the others.",
|
|
133
|
+
"extra.routing.pickProfile": "pick a connection…",
|
|
134
|
+
"extra.routing.untested": "(not tested yet)",
|
|
135
|
+
"extra.routing.modelPh": "model name",
|
|
136
|
+
"extra.routing.route": "Send this range there",
|
|
137
|
+
"extra.routing.clear": "Back to Claude",
|
|
138
|
+
"extra.routing.kvProfile": "Connection",
|
|
139
|
+
"extra.routing.kvModel": "Model",
|
|
140
|
+
"extra.routing.kvSmall": "Small model",
|
|
141
|
+
"extra.routing.kvTurns": "Turn limit",
|
|
142
|
+
"extra.routing.staged": "waiting for Apply",
|
|
143
|
+
"extra.routing.stagedSet": "{target}",
|
|
144
|
+
"extra.routing.stagedClear": "back to Claude",
|
|
145
|
+
"extra.routing.modelGone": "model not listed",
|
|
146
|
+
"extra.reset.title": "Put the guardrails back to their defaults",
|
|
147
|
+
"extra.reset.body": "This removes these settings from your config file, so each one goes back to what ORC ships. Your connections and your routing are NOT touched.",
|
|
148
|
+
"extra.reset.note": "Removing a setting is not the same as setting it to its default value — the key stops being in the file at all.",
|
|
149
|
+
"extra.reset.apply": "Reset them",
|
|
150
|
+
"extra.reset.done": "{n} settings back to their defaults.",
|
|
151
|
+
"extra.reset.label": "Reset the guardrails",
|
|
152
|
+
"extra.routing.undo": "Undo",
|
|
153
|
+
"extra.slots.title": "Where each fixed job runs",
|
|
154
|
+
"extra.slots.sub": "Some lanes give no score. They give one job to one agent. Pick where each job runs.",
|
|
155
|
+
"extra.slots.subWhy": "A score is what a range needs, and four lanes never produce one. Until v0.55.0 those lanes were routed by reading the score range of the agent they pin — arithmetic on a number nobody chose. A job is now a named position with one connection and one model.",
|
|
156
|
+
"extra.slots.keepsSlotWhy": "A job with no connection keeps its row and is drawn as the Claude agent it falls back to. Hiding it would make “I left the checker on Claude on purpose” and “there is no checker” look the same.",
|
|
157
|
+
"extra.slots.asked": "you are asked at the gate, every time",
|
|
158
|
+
"extra.slots.hold": "Send this job there",
|
|
159
|
+
"extra.slots.clear": "Back to Claude",
|
|
160
|
+
"extra.slots.displaces": "This takes the job from: {agents}",
|
|
161
|
+
"extra.slots.kvDisplaces": "Takes the job from",
|
|
162
|
+
"extra.slots.stagedSet": "{slot} → {target}",
|
|
163
|
+
"extra.slots.stagedClear": "back to {agent}",
|
|
164
|
+
"extra.slots.confirmReplace": "{slot} already runs on {old}. Replace it with {next}?",
|
|
165
|
+
"extra.slots.unreachable": "These roles can be set in your config, and nothing runs them yet:",
|
|
166
|
+
"extra.guard.title": "The limits you set",
|
|
167
|
+
"extra.guard.sub": "Change a limit here, then press Apply.",
|
|
168
|
+
"extra.guard.subWhy": "These are ordinary ORC settings, shown here because this is where they matter. They read from the same file the Settings panel edits, and they are written by the same command.",
|
|
169
|
+
"extra.guard.none": "No settings were returned.",
|
|
170
|
+
"extra.cost.title": "What it ran, and what it cost",
|
|
171
|
+
"extra.cost.none": "Nothing has been sent anywhere else yet.",
|
|
172
|
+
"extra.cost.noneHint": "This fills in the first time a task really runs somewhere else. ORC writes each one down as it happens.",
|
|
173
|
+
"extra.cost.dispatches": "{n} tasks sent",
|
|
174
|
+
"extra.cost.scanned": "from {n} traces",
|
|
175
|
+
"extra.cost.sources": "{log} written down by ORC · {traces} read from traces · {backfill} recovered from saved returns",
|
|
176
|
+
"extra.cost.sourcesWhy": "ORC writes every foreign dispatch to its own log the moment the worker answers, so a cost figure never depends on a run remembering to narrate it. Traces and saved run returns are read as well, so dispatches made before that log existed still appear. The same dispatch is only ever counted once.",
|
|
177
|
+
"extra.cost.unreadable": "Some lines in the log could not be read: {n}. Those dispatches are not counted in the totals below.",
|
|
178
|
+
"extra.cost.undated": "Some saved returns have no date: {n}. A date filter leaves them out. Clear the filter to include them.",
|
|
179
|
+
"extra.cost.priceTable": "Prices are from the table dated {as_of} ({days} days old). Nothing here is priced unless ORC has a rate for it.",
|
|
180
|
+
"extra.cost.nDispatches": "{n} sent",
|
|
181
|
+
"extra.cost.never": "Nothing has run through this range yet, so there is nothing to report — not zero cost, no measurement at all.",
|
|
182
|
+
"extra.cost.unrouted": "no longer routed",
|
|
183
|
+
"extra.cost.partial": "These counts come from {got} of {of} tasks — {missing} reported no counts at all. The rest is unknown, not zero.",
|
|
184
|
+
"extra.cost.usd": "usd {usd}",
|
|
185
|
+
"extra.cost.noRate": "usd — · there is no rate for {provider} in the price table, and a figure ORC did not price itself is never printed.",
|
|
186
|
+
"extra.cost.substitutions": "You did not get the model you asked for",
|
|
187
|
+
"extra.cost.reroutes": "The model held and a different company served it",
|
|
188
|
+
"extra.cost.fallbacks": "It did not work and Claude finished the job",
|
|
189
|
+
"extra.cost.more": "…and {n} more",
|
|
190
|
+
"extra.cost.missingRates": "Pairs with no price",
|
|
191
|
+
"extra.cost.ratesWhy": "Prints the JSON to paste for every provider and model pair that has no rate.",
|
|
192
|
+
"extra.routing.recomputed": "recomputed on Apply",
|
|
193
|
+
"extra.test.passHint": "Unlocks the stored key for this test only. Leave it empty if you are pasting a replacement key below.",
|
|
194
|
+
"extra.test.replaceKey": "or paste a new key instead",
|
|
195
|
+
"extra.test.replaceKeyHint": "Only if you changed the key at the provider. This REPLACES what is stored, and it asks for a passphrase again after the test passes.",
|
|
196
|
+
"extra.gate.hidden": "Connect one provider and test it. Routing, limits and spending appear after that.",
|
|
197
|
+
"extra.gate.hiddenWhy": "They are all controls for work that cannot happen until something answers, and setting them now would only look like it did something.",
|
|
198
|
+
"extra.gate.neverTested": "You have a connection, but it has never answered. Test it — nothing is ever sent to somewhere that has not proved it works.",
|
|
199
|
+
"extra.gate.noConnection": "Nothing is connected yet, so there is nothing to route work to. Install a tool above, or add a connection to a provider and give it a key.",
|
|
200
|
+
"extra.gate.title": "Set one connection up first",
|
|
201
|
+
"extra.live.cacheRead": "read from cache",
|
|
202
|
+
"extra.live.cacheWrite": "written to cache",
|
|
203
|
+
"extra.live.input": "new input",
|
|
204
|
+
"extra.live.noReport": "this tool does not say which model answered, so if it quietly used a different one there is no way to tell from here",
|
|
205
|
+
"extra.live.output": "output",
|
|
206
|
+
"extra.live.reply": "what came back",
|
|
207
|
+
"extra.live.reported": "model that answered",
|
|
208
|
+
"extra.live.requested": "model asked for",
|
|
209
|
+
"extra.live.truncated": "Shortened. ORC keeps only the beginning of a reply.",
|
|
210
|
+
"extra.probe.cliFree": "ORC checks four free things first. The program is there. It is new enough. It has a sign-in. It lists the models your account can reach. No model runs, and nothing is charged.",
|
|
211
|
+
"extra.probe.cliPaid": "Sending a real message is a separate button. On a tool like this it is not cheap. The tool loads its own instructions first. One short message then costs thousands of words of input.",
|
|
212
|
+
"extra.test.live": "Send a real message",
|
|
213
|
+
"extra.test.model": "model to test",
|
|
214
|
+
"extra.test.modelHint": "Only used by the real-message button. A model being on this list means the provider offers it — it does not mean it works.",
|
|
215
|
+
"extra.tools.absentWhat": "This program is not installed here. There is nothing to sign in to and no models to list. Install it first, then connect.",
|
|
216
|
+
"extra.tools.altNone": "There is no way to use this one without installing it. That is not something ORC forgot to look for — this tool has no website to point at.",
|
|
217
|
+
"extra.tools.altYes": "You can also do this without installing anything, using:",
|
|
218
|
+
"extra.tools.auth": "signed in",
|
|
219
|
+
"extra.tools.authNo": "no",
|
|
220
|
+
"extra.tools.authYes": "yes",
|
|
221
|
+
"extra.tools.connect": "Connect",
|
|
222
|
+
"extra.tools.connectedAs": "connected as",
|
|
223
|
+
"extra.tools.connectedUntested": "A connection to this tool exists, and it has never answered a test. Test it before ORC routes work to it.",
|
|
224
|
+
"extra.tools.test": "Test",
|
|
225
|
+
"extra.tools.addAnother": "Add another connection",
|
|
226
|
+
"extra.tools.floor": "oldest ORC drives",
|
|
227
|
+
"extra.tools.install": "Install it for me",
|
|
228
|
+
"extra.tools.keyhelpNoProfile": "Add a connection first — which key it uses is a property of the connection, not of the tool.",
|
|
229
|
+
"extra.tools.keyhelpSub": "What this tool needs from you, and which part ORC can do for you.",
|
|
230
|
+
"extra.tools.loginManual": "ORC cannot type this for you: the tool always asks at the keyboard. Press it and ORC opens a terminal on that exact command.",
|
|
231
|
+
"extra.tools.models": "models it offers",
|
|
232
|
+
"extra.tools.more": "Details",
|
|
233
|
+
"extra.tools.neverElevates": "ORC never asks for administrator rights and never runs anything as another user. If the install needs that, you will see it ask, in your own window, and it is yours to decide.",
|
|
234
|
+
"extra.tools.noCommand": "ORC has no install command for this computer. Its own documentation is the route.",
|
|
235
|
+
"extra.tools.none": "Nothing in the catalog runs as a local program.",
|
|
236
|
+
"extra.tools.outdatedWhat": "Your version is older than the one ORC can drive. An older build takes different options. The failure then looks like a model problem, not a version problem.",
|
|
237
|
+
"extra.tools.recheck": "Check again",
|
|
238
|
+
"extra.tools.recheckWhy": "Press this after you install something in another window.",
|
|
239
|
+
"extra.tools.sub": "ORC checks these programs on your computer every time you open this page.",
|
|
240
|
+
"extra.tools.subWhy": "Some of the things ORC can hand work to are programs installed on your own computer rather than a website it calls. A program can simply not be there, so the answer is never remembered.",
|
|
241
|
+
"extra.tools.title": "Tools that live on this machine",
|
|
242
|
+
"extra.tools.unauthWhat": "It is installed, but it has no sign-in ORC can see. Here is what it takes:",
|
|
243
|
+
"extra.tools.version": "version",
|
|
244
|
+
"extra.tools.versionUnknown": "unknown — ORC could not read it, and is not treating that as too old",
|
|
245
|
+
"extra.tools.willRun": "ORC will run exactly this, in a terminal window you can watch:",
|
|
246
|
+
"extra.profile.credentialTool": "the tool holds its own sign-in — ORC has no key for this one and does not need one",
|
|
247
|
+
"extra.strip.passphrase": "passphrase until",
|
|
248
|
+
"extra.session.title": "Save the passphrase",
|
|
249
|
+
"extra.session.keepFor": "Keep this passphrase for",
|
|
250
|
+
"extra.session.keepForHint": "After this date ORC stops a run instead of moving the work back to Claude. You set the date; ORC keeps it.",
|
|
251
|
+
"extra.session.days": "{n} days",
|
|
252
|
+
"extra.session.until": "Saved until {date}.",
|
|
253
|
+
"extra.session.honesty": "While this passphrase is saved, anything that can run as you on this computer can open the connection. The deadline is what limits that. Copying the project folder to another computer does not open it.",
|
|
254
|
+
"extra.session.save": "Save",
|
|
255
|
+
"extra.session.abandon": "Do not save · disconnect this connection",
|
|
256
|
+
"extra.session.opened": "Enter the passphrase in the window that just opened.",
|
|
257
|
+
"extra.session.active": "passphrase until {date}",
|
|
258
|
+
"extra.session.expiring": "passphrase until {date} · {days} days left",
|
|
259
|
+
"extra.session.expired": "passphrase expired",
|
|
260
|
+
"extra.session.none": "no passphrase saved",
|
|
261
|
+
"extra.session.extend": "New deadline",
|
|
262
|
+
"extra.session.forget": "Forget now",
|
|
263
|
+
"extra.session.forgetWhat": "ORC deletes the saved passphrase for {name}. The stored key stays. The next run stops and asks you to connect again.",
|
|
264
|
+
"extra.lanes.title": "Which lane does a band govern",
|
|
265
|
+
"extra.lanes.sub": "Each row says whether that lane can send work off Claude.",
|
|
266
|
+
"extra.lanes.subWhy": "A band is arithmetic. Which lane it governs is the decision. ORC computes every row below; this panel only shows it.",
|
|
267
|
+
"extra.lanes.none": "No lane information yet.",
|
|
268
|
+
"extra.lanes.edges": "band {band} · edges {edges} · both edges agree: {agree}",
|
|
269
|
+
"extra.keyhelp.session": "For this terminal only",
|
|
270
|
+
"extra.keyhelp.persist": "To keep it after you close the terminal",
|
|
271
|
+
"extra.tab.recovery": "Recovery",
|
|
272
|
+
"extra.recovery.title": "Dispatches that did not finish",
|
|
273
|
+
"extra.recovery.note": "A worker that stopped part-way left its changes on disk. ORC wrote down what the files looked like before it started, so it can tell you exactly what changed.",
|
|
274
|
+
"extra.recovery.noteWhy": "Until v0.54.0 a failed foreign dispatch was re-sent from scratch, as if the repository were untouched. It usually is not: a worker that wrote five of six lines and then lost its connection leaves a half-changed file, and a replacement executor either rewrites work you already paid for or improvises against a mental model that no longer matches the disk. The journal is what makes the difference visible, and it is written by the CLI as the dispatch runs — not by a lane that could forget.",
|
|
275
|
+
"extra.recovery.none": "No foreign dispatch has been recorded yet",
|
|
276
|
+
"extra.recovery.noneHint": "ORC starts a record the moment a task is sent to a non-Claude worker. Nothing has been sent yet.",
|
|
277
|
+
"extra.recovery.count": "{n} recorded",
|
|
278
|
+
"extra.recovery.orphans": "{n} never reported back",
|
|
279
|
+
"extra.recovery.inFlight": "{n} still running",
|
|
280
|
+
"extra.recovery.retention": "kept for {days} days after a clean finish",
|
|
281
|
+
"extra.recovery.chipLive": "still running",
|
|
282
|
+
"extra.recovery.chipOrphan": "never reported back",
|
|
283
|
+
"extra.recovery.chipAttempts": "{n} attempts",
|
|
284
|
+
"extra.recovery.attempt": "attempt {n} of {of}",
|
|
285
|
+
"extra.recovery.neverReported": "This dispatch never reported back. The process ended before it could say what happened.",
|
|
286
|
+
"extra.recovery.attribution": "what caused it",
|
|
287
|
+
"extra.recovery.holdWave": "Sending this task to Claude instead would fail as well. Fix the cause first.",
|
|
288
|
+
"extra.recovery.position": "what changed on disk",
|
|
289
|
+
"extra.recovery.undeclared": "{path} changed, and this task never declared it.",
|
|
290
|
+
"extra.recovery.lastAction": "Last action: {action}",
|
|
291
|
+
"extra.recovery.torn": "{n} log line(s) were cut off and could not be read.",
|
|
292
|
+
"extra.recovery.acceptance": "what this task had to achieve",
|
|
293
|
+
"extra.recovery.blocked": "Blocked: {why}",
|
|
294
|
+
"extra.recovery.target": "who should continue it",
|
|
295
|
+
"extra.recovery.readFailed": "The reconcile command did not answer.",
|
|
296
|
+
"extra.recovery.resumeWhy": "This writes a new task file that carries what is already on disk. The worker that picks it up costs money, so ORC does not run it for you.",
|
|
297
|
+
"extra.recovery.reconcileWhy": "This read is free. It compares the files now against what ORC recorded before the dispatch started.",
|
|
298
|
+
"extra.recovery.prune.title": "Delete old records",
|
|
299
|
+
"extra.recovery.prune.note": "Only a record whose every attempt finished cleanly, and which nothing has changed for 30 days, can be deleted. A dispatch that never reported back is never deleted.",
|
|
300
|
+
"extra.recovery.prune.preview": "Show what would go",
|
|
301
|
+
"extra.recovery.prune.apply": "Delete them",
|
|
302
|
+
"extra.recovery.prune.none": "Nothing can be deleted yet.",
|
|
303
|
+
"extra.recovery.prune.would": "{n} record(s) would be deleted:",
|
|
304
|
+
"extra.rel.title": "how often each connection finishes",
|
|
305
|
+
"extra.rel.none": "Nothing has been dispatched yet.",
|
|
306
|
+
"extra.rel.counts": "{n} dispatch(es) · {failed} failed · {resumed} resumed · {orphaned} never reported back",
|
|
307
|
+
"extra.rel.tooSmall": "sample too small (needs {floor})",
|
|
308
|
+
"extra.rel.rate": "{pct}% did not finish",
|
|
309
|
+
"extra.rel.attribution": "provider {provider} · network {network} · local {local} · worker {worker} · orc {orc} · unattributed {unattributed}",
|
|
310
|
+
"extra.rel.mttf": "average time before a failure: {s}s",
|
|
311
|
+
"extra.rel.unreadable": "{n} record(s) could not be read and are not counted above.",
|
|
312
|
+
"extra.rel.noResult": "{n} attempt(s) have no result and are not counted above.",
|
|
313
|
+
"extra.demotion.title": "Demotion in this run",
|
|
314
|
+
"extra.demotion.note": "A worker that stalls twice in one run stays on Claude for the rest of that run.",
|
|
315
|
+
"extra.demotion.noteWhy": "The mirror of routing work off Claude without saying so is a lane that quietly stops. A demotion nobody can see is a subsystem that went quiet, so this card renders even when nothing is demoted. Nothing here is stored: the verdict is recomputed from the journal on disk every time you open it. Only the human half — a promote or a hand demotion, with its reason — is written down, and it is deleted with the run.",
|
|
316
|
+
"extra.demotion.noRun": "No run is open",
|
|
317
|
+
"extra.demotion.noRunHint": "A demotion is scoped to one run. With no run open there is no clock to report.",
|
|
318
|
+
"extra.demotion.stateArmed": "armed",
|
|
319
|
+
"extra.demotion.stateDemoted": "demoted",
|
|
320
|
+
"extra.demotion.clockConsecutive": "Consecutive clock",
|
|
321
|
+
"extra.demotion.clockStale": "Stale clock",
|
|
322
|
+
"extra.demotion.clockStalls": "{n} stalled dispatches",
|
|
323
|
+
"extra.demotion.clockMinutes": "{n} minutes with no progress",
|
|
324
|
+
"extra.demotion.clockOff": "off",
|
|
325
|
+
"extra.demotion.ladder": "Ladder now",
|
|
326
|
+
"extra.demotion.noProfiles": "Nothing has reached the journal yet",
|
|
327
|
+
"extra.demotion.noProfilesHint": "No foreign dispatch in this run has reported back, so no clock has anything to count.",
|
|
328
|
+
"extra.demotion.chipRouting": "routing",
|
|
329
|
+
"extra.demotion.chipDemoted": "demoted",
|
|
330
|
+
"extra.demotion.stalls": "stalls {n}/{of}",
|
|
331
|
+
"extra.demotion.quiet": "live attempt {task} quiet for {min}m",
|
|
332
|
+
"extra.demotion.resetBy": "counter reset by {task} ({outcome})",
|
|
333
|
+
"extra.demotion.resumes": "{n} resume(s) of the same stall — not counted twice",
|
|
334
|
+
"extra.demotion.unattributed": "{n} journal attempt(s) carry no run and are counted by no run's clock.",
|
|
335
|
+
"extra.demotion.override": "{state} by hand on {at} — “{reason}”",
|
|
336
|
+
"extra.demotion.promote": "Promote back",
|
|
337
|
+
"extra.demotion.promoteHint": "Needs a reason. It is written down with the run.",
|
|
338
|
+
"extra.demotion.promoteTitle": "Promote this run back",
|
|
339
|
+
"extra.demotion.promoteWhat": "Run {run} will route to {profiles} again.",
|
|
340
|
+
"extra.demotion.promoteWatermark": "A promote forgives the evidence it has seen. It does not switch the clock off — two more stalls in this run demote again.",
|
|
341
|
+
"extra.demotion.reasonPlaceholder": "Why are you promoting it back?",
|
|
342
|
+
"extra.demotion.reasonAria": "Reason for promoting this run back",
|
|
343
|
+
"extra.demotion.reasonRequired": "A reason is required. A state change nobody wrote a reason for is one nobody can audit later.",
|
|
344
|
+
"extra.demotion.promoted": "Run {run} routes foreign again."
|
|
345
|
+
}
|