{"_id":"@argszero/cordis-plugin-job-id-guidance","_rev":"2-773709a09b2cfa8dce2eec21a61698b2","name":"@argszero/cordis-plugin-job-id-guidance","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@argszero/cordis-plugin-job-id-guidance","version":"0.1.0","keywords":["cordis","deepseek-harness","dsh","plugin","jobs","subagent","diagnostics","error-message","guard"],"license":"MIT","_id":"@argszero/cordis-plugin-job-id-guidance@0.1.0","maintainers":[{"name":"argszero","email":"argszero.reg@gmail.com"}],"homepage":"https://github.com/argszero/cordis-plugin-job-id-guidance#readme","bugs":{"url":"https://github.com/argszero/cordis-plugin-job-id-guidance/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"dist":{"shasum":"facd0e56d32acaa0731779a458b6146725a8e665","tarball":"https://registry.npmjs.org/@argszero/cordis-plugin-job-id-guidance/-/cordis-plugin-job-id-guidance-0.1.0.tgz","fileCount":8,"integrity":"sha512-oiyYmC2dWPrVu38aooJV60PjUTUjkJhFYyzRxuxlRV9breYZ4qAZFxNlb96kKiwyivzuvEOfCDhHqjx9OXi0XA==","signatures":[{"sig":"MEUCIQDWUXkZPldO6euKhfo6ReXboKk8cAJqcUrfNZ8dOhsa0QIgY7uB4zdEcCfWNWeYwEqNmWA/Ef97mx08zjgmjbRC56c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27997},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","engines":{"node":"^22.19 || >=24"},"exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./src/*":"./src/*","./package.json":"./package.json"},"gitHead":"cfb2248323b5f50c5a638e6a8565a52433bccfc5","scripts":{"test":"node --test \"test/*.spec.mjs\"","build":"tsc","prepublishOnly":"tsc"},"_npmUser":{"name":"argszero","email":"argszero.reg@gmail.com"},"repository":{"url":"git+https://github.com/argszero/cordis-plugin-job-id-guidance.git","type":"git"},"_npmVersion":"11.17.0","description":"Job-id guidance for dsh: when job_output/job_kill fails with the registry's bare `unknown job <id>`, append one sentence naming the likely namespace mistake. Backgrounded continuable delegations return a durable subagent id and register no job, so the fai","directories":{},"_nodeVersion":"26.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@deepseek-ai/cordis":"^4.0.2","@deepseek-ai/dsh-llm":"0.1.2-rc.1","@deepseek-ai/dsh-jobs":"0.1.2-rc.1","@deepseek-ai/dsh-brand":"0.1.2-rc.1","@deepseek-ai/dsh-scope":"0.1.2-rc.1","@deepseek-ai/dsh-tools":"0.1.2-rc.1","@deepseek-ai/dsh-session":"0.1.2-rc.1","@deepseek-ai/dsh-system-prompt":"0.1.2-rc.1","@deepseek-ai/dsh-session-persistence":"0.1.2-rc.1"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.2","@deepseek-ai/dsh-llm":">=0.1.2-rc.1 <0.2.0 || >=0.1.3-alpha.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0","@deepseek-ai/dsh-jobs":">=0.1.2-rc.1 <0.2.0 || >=0.1.3-alpha.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0","@deepseek-ai/dsh-tools":">=0.1.2-rc.1 <0.2.0 || >=0.1.3-alpha.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/cordis-plugin-job-id-guidance_0.1.0_1789170320266_0.47352589303551107","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"_id":"@argszero/cordis-plugin-job-id-guidance@0.1.1","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"bugs":{"url":"https://github.com/argszero/cordis-plugin-job-id-guidance/issues"},"dist":{"shasum":"3d79c06c47dd6a2fe0d7ffae5f26d0c0c2ae03fe","tarball":"https://registry.npmjs.org/@argszero/cordis-plugin-job-id-guidance/-/cordis-plugin-job-id-guidance-0.1.1.tgz","fileCount":8,"integrity":"sha512-a75LVHvSGreThdlsXbe3TSWB/MhX/PiH19+LC7/SO2fre/dPbuMXWfC1sufoin9vzWK3RWPNIWl09FEBqlXXyQ==","signatures":[{"sig":"MEQCIHMZbqAEQjDm6yo04Ozz0R8Xk0Va225IjpDSkiMqBUtNAiBWQ4jt6FryKN2QSv1q4O1nmACFvAkfY6LlRj8Ag3wC+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCFfPPeHcye6NII5b6G2vUMSWivf9gM4BhnYMdq6FQ27wIhAIxCdmqfHBrf+svXmH69dum4dAQ0qR+ztKMbAvEF1Bn6"}],"unpackedSize":30930},"main":"lib/index.js","name":"@argszero/cordis-plugin-job-id-guidance","type":"module","types":"lib/types/index.d.ts","engines":{"node":"^22.19 || >=24"},"exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./src/*":"./src/*","./package.json":"./package.json"},"gitHead":"70948b53b5ae1ad702a27d97f817cc1a4f644d48","license":"MIT","scripts":{"test":"node --test \"test/*.spec.mjs\"","build":"tsc","prepublishOnly":"tsc"},"version":"0.1.1","_npmUser":{"name":"argszero","email":"argszero.reg@gmail.com"},"homepage":"https://github.com/argszero/cordis-plugin-job-id-guidance#readme","keywords":["cordis","deepseek-harness","dsh","plugin","jobs","subagent","diagnostics","error-message","guard"],"repository":{"url":"git+https://github.com/argszero/cordis-plugin-job-id-guidance.git","type":"git"},"_npmVersion":"11.17.0","description":"Job-id guidance for dsh: when job_output/job_kill fails with the registry's bare `unknown job <id>`, append one sentence naming the likely namespace mistake. Backgrounded continuable delegations return a durable subagent id and register no job, so the fai","directories":{},"maintainers":[{"name":"argszero","email":"argszero.reg@gmail.com"}],"_nodeVersion":"26.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"semver":"^7.6.0","typescript":"^5.5.0","@deepseek-ai/cordis":"^4.0.2","@deepseek-ai/dsh-llm":"0.1.6-alpha.2","@deepseek-ai/dsh-jobs":"0.1.6-alpha.2","@deepseek-ai/dsh-brand":"0.1.6-alpha.2","@deepseek-ai/dsh-scope":"0.1.6-alpha.2","@deepseek-ai/dsh-tools":"0.1.6-alpha.2","@deepseek-ai/dsh-session":"0.1.6-alpha.2","@deepseek-ai/dsh-system-prompt":"0.1.6-alpha.2","@deepseek-ai/dsh-session-persistence":"0.1.6-alpha.2"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.2","@deepseek-ai/dsh-llm":">=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-alpha.1 <0.2.0","@deepseek-ai/dsh-jobs":">=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-alpha.1 <0.2.0","@deepseek-ai/dsh-tools":">=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-alpha.1 <0.2.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cordis-plugin-job-id-guidance_0.1.1_1789715597960_0.656669869683028"}}},"time":{"created":"2026-09-11T23:45:20.090Z","modified":"2026-09-18T07:13:18.175Z","0.1.0":"2026-09-11T23:45:20.402Z","0.1.1":"2026-09-18T07:13:18.054Z"},"bugs":{"url":"https://github.com/argszero/cordis-plugin-job-id-guidance/issues"},"license":"MIT","homepage":"https://github.com/argszero/cordis-plugin-job-id-guidance#readme","keywords":["cordis","deepseek-harness","dsh","plugin","jobs","subagent","diagnostics","error-message","guard"],"repository":{"url":"git+https://github.com/argszero/cordis-plugin-job-id-guidance.git","type":"git"},"description":"Job-id guidance for dsh: when job_output/job_kill fails with the registry's bare `unknown job <id>`, append one sentence naming the likely namespace mistake. Backgrounded continuable delegations return a durable subagent id and register no job, so the fai","maintainers":[{"name":"argszero","email":"argszero.reg@gmail.com"}],"readme":"# @argszero/cordis-plugin-job-id-guidance\n\nMake an unresolvable background-job id say **what actually went wrong**, instead\nof the job registry's bare `unknown job <id>`.\n\n`dsh` plugin (bundle patch). Watches the `tools/post-execute` seam; enriches one\nspecific failure and nothing else.\n\n## The problem\n\nThe `subagent` tool has two asynchronous shapes, and each hands the model a\ndifferent id namespace — both rendered as a short opaque string:\n\n| how you asked | what comes back | how you drive it |\n|---|---|---|\n| `run_in_background: true` (one-shot) | `{ kind: 'background', jobId }` | `job_output` / `job_kill` |\n| continuable background delegation | `{ kind: 'continuable', subagentId }` | `send_message` / `interrupt_agent` |\n\nA continuable delegation registers **no job at all** — it is a durable child\nagent, not a tracked task. So passing its id to a job control fails with the\nregistry's own wording:\n\n```\nError: unknown job 3e9f0a1b-4c2d-4e6f-8a90-1234567890ab\n```\n\nThat is textually identical to the failure for an id the model simply made up.\nThe model has no way to tell \"wrong tool\" from \"typo\", so it retries\n`job_output` instead of switching to `send_message` — and burns the turn.\n\n## What the plugin does\n\nAppends one sentence to that exact failure:\n\n```\nError: unknown job 3e9f0a1b-4c2d-4e6f-8a90-1234567890ab\n\nThat id is not one of your background job ids — those look like `bash-1`.\n`job_list` shows the job ids you can read. If this id came from `subagent`, it\nis a durable subagent id rather than a job; drive it with `send_message` /\n`interrupt_agent`.\n```\n\nThe authoritative failure still leads. The original text is preserved verbatim.\n\n## Install\n\n```sh\nnpm install @argszero/cordis-plugin-job-id-guidance\n```\n\nThe package ships a `dsh.bundle` patch, so mounting it is the whole setup:\n\n```sh\ndsh plugin add @argszero/cordis-plugin-job-id-guidance\n```\n\nor add it to your configuration directly:\n\n```yaml\n- insert:\n    - id: job-id-guidance\n      name: '@argszero/cordis-plugin-job-id-guidance'\n```\n\n## Design: what it refuses to do\n\nThe plugin is deliberately narrow, because a diagnostic that lies is worse than\nno diagnostic.\n\n- **Only this call's own failure.** The failure must name *the id the call\n  passed*, matched with a trailing boundary: the failure of `bash-12` does not\n  answer for a request for `bash-1`, and job `11` does not answer for job `1`.\n- **Never for a job-shaped id.** Job ids are minted as `<kind>-<counter>`\n  (`jobs-local`: ``JobId(`${spec.kind}-${count}`)``, counter from 1, lowercase\n  kinds such as `bash` / `pwsh` / `subagent` / `pty-send`). Anything carrying\n  other characters — notably a uuid — was never minted by this registry. The\n  hint's only claim is therefore the **negative** one: *\"not one of your job\n  ids\"*. A job-shaped id the plugin cannot resolve stays silent, because the\n  claim would not be established.\n- **Never claims what the id *is*.** The hint does not say \"this is a subagent\n  id\". An id can be a session id, a child-agent id minted as a bare uuid, or\n  something else entirely; the plugin only says what it is *not* and points at\n  the two ways forward.\n- **Never vetoes, never rewrites a success.** A blocked result and a successful\n  result pass through untouched.\n- **Never becomes a second failure.** Any internal error is logged and the\n  original failure is returned unchanged.\n\n## Config\n\n| key | default | meaning |\n|---|---|---|\n| `tools` | `['job_output', 'job_kill']` | tool names treated as job controls |\n\n```yaml\n- set:\n    - id: job-id-guidance\n      config:\n        tools: ['my_job_read', 'my_job_stop']\n```\n\n## Compatibility\n\nMounts against every published dsh line the package was verified on. The rule\nreads only the job registry's own failure wording and `ctx.jobs.list()`, so it\ndoes not depend on a specific harness build. Peer range, declared identically on\n`@deepseek-ai/dsh-jobs`, `@deepseek-ai/dsh-llm` and `@deepseek-ai/dsh-tools`:\n\n```\n>=0.1.2-rc.1 <0.1.3 || >=0.1.3-alpha.2 <0.1.4 || >=0.1.5-alpha.1 <0.2.0 || >=0.1.6-alpha.1 <0.2.0\n```\n\nEvery dsh release published today is a **prerelease** (`0.1.2-rc.1`, `0.1.5-alpha.1`,\n`0.1.6-alpha.2`, …), and a semver comparator admits a prerelease only when some\ncomparator **in the same group** shares its `major.minor.patch` tuple. Two\nconsequences follow, and both have already bitten this package:\n\n```jsonc\n// Matches nothing: 0.1.2-rc.1 sorts BELOW 0.1.2, and every other prerelease\n// carries a different tuple.  -> ETARGET, the package cannot be installed.\n\">=0.1.2\"\n\n// Only the 0.1.2-rc tuple. The `<0.2.0` upper bound is INERT for prereleases:\n// it excludes no later line, so every other line gets ERESOLVE.\n\">=0.1.2-rc.1 <0.2.0\"\n```\n\nThe second form is the dangerous one, because it *reads* as though it covered\neverything from `0.1.2-rc.1` onward. It does not — `<0.2.0` never excludes\n`0.1.6-alpha.2`, and no comparator names that tuple. Up to **v0.1.0** the\nshipped range was\n\n```\n>=0.1.2-rc.1 <0.2.0 || >=0.1.5-alpha.1 <0.2.0\n```\n\nwhich admitted the `0.1.2-rc` and `0.1.5` tuples and **nothing else** — 5 of the\n23 published versions. A user on the newest shipped dsh release\n(`0.1.6-alpha.2`) therefore could not install the plugin at all:\n\n```\nnpm error ERESOLVE unable to resolve dependency tree\nnpm error peer @deepseek-ai/dsh-llm@\">=0.1.2-rc.1 <0.2.0 || ...\" from\nnpm error   @argszero/cordis-plugin-job-id-guidance@0.1.0\n```\n\nThe plugin's own suite passes on that line (18/18). The dsh packages are\n**peers**, so `--legacy-peer-deps` is not something a consumer can reasonably be\nasked to accept: the install simply fails.\n\n**What we ship:** one comparator per supported tuple, each with its own upper\nbound so the intended span is legible rather than implied.\n\n| clause | admits |\n| --- | --- |\n| `>=0.1.2-rc.1 <0.1.3` | `0.1.2-rc.1` |\n| `>=0.1.3-alpha.2 <0.1.4` | `0.1.3-alpha.2` |\n| `>=0.1.5-alpha.1 <0.2.0` | the whole 0.1.5 line (alpha.1, alpha.2, rc.1, rc.2) |\n| `>=0.1.6-alpha.1 <0.2.0` | the whole 0.1.6 line (alpha.1, alpha.2) |\n\n`test/peer-range` **computes** the admitted set with the real `semver` package\nand asserts it equals exactly the set the suite has been run against — 8\nversions — rather than pattern-matching the range string. An earlier guard only\nchecked that the string mentioned `0.1.2-rc.N` and `0.1.5-alpha.N`; that form\ncannot tell a correct range from an incorrect one, which is how the range above\nshipped green. Asserting the set exactly makes both directions loud: dropping a\nsupported line fails, and admitting an unverified line fails too. The same file\nalso asserts that this README quotes the manifest range verbatim.\n\n## Source\n\nDiscussion [#6367](https://github.com/deepseek-ai/deepseek-harness/discussions/6367).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}