Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
286 changes: 286 additions & 0 deletions capabilities/core/core.generate-nudge-message/1.1.0/contract.json
Original file line number Diff line number Diff line change
@@ -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"
}
}
Loading