From d326928a3b6087cd95fbbad1e555278b5c1b5022 Mon Sep 17 00:00:00 2001 From: Enrico Piovesan Date: Mon, 10 Aug 2026 01:05:59 -0600 Subject: [PATCH] Publish core.generate-nudge-message 1.1.0 --- .../1.1.0/contract.json | 286 ++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 capabilities/core/core.generate-nudge-message/1.1.0/contract.json diff --git a/capabilities/core/core.generate-nudge-message/1.1.0/contract.json b/capabilities/core/core.generate-nudge-message/1.1.0/contract.json new file mode 100644 index 0000000..5d47be6 --- /dev/null +++ b/capabilities/core/core.generate-nudge-message/1.1.0/contract.json @@ -0,0 +1,286 @@ +{ + "kind": "capability_contract", + "schema_version": "1.0.0", + "id": "core.generate-nudge-message", + "namespace": "core", + "name": "generate-nudge-message", + "version": "1.1.0", + "lifecycle": "active", + "owner": { + "team": "loop", + "contact": "founders@loop.dev" + }, + "summary": "Generates a short, human, context-aware nudge message for an action item at a given intensity.", + "description": "Pure message generation. Takes item details + intensity + tone configuration and returns a ready-to-send message body plus subject/preview. No delivery occurs inside the capability.\n\nImplemented and smoke-tested matrix (use_cases):\n- soft + friendly tone reminder\n- escalate + direct tone escalation message\n- direct + neutral tone request\n- config_error when item.title is empty\n\nKnown limitations (intentional in 1.1.0):\n- reason_code invalid_intensity removed from the declared surface; intensity is a schema enum so host validation rejects unknown values before the guest runs\n- Delivery / sending is out of scope; callers must send the returned message", + "use_cases": [ + { + "scenario": "As a follow-up engine, I want a soft reminder that feels helpful rather than nagging, so that owners stay engaged without friction.", + "input_example": { + "item": { + "id": "ai-1", + "title": "Send the revised proposal", + "owner_name": "Ada", + "due_date": "2026-08-09", + "status": "open", + "nudge_count": 0 + }, + "intensity": "soft", + "message_config": { + "version": "1.0", + "tone": "friendly", + "include_due_date": true, + "language": "en" + } + }, + "output_example": { + "message": "Hey Ada \u2014 friendly reminder that \u201cSend the revised proposal\u201d is due tomorrow. Let us know if you need anything!", + "preview": "Reminder: Send the revised proposal", + "reason_code": "ok", + "evaluation_trace": [ + "intensity=soft", + "tone=friendly" + ] + }, + "happy": true, + "persona_ref": "runtime-engineer" + }, + { + "scenario": "As a follow-up engine, I want an escalate-intensity message when an item has been ignored repeatedly, so that neglect gets a clearer ask.", + "input_example": { + "item": { + "id": "ai-9", + "title": "Close security review", + "owner_name": "Bob", + "due_date": "2026-08-01", + "status": "open", + "nudge_count": 3 + }, + "intensity": "escalate", + "message_config": { + "version": "1.0", + "tone": "direct", + "include_due_date": true, + "language": "en" + } + }, + "output_example": { + "message": "Escalation: \"Close security review\" still needs attention from Bob (due 2026-08-01).", + "preview": "Reminder: Close security review", + "reason_code": "ok", + "evaluation_trace": [ + "intensity=escalate", + "tone=direct" + ] + }, + "happy": true, + "persona_ref": "collaboration-product-owner" + }, + { + "scenario": "As a follow-up engine, I want a direct, neutral reminder when soft nudges are insufficient, so that the ask is unambiguous.", + "input_example": { + "item": { + "id": "ai-2", + "title": "Ship docs", + "owner_name": "Ada", + "due_date": "2026-08-12", + "status": "open", + "nudge_count": 1 + }, + "intensity": "direct", + "message_config": { + "version": "1.0", + "tone": "neutral", + "include_due_date": true, + "language": "en" + } + }, + "output_example": { + "message": "Ada: Please complete \"Ship docs\" by 2026-08-12.", + "preview": "Reminder: Ship docs", + "reason_code": "ok", + "evaluation_trace": [ + "intensity=direct", + "tone=neutral" + ] + }, + "happy": true, + "persona_ref": "runtime-engineer" + }, + { + "scenario": "As a follow-up engine, I want a config_error when the item title is missing, so that I can skip generation instead of sending a blank nudge.", + "input_example": { + "item": { + "id": "ai-x", + "title": "", + "owner_name": "Ada", + "due_date": "2026-08-09", + "status": "open", + "nudge_count": 0 + }, + "intensity": "soft", + "message_config": { + "version": "1.0", + "tone": "friendly", + "include_due_date": true, + "language": "en" + } + }, + "output_example": { + "message": "", + "preview": "", + "reason_code": "config_error", + "evaluation_trace": [ + "item.title required" + ] + }, + "happy": false, + "persona_ref": "runtime-engineer" + } + ], + "inputs": { + "schema": { + "type": "object", + "required": [ + "item", + "intensity", + "message_config" + ], + "properties": { + "item": { + "type": "object" + }, + "intensity": { + "type": "string", + "enum": [ + "soft", + "direct", + "escalate" + ] + }, + "message_config": { + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "type": "string" + }, + "tone": { + "type": "string", + "enum": [ + "friendly", + "neutral", + "direct" + ] + }, + "include_due_date": { + "type": "boolean" + }, + "language": { + "type": "string" + } + } + } + } + } + }, + "outputs": { + "schema": { + "type": "object", + "required": [ + "message", + "reason_code" + ], + "properties": { + "message": { + "type": "string" + }, + "preview": { + "type": "string" + }, + "reason_code": { + "type": "string", + "enum": [ + "ok", + "config_error" + ] + }, + "evaluation_trace": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "preconditions": [], + "postconditions": [ + { + "id": "deterministic", + "description": "Identical inputs produce identical outputs" + } + ], + "side_effects": [ + { + "kind": "memory_only", + "description": "Pure generation" + } + ], + "emits": [], + "consumes": [], + "permissions": [ + { + "id": "core.generate-nudge-message" + } + ], + "execution": { + "binary_format": "wasm", + "entrypoint": { + "kind": "wasi-command", + "command": "run" + }, + "preferred_targets": [ + "local", + "edge", + "browser" + ], + "constraints": { + "host_api_access": "none", + "network_access": "forbidden", + "filesystem_access": "none" + } + }, + "policies": [], + "dependencies": [], + "provenance": { + "source": "ai-assisted", + "author": "loop-founders + traverse-capability-author", + "created_at": "2026-08-08T06:00:00Z", + "spec_ref": "core.generate-nudge-message@1.1.0", + "adr_refs": [ + "persona-council-review-2026-08-08" + ], + "exception_refs": [] + }, + "evidence": [ + { + "evidence_id": "core-generate-nudge-message-1.1.0-contract-validation", + "type": "contract_validation", + "status": "passed" + } + ], + "service_type": "stateless", + "permitted_targets": [ + "local", + "edge", + "browser", + "cloud" + ], + "artifact_type": "native", + "artifact": { + "digest": "sha256:13c7612cfe4b5c23d261b392deb1136897242ab9562023abe9ea440197eebfff", + "url": "https://github.com/traverse-framework/registry/releases/download/artifacts/core.generate-nudge-message-1.1.0/core-generate-nudge-message.wasm" + } +}