Conversation
Nine skills documented the research-log write as a bare patch op,
`{ appendResearchLog: { summary } }`, which reads as the tool's argument
shape. Sent that way it is silently dropped: unknown top-level keys are
stripped, so a call carrying a valid updates[] alongside them reports
success while that write is discarded. Sent alone it fails validation
instead, which is at least loud.
seo-project-setup is left alone — its op list already sits under
`update_project_context(projectId, updates)`, so the wrapper is implied
there.
|
The root cause here isn't really the skill wording — it's that unknown top-level keys are stripped silently. Every tool registers through const normalized = objectSchema(tool.config.inputSchema);
inputSchema: normalized instanceof z.ZodObject ? normalized.strict() : normalized,(Outputs would stay permissive, per the existing comment there.) That would turn this class of silent write-loss into a validation error across every tool, not just the ones documented here. I didn't do it in this PR because it changes behavior for every client — anything currently sending a stray field starts getting a hard error instead of a quiet success, and you're better placed than I am to know whether that's true of any client in the wild. Happy to open it as a separate PR if you want it, either instead of or alongside this one. |
13e903a to
ec3d8ce
Compare
Nine skills document the research-log write as a bare patch op:
Read as the tool's argument shape — which is how it reads without the surrounding call — that produces a silent data loss.
update_project_contexttakes{ projectId, updates }, and unknown top-level keys are stripped before the handler sees them. So an agent that sendsappendResearchLogoraddKeyPagesat the top level alongside a validupdates[]getsUpdated project context (1 change(s))while that write is discarded.Verified against a running instance:
updates[]→Input validation error: updates: Invalid input: expected array, received undefined. Loud, fine.updates[]plus a top-leveladdKeyPages→ success, key page silently dropped.The examples now show
{ updates: [{ appendResearchLog: { summary: "..." } }] }.seo-project-setupis deliberately untouched: its op list already sits underupdate_project_context(projectId, updates), so the wrapper is implied there.Found when an agent running
seo-auditreported its research-log and key-page writes as successful and neither appeared.Docs-only change — no behavior change.
sync-plugin-skillsre-run, idempotent, so theplugins/openseo/skillscheck stays green.