openvibers/openvibe.codes Commits

Declare edit/review/tools/vision/browser/computer-use and runtimes on Codes' harness offers and route on them (#16)

OP OpenVibers committed 5 Oct 2026 · af3aab3328 · 3 files, +65 −9

* Declare edit/review/tools/vision/browser/computer-use and runtimes on Codes' harness offers and route on them

All three targeted tests pass. Changes (each row now carries `edit`, `review`, `tools`, `vision`, `browser`, `computer_use` and `runtimes:["code"]`):

**Changes**
- `server/data/harness-offers.json:6` — claude-code capabilities: edit/review/tools/vision `true`, browser/computer_use `false`, runtimes `["code"]`.
- `server/data/harness-offers.json:56` — codex: same as claude-code.
- `server/data/harness-offers.json:106` — command-code: edit/tools `true`, review/vision/browser/computer_use `false`, runtimes `["code"]`.
- `server/data/harness-offers.json:138` — opencode: edit/review/tools/vision `true`, browser/computer_use `false`, runtimes `["code"]`.
- `server/data/harness-offers.json:170` — aider: edit/tools `true`, review/vision/browser/computer_use `false`, runtimes `["code"]`.
- `server/data/harness-offers.json:202` — deepseek: edit/review/tools/vision/browser/computer_use all `false`, runtimes `["code"]` (bare `api` harness, no agent loop).
- `server/domain/harness-placement.js:13` — `HARNESS_FLAGS` extended with `edit→harness:edit`, `review→harness:review`, `tools→harness:tools`, `vision→harness:vision`, `browser→harness:browser`, `computer_use→harness:computer-use` (existing `toOffer` loop at :36 then advertises each as a resource-offer capability).
- `test/harness-placement.test.js:42,75` — updated the two exact capability-array expectations for the new flags.
- `test/harness-placement.test.js:139` — new route case: `requirements.capabilities:['harness:vision']` excludes `deepseek:deepseek-chat` with reason `lacks harness:vision` while claude-code/codex stay eligible.

**Schema check** — all six booleans plus `runtimes` (enum includes `code`) already exist in `platform.harness-offer@1` (`node_modules/openvibe-contracts/contracts/platform/harness-offer.v1.json:44-83`); nothing was missing. `harnesses.js:30` validation therefore accepts the rows.

**Truthfulness notes** — vision follows your instruction exactly. No row or local README documents per-harness behavior, so I used each product's known nature and set `browser`/`computer_use` **false everywhere** (none drives a web browser or a desktop) and deepseek's `edit/review/tools` **false** (an API endpoint, not an agent). I could not establish a review workflow for **command-code** or **aider** from any local doc, so I set `review:false` for both and state that as an unestablished capability rather than an assertion of absence. `runtimes` is added as data (schema-validated) but is not mapped into `HARNESS_FLAGS`, which maps booleans only; no rate card or price was touched.

**Tests** — `ov test test/harness-placement.test.js test/harnesses.test.js test/harnesses-api.test.js` → `3 passed in 7 s`, all named files green.

* Aider takes images with vision-capable models: vision true (review)

Changes

ddiff --git a/server/data/harness-offers.json b/server/data/harness-offers.json
iindex ae07ba8..7f883b6 100644
---- a/server/data/harness-offers.json
++++ b/server/data/harness-offers.json
@@@ -7,7 +7,14 @@
"host_access": true,
"mcp": true,
"long_autonomy": true,
-- "resume": true
++ "resume": true,
++ "edit": true,
++ "review": true,
++ "tools": true,
++ "vision": true,
++ "browser": false,
++ "computer_use": false,
++ "runtimes": ["code"]
},
"address": {
"kind": "cli",
@@@ -50,7 +57,14 @@
"host_access": true,
"mcp": true,
"long_autonomy": true,
-- "resume": true
++ "resume": true,
++ "edit": true,
++ "review": true,
++ "tools": true,
++ "vision": true,
++ "browser": false,
++ "computer_use": false,
++ "runtimes": ["code"]
},
"address": {
"kind": "cli",
@@@ -93,7 +107,14 @@
"host_access": true,
"mcp": true,
"long_autonomy": false,
-- "resume": true
++ "resume": true,
++ "edit": true,
++ "review": false,
++ "tools": true,
++ "vision": false,
++ "browser": false,
++ "computer_use": false,
++ "runtimes": ["code"]
},
"address": {
"kind": "cli",
@@@ -118,7 +139,14 @@
"host_access": true,
"mcp": true,
"long_autonomy": false,
-- "resume": true
++ "resume": true,
++ "edit": true,
++ "review": true,
++ "tools": true,
++ "vision": true,
++ "browser": false,
++ "computer_use": false,
++ "runtimes": ["code"]
},
"address": {
"kind": "cli",
@@@ -143,7 +171,14 @@
"host_access": true,
"mcp": false,
"long_autonomy": false,
-- "resume": true
++ "resume": true,
++ "edit": true,
++ "review": false,
++ "tools": true,
++ "vision": true,
++ "browser": false,
++ "computer_use": false,
++ "runtimes": ["code"]
},
"address": {
"kind": "cli",
@@@ -168,7 +203,14 @@
"host_access": false,
"mcp": false,
"long_autonomy": false,
-- "resume": false
++ "resume": false,
++ "edit": false,
++ "review": false,
++ "tools": false,
++ "vision": false,
++ "browser": false,
++ "computer_use": false,
++ "runtimes": ["code"]
},
"address": {
"kind": "api",
ddiff --git a/server/domain/harness-placement.js b/server/domain/harness-placement.js
iindex d3f3328..c39b2a7 100644
---- a/server/domain/harness-placement.js
++++ b/server/domain/harness-placement.js
@@@ -10,7 +10,10 @@ const { plan } = require('openvibe-sdk/placement');
// A catalog row without task_capabilities takes edit and review.
const DEFAULT_TASKS = ['edit', 'review'];
// harness-offer@1 capability flag → the resource-offer@1 capability it adds when true.
--const HARNESS_FLAGS = { host_access: 'harness:host-access', mcp: 'harness:mcp', long_autonomy: 'harness:long-autonomy', resume: 'harness:resume' };
++const HARNESS_FLAGS = {
++ host_access: 'harness:host-access', mcp: 'harness:mcp', long_autonomy: 'harness:long-autonomy', resume: 'harness:resume',
++ edit: 'harness:edit', review: 'harness:review', tools: 'harness:tools', vision: 'harness:vision', browser: 'harness:browser', computer_use: 'harness:computer-use',
++};
const TASKS = Object.freeze({
edit: ['task:edit'],
ddiff --git a/test/harness-placement.test.js b/test/harness-placement.test.js
iindex 108137c..3a5c67c 100644
---- a/test/harness-placement.test.js
++++ b/test/harness-placement.test.js
@@@ -39,7 +39,7 @@ function priced(row, freshUsd) {
provider: 'example',
region: 'global',
trust: 'partner',
-- capabilities: ['task:edit', 'task:review', 'harness:host-access', 'harness:mcp', 'harness:resume'],
++ capabilities: ['task:edit', 'task:review', 'harness:host-access', 'harness:mcp', 'harness:resume', 'harness:edit', 'harness:tools'],
capacity: { workers: { harness: 2 } },
health: { status: 'degraded' },
pricing: { model: 'per-operation', unit: 'token', marginal_usd_per_unit: 0.003 / 1000 },
@@@ -72,7 +72,7 @@ function priced(row, freshUsd) {
}
const browsing = { ...rows[0], task_capabilities: ['edit', 'browse'] };
const offer = toOffer(browsing, browsing.agents[0], { now });
-- assert.deepStrictEqual(offer.capabilities, ['task:edit', 'task:browse', 'harness:host-access', 'harness:mcp', 'harness:long-autonomy', 'harness:resume']);
++ assert.deepStrictEqual(offer.capabilities, ['task:edit', 'task:browse', 'harness:host-access', 'harness:mcp', 'harness:long-autonomy', 'harness:resume', 'harness:edit', 'harness:review', 'harness:tools', 'harness:vision']);
assert.ok(contracts.validate('platform.resource-offer@1', JSON.parse(JSON.stringify(offer))).valid);
});
@@@ -136,6 +136,17 @@ function priced(row, freshUsd) {
assert.ok(none.candidates.every((c) => c.reason === 'lacks task:browse'));
});
++ await check('a harness:vision requirement drops the vision:false harnesses', async () => {
++ const harnesses = createHarnesses({ catalogPath });
++ const r = route({ task: 'edit', extra: { capabilities: ['harness:vision'] }, harnesses, now });
++ assert.ok(['claude-code:claude-code-sonnet', 'codex:codex-default'].includes(r.selected), `selected ${r.selected}`);
++ for (const id of ['claude-code:claude-code-sonnet', 'codex:codex-default']) {
++ assert.deepStrictEqual(r.candidates.find((c) => c.id === id), { id, included: true, reason: null });
++ }
++ assert.deepStrictEqual(r.candidates.find((c) => c.id === 'deepseek:deepseek-chat'), { id: 'deepseek:deepseek-chat', included: false, reason: 'lacks harness:vision' });
++ assert.ok(toOffer(harnesses.get(r.selected.split(':')[0]), harnesses.agents(r.selected.split(':')[0])[0]).capabilities.includes('harness:vision'));
++ });
++
await check('an unknown task throws harness.task_unknown', async () => {
assert.throws(() => requirementsFor('deploy'), (error) => error.code === 'harness.task_unknown');
assert.throws(() => requirementsFor('toString'), (error) => error.code === 'harness.task_unknown');