Skill: novalystrix/nova-accountability (version 2.0.0)

--- name: accountability description: Manage accountability items on a Monday.com board. Use when creating new accountability items, checking on existing ones, running work sessions, or when a cron job fires. Also use when the owner says "you're accountable for X" or asks about accountability status. config: board_id: type: string required: true description: Monday.com board ID (found in the board URL) api_token_env: type: string default: MONDAY_API_TOKEN description: Name of the environment variable holding the Monday.com API token owner_name: type: string default: Owner description: Human name for the owner/manager (used in completion rules and messaging) agent_name: type: string default: Agent description: Name of the AI agent running this skill columns: type: object description: Monday.com column IDs for this board properties: status: type: string default: color_mm0yr4nm check_frequency: type: string default: text_mm0y6b8r last_checked: type: string default: date_mm0y8p9j details: type: string default: long_text_mm0yce5e assigned_by: type: string default: color_mm10z99x assigned_by_labels: type: object properties: owner: type: string default: Owner agent: type: string default: Agent messaging_hours: type: object properties: start: type: string default: "08:00" end: type: string default: "22:00" timezone: type: string default: UTC --- # Accountability Skill ## Configuration This skill is config-driven. All board IDs, column IDs, and names come from plugin config (see frontmatter above). For this installation: - **Board ID**: `{{config.board_id}}` - **Owner Name**: `{{config.owner_name}}` - **Agent Name**: `{{config.agent_name}}` ### Column IDs | Column | Config Key | Default ID | Type | Purpose | |--------|------------|------------|------|---------| | Status | `columns.status` | `color_mm0yr4nm` | status | Active / Done / Blocked | | Check Frequency | `columns.check_frequency` | `text_mm0y6b8r` | text | How often to check: 1h, 2h, 4h, 8h, daily | | Last Checked | `columns.last_checked` | `date_mm0y8p9j` | date | When agent last reviewed this item | | Details | `columns.details` | `long_text_mm0yce5e` | long_text | Full definition of done, context, blockers | | Assigned By | `columns.assigned_by` | `color_mm10z99x` | status | Who created/assigned this task | ## Completion Rules - **Owner-assigned tasks** (`{{config.assigned_by_labels.owner}}`): Only `{{config.owner_name}}` can mark them Done. Agent may suggest completion but must NOT change status to Done. - **Agent-assigned tasks** (`{{config.assigned_by_labels.agent}}`): Agent can mark them Done independently. - Always check "Assigned By" before changing any status to Done. ## API Setup - Token env var: `{{config.api_token_env}}` in `~/.openclaw/.env` - Endpoint: `https://api.monday.com/v2` (GraphQL) - Auth header: `Authorization: <token>` --- ## Hourly Work Session (Cron-Triggered) This is the core loop. Every hour, a cron job fires and the agent runs a **real work session** — not just a status check. ### Phase 1: Review & Plan 1. **Read all active items** from the Monday board (including sub-items) 2. **Assess each item**: What's the current state? What changed since last check? What's blocking progress? 3. **Pick what to work on** — prioritize items that are unblocked and can make real progress 4. **Break work into subtasks** — create sub-items under the main accountability item on Monday 5. **Write the plan in the Doc column** of the sub-item: what you're about to do, approach, expected outcome ### Phase 2: Do the Work 6. **Execute the plan**: - For **code work**: Follow the product-dev process — Cursor Agent writes code, test, iterate. Never code directly. - For **non-code work**: Do it directly (config changes, research, outreach, etc.) 7. **Write an update** on the main accountability item in Monday (Updates section) with what was done and results ### Phase 3: Handle Being Stuck If stuck, blocked, or unsure what to do next: 8. **Reassess the whole project fresh** — don't keep banging on the same approach 9. **If it's code**: Read ALL of it. Understand the goal. Reflect on everything as if seeing it for the first time. 10. **Create new tasks** as needed (sub-items on Monday) 11. **Orchestrate others**: - **Sub-agents**: Spawn Cursor Agent or other coding agents for implementation - **People**: Message anyone who can help — `{{config.owner_name}}` or others. Don't limit yourself. If someone else has the context or ability to unblock you, reach out to them directly. 12. **If you genuinely need the owner**: Message them with specific context — what you tried, what failed, what you need from them ### Phase 4: Wrap Up 13. **Update "Last Checked"** date on all reviewed items 14. **Update statuses**: Move items to Blocked/Stuck if appropriate 15. **For owner-assigned items that look complete**: Write an update suggesting it's done, but do NOT change status to Done — only `{{config.owner_name}}` can do that --- ## Workflow: Creating New Accountability Items 1. Create item on board `{{config.board_id}}` with `create_item` mutation 2. Set Details column with: goal, definition of done, current state 3. Set Check Frequency (e.g. "1h") 4. Set Assigned By: `{{config.assigned_by_labels.owner}}` or `{{config.assigned_by_labels.agent}}` depending on who initiated it 5. Write first update with current status 6. The hourly work session cron handles all items — no need for per-item crons ## Workflow: Daily Summary Every day at 9:00 AM, review all active items and write a consolidated update to `{{config.owner_name}}`. --- ## Monday.com Sub-Items Sub-items are used as subtasks under each accountability item. They represent specific work units. ### Create sub-item ```graphql mutation { create_subitem(parent_item_id: PARENT_ID, item_name: "SUBTASK_NAME") { id } } ``` ### Read sub-items ```graphql { items(ids: [PARENT_ID]) { subitems { id name column_values { id text value } } } } ``` --- ## GraphQL Snippets Replace `BOARD_ID` with `{{config.board_id}}` and column IDs with values from config. ### Read all active items (with sub-items) ```graphql { boards(ids: BOARD_ID) { items_page(limit: 50) { items { id name column_values { id text value } updates(limit: 3) { body created_at } subitems { id name column_values { id text value } } } } } } ``` ### Create item ```graphql mutation { create_item(board_id: BOARD_ID, item_name: "TITLE", column_values: "{\"DETAILS_COL\":{\"text\":\"DETAILS\"},\"FREQ_COL\":\"FREQ\",\"ASSIGNED_COL\":{\"label\":\"OWNER_LABEL\"}}") { id } } ``` ### Write update ```graphql mutation { create_update(item_id: ITEM_ID, body: "<p>UPDATE_HTML</p>") { id } } ``` ### Update Last Checked ```graphql mutation { change_column_value(board_id: BOARD_ID, item_id: ITEM_ID, column_id: "LAST_CHECKED_COL", value: "{\"date\":\"YYYY-MM-DD\"}") { id } } ``` ### Change Status Status labels: Working on it (1/orange), Done (2/green), Stuck (0/red) ```graphql mutation { change_column_value(board_id: BOARD_ID, item_id: ITEM_ID, column_id: "STATUS_COL", value: "{\"label\":\"Working on it\"}") { id } } ``` ## Helper Script Run `scripts/monday-api.sh` for common operations: ```bash export MONDAY_API_TOKEN="your_token" export MONDAY_BOARD_ID="your_board_id" # List items bash scripts/monday-api.sh list # Add update to item bash scripts/monday-api.sh update <item_id> "<html body>" # Set last checked bash scripts/monday-api.sh checked <item_id> ``` --- ## Messaging Etiquette - **Never message people outside `{{config.messaging_hours.start}}` – `{{config.messaging_hours.end}}`** (`{{config.messaging_hours.timezone}}`) unless it's genuinely urgent - If you need someone's input and it's outside hours, note it as a blocker and follow up when hours resume - `{{config.owner_name}}` can be messaged anytime if something is truly urgent ## Critical: Read Before Working **Before doing ANY work on an accountability item, you MUST read the full Document/Details column on that item first.** This contains important context, constraints, and explicit instructions about what to do and what NOT to do. Skipping this step has caused the agent to undo previous decisions. No exceptions. ## Sub-Agent Context Rule **When spawning any sub-agent for work on an accountability item, you MUST include the full text from the item's Details/Doc column in the sub-agent's task prompt.** This includes constraints, warnings, history, and explicit "DO NOT" instructions. The sub-agent has no memory of previous sessions — if it doesn't get the context in its prompt, it will make decisions that contradict prior decisions.

path: README.md
content: # Accountability Skill

Track and drive real work sessions on a Monday.com board. An AI agent reads all active items hourly, assesses state, picks tasks, executes work (or delegates), and writes updates — not just status pings.

## What It Does

Every hour (or at your configured frequency), the agent:
1. Reads all active items + sub-items from your Monday board
2. Assesses each item: state, blockers, what changed
3. Picks the most actionable item and breaks it into sub-tasks
4. Executes: writes code via Cursor Agent, makes config changes, sends messages
5. Writes updates back to Monday with results
6. Updates "Last Checked" on all items

## Installation

```bash
clawhub install accountability
```

## Configuration

Add to your `openclaw.json` config (or `.openclaw/.env`):

```json
{
  "skills": {
    "accountability": {
      "board_id": "YOUR_MONDAY_BOARD_ID",
      "api_token_env": "MONDAY_API_TOKEN",
      "owner_name": "Roy",
      "agent_name": "Nova",
      "columns": {
        "status": "color_mm0yr4nm",
        "check_frequency": "text_mm0y6b8r",
        "last_checked": "date_mm0y8p9j",
        "details": "long_text_mm0yce5e",
        "assigned_by": "color_mm10z99x"
      },
      "assigned_by_labels": {
        "owner": "Roy",
        "agent": "Nova"
      },
      "messaging_hours": {
        "start": "08:00",
        "end": "22:00",
        "timezone": "Asia/Jerusalem"
      }
    }
  }
}
```

### Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `MONDAY_API_TOKEN` | ✅ | Your Monday.com API v2 token |
| `MONDAY_BOARD_ID` | ✅ | Board ID to operate on (overrides config) |
| `MONDAY_COL_STATUS` | optional | Status column ID (default from config) |
| `MONDAY_COL_LAST_CHECKED` | optional | Last-checked column ID (default from config) |

### Getting Your Board ID

Open your board in Monday.com. The URL will look like:
`https://yourworkspace.monday.com/boards/1234567890`

The number at the end is your Board ID.

### Getting Your API Token

1. Go to `https://yourworkspace.monday.com/apps/manage/tokens`
2. Create a new token with `boards:read` and `boards:write` scopes

## Board Setup

The skill expects these columns on your Monday board:

| Column | Type | Purpose |
|--------|------|---------|
| Status | Status | Active / Done / Blocked / Working on it |
| Check Frequency | Text | How often to check: 1h, 2h, 4h, 8h, daily |
| Last Checked | Date | When the agent last reviewed this item |
| Details | Long Text | Goal, definition of done, context, blockers |
| Assigned By | Status | Who owns this: owner or agent |

### Auto-Setup (Coming Soon)

A future version will auto-create the board and columns if they don't exist. For now, create them manually and configure the column IDs in your config.

## Completion Rules

- **Owner-assigned tasks**: Only the owner can mark them Done. The agent writes "suggesting completion" updates but does NOT change status.
- **Agent-assigned tasks**: The agent can mark them Done independently.

## Cron Setup

The skill is designed to run on a schedule. Recommended: every 1 hour.

```json
{
  "cron": {
    "schedule": { "kind": "every", "everyMs": 3600000 },
    "payload": { "kind": "systemEvent", "text": "Hourly accountability work session. Read the accountability skill and follow the Hourly Work Session process exactly." }
  }
}
```

## Helper Script

The skill includes `scripts/monday-api.sh` for common operations:

```bash
# Set required env vars
export MONDAY_API_TOKEN="your_token"
export MONDAY_BOARD_ID="your_board_id"

# List all items
bash scripts/monday-api.sh list

# Add update to item
bash scripts/monday-api.sh update 1234567 "<p>Update text</p>"

# Set last checked to today
bash scripts/monday-api.sh checked 1234567

# Change status
bash scripts/monday-api.sh status 1234567 "Done"
```

## Design Principles

- **Real work, not status theater** — the agent should execute, not just report
- **Stuck = reassess** — if blocked, don't keep trying the same thing; step back and rethink
- **Delegate when blocked** — spawn sub-agents for code, message people who can unblock
- **Respect hours** — don't message people outside configured hours (unless urgent)
- **Owner controls completion** — agent never marks owner tasks as Done unilaterally


path: scripts/monday-api.sh
content: #!/bin/bash
# Monday.com API helper for Accountability board
# Reads config from environment variables. Set these:
#   MONDAY_API_TOKEN  — your Monday.com API v2 token
#   MONDAY_BOARD_ID   — the board ID to operate on
#   MONDAY_COL_LAST_CHECKED — column ID for last-checked date (default: date_mm0y8p9j)
#   MONDAY_COL_STATUS       — column ID for status (default: color_mm0yr4nm)
set -euo pipefail

# Read token from env, then fallback to .env file
[REDACTED_SECRET] MONDAY_API_TOKEN ~/.openclaw/.env 2>/dev/null | cut -d= -f2 || echo '')}"
BOARD="${MONDAY_BOARD_ID:-}"
COL_LAST_CHECKED="${MONDAY_COL_LAST_CHECKED:-date_mm0y8p9j}"
COL_STATUS="${MONDAY_COL_STATUS:-color_mm0yr4nm}"
API="https://api.monday.com/v2"

if [ -z "$TOKEN" ]; then
  echo "Error: MONDAY_API_TOKEN not set and not found in ~/.openclaw/.env" >&2
  exit 1
fi

if [ -z "$BOARD" ]; then
  echo "Error: MONDAY_BOARD_ID not set. Pass it as env var or set it in your shell." >&2
  exit 1
fi

query() {
  curl -s -X POST "$API" \
    -H "Content-Type: application/json" \
    -H "Authorization: $TOKEN" \
    -d "{\"query\": \"$1\"}"
}

case "${1:-help}" in
  list)
    query "{ boards(ids: $BOARD) { items_page(limit: 50) { items { id name column_values { id text value } updates(limit: 3) { body created_at } } } } }" | jq .
    ;;
  update)
    ITEM_ID="$2"
    BODY="$3"
    query "mutation { create_update(item_id: $ITEM_ID, body: \"$BODY\") { id } }" | jq .
    ;;
  checked)
    ITEM_ID="$2"
    DATE=$(date +%Y-%m-%d)
    query "mutation { change_column_value(board_id: $BOARD, item_id: $ITEM_ID, column_id: \\\"$COL_LAST_CHECKED\\\", value: \\\"{\\\\\\\"date\\\\\\\":\\\\\\\"$DATE\\\\\\\"}\\\") { id } }" | jq .
    ;;
  status)
    ITEM_ID="$2"
    LABEL="$3"
    query "mutation { change_column_value(board_id: $BOARD, item_id: $ITEM_ID, column_id: \\\"$COL_STATUS\\\", value: \\\"{\\\\\\\"label\\\\\\\":\\\\\\\"$LABEL\\\\\\\"}\\\") { id } }" | jq .
    ;;
  *)
    echo "Usage: $0 {list|update <id> <html>|checked <id>|status <id> <label>}"
    echo ""
    echo "Environment variables:"
    echo "  MONDAY_API_TOKEN        (required) Monday.com API token"
    echo "  MONDAY_BOARD_ID         (required) Board ID"
    echo "  MONDAY_COL_LAST_CHECKED (optional) Last-checked column ID (default: date_mm0y8p9j)"
    echo "  MONDAY_COL_STATUS       (optional) Status column ID (default: color_mm0yr4nm)"
    ;;
esac


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)