Skip to content

(MOT-3900) feat(harness): compose system prompt from worker instructions#447

Closed
ytallo wants to merge 2 commits into
mainfrom
feat/worker-instructions
Closed

(MOT-3900) feat(harness): compose system prompt from worker instructions#447
ytallo wants to merge 2 commits into
mainfrom
feat/worker-instructions

Conversation

@ytallo

@ytallo ytallo commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Fixes MOT-3900

What

Workers now contribute their own sections to the agent system prompt, and operators can add persistent custom instructions — globally, per worker, or per session — with a defined precedence.

  • Worker-declared sections: a worker publishes markdown as metadata.agent_instructions on the configuration entry it already registers. The harness injects it under a # Notes from the \` workerheading while the worker is live (some<entry_id>::function registered), and drops it when the worker stops. Installing the shell worker adds itscoder::*` guidance; stopping it removes it.
  • Operator instructions: new harness-owned instructions configuration entry — global (appended to every turn) plus workers.<id> (appended inside that worker's section). Renders automatically in the console configuration page and hot-reloads via an unfiltered configuration trigger; no console changes needed.
  • Session-specific text stays the existing per-send options.system_prompt with enrich.

Composition order (later refines earlier): mode paragraph → identity prompt → worker sections (worker text, then operator per-worker text) → global operator instructions → per-send enrich. override remains absolute: caller prompt verbatim, nothing else.

Deduplication

The coder/code-editing guidance moves out of harness/prompts/default.txt, harness/prompts/cli.txt, and all four provider identity prompts into shell/prompts/agent-instructions.txt, declared by the shell worker's config registration. It is no longer served when the shell worker isn't running, and can't drift across five prompt copies.

The web worker's web::inject-guidance pre-generate hook is the older per-step variant of this; migrating it to agent_instructions is a possible follow-up.

Implementation notes

  • harness/src/instructions.rs: hot-swappable snapshot (mirrors the discovery/configuration cell pattern) — seeded at boot from configuration::list metadata + the instructions entry value, refreshed by a configuration trigger bound without an id filter. Best-effort everywhere: a fetch failure keeps the previous snapshot and never bricks boot or a send.
  • Sections are composed once at send/spawn time and frozen on the turn, same as the identity fetch; children spawned via harness::spawn get the same sections.
  • agent_instructions values that are non-string or blank are ignored; sections over 8KB log a warning but are never truncated.

Testing

  • cargo test green: harness 185, shell 1294, provider-{anthropic,openai,openai-codex,xai} all pass; clippy clean on harness + shell.
  • New unit tests: composition order end-to-end, override-skips-everything, user-only sections, live-worker prefix gating (incl. shellac:: vs shell:: false-prefix), metadata parse tolerance, empty-snapshot prompt is byte-identical to before.

Live smoke (pending)

  • First turn's system prompt contains the shell section; identity has no coder:: text
  • Editing instructions.global in the console lands on the next turn without restart
  • Stopping the shell worker drops its section on the next turn

Summary by CodeRabbit

  • New Features

    • Layered system prompts now combine built-in guidance, live worker-specific sections, and operator-editable instructions that refresh automatically while workers run.
    • Override option now returns the provided prompt verbatim.
  • Bug Fixes

    • System-prompt composition order is preserved and worker instructions are limited to currently-live workers.
  • Documentation

    • Expanded docs covering worker sections and operator instructions.
    • Updated agent prompt guidance: code-file operation instructions are now centralized in the shell worker, with redundant coder guidance removed from provider/CLI prompt docs.

Workers now contribute their own prompt sections: a worker publishes
markdown as metadata.agent_instructions on the configuration entry it
registers, and the harness appends it to every system prompt (sorted,
under a per-worker heading) while that worker has functions registered.
Operators get a dedicated 'instructions' configuration entry with a
'global' text plus per-worker overrides, hot-reloaded via an unfiltered
configuration trigger and editable from the console configuration page.

Composition order: mode paragraph, identity prompt, worker sections
(worker text then operator text), global operator instructions, then the
per-send enrich prompt. 'override' still serves the caller prompt
verbatim.

The coder/code-editing guidance moves out of the harness default prompt
and all provider identity prompts into the shell worker's declared
instructions, so it is only served when the shell worker is actually
running and no longer duplicated across prompts.
@vercel

vercel Bot commented Jul 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
workers Ready Ready Preview, Comment Jul 8, 2026 3:44am
workers-tech-spec Ready Ready Preview, Comment Jul 8, 2026 3:44am

Request Review

@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

skill-check — worker

0 verified, 39 skipped (no docs/).

Layer Result
structure
vale
ai
render

Four for four. Nicely done.

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a0cc07c0-f5cc-4d13-9292-fb0687c7dc56

📥 Commits

Reviewing files that changed from the base of the PR and between 00eba80 and 277e773.

📒 Files selected for processing (2)
  • shell/prompts/agent-instructions.txt
  • shell/src/configuration.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • shell/src/configuration.rs

📝 Walkthrough

Walkthrough

Adds a hot-reloadable instructions cache, threads worker and operator instructions into system-prompt assembly, and moves coder::* file-operation guidance into shell-worker instructions with matching prompt, config, test, and documentation updates.

Changes

Instructions subsystem and prompt composition

Layer / File(s) Summary
Instructions data model and lifecycle
harness/src/instructions.rs, harness/src/lib.rs
Defines the instructions snapshot types, cached cell, config entry registration, reload logic, configuration trigger, live section assembly, and unit tests; exports the module from the crate root.
Deps and boot wiring
harness/src/deps.rs, harness/src/main.rs, harness/src/configuration.rs, harness/src/discovery.rs
Adds the instructions cell to Deps, exposes an accessor, broadens trigger_with_retry, adds a test-only FunctionsSnapshot constructor, and wires instructions registration/reload/trigger binding into boot.
System prompt composition
harness/src/prompt/mod.rs, harness/src/prompt/tests.rs
Adds WorkerSection, extends prompt options with worker sections and global instructions, rewrites prompt assembly and resolution around the new options object, and updates tests for the revised composition and routing behavior.
Turn options wiring
harness/src/functions/send.rs, harness/src/subagent.rs
Fetches instructions/functions during turn setup, derives live worker sections and global instructions, and passes them into system-prompt resolution for top-level and child turns.

Relocation of coder:: guidance to shell worker*

Layer / File(s) Summary
Shell agent-instructions file
shell/prompts/agent-instructions.txt, shell/src/configuration.rs
Adds the shell worker agent-instructions prompt, registers it in configuration metadata, and adds a test for the prompt contents.
Prompt guidance removal
provider-anthropic/prompts/identity.txt, provider-openai-codex/prompts/identity.txt, provider-openai/prompts/identity.txt, provider-xai/prompts/identity.txt, harness/prompts/cli.txt, harness/prompts/default.txt, harness/src/prompt/tests.rs
Deletes coder::* guidance from provider identity prompts and harness cli/default prompts, and adjusts harness prompt tests to assert the guidance is absent.
Documentation
harness/README.md, worker-readme.md
Documents worker-level agent instructions and the system-prompt composition layers in the harness and worker readmes.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ConfigTrigger
  participant InstructionsHandler
  participant IIIClient
  participant InstructionsCell
  participant SendStart
  participant Prompt

  ConfigTrigger->>InstructionsHandler: configuration registered/updated/deleted
  InstructionsHandler->>IIIClient: fetch_snapshot
  IIIClient-->>InstructionsHandler: worker metadata + operator entry
  InstructionsHandler->>InstructionsCell: update cached snapshot

  SendStart->>InstructionsCell: instructions()
  SendStart->>Prompt: resolve_system_prompt(SystemPromptOpts{mode, identity, sections, user_global})
  Prompt-->>SendStart: composed system prompt
Loading

Poem

A rabbit hopped through configs bright,
And stitched the prompts just right.
Worker notes and global cheer,
Now flow to each turn clear.
Bye, coder:: crumbs in old disguise —
The shell worker holds the wise.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: harness system prompt composition now includes worker instructions.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/worker-instructions

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
harness/src/subagent.rs (1)

136-148: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Rename the FunctionsSnapshot binding to avoid shadowing.

let functions = deps.functions().await; (line 138, Arc<FunctionsSnapshot>) is shadowed a few lines later by let functions = match parent_record { ... }; (the function-policy Option<FunctionPolicy>, line 141). Both are valid but unrelated types sharing one name in the same function — safe today, but a maintainability trap for the next edit that needs the registry snapshot after the policy shadow point.

♻️ Suggested rename
     let instructions = deps.instructions().await;
-    let functions = deps.functions().await;
-    let sections = crate::instructions::live_sections(&instructions, &functions);
+    let functions_snapshot = deps.functions().await;
+    let sections = crate::instructions::live_sections(&instructions, &functions_snapshot);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@harness/src/subagent.rs` around lines 136 - 148, Rename the
`FunctionsSnapshot` binding in `subagent::...` so it no longer shares the
`functions` name with the later policy variable. Keep the
`deps.functions().await` result under a distinct name, and update the
`live_sections` call and any other uses in this function accordingly. Ensure the
later `match parent_record` result remains clearly named as the function policy
to avoid shadowing and confusion in future edits.
harness/src/prompt/tests.rs (1)

89-102: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider sharing the sections() test fixture.

The same WorkerSection fixture is duplicated near-identically across this file, harness/src/functions/send.rs (test module), and harness/src/subagent.rs (test module). Extracting it into a shared test-support helper would reduce drift risk if the fixture shape changes.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@harness/src/prompt/tests.rs` around lines 89 - 102, The WorkerSection test
fixture returned by sections() is duplicated across multiple test modules, so
update the tests to use a shared helper instead of maintaining separate copies.
Extract the common fixture into a test-support utility that can be reused by
harness/src/prompt/tests.rs, the send.rs test module, and the subagent.rs test
module, and then switch sections() and the other tests to reference that shared
builder/fixture so future WorkerSection shape changes stay consistent.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@harness/README.md`:
- Around line 174-180: The Worker sections description should say “running”
instead of “installing,” since the guidance is injected only while the worker is
live. Update the wording in the README section that describes how
`metadata.agent_instructions` is added via `configuration::register` and the `#
Notes from the \`<id>\` worker` heading so it clearly states the `coder::*`
guidance appears when an `<entry_id>::` function is registered and disappears
when it stops.

In `@harness/src/instructions.rs`:
- Around line 118-133: The `get_entry_value` helper is using substring matching
on the error text from `trigger_with_retry`, which can misclassify unrelated
failures as missing entries. Update `trigger_with_retry` and/or
`get_entry_value` to preserve and inspect the structured SDK error code, then
branch on the actual `NOT_FOUND` code instead of `contains("NOT_FOUND")`; keep
`should_seed` unchanged except for using the corrected missing-entry behavior.

---

Nitpick comments:
In `@harness/src/prompt/tests.rs`:
- Around line 89-102: The WorkerSection test fixture returned by sections() is
duplicated across multiple test modules, so update the tests to use a shared
helper instead of maintaining separate copies. Extract the common fixture into a
test-support utility that can be reused by harness/src/prompt/tests.rs, the
send.rs test module, and the subagent.rs test module, and then switch sections()
and the other tests to reference that shared builder/fixture so future
WorkerSection shape changes stay consistent.

In `@harness/src/subagent.rs`:
- Around line 136-148: Rename the `FunctionsSnapshot` binding in `subagent::...`
so it no longer shares the `functions` name with the later policy variable. Keep
the `deps.functions().await` result under a distinct name, and update the
`live_sections` call and any other uses in this function accordingly. Ensure the
later `match parent_record` result remains clearly named as the function policy
to avoid shadowing and confusion in future edits.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: da98b81d-a86f-40f1-afb3-030dc9a221b9

📥 Commits

Reviewing files that changed from the base of the PR and between 9f10807 and 00eba80.

📒 Files selected for processing (20)
  • harness/README.md
  • harness/prompts/cli.txt
  • harness/prompts/default.txt
  • harness/src/configuration.rs
  • harness/src/deps.rs
  • harness/src/discovery.rs
  • harness/src/functions/send.rs
  • harness/src/instructions.rs
  • harness/src/lib.rs
  • harness/src/main.rs
  • harness/src/prompt/mod.rs
  • harness/src/prompt/tests.rs
  • harness/src/subagent.rs
  • provider-anthropic/prompts/identity.txt
  • provider-openai-codex/prompts/identity.txt
  • provider-openai/prompts/identity.txt
  • provider-xai/prompts/identity.txt
  • shell/prompts/agent-instructions.txt
  • shell/src/configuration.rs
  • worker-readme.md
💤 Files with no reviewable changes (4)
  • provider-openai/prompts/identity.txt
  • provider-anthropic/prompts/identity.txt
  • provider-xai/prompts/identity.txt
  • provider-openai-codex/prompts/identity.txt

Comment thread harness/README.md
Comment on lines +174 to +180
1. **Worker sections.** A worker publishes agent guidance by setting
`metadata.agent_instructions` (a markdown string) on the configuration entry
it registers (`configuration::register`). The section is injected — under a
`# Notes from the \`<id>\` worker` heading, sorted by entry id — only while
the worker is live (some `<entry_id>::` function is registered), so
installing the shell worker adds its `coder::*` guidance and stopping it
removes it.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use “running” rather than “installing.”

The guidance is injected only while the worker is live; “installing” makes the trigger condition sound broader than it is.

Suggested fix
- so installing the shell worker adds its `coder::*` guidance and stopping it removes it.
+ so running the shell worker adds its `coder::*` guidance and stopping it removes it.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
1. **Worker sections.** A worker publishes agent guidance by setting
`metadata.agent_instructions` (a markdown string) on the configuration entry
it registers (`configuration::register`). The section is injected — under a
`# Notes from the \`<id>\` worker` heading, sorted by entry id — only while
the worker is live (some `<entry_id>::` function is registered), so
installing the shell worker adds its `coder::*` guidance and stopping it
removes it.
1. **Worker sections.** A worker publishes agent guidance by setting
`metadata.agent_instructions` (a markdown string) on the configuration entry
it registers (`configuration::register`). The section is injected — under a
`# Notes from the \`<id>\` worker` heading, sorted by entry id — only while
the worker is live (some `<entry_id>::` function is registered), so
running the shell worker adds its `coder::*` guidance and stopping it
removes it.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@harness/README.md` around lines 174 - 180, The Worker sections description
should say “running” instead of “installing,” since the guidance is injected
only while the worker is live. Update the wording in the README section that
describes how `metadata.agent_instructions` is added via
`configuration::register` and the `# Notes from the \`<id>\` worker` heading so
it clearly states the `coder::*` guidance appears when an `<entry_id>::`
function is registered and disappears when it stops.

Comment on lines +118 to +133
async fn should_seed(iii: &IIIClient) -> Result<bool, String> {
match get_entry_value(iii, INSTRUCTIONS_CONFIG_ID).await? {
None => Ok(true),
Some(v) if v.is_null() => Ok(true),
Some(_) => Ok(false),
}
}

/// `configuration::get` tolerant of a missing entry (codes vary in case).
async fn get_entry_value(iii: &IIIClient, id: &str) -> Result<Option<Value>, String> {
match trigger_with_retry(iii, "configuration::get", json!({ "id": id })).await {
Ok(resp) => Ok(resp.get("value").cloned()),
Err(e) if e.to_ascii_uppercase().contains("NOT_FOUND") => Ok(None),
Err(e) => Err(e),
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

Does the iii-sdk Rust crate's configuration::get trigger response use a stable/typed NOT_FOUND error code, or free-form error text?

💡 Result:

In the iii-sdk Rust crate, invocations (including triggers like configuration::get) are performed using the generic iii.trigger() method [1][2]. The SDK utilizes a structured message protocol for communication between the worker and the engine [3][4]. When a function invocation results in an error, the engine communicates this back to the SDK. Based on the SDK's internal message protocol—which is consistent across its Rust, Node.js, and other implementations—error responses are structured as objects typically containing both a code (string) and a message (string) [4]. Therefore, configuration::get and other triggers do not return free-form error text; they use a typed, structured error response format that includes a stable, machine-readable error code [4]. For example, when handling errors in a custom implementation, you would typically expect to handle an object with the following shape [4]: { "code": "SOME_ERROR_CODE", "message": "Human-readable description" } As configuration::get is a system-level function invoked via the standard trigger interface, any NOT_FOUND condition would return a structured error with a specific NOT_FOUND (or similarly typed) error code [5][4].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate the relevant functions and any error-shape handling around trigger_with_retry.
rg -n "trigger_with_retry|get_entry_value|should_seed|NOT_FOUND|configuration::get|code.*message|message.*code" harness/src -S

# Map the file structure for the target file before reading slices.
ast-grep outline harness/src/instructions.rs --view expanded

Repository: iii-hq/workers

Length of output: 4851


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Read the relevant section with line numbers.
sed -n '1,220p' harness/src/instructions.rs | cat -n

Repository: iii-hq/workers

Length of output: 10852


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the trigger retry wrapper and the error formatting used by the harness.
sed -n '1,260p' harness/src/configuration.rs | cat -n
printf '\n---- error.rs ----\n'
sed -n '1,220p' harness/src/error.rs | cat -n
printf '\n---- engine.rs excerpt ----\n'
sed -n '1,240p' harness/src/clients/engine.rs | cat -n

Repository: iii-hq/workers

Length of output: 24355


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the retry wrapper and any helper that stringifies errors.
sed -n '300,420p' harness/src/configuration.rs | cat -n
printf '\n---- other NOT_FOUND matches ----\n'
rg -n "NOT_FOUND|to_ascii_uppercase\\(\\)\\.contains\\(\"NOT_FOUND\"\\)" harness/src -S

Repository: iii-hq/workers

Length of output: 3539


🌐 Web query:

iii-sdk Rust trigger error Display format code message NOT_FOUND configuration get error shape

💡 Result:

In the iii-sdk Rust environment, a NOT_FOUND error returned during configuration or trigger registration typically indicates that the requested identifier (such as a configuration ID or trigger type) has not been correctly registered with the engine before being accessed [1][2]. Key details regarding this error: 1. Identification of the Error: The NOT_FOUND code explicitly indicates that a get or schema call was performed against an ID that has not yet been registered [1]. In the context of trigger registration, this often occurs because the required trigger worker (e.g., HTTP, cron, stream) is not active or has not been properly registered in your project [2]. 2. Troubleshooting Steps: - Verify Registration: Ensure that you have called the necessary registration functions (e.g., register_worker, register_trigger, or register_trigger_type) before attempting to invoke or configure the resource [1][2]. - Check Trigger Worker Availability: If you receive this during trigger registration, confirm that the specific trigger type (like http or cron) is supported and that the corresponding worker is active [2]. You can check available workers at workers.iii.dev [2]. - Inspect Error Payloads: If you are using the Rust SDK, the IIIError enum contains a Remote variant that carries an ErrorBody [3]. You can match on IIIError::Remote(body) to extract the code (e.g., NOT_FOUND) and the accompanying message, which often provides specific details about the missing registration [3]. 3. Common Misconfiguration: A common source of this error is attempting to use a trigger or configuration ID that has not been defined in the engine's current state [1]. Always ensure that configuration IDs are registered before use [1] and that trigger types are installed if they are not built-in [2].

Citations:


🌐 Web query:

iii-sdk Rust iii_sdk::errors::ErrorDisplay formatremote error ( NOT_FOUND code message

💡 Result:

In the iii-sdk Rust crate, iii_sdk::errors::IIIError is the primary error enum [1]. When a remote error occurs, it is represented by the IIIError::Remote(ErrorBody) variant [1]. The ErrorBody struct contains a code (String) and a message (String) [2][3]. While the specific Display implementation for IIIError may vary by version, the Remote variant typically formats as a string that includes the engine's error metadata [1]. When you encounter a NOT_FOUND error, it is passed within the ErrorBody payload [1]. You can access this programmatically by matching on the error variant: match err { IIIError::Remote(body) => { if body.code == "NOT_FOUND" { // Handle the specific NOT_FOUND error println!("Remote error ({}): {}", body.code, body.message); } } _ => { /* Handle other errors */ } } The ErrorBody structure is defined as: pub struct ErrorBody { pub code: String, pub message: String, pub stacktrace: Option, } [2][3] You can branch on body.code.as_str() to handle specific engine error codes such as invocation_failed, function_not_found, or NOT_FOUND [1].

Citations:


Use the SDK error code instead of substring matching. trigger_with_retry reduces the error to text, so contains("NOT_FOUND") can swallow unrelated failures that happen to mention that substring. Branch on the structured NOT_FOUND code from the SDK error body, or keep the typed error through the retry helper.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@harness/src/instructions.rs` around lines 118 - 133, The `get_entry_value`
helper is using substring matching on the error text from `trigger_with_retry`,
which can misclassify unrelated failures as missing entries. Update
`trigger_with_retry` and/or `get_entry_value` to preserve and inspect the
structured SDK error code, then branch on the actual `NOT_FOUND` code instead of
`contains("NOT_FOUND")`; keep `should_seed` unchanged except for using the
corrected missing-entry behavior.

…tions

Replace the moved-verbatim coder paragraph with workflow doctrine the
function contracts cannot convey: orient with tree/search (context
lines), stat-probe + windowed/numbered reads before editing, anchored
regex edits guarded by expect_matches, verify from the returned echoes
instead of re-reading, create-file only for new files, move for
renames, and coder::info + shell::fs::* for paths outside the jail.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant