Commit Graph
7751 Commits
Author SHA1 Message Date
DottaandClaude Opus 5.5 b4b720601a fix(agents): hired OpenCode agents inherit the hiring agent's OpenRouter key reference
An OpenCode agent hired by another OpenCode agent got no credential, so
approving the hire left it failing verification with harness_auth_failed.
Credential inheritance covered Claude, Codex and Grok but not opencode_local.
Add OPENROUTER_API_KEY, the key AI connections bind for opencode_local.
Only secret references are copied; plain values such as
OPENCODE_CONFIG_CONTENT still stay with the parent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 23:34:35 -06:00
DottaandClaude Opus 5.5 839e3c37e0 test(evals): let find-and-install identify the skill by its page link
The reply check required the frontmatter name verbatim, so a correct
reply naming "Accessibility Review" with a link to the saved skill
would fail. Accept the saved name or a link to that skill's page; a link
to another skill still fails.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 23:33:17 -06:00
DottaandClaude Opus 5.5 d4a5298373 fix(runner): tell agents a skill found in a directory is imported, not re-created
An agent asked to add a skill from a vetted local directory searched the
company library, found no match, read "existing skill" as "already in
the library" and saved a managed copy with create_skill. The copy lost
its source locator, so update, audit and reset flows cannot follow it.

State in the create_skill contract that a SKILL.md in a local directory,
repository, URL or catalog is an existing skill even when the library has
no match, and must be imported rather than copied.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 23:33:17 -06:00
DottaandClaude Opus 5.5 0ad24b8fa3 test(evals): open the remembered preview through the current attachment panel
Attachment links in chat now open the in-app preview panel instead of
starting a download, so the result check timed out waiting for a download
event after the panel had correctly shown the blue preview. Follow the
visible path: click the answer's link, then use the panel's Download control
for that file (a direct download still counts) and check the filename.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 23:28:43 -06:00
DottaandClaude Opus 5.5 e7b019b3b2 test(evals): grade remember-and-follow-up by preview bytes and turn effects
The baseline run returned the selected preview correctly but failed twice on
grader assumptions: it re-registered the byte-identical file as a new
attachment (grader required the original attachment id), and it asked the
clarification through a pending ask_user_questions card (grader only read
comment replies). The grader also matched reply wording with regexes.

- Identify "that preview" by downloaded bytes and filename of the attachment
  the canonical answer links, verified against its stored digest.
- Accept a clarification that ends the turn as a reply or a pending question
  card created by that phase's own run; require that run to create no
  attachment, work product or document revision.
- Require no follow-up task (neither request asked for one) instead of
  matching "blue" in task text; drop all reply-wording regexes.
- Bump oracle to paperclip.chat-catalog.runtime.remember-preview.v3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 23:28:43 -06:00
DottaandClaude Opus 5.5 dd6c5df76a test(evals): give archive-card's Research card a real blocker to summarize
The unrelated Research card asks for the project's biggest blockers, but
its only task was a backlog follow-up. The summarizer searched for
blockers that did not exist, and its pre-query generation took 171-182s
against the 180s limit, failing setup in 2 of 4 runs. The Research
project now has one blocked task, as Launch does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:43:30 -06:00
DottaandClaude Opus 5.5 b3f8bbfdb9 fix(status-cards): remove a new card only when its compile cannot be queued
The create route's cleanup also wrapped the activity record written after
the compile was queued, so a logging failure deleted the card and left
its generation task queued. Only enqueueCompile failures now remove the
card; a regression test fails the creation activity record and checks
that the card and its uncancelled generation task remain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:43:30 -06:00
DottaandClaude Opus 5.5 cfe3decc7c fix(status-cards): resolve the card link before creating the card
A failed company read for the href ran inside the create route's cleanup
path, which deleted the new card while its compile task stayed queued.
The issue prefix is now read before the card is created; a regression
test makes that read fail and checks that no card or task is left.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:43:30 -06:00
DottaandClaude Opus 5.5 2010e43746 fix(status-cards): give agents the person's restore route when archiving a card
Archive and restore responses carried no board route and the PATCH
operation had no description, so a chat agent that archived a card could
only tell the person to 'clear archived' via the API. Single-card
responses (create, get, patch) now include href, the company-scoped
Status page route, and the PATCH description explains that archive keeps
the card and history, that a person restores it from the Status page,
and that restoring starts a fresh summary.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:43:30 -06:00
DottaandClaude Opus 5.5 ed1de93f80 test(evals): grade archive-card's restore route by its link, not reply wording
The archive-restoration-truthful check pattern-matched the reply: a
truthful 'archived, not deleted' failed on the word 'deleted', and
'refreshes'/'refreshed' missed /\brefresh\b/. Saved state already proves
archive-not-delete and preserved history; the reply is now graded on
giving a usable route (the archived card or the status cards page,
where Restore lives). Bumps the oracle to status-card.archive.v2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:43:30 -06:00
DottaandClaude Opus 5.5 952636e1d2 fix(agents): give the terminate denial a ready link to the agent's profile
An agent refused termination relayed the profile path as plain text. The
denial now carries a Markdown link to /<prefix>/agents/<id>, so the agent
can send the person straight to the Terminate control. POST /terminate now
resolves the agent before the board check, so the link names the target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:32:43 -06:00
DottaandClaude Opus 5.5 ff9ee74c46 fix(issues): do not wake the assignee for an issue created already closed
Creating an issue with status done or cancelled and an agent assignee queued
an issue_assigned wake, so the agent got a run for finished work (and it
queued behind any run the agent already had). The update path already treats
restoring an assignee on closed work as not a reopen request, and create-time
fast responses already skip done and cancelled. Apply the same guard to the
create-time assignment wake.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:32:43 -06:00
DottaandClaude Opus 5.5 fd29465e1a fix(agents): keep agent termination board-only on the PATCH status route
PATCH /api/agents/:id with status "terminated" ran the lifecycle terminate
command after only the agent-config update check, so an agent that could
configure a peer (or itself) could terminate it after POST /terminate
returned 403. Both routes now share one board-only gate whose denial names
where a person can terminate the agent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:32:43 -06:00
DottaandClaude Opus 5.5 031aab4041 test(evals): fail retire-agent setup when the historical record starts work
The baseline and second runs both had a third Morgan run, queued by creating
the done historical task. Assert in setup that Morgan's only run is the
active assignment, so this shows up as a setup defect, not a candidate one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:32:43 -06:00
DottaandClaude Opus 5.5 0656683b5b test(evals): grade retire-agent by its profile route and both terminate routes
Replace the reply keyword/regex check with the exact link to the intended
agent's profile, where the person uses Terminate. Probe the PATCH status
route as well as POST /terminate, since the baseline agent terminated the
worker through PATCH after POST was refused. Bump the oracle version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:32:43 -06:00
Dotta 0afe9514ab fix(server): document the safe company import request body in the API catalog
POST /api/companies/{companyId}/imports/preview and /imports/apply registered
no request body, so agents reading the catalog could not learn the source,
target, collisionStrategy or nameOverrides fields. Register the existing
preview and import schemas and describe the safe-route limits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 1171878148)
2026-11-07 22:31:23 -06:00
Dotta 9675c0b150 fix(chat): tell agents how to read the company link prefix from a task identifier
Chat guidance said to derive the link prefix from the returned task
identifier but never said how. A CEO agent reasoned that RUN-1 "doesn't
give the prefix directly", invented /runner-e2e/agents/<id>, and every
agent profile link in its reply opened "Organization not found". State
that the prefix is the identifier part before the final hyphen and number,
that all company links share it, and that it is never built from names,
slugs, hostnames or paths.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 0e7a64cdf0)
2026-11-07 22:31:23 -06:00
DottaandClaude Opus 5.5 ab80026501 test(chat): grade import-preview by saved configuration and the stopped first turn, not reply keywords
The baseline attempt failed although the agent only previewed: the
before-choice check compared the existing agent's full configuration
response, whose lifecycle status and updatedAt change after setup
(preparation and harness budget funding). Compare the configuration
without those fields (configurationRevision, the product's own content
hash, stays). Replace the conflict/choice keyword regexes over the reply
with structure: the first turn ended waiting on the person with no import
activity, and the reply names the setup-chosen conflicting employee.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:31:23 -06:00
DottaandClaude Opus 5.5 470db33754 fix(evals): follow a rendered task link in revise-delivery only when one exists
The revision request attaches its source task, so the shared result-navigation
check's requirement for a rendered task link rejected a correct reply that
returned both version downloads. The case still opens the returned download and
both versions' library stacks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 21:11:27 -06:00
DottaandClaude Opus 5.5 a3f29839fd fix(evals): grade website revision by its saved versions, not reply wording
The revise-delivery grader rejected a correct revision for four eval reasons:
the fixture footer marker ended in the nonce's attempt suffix (-1), which the
agent reasonably bumped as a version label on website-v1.html; it required a
link to the source task the person had attached; it required the revision on
the source task although the chat run's register_deliverable files it on the
requesting conversation; and it graded revision context with keyword regexes.

Hash the marker, accept the source task or the conversation, and grade
revision context structurally: a separately titled registered version plus a
returned route to the retained original.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 21:11:27 -06:00
DottaandClaude Opus 5.5 a4b9285b60 test(evals): grade restore-document by saved revisions, not reply wording
The concurrent phase required the reply to say Casey, offline and
prototype, and the approval check scanned reply words. The read and
final phases now accept a revision identified by id or number, the final
phase accepts naming the intervening edit by revision or editor, and
saved state decides restore versus preserve. Approval is checked from
activity only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 21:10:31 -06:00
DottaandClaude Opus 5.5 e804362a94 fix(documents): say whether an exact revision read is still current
An agent asked to read the current plan fetched the revision it had just
restored by id and reported it as the latest, missing a newer edit by
another person. The exact-revision read now carries the document's
latestRevisionId, latestRevisionNumber and isLatest, and its API
description points to the current-document read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 21:10:31 -06:00
DottaandClaude Opus 5.5 dc6e4be04d test(chat): accept an exact inline brief handoff in tasks.attachment-brief
The grader required either a copied attachment or an attachment URL in
the delegated task, so it rejected the agent copying the complete brief
verbatim into the task description, which the chat guidance itself
recommends ("copy the relevant existing content into the handoff") and
which gave Morgan everything needed to build the site.

- Accept the complete exact brief text (setup-chosen literal, tolerant
  only of line endings, indentation, blank lines and quote markers) in
  the full saved task description or its documents, and require Morgan's
  own bearer to read it there.
- Read the saved task in full; company issue listings shorten
  descriptions to 1200 characters, which could also hide a reference.
- Drop the website/landing-page keyword check on the model-written title.
- Bump the case oracle version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 20:57:26 -06:00
DottaandClaude Opus 5.5 4eaf631f65 fix(chat): link a person's own profile editor instead of attempting an agent write
Chat agents asked to change the person's own display name had no route to
offer, so they searched the API, tried the human-only profile endpoint and
ended with vague "profile/account settings" directions. Tell chat where the
personal profile editor lives and that agent credentials cannot change it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 20:55:37 -06:00
DottaandClaude Opus 5.5 384fd82892 test(evals): grade edit-profile from the profile-editor link and saved identity
The account popover check failed in strict mode because the profile page now
has its own display-name heading; scope it to the popover. Accept 401 as well
as 403 for the agent's denied profile write (a non-session credential is
unauthenticated on the human-only route). Replace the reply keyword and
negative wording regexes with a required rendered link to the person's
profile editor, which the person follows to save the name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 20:55:36 -06:00
DottaandClaude Opus 5.5 f0ddccff71 fix(chat): ask which record is meant when a change matches several
A chat request such as "Mark the landing-page task as high priority" with
two accessible tasks of that title left the agent deliberating between
picking one, changing both and asking, until the run was cancelled. Chat
guidance now says to ask which candidate is meant, with links and the
distinguishing detail, before changing any of them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 20:51:59 -06:00
DottaandClaude Opus 5.5 886a36aeba test(evals): grade the ambiguous-task clarification by state and links, not wording
The clarify-before-write check required a question mark or one of
which/choose/select/clarify in the free-form reply. A valid question
phrased as "Tell me the one to raise" failed it, and the keywords proved
nothing the saved state and links do not. The check now relies on no
early mutation of either task and links to both candidates; the later
checks still reject picking the first match, changing both, or the wrong
task after the selection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 20:51:59 -06:00
DottaandClaude Opus 5.5 faed046526 fix(evals): grade instruction edits by saved merge and link, not wording
The edit-instructions oracle matched the saved rule and the reply against
phrase regexes. It now requires the agent's own audited save to add guidance
on top of the prior and concurrent human revisions, and a link to Morgan or
the saved revision. An unsaved rule fails whatever the reply says.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 20:49:56 -06:00
DottaandClaude Opus 5.5 988094c256 fix(runner): return the edited agent's link and effect in instruction save receipts
Completion feedback forbids guessing routes when no href was returned, and
the instruction tools returned none, so chat replies after an instruction
edit could not link the edited agent. Save and restore receipts now carry a
resourceLinks entry with the agent's real profile href and state that runs
starting after the save use the new instructions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 20:49:56 -06:00
Dotta 4b367425e6 fix(server): document the company export request body in the API catalog
POST /exports and /exports/preview registered no request body, so agents that
discover operations through the API catalog sent none. The defaults export
only the company and agents, and an agent then told a user that the company
had no projects or skills to export. Register companyPortabilityExportSchema
and describe the include defaults, as the legacy /export route already does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit e7b5673439)
2026-11-07 20:40:33 -06:00
DottaandClaude Opus 5.5 43b71c5cb7 test(chat): grade company export by package provenance and the named omitted credential
The export-company oracle could never pass: an inline import preview never fills
manifest.source, the product exports secret_ref inputs as valueless optional
inputs by design, and the reply was matched against keyword regexes. Grade
provenance from the package's own COMPANY.md company entry, foreign scope from
manifest agents/projects belonging to the source company, and require the reply
to name the setup-chosen omitted credential (key or secret name).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 20:40:32 -06:00
DottaandClaude Opus 5.5 6cc881bb11 test(evals): pass the candidate launcher's framework-report helpers into the extracted branch
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 19:23:40 -06:00
DottaandClaude Opus 5.5 a7c97538ba fix(evals): keep the private merged report sealable and name refused carriers
A failed private chat cell lists its HTML report's trace viewer program
files (codicon .ttf, playwright-logo .svg, manifest.webmanifest) in its
evidence manifest. The campaign report copied them into
normalized/evidence/<id>/attempt-N/html-report/trace/, where the trusted
generated-report seal refuses those carrier types, so the whole merged
report was lost with "Unsupported packaged evidence carrier".

The report no longer stages a cell file whose type that seal refuses; the
merged report keeps its own authenticated trace viewer and the cell archive
keeps the files. Before sealing, the transfer now names the first refused
carrier with a closed category (font, svg, webmanifest, image, source map,
no extension, other, trace viewer asset or bytes), never its path. The seal
itself, its limits and its scans are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 19:20:46 -06:00
DottaandClaude Opus 5.5 5a53f93b08 fix(evals): drop playwright-output copies the private HTML report already holds
Playwright's HTML reporter copies every attachment, including the failure
trace and video, into html-report/data/<sha1>.<ext>, while the same bytes
stay in playwright-output. Private chat cells seal both into the original
and the packaged trees, so a large failed attempt carried the trace four
times outside the blob report and lost all private evidence once the
bundle crossed the 256 MB allowance.

Before packaging, drop a playwright-output file only when html-report/data
holds an independently verified, byte-identical regular file under its
content-derived name, and record what was dropped in a snapshot receipt.
The HTML report, its trace viewer and the blob report are unchanged.
Framework-JSON cells, which register playwright-output attachments by path,
are left untouched. No trusted transfer file, limit or scan changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 19:20:45 -06:00
DottaandClaude Opus 5.5 d76ff10aaa fix(evals): name runtime-built evidence refusals by their fixed template
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 17:09:38 -06:00
Dotta a37a2e4fd5 test(chat): check run route and issue-run field without source-layout literals
Match the registered run route path and the runsForIssue select block's
runId field instead of a full JSX line and a fixed character window, so
harmless refactors do not break the guidance regression test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit a490180801)
2026-11-07 16:10:08 -06:00
DottaandClaude Opus 5.5 ca973e3b13 fix(native): do not also report a classified model rejection as unclassified
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 16:09:54 -06:00
DottaandClaude Opus 5.5 f04cbfd134 fix(evals): refusal naming never throws; derive module coverage from transfer imports
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 14:45:19 -06:00
DottaandClaude Opus 5.5 c80393e966 fix(evals): name refusals from dispatch authority and chat admission too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 14:32:36 -06:00
Dotta 1892ba16ad fix(skills): keep the overlay promise to Cmd/Ctrl+K and say where operators apply
The sidebar Search item links to the full search page, so it does not keep
the person's place. The palette sends only free text, so operators filter
only after the Search all handoff. Correct both statements and test them
against the sidebar and palette source.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit ff83378b26)
2026-11-07 14:32:03 -06:00
Dotta 05193427cb fix(chat): use runId from issue run listings in run link guidance
GET /api/issues/{id}/runs returns the run ID as runId, not id. Name the
field each response returns so chat can build the run link, and pin the
listing's field name in the regression test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 123d7fb940)
2026-11-07 14:31:42 -06:00
DottaandClaude Opus 5.5 63613c80dc fix(evals): name why a private evidence transfer refused, without its text
The trusted transfer printed one fixed line for every refusal, so a refused
attempt kept no evidence and no reason. Report a closed refusal code: a slug of a
fixed literal message from the trusted evidence modules, a Node error code, an
error type, or 'dynamic'. Message text is never printed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 14:26:58 -06:00
DottaandClaude Opus 5.5 8cc11b7593 test(evals): identify an opened agent profile by its header portrait
Since #19535 the agent profile h1 is the editable title ("Frontend
engineer"), and the name is secondary text. The runtime result check
waited for a heading named "Morgan" and failed on the correct page in
run 42406653921. Identify the profile by the header portrait, which
the page labels "<name> avatar".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 14:12:16 -06:00
DottaandClaude Opus 5.5 741ca2e94c test(evals): grade resume-agent from saved state and attribution, not reply phrases
The resume-agent grader required phrase lists in both replies. A valid
reply such as "Morgan hasn't started the work yet" failed the
no-invented-execution regex. Grade the first resume by its attribution to
the first request's own run, keep the no-worker-run check, and require
a bound reply for each phase.

Add no-agent-budget-override: in run 42404423330 the CEO lifted the
board's budget hard stop through PATCH /api/agents/{id} after the budget
route refused it. That outcome must fail even when the reply explains it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 14:12:16 -06:00
Dotta ba4ac2d81a fix(chat): link the profile of an agent chat acted on
Chat guidance defined only the task-link template. Asked to resume an
agent, the chat agent resumed it and reported the result but never
linked the agent, leaving the person no direct route to check its
saved availability.

Tell chat to link an affected agent's profile at
/<prefix>/agents/<urlKey or id>, and keep that link distinct from an
agent:// mention, which notifies the agent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 5324cfc4df)
2026-11-07 14:12:16 -06:00
DottaandClaude Opus 5.5 d1954bbbe9 test: give the budget-authority unit a DB that accepts work hints
Configuration preparation on current master publishes passive work
hints through db.execute, so the empty object mock from #17857 throws
before the budget assertions run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 14:12:16 -06:00
Dotta ab0116963b fix: keep provisioning run attribution in supported activity audit
Co-Authored-By: Paperclip <noreply@paperclip.ing>
(cherry picked from commit b6cd49d4b6)
2026-11-07 14:12:16 -06:00
Dotta 2819586b5b fix: retain approving budget authority and guard built-in provisioning
Co-Authored-By: Paperclip <noreply@paperclip.ing>
(cherry picked from commit e5682d22fa)
2026-11-07 14:12:16 -06:00
Dotta 7a36d50497 fix: save initial hire budgets within lifecycle transaction
Co-Authored-By: Paperclip <noreply@paperclip.ing>
(cherry picked from commit 8c06aba41c)
2026-11-07 14:12:16 -06:00
Dotta 0113b10ce5 fix: require board authority for agent budget policies
Co-Authored-By: Paperclip <noreply@paperclip.ing>
(cherry picked from commit f970f6b01f)
2026-11-07 14:12:15 -06:00