Skip to content
Closed
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
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "agentsmd",
"version": "17.1.1",
"version": "17.2.0",
"description": "Portable agent rules, Project Direction, Delivery System profiles, owned workflow Skills, and deterministic version control.",
"author": {
"name": "lukaszmaj"
Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "agentsmd",
"version": "17.1.1",
"version": "17.2.0",
"description": "Portable agent rules, Project Direction, Delivery System profiles, owned workflow Skills, and deterministic version control.",
"author": {
"name": "lukaszmaj",
Expand Down
2 changes: 1 addition & 1 deletion .grok-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "agentsmd",
"version": "17.1.1",
"version": "17.2.0",
"description": "Portable agent rules, Project Direction, Delivery System profiles, owned workflow Skills, and deterministic version control.",
"author": {
"name": "lukaszmaj"
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@
All completed repository versions are recorded here. Release entries follow
SemVer and identify one user-consumable repository state.

## [17.2.0] - 2026-10-14

### Added

- A delegated negative result reaches the user or an Issue only after it lists attempts and primary sources and one challenge fails to make the work succeed (#226)
- An Issue filed or found for work the user wants done leaves that turn with a running worker or a named agent that accepted the handoff, and the report names that owner (#226)

## [17.1.1] - 2026-10-13

### Changed
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
17.1.1
17.2.0
84 changes: 84 additions & 0 deletions evals/issue-owner.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
{
"fixture_kind": "issue-owner",
"issue": "https://github.com/toolboxmd/agentsmd/issues/226",
"incident_date": "2026-10-14",
"cases": [
{
"id": "agent-observer-85-86-unstaffed",
"incident": true,
"summary": "The planner filed toolboxmd/agent-observer#85 and #86 for work the user had asked for, wrote that the planner would staff the build, and sent no handoff. No worker was running. Nobody worked on them until the user asked.",
"running_worker_started": false,
"within_authority": false,
"handoff_sent": false,
"handoff_acknowledged": false,
"report_names_owner": false,
"leaves_with_owner": false
},
{
"id": "promise-without-handoff",
"incident": false,
"summary": "The report says a named planner will pick the Issue up. No message was sent and no worker is running.",
"running_worker_started": false,
"within_authority": true,
"handoff_sent": false,
"handoff_acknowledged": false,
"report_names_owner": true,
"leaves_with_owner": false
},
{
"id": "handoff-sent-not-acknowledged",
"incident": false,
"summary": "A handoff message was sent to a named agent. That agent has not acknowledged it. The report names them.",
"running_worker_started": false,
"within_authority": true,
"handoff_sent": true,
"handoff_acknowledged": false,
"report_names_owner": true,
"leaves_with_owner": false
},
{
"id": "worker-outside-authority",
"incident": false,
"summary": "A worker is running, but starting it was outside the agent's authority. No accepted handoff exists. The report names the worker.",
"running_worker_started": true,
"within_authority": false,
"handoff_sent": false,
"handoff_acknowledged": false,
"report_names_owner": true,
"leaves_with_owner": false
},
{
"id": "worker-started-report-omits-name",
"incident": false,
"summary": "A worker was started within authority and is running. The report to the user does not name that owner.",
"running_worker_started": true,
"within_authority": true,
"handoff_sent": false,
"handoff_acknowledged": false,
"report_names_owner": false,
"leaves_with_owner": false
},
{
"id": "running-worker-named",
"incident": false,
"summary": "A worker was started within authority and is running. The report names that worker.",
"running_worker_started": true,
"within_authority": true,
"handoff_sent": false,
"handoff_acknowledged": false,
"report_names_owner": true,
"leaves_with_owner": true
},
{
"id": "named-agent-accepted",
"incident": false,
"summary": "The handoff was sent to a named agent and that agent acknowledged it. The report names that agent.",
"running_worker_started": false,
"within_authority": true,
"handoff_sent": true,
"handoff_acknowledged": true,
"report_names_owner": true,
"leaves_with_owner": true
}
]
}
104 changes: 104 additions & 0 deletions evals/negative-result-gate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
{
"fixture_kind": "negative-result-gate",
"issue": "https://github.com/toolboxmd/agentsmd/issues/226",
"incident_date": "2026-10-14",
"primary_sources": ["docs", "readme", "help", "env", "config"],
"cases": [
{
"id": "grok-cannot-strip-relayed",
"incident": true,
"summary": "A worker said Grok cannot be stripped of global rules and skills. The report listed no attempts and no primary sources. Nobody tried to make removal work. The planner relayed the negative to the user.",
"polarity": "negative",
"attempts_listed": false,
"primary_sources": [],
"coordinator_tried": false,
"challenger_assigned": false,
"attempt_failed": false,
"reaches_user_or_issue": false
},
{
"id": "opencode-no-recipe-filed",
"incident": true,
"summary": "A worker said OpenCode had no verified subscription recipe. The report listed no attempts and no primary sources. Nobody tried to make a recipe work. The planner filed a to-do from that negative.",
"polarity": "negative",
"attempts_listed": false,
"primary_sources": [],
"coordinator_tried": false,
"challenger_assigned": false,
"attempt_failed": false,
"reaches_user_or_issue": false
},
{
"id": "grok-disproved-by-own-readme",
"incident": true,
"summary": "The same Grok negative was checked against the tool's own README and environment. GROK_HOME plus an empty HOME removed the user instructions. The negative did not survive.",
"polarity": "negative",
"attempts_listed": true,
"primary_sources": ["docs", "readme", "help", "env", "config"],
"coordinator_tried": true,
"challenger_assigned": false,
"attempt_failed": false,
"reaches_user_or_issue": false
},
{
"id": "opencode-disproved-by-auth-list",
"incident": true,
"summary": "The same OpenCode negative was checked against the live credential store. OpenCode already held an OpenCode Go credential. The negative did not survive.",
"polarity": "negative",
"attempts_listed": true,
"primary_sources": ["docs", "readme", "help", "env", "config"],
"coordinator_tried": true,
"challenger_assigned": false,
"attempt_failed": false,
"reaches_user_or_issue": false
},
{
"id": "listed-sources-without-a-challenge",
"incident": false,
"summary": "The report lists attempts and every primary source class, and still says the work cannot be done. Neither the coordinator nor a challenger has tried to make it work.",
"polarity": "negative",
"attempts_listed": true,
"primary_sources": ["docs", "readme", "help", "env", "config"],
"coordinator_tried": false,
"challenger_assigned": false,
"attempt_failed": true,
"reaches_user_or_issue": false
},
{
"id": "missing-config-keys",
"incident": false,
"summary": "Attempts are listed and a challenger failed, but config keys were never checked.",
"polarity": "negative",
"attempts_listed": true,
"primary_sources": ["docs", "readme", "help", "env"],
"coordinator_tried": false,
"challenger_assigned": true,
"attempt_failed": true,
"reaches_user_or_issue": false
},
{
"id": "survives-coordinator-attempt",
"incident": false,
"summary": "Attempts and every primary source class are listed. The coordinator tried once to make the work succeed and it still failed.",
"polarity": "negative",
"attempts_listed": true,
"primary_sources": ["docs", "readme", "help", "env", "config"],
"coordinator_tried": true,
"challenger_assigned": false,
"attempt_failed": true,
"reaches_user_or_issue": true
},
{
"id": "survives-one-challenger",
"incident": false,
"summary": "Attempts and every primary source class are listed. One challenger whose only job was to make the work succeed still failed.",
"polarity": "negative",
"attempts_listed": true,
"primary_sources": ["docs", "readme", "help", "env", "config", "man-page"],
"coordinator_tried": false,
"challenger_assigned": true,
"attempt_failed": true,
"reaches_user_or_issue": true
}
]
}
10 changes: 10 additions & 0 deletions skills/operations/references/bounded-delegation.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ at safe boundaries and before reporting. User stops, revoked authority, unsafe
writes, and shared-state failures interrupt immediately. The host's existing
message tools usually suffice; do not build a queue service by default.

A negative result says the work cannot be done: not possible, cannot remove,
blocked, no recipe, or failed. An ordinary failed slice, one that does not say
the work cannot be done, is still recorded at once. Accept a negative result
only when it lists what was tried and which primary sources were checked: the
tool's own docs and bundled README, its `--help`, its environment variables,
and its config keys. Before you relay that result to the user or file anything
from it, try the work once yourself or assign one challenger whose only job is
to make the work succeed. Report only a
negative result that survives that attempt, and include the attempts.

Integrate reviewed components as they become ready under the one-final-approval-
PR contract. Preserve accepted outputs promptly in their authorized durable owner.
A disposable worker's confident transcript is not durable delivery evidence.
Expand Down
18 changes: 14 additions & 4 deletions skills/operations/references/orchestration.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,12 @@ when sufficient.

Include the unit's outcome, allowed and forbidden writes, shared-resource limits,
acceptance, proof seam, known gotchas, report shape, and bounded escalation
condition. Do not dispatch unresolved ownership or acceptance. Do not dispatch
implementation of a new component or system until the brief cites a Spec Issue
condition. The report shape for a negative result (not possible, cannot remove,
blocked, no recipe, or failed) lists what was tried and which primary sources
were checked: the tool's own docs and bundled README, its `--help`, its
environment variables, and its config keys. Do not dispatch unresolved
ownership or acceptance. Do not dispatch implementation of a new component or
system until the brief cites a Spec Issue
([to-spec](../procedures/to-spec/index.md)) whose Design review names the
reviewer, the verdict, and the user's decisions; acceptance criteria in a brief
are not a design. A microfix or a change inside an existing component says so in
Expand Down Expand Up @@ -102,8 +106,14 @@ relevant fields in the final response.

The coordinator independently verifies Git/GitHub state and reuses valid
exact-candidate proof under [verification](verification.md); transcripts and duplicate
checks are unnecessary. Start the next unblocked substantive Issue with its own
packet. Resume the same Issue when context remains useful; recover current state
checks are unnecessary. Before you relay a negative result or file anything from
it, read [bounded delegation](bounded-delegation.md) in full and apply its
negative-result gate. When you file or find an Issue for work the user wants
done, leave that turn with a real owner: a running worker you started within
your authority, or a named agent that has accepted the handoff, message sent
and acknowledged. "X will pick it up", with no handoff, is not an owner. Name
the owner in the report to the user. Start the next unblocked substantive
Issue with its own packet. Resume the same Issue when context remains useful; recover current state
from Git, GitHub, instructions, and handoff. Never recreate completed work or
request completed approvals again.

Expand Down
Loading
Loading