Repository navigation
ADR-0051: a connector principal runs the scheduled prompts its server declares - #1641
mgoldsborough wants to merge 5 commits into
Conversation
QA Review: scheduled-prompts-adrScope: 1 file, +192/−0 (docs only) · worktree: detached at the head (the branch is checked out in its work folder) · reviewed: Necessity holds. Two pains are named, and the one alternative that avoids a new actor (the installer owns the tasks) is rejected for a reason ADR-0007 already establishes. Both Criticals below are in the reconcile rules, the part an implementer will copy literally. Critical (must fix)
Fix in-PR (apply mechanically — no adjudication essay expected)
Suggestions (optional)
What Looks Good
Body claims
machine record{
"kind": "review", "pr": 1641, "round": 1,
"reviewed": "ab7acc5e9f5580c4e7b2aaf7dd0f2a8c188367d2", "delta_base": null,
"risk": "MEDIUM", "stop_gate": "n/a",
"verdict": "Sound reach model; the reconcile rules lack a re-enable transition and do not handle prompt-argument changes.",
"findings": [
{"id": "r1c1", "bucket": "critical", "file": "adr/0048-a-connector-principal-runs-the-scheduled-prompts-its-server-declares.md", "line": 112,
"claim": "Reconcile-disabled tasks have no re-enable path (reinstall, restored prompt) and are indistinguishable from an admin pause; disable-on-uninstall also defeats the ADR-0007 self-heal the door check at :73 cites.",
"evidence": "reasoned", "receipt": "read :66-128; reconcile rules are create/narrow/disable only; ADR-0007 skip exists so runs self-heal",
"preconditions": "uninstall->reinstall or withdraw->restore -> existing disabled task -> no rule applies -> never runs",
"fix": "reconcile-owned disable reason separate from override + inverse re-enable rule; or drop disable-on-uninstall and rely on the door skip", "scope": "core"},
{"id": "r1c2", "bucket": "critical", "file": "adr/0048-a-connector-principal-runs-the-scheduled-prompts-its-server-declares.md", "line": 119,
"claim": "Prompt-argument changes are unaddressed; a new required argument yields -32602 at run time, which :119 treats as withdrawn and disables.",
"evidence": "reasoned", "receipt": "MCP prompts error table: invalid name and missing required arguments both -32602; widening list :93-95 omits arguments",
"preconditions": "release adds required argument -> approved values lack it -> prompts/get -32602 -> disabled",
"fix": "compare the argument set at reconcile (new required arg = approval); decide withdrawal from prompts/list only", "scope": "core"},
{"id": "r1f1", "bucket": "fix-in-pr", "file": "adr/0048-a-connector-principal-runs-the-scheduled-prompts-its-server-declares.md", "line": 98,
"claim": "Behaviour of a task while a need is unbound is unstated.", "evidence": "reasoned", "receipt": null, "preconditions": null, "fix": "one sentence: pause or run without", "scope": "core"},
{"id": "r1f2", "bucket": "fix-in-pr", "file": "adr/0048-a-connector-principal-runs-the-scheduled-prompts-its-server-declares.md", "line": 151,
"claim": "Consequence presents a workspace-vs-person tool property as new; identity-sources.ts, the ADR-0043 mark and app-only visibility already carry it.",
"evidence": "reasoned", "receipt": "read src/tools/identity-sources.ts header and adr/0043", "preconditions": null, "fix": "name existing carriers, state only what is new", "scope": "peripheral"},
{"id": "r1f3", "bucket": "fix-in-pr", "file": "adr/0048-a-connector-principal-runs-the-scheduled-prompts-its-server-declares.md", "line": 76,
"claim": "Line is 124 columns; rest of file wraps at 80.", "evidence": "reproduced", "receipt": "awk length>82 -> only line 76 (124)", "preconditions": null, "fix": "rewrap", "scope": "peripheral"},
{"id": "r1f4", "bucket": "fix-in-pr", "file": "PR body", "line": 0,
"claim": "Body says the marker carries `requires` for other tools; the ADR now uses `needs` in words.", "evidence": "reproduced", "receipt": "gh pr view body vs ADR :49-64", "preconditions": null, "fix": "refresh the body", "scope": "peripheral"},
{"id": "r1s1", "bucket": "suggestion", "file": "adr/0048-a-connector-principal-runs-the-scheduled-prompts-its-server-declares.md", "line": 113,
"claim": "Reconcile key uses server name while the principal is per install.", "evidence": "reasoned", "receipt": null, "preconditions": null, "fix": "key by install", "scope": "peripheral"},
{"id": "r1s2", "bucket": "suggestion", "file": "adr/0048-a-connector-principal-runs-the-scheduled-prompts-its-server-declares.md", "line": 92,
"claim": "Mixed narrow+widen declarations unspecified.", "evidence": "reasoned", "receipt": null, "preconditions": null, "fix": "whole declaration waits", "scope": "peripheral"},
{"id": "r1s3", "bucket": "suggestion", "file": "adr/0048-a-connector-principal-runs-the-scheduled-prompts-its-server-declares.md", "line": 43,
"claim": "Marker's ADR-0024 kind is unstated.", "evidence": "reasoned", "receipt": null, "preconditions": null, "fix": "state it widens nothing until approved", "scope": "peripheral"}
]
}Next: answer with pr-adjudicate. |
Adjudication round 1: both Criticals valid, fixed with one runtime-owned hold · fixed at 097d585Declined: r1s1 (keying reconcile by the install). The name key stays; a server rename is not a case this ADR has to carry. r1c1 · valid
r1c2 · valid
Fix in-PRr1f1–r1f4 applied, 097d585. r1f1: a need the admin leaves unbound is a decision, and the run goes without that reach. A need unbound by an uninstall holds the task until the admin answers. r1f4: the body already said VerificationCI: deferred (draft; docs only) · local: machine record{
"kind": "adjudication", "pr": 1641, "round": 1, "fixed_at": "097d585a",
"verdicts": [
{"id": "r1c1", "verdict": "valid", "premise": "verified",
"resolution": "no disable on uninstall (door skip); withdrawal holds the task with a runtime-owned reason apart from an admin pause; reconcile lifts its own hold when the cause clears; 097d585a"},
{"id": "r1c2", "verdict": "valid", "premise": "verified",
"resolution": "withdrawal decided from prompts/list at reconcile only; a run-time -32602 is a failed run; a new required argument holds until the admin gives a value; a removed argument narrows; 097d585a"},
{"id": "r1f1", "verdict": "valid", "premise": "verified", "resolution": "applied, 097d585a"},
{"id": "r1f2", "verdict": "valid", "premise": "verified", "resolution": "applied, 097d585a"},
{"id": "r1f3", "verdict": "valid", "premise": "verified", "resolution": "applied, 097d585a"},
{"id": "r1f4", "verdict": "valid", "premise": "verified", "resolution": "body refreshed"},
{"id": "r1s1", "verdict": "valid", "premise": "accepted", "resolution": "declined"},
{"id": "r1s2", "verdict": "valid", "premise": "accepted", "resolution": "taken, 097d585a"},
{"id": "r1s3", "verdict": "valid", "premise": "accepted", "resolution": "taken, 097d585a"}
],
"ci": "deferred",
"local": "awk length>80 clean; grep for disable/requires/-32602 rules: none; deletion side read"
} |
What: ADR-0051 (Proposed), docs only.
_meta["ai.nimblebrain/scheduled-prompts"], carrying a schedule, the server's own tools, limits, a budget, and itsneedsin words. A declaration never names another server.prompts/getat each run, so the procedure updates with the server. Widened bounds wait for approval.list_changedand on boot, and never deletes a task. It holds a task whose prompt was withdrawn or that waits on an admin, and it lifts its own hold when the cause clears. An uninstalled connector's runs are skipped at the door. Admin overrides survive a reconcile, and a delete suppresses the task.Why: a server's standing work otherwise runs as whichever member set it up by hand, and it drifts from the server's releases.
Test: docs only.