Daily briefing panel
An owner-approved reminder and a card that reads current weather on demand.
Documentation revision 1 · Contract reference API 54 · Installed readiness unknown
Preview offline card · Complete HTML interaction body · Machine-readable recipe
What runs where
- Approved daily schedule → local reminder → owner opens the card → explicit weather refresh → panel renders source timestamps.
- An approved schedule runs without the controller while the listener is active. Android doze can delay it. Weather needs internet.
Controller integration
- Generate the briefing card, post the manifest, wait for owner approval, and verify next run/status.
- Maintain one schedule manifest per agent; merge with the existing submitted manifest rather than overwriting unrelated actions.
Only explicit decision-model/weather requests leave the phone; direct or relay transport still requires a running reachable phone.
Boundaries
- The local schedule cannot template arbitrary API responses into rich HTML. A fresh multi-source digest needs controller code to gather, summarize and publish a new card.
- This complete starter is a reminder plus on-demand weather panel. Calendar/mail aggregation is an optional separately authorized integration.
Lifecycle
start
Inspect existing /v1/schedule/manifest, merge actions, submit start_request, wait for owner approval; GET /v1/schedule must show active. Post generated card separately.
update
Resubmit merged replacement manifest; new content requires approval. GET status confirms which digest is active.
pause
POST /v1/schedule/pause {"paused":true}; affects this agent’s entire manifest, not just the reminder. Resume with false.
stop
Remove only the reminder from a replacement manifest if other actions exist. DELETE /v1/schedule only if this agent has a dedicated recipe manifest. Cancel the card separately; keep_assets=true preserves saved files.
Failures and costs
- awaiting_owner is not running: inspect /v1/schedule until active.
- Weather stale=true or expired expires_at: show stale status, not fresh conditions; upstream_failed retains no invented forecast.
- No decision-model call in this starter. MET Norway weather is an external service and returns attribution.
Complete synthetic contract examples
These fixtures demonstrate contracts. They are not observations from a phone. Replace image/resource IDs with returned authorized IDs. Load request.json as the complete body of POST /v1/interactions; it contains the full offline HTML.
Start request (wait for owner approval)
{
"method": "POST",
"path": "/v1/schedule",
"body": {
"manifest": {
"timezone": "Europe/Warsaw",
"actions": [
{
"id": "briefing-reminder",
"when": {
"daily": [
"08:00"
],
"count": 7
},
"do": {
"call": "POST /v1/interactions",
"body": {
"kind": "notice",
"title": "Daily briefing",
"text": "Your briefing is ready to refresh. Open the briefing card.",
"no_takeover": true
}
}
}
]
}
}
}
pause
{
"id": "pause",
"request": {
"method": "POST",
"path": "/v1/schedule/pause",
"body": {
"paused": true
}
},
"response": {
"status": 200,
"body": {
"paused": true
}
},
"evidence": "Synthetic contract fixture, not a device observation."
}
resume
{
"id": "resume",
"request": {
"method": "POST",
"path": "/v1/schedule/pause",
"body": {
"paused": false
}
},
"response": {
"status": 200,
"body": {
"paused": false
}
},
"evidence": "Synthetic contract fixture, not a device observation."
}
stop
{
"id": "stop",
"request": {
"method": "DELETE",
"path": "/v1/schedule",
"query": {
"keep_assets": true
}
},
"response": {
"status": 200,
"body": {
"removed": true
}
},
"evidence": "Synthetic contract fixture, not a device observation."
}
Extensions
- Controller can combine authorized calendar and task data, with a separate timestamp per source.
- Send a new card and cancel the old one after replacing; do not open unlimited pending questions.
Source evidence
- app/src/main/java/cc/bridgit/app/api/Endpoints.kt
- app/src/main/java/cc/bridgit/app/interact/CardRules.kt
- app/src/main/java/cc/bridgit/app/interact/CardActions.kt
- app/src/main/java/cc/bridgit/app/schedule/ScheduleModule.kt
- app/src/main/java/cc/bridgit/app/schedule/ScheduleRules.kt
- app/src/main/java/cc/bridgit/app/weather/WeatherModule.kt