From 66c4fd1b88948a8e938ec752519b29dd7d28f8c8 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Mon, 10 Aug 2026 08:33:40 -0400 Subject: [PATCH] =?UTF-8?q?fix(sync):=20process-skill=20triggers=20invoke?= =?UTF-8?q?=20by=20name=20only=20=E2=80=94=20resemblance=20offers,=20never?= =?UTF-8?q?=20substitutes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Scribe issue #2582: the sync wrote "Use when {title}-type work is requested" into every generated process skill, so a bespoke live prompt that merely resembled a stored Process got the Process's canned procedure — and inherited approvals embedded in its body (the Drift Audit's fan-out opt-in) that the conversation never granted. Observed live: an explicit systems-review request with its own constraints was answered with the Drift Audit clarify menu recommending ~15 parallel auditors. New trigger contract, both variants: follow verbatim only when invoked by name; on mere resemblance the live instructions govern — offer the process, ask before following, and never inherit embedded approvals the operator hasn't granted in this conversation. (The Drift Audit process record itself was also rewritten to a sequential in-context walk — data change, live already, recorded in the same issue.) Co-Authored-By: Claude Fable 5 --- src/scribe/services/plugin_context.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/scribe/services/plugin_context.py b/src/scribe/services/plugin_context.py index 64b08e4..c8a7859 100644 --- a/src/scribe/services/plugin_context.py +++ b/src/scribe/services/plugin_context.py @@ -223,17 +223,23 @@ async def build_process_manifest(user_id: int) -> dict: f'A shared Scribe process "{title}", authored by {owner} — NOT the' f" operator's own." + (f" {preview}" if preview else "") - + f' Use when {title}-type work is requested, or when asked to run' - f' the "{title}" process — but summarise it and get the operator\'s' - f" go-ahead before following it, since it reflects {owner}'s" - f" judgement rather than theirs." + + f' Use only when the operator asks to run the "{title}" process' + f" by name — and even then summarise it and get their go-ahead" + f" first, since it reflects {owner}'s judgement rather than" + f" theirs. If a request merely resembles this process, the live" + f" instructions govern: offer it by name, don't follow it." ) else: description = ( f'Run the operator\'s saved Scribe process "{title}".' + (f" {preview}" if preview else "") - + f' Use when {title}-type work is requested, or when asked to run' - f' the "{title}" process.' + + f' Use when the operator asks to run the "{title}" process by' + f" name. If a request merely RESEMBLES this process, the live" + f" instructions govern — offer the process by name and ask" + f" before following it; never substitute it for explicit" + f" instructions, and never inherit approvals embedded in it" + f" (e.g. a fan-out opt-in) the operator hasn't granted in this" + f" conversation." ) entry = { "id": it["id"], "name": title, "slug": slug,