From 2989ddf5ab6e3d0e0aab9ed2ea7b31d5a4a96c5c Mon Sep 17 00:00:00 2001 From: Aditya Datta Date: Sun, 23 Aug 2026 19:18:31 +0530 Subject: [PATCH 1/2] feat(examples): add bounded task routing flow Signed-off-by: Aditya Datta --- README.md | 9 +++++++++ examples/task-router.js | 40 ++++++++++++++++++++++++++++++++++++++++ package.json | 1 + tests/cli.test.js | 17 +++++++++++++++++ 4 files changed, 67 insertions(+) create mode 100644 examples/task-router.js diff --git a/README.md b/README.md index a53afeb..8580354 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,15 @@ Inspect a node: npx kalaris-myriad show MYR-D051-T041 ``` +Route a natural-language request to one bounded task without claiming scientific completion: + +```bash +node examples/task-router.js "variant-aware off-target assessment" +``` + +The example returns the selected node's objective, required evidence, and qualified-review +boundary as structured JSON. + Export a domain: ```bash diff --git a/examples/task-router.js b/examples/task-router.js new file mode 100644 index 0000000..2eb30d0 --- /dev/null +++ b/examples/task-router.js @@ -0,0 +1,40 @@ +#!/usr/bin/env node +import { execFileSync } from 'node:child_process'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const cli = path.join(root, 'bin', 'kalaris-myriad.js'); +const request = process.argv.slice(2).join(' ').trim(); + +if (!request) { + console.error('Usage: node examples/task-router.js '); + process.exit(1); +} + +const candidates = JSON.parse(execFileSync(process.execPath, [ + cli, 'search', request, '--limit', '1', '--json' +], { cwd: root, encoding: 'utf8' })); + +if (candidates.length === 0) { + console.log(JSON.stringify({ status: 'no-route', request, task: null }, null, 2)); + process.exit(0); +} + +const task = candidates[0]; +console.log(JSON.stringify({ + status: 'routed', + request, + task: { + id: task.id, + routing_name: task.routing.name, + objective: task.objective, + expected_evidence: task.execution_contract.required_completion_evidence, + review_boundary: { + mode: task.execution_contract.mode, + human_review_required: task.execution_contract.human_review_required, + no_call_when: task.execution_contract.no_call_when, + scientific_validation_claim: task.maturity.scientific_validation_claim + } + } +}, null, 2)); diff --git a/package.json b/package.json index 4b9157c..965d1ff 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "schemas/", "docs/", "explorer/", + "examples/", "README.md", "CREDITS.md", "NOTICE.md", diff --git a/tests/cli.test.js b/tests/cli.test.js index b2d9802..b7dea34 100644 --- a/tests/cli.test.js +++ b/tests/cli.test.js @@ -6,6 +6,7 @@ import { fileURLToPath } from 'node:url'; const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); const cli = path.join(root, 'bin', 'kalaris-myriad.js'); +const router = path.join(root, 'examples', 'task-router.js'); function run(args) { const r = spawnSync(process.execPath, [cli, ...args], { cwd: root, encoding: 'utf8' }); assert.equal(r.status, 0, r.stderr || r.stdout); @@ -37,3 +38,19 @@ test('CLI validator passes', () => { assert.equal(data.status, 'PASS'); assert.equal(data.task_count, 10000); }); + +test('task router returns a bounded route without claiming completion', () => { + const result = spawnSync(process.execPath, [router, 'variant', 'off-target'], { + cwd: root, + encoding: 'utf8' + }); + assert.equal(result.status, 0, result.stderr || result.stdout); + const data = JSON.parse(result.stdout); + assert.equal(data.status, 'routed'); + assert.match(data.task.id, /^MYR-/); + assert.equal(data.task.review_boundary.mode, 'computational-advisory'); + assert.equal(data.task.review_boundary.human_review_required, true); + assert.equal(data.task.review_boundary.scientific_validation_claim, 'none'); + assert.ok(data.task.expected_evidence.length > 0); + assert.equal('completed' in data, false); +}); From 9d8e8ed7847f32317b248e172b5a4e81397f7942 Mon Sep 17 00:00:00 2001 From: Aditya Datta Date: Tue, 25 Aug 2026 10:14:05 +0530 Subject: [PATCH 2/2] fix(examples): flush task router output Signed-off-by: Aditya Datta --- examples/task-router.js | 62 ++++++++++++++++++++++------------------- tests/cli.test.js | 14 ++++++++++ 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/examples/task-router.js b/examples/task-router.js index 2eb30d0..8f45e89 100644 --- a/examples/task-router.js +++ b/examples/task-router.js @@ -5,36 +5,42 @@ import { fileURLToPath } from 'node:url'; const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); const cli = path.join(root, 'bin', 'kalaris-myriad.js'); -const request = process.argv.slice(2).join(' ').trim(); +function main() { + const request = process.argv.slice(2).join(' ').trim(); -if (!request) { - console.error('Usage: node examples/task-router.js '); - process.exit(1); -} + if (!request) { + console.error('Usage: node examples/task-router.js '); + process.exitCode = 1; + return; + } -const candidates = JSON.parse(execFileSync(process.execPath, [ - cli, 'search', request, '--limit', '1', '--json' -], { cwd: root, encoding: 'utf8' })); + const candidates = JSON.parse(execFileSync(process.execPath, [ + cli, 'search', request, '--limit', '1', '--json' + ], { cwd: root, encoding: 'utf8' })); -if (candidates.length === 0) { - console.log(JSON.stringify({ status: 'no-route', request, task: null }, null, 2)); - process.exit(0); -} + if (candidates.length === 0) { + console.log(JSON.stringify({ status: 'no-route', request, task: null }, null, 2)); + process.exitCode = 0; + return; + } -const task = candidates[0]; -console.log(JSON.stringify({ - status: 'routed', - request, - task: { - id: task.id, - routing_name: task.routing.name, - objective: task.objective, - expected_evidence: task.execution_contract.required_completion_evidence, - review_boundary: { - mode: task.execution_contract.mode, - human_review_required: task.execution_contract.human_review_required, - no_call_when: task.execution_contract.no_call_when, - scientific_validation_claim: task.maturity.scientific_validation_claim + const task = candidates[0]; + console.log(JSON.stringify({ + status: 'routed', + request, + task: { + id: task.id, + routing_name: task.routing.name, + objective: task.objective, + expected_evidence: task.execution_contract.required_completion_evidence, + review_boundary: { + mode: task.execution_contract.mode, + human_review_required: task.execution_contract.human_review_required, + no_call_when: task.execution_contract.no_call_when, + scientific_validation_claim: task.maturity.scientific_validation_claim + } } - } -}, null, 2)); + }, null, 2)); +} + +main(); diff --git a/tests/cli.test.js b/tests/cli.test.js index b7dea34..7f6451c 100644 --- a/tests/cli.test.js +++ b/tests/cli.test.js @@ -54,3 +54,17 @@ test('task router returns a bounded route without claiming completion', () => { assert.ok(data.task.expected_evidence.length > 0); assert.equal('completed' in data, false); }); + +test('task router emits complete JSON when no route matches', () => { + const request = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'; + const result = spawnSync(process.execPath, [router, request], { + cwd: root, + encoding: 'utf8' + }); + assert.equal(result.status, 0, result.stderr || result.stdout); + assert.deepEqual(JSON.parse(result.stdout), { + status: 'no-route', + request, + task: null + }); +});