@algosuite/vo-mcp 0.2.0-beta.52 → 0.2.0-beta.53
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/dist/runner-cli.js +30 -2
- package/dist/runner-cli.js.map +2 -2
- package/package.json +1 -1
package/dist/runner-cli.js
CHANGED
|
@@ -8141,7 +8141,20 @@ var init_headless_execution_contract = __esm({
|
|
|
8141
8141
|
"`pnpm exec tsc --noEmit -p <dir>`); any other Bash command (`node \u2026`, `npx \u2026`, `git \u2026`, `gh \u2026`) is",
|
|
8142
8142
|
"auto-denied \u2014 that is expected, not a broken environment. Wrap what you need as `pnpm exec <cmd>`.",
|
|
8143
8143
|
"Roadmap-board drift (`check-roadmap-board-coverage` red): run `pnpm run roadmap:board` and keep the",
|
|
8144
|
-
"regenerated `public/roadmap-progress.json` + `cloud-run/vo-control-plane/data/roadmap-progress.json`."
|
|
8144
|
+
"regenerated `public/roadmap-progress.json` + `cloud-run/vo-control-plane/data/roadmap-progress.json`.",
|
|
8145
|
+
// 2026-08-18: a task asked for `missingTin` persisted a FULL 9-digit TIN — an SSN for any sole
|
|
8146
|
+
// proprietor — while owner-roster.ts already stored last-4 and the client portal promised users it
|
|
8147
|
+
// would "never ask you to type your full SSN". The agent was not wrong to infer it; the SPEC never
|
|
8148
|
+
// said. `scripts/ci/check-pii-field-posture.mjs` now blocks the PR, but a blocked PR is spend
|
|
8149
|
+
// already burnt, so say it here too.
|
|
8150
|
+
"Sensitive fields (SSN/TIN/EIN, DOB, account or routing numbers, passport/licence): do NOT decide the",
|
|
8151
|
+
"storage form yourself. Search for an existing precedent first (`owner-roster.ts` validates TIN",
|
|
8152
|
+
"**last 4**; `cpa-mirror` stores `taxpayerSsnLast4` and excludes raw `ssn`) and follow it. Prefer a",
|
|
8153
|
+
"masked/last-4/boolean form. If the task truly needs a full value, STOP and say so in the PR body",
|
|
8154
|
+
"rather than persisting it \u2014 storing full PII is a compliance decision, not a feature detail. Whenever",
|
|
8155
|
+
"your diff persists ANY new field carrying such an identifier (masked or not), STATE the posture in",
|
|
8156
|
+
"the PR body as `PII-POSTURE: <storage form + the precedent followed>` \u2014 CI hard-blocks high-severity",
|
|
8157
|
+
"forms without the marker, and a blocked PR is spend already burnt."
|
|
8145
8158
|
].join("\n");
|
|
8146
8159
|
}
|
|
8147
8160
|
});
|
|
@@ -8337,8 +8350,21 @@ function classifyTaskShape(task) {
|
|
|
8337
8350
|
}
|
|
8338
8351
|
return "feature";
|
|
8339
8352
|
}
|
|
8353
|
+
function stripDispatchBoilerplate(text) {
|
|
8354
|
+
const contractLines = HEADLESS_EXECUTION_CONTRACT.split("\n").map((l) => l.trim()).filter((l) => l.length >= 20);
|
|
8355
|
+
return String(text ?? "").split("\n").map((rawLine) => {
|
|
8356
|
+
const line = rawLine.trim().replace(/^(?:>[ \t]*){1,64}/u, "").trim();
|
|
8357
|
+
if (line.length < 20) return rawLine;
|
|
8358
|
+
if (contractLines.some((c) => c.includes(line))) return null;
|
|
8359
|
+
let redacted = line;
|
|
8360
|
+
for (const c of contractLines) {
|
|
8361
|
+
if (redacted.includes(c)) redacted = redacted.split(c).join(" ");
|
|
8362
|
+
}
|
|
8363
|
+
return redacted === line ? rawLine : redacted;
|
|
8364
|
+
}).filter((l) => l !== null).join("\n");
|
|
8365
|
+
}
|
|
8340
8366
|
function matchGovernedStakes(task) {
|
|
8341
|
-
const prompt = String(task?.prompt || "");
|
|
8367
|
+
const prompt = stripDispatchBoilerplate(String(task?.prompt || ""));
|
|
8342
8368
|
const m = GOVERNED_STAKES_PATTERN.exec(prompt);
|
|
8343
8369
|
return m ? m[0] : null;
|
|
8344
8370
|
}
|
|
@@ -8368,6 +8394,7 @@ var UI_ROADMAP_DISPATCH_MARKER, SHAPE_RULES, GOVERNED_STAKES_PATTERN, RESEARCH_W
|
|
|
8368
8394
|
var init_methodology_composer = __esm({
|
|
8369
8395
|
"../../scripts/virtual-office/code-runner/methodology-composer.mjs"() {
|
|
8370
8396
|
"use strict";
|
|
8397
|
+
init_headless_execution_contract();
|
|
8371
8398
|
UI_ROADMAP_DISPATCH_MARKER = /^\s*work on\s+[^\n]{1,200}?\s+roadmap task:/iu;
|
|
8372
8399
|
SHAPE_RULES = [
|
|
8373
8400
|
{
|
|
@@ -8413,6 +8440,7 @@ var init_methodology_composer = __esm({
|
|
|
8413
8440
|
"If the consensus tools are not available in this session, say exactly that in the PR body instead of silently skipping \u2014 an unverified governed claim must be visible, never implied."
|
|
8414
8441
|
];
|
|
8415
8442
|
UNIVERSAL_DIRECTIVES = [
|
|
8443
|
+
'NEGATIVE CONTROL FIRST \u2014 your first deliverable, before further implementation, is the check that FAILS when your work is wrong: for a test-writing task, run the new tests and show at least one failing against the exact production line it guards (then passing); for a fix or feature, the failing-then-passing check. Paste that real output into the PR body. Budget dies from the end \u2014 agents author first and verify last, so exhaustion deletes exactly the verification evidence (measured 2026-08-20: $12.60 across a task plus its continuation for 363 test lines that were never once executed, whose PR body echoed the words "NEGATIVE CONTROL" from its spec with zero runs behind them). A surviving negative control is worth more than another feature file.',
|
|
8416
8444
|
'Before finishing, REHEARSE the repo gates your diff will hit and fix failures locally. HOW: bare `node <script>` is DENIED in this session (only `pnpm \u2026` is pre-authorized) \u2014 run whole-tree gates through their package.json aliases (`pnpm run check:<gate>`, e.g. `pnpm run check:algobooks-model-tiering`, `pnpm run check:hollow-tests`) or as `pnpm exec node scripts/...`; never conclude "cannot run" and hand-write a generated artifact. Diff-scoped gates (base...head, committed refs) cannot see your UNCOMMITTED edits, so satisfy their rule by construction: any roadmap-doc change under docs/current or docs/vo -> run `pnpm run roadmap:progress && pnpm exec node scripts/sync-roadmap-progress.mjs` and keep the regenerated artifacts in your diff (board drift gate); any top-level `.ts` directly under functions-core-tax/src/tax/ (not tests, not tax-year-thresholds.ts, not nested dirs; even a comment-only edit counts) -> in docs/current/algotax-coverage-roadmap.md the file MUST have a row in the callable Status table (most `algobooks-*.ts` files have NONE \u2014 add an honest row first, or the gate fails with "has no row"), then either change that row\'s Status or append a dated Update Log line that NAMES the changed file\'s basename (a dated line that does not name the file still fails); ONLY for a comment-only / no-behavior diff you may instead end your final summary with a line `VO-ALLOW-NO-AUDIT-UPDATE: <reason>` (it lands in the PR body the gate reads) \u2014 never when logic changed \u2014 tax-audit ratchet; a new entry in REQUIRED_GATE_INVOCATIONS -> classify it in scripts/ci/check-main-health-core.mjs (anti-drift test); new test files -> no Date.now()/new Date() fixtures and 4+ real assertions (clock-fixture + hollow-test gates); a .github/workflows edit may be rejected at push (the runner token lacks the workflows scope) -> say so in your final summary instead of retrying. Live tests 2026-08-16: four dispatched PRs bounced on exactly these.',
|
|
8417
8445
|
"Verification is a stage, not a vibe: before publishing, run the tests/build your change touches and cite their actual output. A claim without execution evidence is not done.",
|
|
8418
8446
|
"Work to completion or end with an explicit failure reason. Do not stop because time has passed; stop when the evidence says the work is done \u2014 or state exactly what is blocking.",
|