Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .github/workflows/link-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Every iii.dev URL in the repo must answer with a success code.
# Weekly too, since these links rot without anyone touching the repo.
name: Link Check

on:
pull_request:
branches: [main]
schedule:
- cron: '0 13 * * 1'
workflow_dispatch:

permissions: {}

jobs:
iii-dev-links:
name: iii.dev links
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
Comment thread
coderabbitai[bot] marked this conversation as resolved.
with:
persist-credentials: false
- run: ./scripts/check-links.sh
2 changes: 1 addition & 1 deletion harness/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ are invisible; the function id is the only contract.
- `coder::*` — file ops for any code task (read/search/create/update/move/delete)
- `slack::*` — post to Slack

**7. Authoring a worker.** Read the SDK reference for your language first (Node / Python / Rust / Browser / Engine WS) at https://iii.dev/docs/sdk-reference/. Use the SDK's `registerWorker(...)` and call `iii.registerFunction` / `iii.registerTrigger` / `iii.trigger` on the returned value; they are methods, not top-level exports. Always declare `description`, `request_format`, and `response_format` so the next caller gets a real contract.
**7. Authoring a worker.** Read the SDK reference for your language first (Node / Python / Rust / Browser / Engine WS) at https://iii.dev/docs/reference/. Use the SDK's `registerWorker(...)` and call `iii.registerFunction` / `iii.registerTrigger` / `iii.trigger` on the returned value; they are methods, not top-level exports. Always declare `description`, `request_format`, and `response_format` so the next caller gets a real contract.

TL;DR: list, info, call. The engine tells you the truth; trust it over memory.

Expand Down
10 changes: 5 additions & 5 deletions harness/prompts/default.txt
Original file line number Diff line number Diff line change
Expand Up @@ -446,11 +446,11 @@ existing one — read the SDK reference for the language you will use. Do not wr
from memory: names and config keys from memory are often wrong, and a trigger registered with
wrong keys never fires. Fetch the reference as Markdown.
Pick the URL for the implementation language:
- https://iii.dev/docs/api-reference/sdk-node — Node/TypeScript
- https://iii.dev/docs/api-reference/sdk-python — Python
- https://iii.dev/docs/api-reference/sdk-rust — Rust
- https://iii.dev/docs/api-reference/sdk-browser — browser
- https://iii.dev/docs/sdk-reference/engine-sdk — the raw WebSocket protocol, for any other
- https://iii.dev/docs/reference/sdk-node — Node/TypeScript
- https://iii.dev/docs/reference/sdk-python — Python
- https://iii.dev/docs/reference/sdk-rust — Rust
- https://iii.dev/docs/reference/sdk-browser — browser
- https://iii.dev/docs/reference/engine-protocol — the raw WebSocket protocol, for any other
language
Add `.md` to a docs URL to get the raw markdown source. If a fetch fails, use the index at
https://iii.dev/docs/llms.txt — it lists every doc page. If the docs stay unreachable,
Expand Down
10 changes: 5 additions & 5 deletions harness/src/prompt/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -255,11 +255,11 @@ fn sdk_doc_gate() {
let out = default_prompt();
assert!(out.contains("the FIRST line of worker code"));
for url in [
"https://iii.dev/docs/api-reference/sdk-node",
"https://iii.dev/docs/api-reference/sdk-python",
"https://iii.dev/docs/api-reference/sdk-rust",
"https://iii.dev/docs/api-reference/sdk-browser",
"https://iii.dev/docs/sdk-reference/engine-sdk",
"https://iii.dev/docs/reference/sdk-node",
"https://iii.dev/docs/reference/sdk-python",
"https://iii.dev/docs/reference/sdk-rust",
"https://iii.dev/docs/reference/sdk-browser",
"https://iii.dev/docs/reference/engine-protocol",
] {
assert!(out.contains(url), "missing {url}");
}
Expand Down
2 changes: 1 addition & 1 deletion provider-anthropic/prompts/identity.txt
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ Nothing registered fits? Search the registry: `directory::registry::workers::lis

Code-file create/edit/move/delete → `coder::*` (shell worker); never improvise edits via `shell::exec`. Inventory = `engine::functions::list { prefix: "coder::" }`: `coder::read-file`, `coder::search`, `coder::list-folder`, `coder::tree`, `coder::create-file`, `coder::update-file`, `coder::move`, `coder::delete-file` among them — fetch the contracts you need in ONE batched call before first use; they stay valid all session. Renames/moves = `coder::move`, never delete-then-recreate. Generic browsing (`shell::fs::ls`) outside a code task is fine; once code files are touched, coder owns file ops.

SDK authoring: construct exactly ONE symbol, `registerWorker`; its RETURN value exposes `registerFunction`, `registerTrigger`, `trigger` as METHODS (`iii.registerFunction(...)`), NOT top-level exports — destructuring yields `undefined`, `TypeError: registerFunction is not a function`. Declare `description`, `request_format`, `response_format` on every registered function — they become the contract `engine::functions::info` serves. Inspect the runtime via `engine::workers::info { name }`; don't assume. BEFORE the first line of worker code (new worker OR new registrations), fetch the language's SDK reference as Markdown — from-memory SDK code gets signatures/config keys subtly wrong (a from-memory `registerTrigger` lands but never fires): https://iii.dev/docs/api-reference/sdk-node (Node/TypeScript), https://iii.dev/docs/api-reference/sdk-python (Python), https://iii.dev/docs/api-reference/sdk-rust (Rust), https://iii.dev/docs/api-reference/sdk-browser (browser), https://iii.dev/docs/sdk-reference/engine-sdk (raw WebSocket protocol, other languages). Append `.md` for raw markdown; fetch fails → index at https://iii.dev/docs/llms.txt; docs unreachable → say so, verify each registration with a real call. `engine::functions::info` stays the reference for CALLING — never fetch docs for an ordinary call.
SDK authoring: construct exactly ONE symbol, `registerWorker`; its RETURN value exposes `registerFunction`, `registerTrigger`, `trigger` as METHODS (`iii.registerFunction(...)`), NOT top-level exports — destructuring yields `undefined`, `TypeError: registerFunction is not a function`. Declare `description`, `request_format`, `response_format` on every registered function — they become the contract `engine::functions::info` serves. Inspect the runtime via `engine::workers::info { name }`; don't assume. BEFORE the first line of worker code (new worker OR new registrations), fetch the language's SDK reference as Markdown — from-memory SDK code gets signatures/config keys subtly wrong (a from-memory `registerTrigger` lands but never fires): https://iii.dev/docs/reference/sdk-node (Node/TypeScript), https://iii.dev/docs/reference/sdk-python (Python), https://iii.dev/docs/reference/sdk-rust (Rust), https://iii.dev/docs/reference/sdk-browser (browser), https://iii.dev/docs/reference/engine-protocol (raw WebSocket protocol, other languages). Append `.md` for raw markdown; fetch fails → index at https://iii.dev/docs/llms.txt; docs unreachable → say so, verify each registration with a real call. `engine::functions::info` stays the reference for CALLING — never fetch docs for an ordinary call.

Trigger binding: types via `engine::triggers::list`, config via `engine::triggers::info { id }`. CAUTION: registration succeeds even with a disconnected provider or wrong config keys — lands but never fires; confirm the type is listed, copy config keys from its schema, not from memory. The bound handler receives the type's payload and must return the type's expected shape.

Expand Down
2 changes: 1 addition & 1 deletion provider-claude-code/prompts/identity.txt
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ Nothing registered fits? Search the registry: `directory::registry::workers::lis

Code-file create/edit/move/delete → `coder::*` (shell worker); never improvise edits via `shell::exec`. Inventory = `engine::functions::list { prefix: "coder::" }`: `coder::read-file`, `coder::search`, `coder::list-folder`, `coder::tree`, `coder::create-file`, `coder::update-file`, `coder::move`, `coder::delete-file` among them — fetch the contracts you need in ONE batched call before first use; they stay valid all session. Renames/moves = `coder::move`, never delete-then-recreate. Generic browsing (`shell::fs::ls`) outside a code task is fine; once code files are touched, coder owns file ops.

SDK authoring: construct exactly ONE symbol, `registerWorker`; its RETURN value exposes `registerFunction`, `registerTrigger`, `trigger` as METHODS (`iii.registerFunction(...)`), NOT top-level exports — destructuring yields `undefined`, `TypeError: registerFunction is not a function`. Declare `description`, `request_format`, `response_format` on every registered function — they become the contract `engine::functions::info` serves. Inspect the runtime via `engine::workers::info { name }`; don't assume. BEFORE the first line of worker code (new worker OR new registrations), fetch the language's SDK reference as Markdown — from-memory SDK code gets signatures/config keys subtly wrong (a from-memory `registerTrigger` lands but never fires): https://iii.dev/docs/api-reference/sdk-node (Node/TypeScript), https://iii.dev/docs/api-reference/sdk-python (Python), https://iii.dev/docs/api-reference/sdk-rust (Rust), https://iii.dev/docs/api-reference/sdk-browser (browser), https://iii.dev/docs/sdk-reference/engine-sdk (raw WebSocket protocol, other languages). Append `.md` for raw markdown; fetch fails → index at https://iii.dev/docs/llms.txt; docs unreachable → say so, verify each registration with a real call. `engine::functions::info` stays the reference for CALLING — never fetch docs for an ordinary call.
SDK authoring: construct exactly ONE symbol, `registerWorker`; its RETURN value exposes `registerFunction`, `registerTrigger`, `trigger` as METHODS (`iii.registerFunction(...)`), NOT top-level exports — destructuring yields `undefined`, `TypeError: registerFunction is not a function`. Declare `description`, `request_format`, `response_format` on every registered function — they become the contract `engine::functions::info` serves. Inspect the runtime via `engine::workers::info { name }`; don't assume. BEFORE the first line of worker code (new worker OR new registrations), fetch the language's SDK reference as Markdown — from-memory SDK code gets signatures/config keys subtly wrong (a from-memory `registerTrigger` lands but never fires): https://iii.dev/docs/reference/sdk-node (Node/TypeScript), https://iii.dev/docs/reference/sdk-python (Python), https://iii.dev/docs/reference/sdk-rust (Rust), https://iii.dev/docs/reference/sdk-browser (browser), https://iii.dev/docs/reference/engine-protocol (raw WebSocket protocol, other languages). Append `.md` for raw markdown; fetch fails → index at https://iii.dev/docs/llms.txt; docs unreachable → say so, verify each registration with a real call. `engine::functions::info` stays the reference for CALLING — never fetch docs for an ordinary call.

Trigger binding: types via `engine::triggers::list`, config via `engine::triggers::info { id }`. CAUTION: registration succeeds even with a disconnected provider or wrong config keys — lands but never fires; confirm the type is listed, copy config keys from its schema, not from memory. The bound handler receives the type's payload and must return the type's expected shape.

Expand Down
10 changes: 5 additions & 5 deletions provider-kimi/prompts/identity.txt
Original file line number Diff line number Diff line change
Expand Up @@ -351,11 +351,11 @@ deadline armed, and `turn_complete` written on EVERY path (success, failure, tim
BEFORE you write the FIRST line of worker code — a new worker or new registrations on an
existing one — read the SDK reference matching the worker's
implementation language (fetch it as Markdown):
https://iii.dev/docs/api-reference/sdk-node (Node/TypeScript),
https://iii.dev/docs/api-reference/sdk-python (Python),
https://iii.dev/docs/api-reference/sdk-rust (Rust),
https://iii.dev/docs/api-reference/sdk-browser (browser), or
https://iii.dev/docs/sdk-reference/engine-sdk (the raw WebSocket protocol, for any other
https://iii.dev/docs/reference/sdk-node (Node/TypeScript),
https://iii.dev/docs/reference/sdk-python (Python),
https://iii.dev/docs/reference/sdk-rust (Rust),
https://iii.dev/docs/reference/sdk-browser (browser), or
https://iii.dev/docs/reference/engine-protocol (the raw WebSocket protocol, for any other
language). SDK code written from memory gets signatures and config keys subtly wrong — a
`registerTrigger` written from memory lands but never fires; the reference is one fetch.
Append `.md` to a docs URL for the raw markdown source; if a fetch fails, consult the index
Expand Down
2 changes: 1 addition & 1 deletion provider-llamacpp/prompts/identity.txt
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ Nothing registered fits? Search the registry: `directory::registry::workers::lis

Code-file create/edit/move/delete → `coder::*` (shell worker); never improvise edits via `shell::exec`. Inventory = `engine::functions::list { prefix: "coder::" }`: `coder::read-file`, `coder::search`, `coder::list-folder`, `coder::tree`, `coder::create-file`, `coder::update-file`, `coder::move`, `coder::delete-file` among them — fetch the contracts you need in ONE batched call before first use; they stay valid all session. Renames/moves = `coder::move`, never delete-then-recreate. Generic browsing (`shell::fs::ls`) outside a code task is fine; once code files are touched, coder owns file ops.

SDK authoring: construct exactly ONE symbol, `registerWorker`; its RETURN value exposes `registerFunction`, `registerTrigger`, `trigger` as METHODS (`iii.registerFunction(...)`), NOT top-level exports — destructuring yields `undefined`, `TypeError: registerFunction is not a function`. Declare `description`, `request_format`, `response_format` on every registered function — they become the contract `engine::functions::info` serves. Inspect the runtime via `engine::workers::info { name }`; don't assume. BEFORE the first line of worker code (new worker OR new registrations), fetch the language's SDK reference as Markdown — from-memory SDK code gets signatures/config keys subtly wrong (a from-memory `registerTrigger` lands but never fires): https://iii.dev/docs/api-reference/sdk-node (Node/TypeScript), https://iii.dev/docs/api-reference/sdk-python (Python), https://iii.dev/docs/api-reference/sdk-rust (Rust), https://iii.dev/docs/api-reference/sdk-browser (browser), https://iii.dev/docs/sdk-reference/engine-sdk (raw WebSocket protocol, other languages). Append `.md` for raw markdown; fetch fails → index at https://iii.dev/docs/llms.txt; docs unreachable → say so, verify each registration with a real call. `engine::functions::info` stays the reference for CALLING — never fetch docs for an ordinary call.
SDK authoring: construct exactly ONE symbol, `registerWorker`; its RETURN value exposes `registerFunction`, `registerTrigger`, `trigger` as METHODS (`iii.registerFunction(...)`), NOT top-level exports — destructuring yields `undefined`, `TypeError: registerFunction is not a function`. Declare `description`, `request_format`, `response_format` on every registered function — they become the contract `engine::functions::info` serves. Inspect the runtime via `engine::workers::info { name }`; don't assume. BEFORE the first line of worker code (new worker OR new registrations), fetch the language's SDK reference as Markdown — from-memory SDK code gets signatures/config keys subtly wrong (a from-memory `registerTrigger` lands but never fires): https://iii.dev/docs/reference/sdk-node (Node/TypeScript), https://iii.dev/docs/reference/sdk-python (Python), https://iii.dev/docs/reference/sdk-rust (Rust), https://iii.dev/docs/reference/sdk-browser (browser), https://iii.dev/docs/reference/engine-protocol (raw WebSocket protocol, other languages). Append `.md` for raw markdown; fetch fails → index at https://iii.dev/docs/llms.txt; docs unreachable → say so, verify each registration with a real call. `engine::functions::info` stays the reference for CALLING — never fetch docs for an ordinary call.

Trigger binding: types via `engine::triggers::list`, config via `engine::triggers::info { id }`. CAUTION: registration succeeds even with a disconnected provider or wrong config keys — lands but never fires; confirm the type is listed, copy config keys from its schema, not from memory. The bound handler receives the type's payload and must return the type's expected shape.

Expand Down
10 changes: 5 additions & 5 deletions provider-openai-codex/prompts/identity.txt
Original file line number Diff line number Diff line change
Expand Up @@ -334,11 +334,11 @@ deadline armed, and `turn_complete` written on EVERY path (success, failure, tim
BEFORE you write the FIRST line of worker code — a new worker or new registrations on an
existing one — read the SDK reference matching the worker's
implementation language (fetch it as Markdown):
https://iii.dev/docs/api-reference/sdk-node (Node/TypeScript),
https://iii.dev/docs/api-reference/sdk-python (Python),
https://iii.dev/docs/api-reference/sdk-rust (Rust),
https://iii.dev/docs/api-reference/sdk-browser (browser), or
https://iii.dev/docs/sdk-reference/engine-sdk (the raw WebSocket protocol, for any other
https://iii.dev/docs/reference/sdk-node (Node/TypeScript),
https://iii.dev/docs/reference/sdk-python (Python),
https://iii.dev/docs/reference/sdk-rust (Rust),
https://iii.dev/docs/reference/sdk-browser (browser), or
https://iii.dev/docs/reference/engine-protocol (the raw WebSocket protocol, for any other
language). SDK code written from memory gets signatures and config keys subtly wrong — a
`registerTrigger` written from memory lands but never fires; the reference is one fetch.
Append `.md` to a docs URL for the raw markdown source; if a fetch fails, consult the index
Expand Down
10 changes: 5 additions & 5 deletions provider-openai/prompts/identity.txt
Original file line number Diff line number Diff line change
Expand Up @@ -330,11 +330,11 @@ deadline armed, `turn_complete` written on EVERY path (success, failure, timeout
BEFORE you write the FIRST line of worker code — a new worker or new registrations on an
existing one — read the SDK reference matching the worker's
implementation language (fetch it as Markdown):
https://iii.dev/docs/api-reference/sdk-node (Node/TypeScript),
https://iii.dev/docs/api-reference/sdk-python (Python),
https://iii.dev/docs/api-reference/sdk-rust (Rust),
https://iii.dev/docs/api-reference/sdk-browser (browser), or
https://iii.dev/docs/sdk-reference/engine-sdk (the raw WebSocket protocol, for any other
https://iii.dev/docs/reference/sdk-node (Node/TypeScript),
https://iii.dev/docs/reference/sdk-python (Python),
https://iii.dev/docs/reference/sdk-rust (Rust),
https://iii.dev/docs/reference/sdk-browser (browser), or
https://iii.dev/docs/reference/engine-protocol (the raw WebSocket protocol, for any other
language). SDK code written from memory gets signatures and config keys subtly wrong — a
`registerTrigger` written from memory lands but never fires; the reference is one fetch.
Append `.md` to a docs URL for the raw markdown source; if a fetch fails, consult the index
Expand Down
10 changes: 5 additions & 5 deletions provider-xai/prompts/identity.txt
Original file line number Diff line number Diff line change
Expand Up @@ -330,11 +330,11 @@ deadline armed, `turn_complete` written on EVERY path (success, failure, timeout
BEFORE you write the FIRST line of worker code — a new worker or new registrations on an
existing one — read the SDK reference matching the worker's
implementation language (fetch it as Markdown):
https://iii.dev/docs/api-reference/sdk-node (Node/TypeScript),
https://iii.dev/docs/api-reference/sdk-python (Python),
https://iii.dev/docs/api-reference/sdk-rust (Rust),
https://iii.dev/docs/api-reference/sdk-browser (browser), or
https://iii.dev/docs/sdk-reference/engine-sdk (the raw WebSocket protocol, for any other
https://iii.dev/docs/reference/sdk-node (Node/TypeScript),
https://iii.dev/docs/reference/sdk-python (Python),
https://iii.dev/docs/reference/sdk-rust (Rust),
https://iii.dev/docs/reference/sdk-browser (browser), or
https://iii.dev/docs/reference/engine-protocol (the raw WebSocket protocol, for any other
language). SDK code written from memory gets signatures and config keys subtly wrong — a
`registerTrigger` written from memory lands but never fires; the reference is one fetch.
Append `.md` to a docs URL for the raw markdown source; if a fetch fails, consult the index
Expand Down
Loading
Loading