{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"e3008b8a-268f-41d6-8f2c-491a47a02f0e","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"454b9c2e1ab5d6b04935b77037eae4aba09c56ef509af7a13f57bb3b42bdab12","dependsOn":["scaffold_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"bb148fe484077e2581abae61041f88918ba90502ea1b32b3e2e1e5257117d55c","dependsOn":[],"execution":{"network":true,"profile":"none","requires":["network"],"skillHash":"7ae2f33d07dd65f04780071437d0c74200f8f58a323bc9324fa8524f587719c6","skillId":"scaffold-project","tools":[]},"key":"scaffold_project","kind":"code","role":"implement","skillHash":"7ae2f33d07dd65f04780071437d0c74200f8f58a323bc9324fa8524f587719c6","skillId":"scaffold-project","state":"accepted"}],"objective":"Build imd-schemas: JSON Schema (draft 2020-12) files for the input of every IMD paid action: job.open, job.continue, launch.open, workflow.open, oracle.request, schedule.create, schedule.topup, written from the field tables at https://imd.fun/docs (Job body, Workflow body, Oracle body, Schedule body) with every limit (lengths, counts, enums, regexes, required-together and mutually-exclusive fields). Name each schema after the action version listed in GET /openapi.json x-imd-actions (for example schedule-1) so a new version shows as unsupported instead of silently wrong. Ship a validator library and `imd-validate <action> <file>` CLI with readable errors, plus Known refusal codes and causes to cover: invalid_input, invalid_payment_shape, missing_fact token_supply (workflow request must state the token's total supply), unplannable_steps (gas-and-size-report, write-readme-and-docs and deploy-script steps must not name paths), protected_path (foundry.toml and lib), recheck_failed / needs_revision (vague rules; asking adversarial-review for a failing test), invalid_plan / objective_too_large (request + context + draft objective above about 7,000 characters folded), payer_not_owner (job.continue paid by another wallet), request_key_conflict, launch_token, too_many_publishes, no_panel, unknown_schedule, invalid_owner, evaluation_unavailable (transient).  Label it everywhere it is presented (README top, CLI --help, site banner) as experimental: \"Experimental, commissioned as a test of the IMD swarm. It may not work as described. Read the code, start with small amounts, no warranty.\" Add one line at the end of the README: \"Commissioned through paid IMD swarm requests.\"","parentJobId":null,"planHash":"0e2f638e79c71981f0ab7d77390418ab9f20c90c89eda36a88ff1d7fe465aa5a","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"e3008b8a-268f-41d6-8f2c-491a47a02f0e","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-603-build-imd-schemas-json-schema"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50904","feedbackHash":"12a2c3ef3a4bd818381ceab903dd35e4dc42010116bc33f4a5616162032bc25e","nodeKey":"adversarial_review","submissionHash":"454b9c2e1ab5d6b04935b77037eae4aba09c56ef509af7a13f57bb3b42bdab12","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50957","feedbackHash":"39fc95fe09f5fd6c5faaa90619190c6e701345ab90ab4e298caeff765701495a","nodeKey":"scaffold_project","submissionHash":"bb148fe484077e2581abae61041f88918ba90502ea1b32b3e2e1e5257117d55c","tag1":"verification:structural","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"6c3ad3bccf1a642453f0f28cb4cf24db373f88598fe333ec64bf5b328a9c33af","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c4f696e22e7a36f7","findings":[{"citation":"resolved","description":"The relativePath negative lookahead uses .*, which does not cross line terminators, while the consuming character class permits them. A dot-dot component after a newline is therefore accepted. jobChecks only strips leading ./ and trailing slashes, so it does not discover the resulting protected destination. Both the portable schema and the public validator accept write budgets into lib and artifact outputs outside artifacts/. Reject traversal across all characters and check normalized destinations. The output restriction is specified in https://imd.fun/docs/#job-body; foundry.toml/lib protection is also an explicit assignment requirement.","line":85,"path":"schemas/common-1.json","reproduction":"From the repository root: const {validate}=require(\"./dist/index.js\"); validate(\"job.open\", {\"objective\":\"Implement Owned.\",\"shape\":\"chain\",\"steps\":[{\"skill\":\"implement-contract\",\"paths\":[\"src/\\n/../../lib/Owned.sol\"]}]}); actual: valid:true, errors:[], warnings:[]; expected: invalid_input/protected_path. node:path.posix.normalize of the supplied write path is \"lib/Owned.sol\". Also validate(\"job.open\", {\"objective\":\"Create report.\",\"skill\":\"research-report\",\"outputs\":[{\"name\":\"report\",\"path\":\"artifacts/a\\n/../../foundry.toml\",\"mediaType\":\"text/plain\"}]}) returns valid:true; its output path normalizes to \"foundry.toml\", outside the required artifacts/ directory. Parse the JSON normally so each backslash-n escape becomes a newline character.","severity":"medium","snippet":"      \"pattern\": \"^(?!/)(?![A-Za-z]:)(?!.*(?:^|/)\\\\.{1,2}(?:/|$))[^\\\\\\\\\\\\u0000]+$\",","title":"Newlines bypass path traversal and protected-path validation"},{"citation":"resolved","description":"isJson recursively walks all properties before schema rejection, outside the JSON.stringify try/catch. A valid JSON document under the 16 KiB budget can exhaust the call stack in this walk. The library throws instead of returning a ValidationResult, and the CLI --json mode emits no JSON, breaking callers that rely on structured invalid_input diagnostics. Bound the traversal or handle this failure as an input error.","line":102,"path":"src/index.ts","reproduction":"On Node v22.22.2, generate the exact JSON text with const raw = '{\"objective\":\"Build report\",\"extra\":' + \"[\".repeat(4000) + \"0\" + \"]\".repeat(4000) + \"}\"; (8038 bytes). require(\"./dist/index.js\").validate(\"job.open\", JSON.parse(raw)) throws RangeError: Maximum call stack size exceeded from isJson. Also spawnSync(process.execPath,[\"bin/imd-validate.cjs\",\"job.open\",\"-\",\"--json\"],{input:raw,encoding:\"utf8\"}) returns status 1, empty stdout, and an uncaught RangeError stack on stderr. Expected: valid:false and a readable invalid_input diagnostic, serialized as JSON in --json mode; no uncaught exception.","severity":"low","snippet":"  if (Array.isArray(value)) return Array.from(value).every(isJson);","title":"Nested JSON crashes validation instead of returning readable errors"}],"hash":"454b9c2e1ab5d6b04935b77037eae4aba09c56ef509af7a13f57bb3b42bdab12","nodeId":"028f6579-408c-4a38-8da5-0f7185c5923d","outcome":"completed","summary":"Recorded two reproduced findings in [.imd-findings.json](/root/.identitymd/work/e3008b8a-268f-41d6-8f2c-491a47a02f0e/028f6579-408c-4a38-8da5-0f7185c5923d/.imd-findings.json):\n\n- **Medium:** Newlines bypass traversal checks, permitting protected destinations and artifact-directory escapes.\n- **Low:** An 8 KB nested JSON input crashes validation instead of returning structured errors.\n\nSource locations and reproductions verified. No implementation files changed.","treeHash":null,"usage":{"cachedInputTokens":967936,"inputTokens":108542,"model":"gpt-6-astra","outputTokens":10551,"runtime":"codex","turns":6,"wallClockMs":499369}},{"artifacts":[],"attempt":1,"bundleHash":"5fa5196cdf9af01023480c7dcb1091ea24e6d47cfd52639767492256dff23e6f","device":"0256823ae36e7900","findings":[],"hash":"bb148fe484077e2581abae61041f88918ba90502ea1b32b3e2e1e5257117d55c","nodeId":"45abf4bc-efc0-4db9-bd3d-eab880ded6c0","outcome":"completed","summary":"Implemented versioned schemas for all seven actions, TypeScript validator, CLI, refusal catalog, examples, and required experimental notices. Dependencies are vendored for offline use.\n\nVerified: **389 tests pass**, including all 25 examples, in a clean offline rebuild.\n\nStart with the [README](/home/imd-worker/.identitymd/work/e3008b8a-268f-41d6-8f2c-491a47a02f0e/45abf4bc-efc0-4db9-bd3d-eab880ded6c0/README.md), or run:\n\n```sh\nnpm test\nnode bin/imd-validate.cjs --help\n```","treeHash":"1f9bdc2b73db411094fa2f548bb7b989598490e4","usage":{"cachedInputTokens":3132928,"inputTokens":90352,"model":"gpt-6-astra","outputTokens":19179,"runtime":"codex","turns":6,"wallClockMs":855835}}],"verification":[{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"bb148fe484077e2581abae61041f88918ba90502ea1b32b3e2e1e5257117d55c","verifiedTreeHash":"1f9bdc2b73db411094fa2f548bb7b989598490e4","verifierVersion":"0.1.0+68ddf5e4"}]}