Best for
- A desk needs operator attention (hands-up, blocked)
- Work is complete and ready for review (done)
- Significant progress worth noting (checkpoint)
github/awesome-copilot/skills/signal-write/SKILL.md
Emit structured agent signals — hands-up, blocked, done, checkpoint, partnership. Signals are written as JSON to .signals/ for dashboard consumption and noted in the journal for persistence.
Decision brief
Emit structured signals from a desk to the operator or other desks.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/github/awesome-copilot --skill "skills/signal-write"Inspect the Agent Skill "signal-write" from https://github.com/github/awesome-copilot/blob/9933dcad5be5caeb288cebcd370eeeb2fc2f1685/skills/signal-write/SKILL.md at commit 9933dcad5be5caeb288cebcd370eeeb2fc2f1685. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
This is the primary output — it's what the dashboard reads. Create desks//.signals/.json:
A desk needs operator attention (hands-up, blocked)
Two desks disagree and can't settle it against external facts. This is the system working — the operator reads where desks disagree, not where they perform confidence.
Two desks disagree and can't settle it against external facts. This is the system working — the operator reads where desks disagree, not where they perform confidence.
A desk can't proceed without input — missing access, ambiguous scope, need a decision only the operator can make.
Permission review
The documentation asks the agent to create, modify, or delete local files.
### 1. Write a JSON signal file to `.signals/`The documentation asks the agent to create, modify, or delete local files.
Write them to the **same** `.signals/` directory:Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 75/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 37,126 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Emit structured signals from a desk to the operator or other desks.
hands-upTwo desks disagree and can't settle it against external facts. This is the system working — the operator reads where desks disagree, not where they perform confidence.
blockedA desk can't proceed without input — missing access, ambiguous scope, need a decision only the operator can make.
doneWork is complete and ready for review. Artifacts are on the bench.
checkpointSignificant progress worth the operator knowing about, but work continues. Not blocked, not done — just a marker.
partnershipUsed by the TA (room coordinator) to report coordination quality. Self-assessment scores reflect coordination, not code accuracy:
.signals/This is the primary output — it's what the dashboard reads.
Create desks/<desk-name>/.signals/<timestamp>.json:
{
"signal_type": "execution",
"subtype": "checkpoint",
"timestamp": "2026-07-19T21:30:00Z",
"run_id": "<optional; set to pair this with an outcome signal>",
"agent_name": "<desk-name>",
"self_assessment": {
"intent": 4,
"confidence": 5,
"accuracy": 4,
"completeness": 3
},
"patterns": {
"what_worked": "description of what went well",
"what_was_hard": "description of challenges",
"skill_gap": "areas for improvement"
},
"escalation": {
"reason": null,
"blocked_on": null,
"recommendation": null
}
}
| Signal | signal_type | subtype |
|---|---|---|
| hands-up | "escalation" | "hands-up" |
| blocked | "escalation" | "blocked" |
| done | "execution" | "done" |
| checkpoint | "execution" | "checkpoint" |
| partnership | "partnership" | "partnership" |
The subtype field preserves the specific signal state for
dashboard consumers. signal_type controls sort priority
(escalation → top).
Note: The signals-dashboard canvas extension reads
subtypewhen present and falls back tosignal_typefor display. If consuming signals in your own tooling, prefersubtypefor the specific state.
Ordering: include a
timestamp(ISO 8601 UTC). The dashboard orders signals by it and falls back to file mtime only when it's absent — a git clone/checkout resets mtimes, so mtime alone is not a dependable clock.
Also append a short marker to the desk's journal for persistence:
## <date> — [signal:<type>] <summary>
- <key details>
The journal note is the trail marker. The JSON file is the machine-readable signal.
The signals-dashboard can pair a desk's self-assessment with an outcome — an independent rating of the realized result — and show the honesty gap (how far the desk's confidence was from the delivered quality). Outcome signals are optional and are usually emitted by a reviewer/evaluator, not the desk itself.
Write them to the same .signals/ directory:
{
"signal_type": "outcome",
"run_id": "<same run_id as the signal it rates>",
"agent_name": "<reviewer name>",
"quality_rating": 4,
"effort_to_merge": "minimal",
"issues_found": ["optional short strings"],
"timestamp": "2026-07-19T22:00:00Z"
}
run_id correlates an outcome with the execution/partnership
signal it rates — set the same run_id on both. If it's absent, the
dashboard falls back to the nearest outcome emitted shortly after the
latest signal.quality_rating (0–5) is the realized quality; the dashboard
compares it to the desk's self-assessed confidence to compute the
honesty gap.effort_to_merge — "minimal", "moderate", or "significant".issues_found — optional array of short strings.