project-pulse
Skill0 starsChanged 5 months agoMITView on GitHub
Project-scoped monitoring and telemetry layer for phased delivery. Adds timestamps, structured events, and an event log to project_state.json — enabling dashboards and cross-project visibility without slowing down the agent.
2 other projects use a version of this.
Adopted by
Most recently taken up by
- jerseycheese/agent-skillstheir own version, first seen Nov 1, 2026
- darelleluntao/claude-skillstheir own version, first seen Oct 13, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- jerseycheese/agent-skills★ 4same name
- darelleluntao/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository5 other files it gives its agents.
- idea-expansionSkill
- phase-trackingSkill
- shadcn-ui-migrationSkill
- todo-workflowSkill
- ui-migrationSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
37 rules. About 0 are common, 11 are distinctive, and 26 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈11
Distinctive · estimate
This author's own choices. Worth a look.
26
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 24
Use project-pulse alongside phase-tracking when:
- Very specific: line 32
Do not use project-pulse alone — it reads project_state.json written by phase-tracking.
- Very specific: line 121
When loading an existing v1.0 project_state.json, the agent:
- Very specific: line 126
If yes, writes default values (project_id from repo name, event_log: [], etc.)
- Very specific: line 140
If started_at is missing, duration_hours is omitted.
- Very specific: line 198
If the agent's clock cannot be trusted, use updated_at as the event timestamp
- Very specific: line 204
Run this once when setting up a new project.
- Distinctive: line 207
Ask the user for the complete list of phases.
- Very specific: line 208
Ask for project_id (default: repo directory name) and project_name.
- Very specific: line 214
All phases in pending_phases
- Very specific: line 217
Create the first todo breakdown for Phase 1 using todowrite.
- Very specific: line 219
After every project_state.json write, run the validation gate (see Health checks & validation section).
- Distinctive: line 226
When beginning work on a phase:
- Very specific: line 228
Read project_state.json to confirm current phase.
- Very specific: line 236
When all todos for the current phase are marked completed:
- Very specific: line 251
If no phases remain, set current_phase to "Complete" and current_phase_started_at to null.
- Very specific: line 252
Update next_steps with the next phase goal.
- Distinctive: line 253
Run full project verification (all tests, lint, typecheck).
- Distinctive: line 257
When an important architectural decision is made:
- Very specific: line 259
Write the full ADR as a dedicated file at docs/adr/NNN-title-of-decision.md with context, decision, consequences, and status.
- Very specific: line 273
If no docs/adr/ directory exists, store the full ADR inline under architecture_decisions as an object with a details field.
- Distinctive: line 279
When a problem is identified:
- Distinctive: line 285
When an issue is resolved:
- Distinctive: line 292
When ending a session mid-phase:
- Distinctive: line 294
Ensure all v1.1 fields are set (timestamps, event_log entries appended).
- Very specific: line 295
Update updated_at to the current timestamp.
- Very specific: line 296
Update next_steps to precisely describe what comes next.
- Distinctive: line 298
When resuming after a session gap:
- Very specific: line 300
Read project_state.json first.
- Distinctive: line 301
If v1.0, offer to upgrade to v1.1 (see Migration from v1.0).
- Very specific: line 302
Create fresh todos from next_steps + current_phase.
- Very specific: line 328
Run these commands to verify project_state.json integrity.
- Very specific: line 332
Run after every project_state.json write:
- Very specific: line 358
No events reference phases not present in completed_phases or pending_phases
- Very specific: line 363
When delegating work for a project-pulse-monitored phase to a subagent, include this context in the prompt:
- Very specific: line 378
When using both skills, load phase-tracking first (it creates project_state.json), then project-pulse second (it manages monitoring fields).
- Distinctive: line 387
No locking is needed — agents operate sequentially within a single session.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Project-Pulse Skill
A sibling skill to phase-tracking — project-scoped, structured, and built for a
monitoring dashboard. Where phase-tracking manages in-session state, project-pulse
broadcasts it outward and records the full project lifecycle.
Load both skills side by side: phase-tracking writes the state, project-pulse
adds timestamps, identity, events, and export surfaces. They share project_state.json
and own different concerns.
When to use
Use project-pulse alongside phase-tracking when:
- You want to track progress across multiple projects from a single dashboard
- You need phase velocity metrics (how long does each phase take?)
- You want alerts on stalled phases or aging issues
- You need a structured event log for compliance or post-mortems
- You're building a monitoring or reporting layer on top of phased delivery
Do not use project-pulse alone — it reads project_state.json written by
phase-tracking. Always load phase-tracking first.
Relationship with phase-tracking
| Concern | Owned by |
|---|---|---|
| State mutations (phase transitions, ADRs, issues) | phase-tracking |
| Schema v1.1 structured fields (timestamps, events, project_id) | Both |
| Schema validation | project-pulse |
| Event log (append-only chronological record) | project-pulse |
Schema: project_state.json v1.1
The v1.1 schema extends phase-tracking's v1.0 with timestamps, structured
objects, project identity, and an event log. Existing v1.0 files continue
to work — missing v1.1 fields produce warnings but no errors.
Full schema
{
"schema_version": "1.1",
"project_id": "my-project-slug",
"project_name": "My Project",
"current_phase": "Phase 3 — Auth & Permissions",
"current_phase_started_at": "2026-06-10T08:00:00Z",
"completed_phases": [
{
"name": "Phase 1 — Project scaffold & config",
"started_at": "2026-06-01T09:00:00Z",
"completed_at": "2026-06-03T17:30:00Z",
"duration_hours": 32.5
}
],
"pending_phases": ["Phase 4 — API routes"],
"architecture_decisions": [
{
"id": "ADR-001",
"title": "Use row-level security with Postgres RLS",
"status": "Accepted",
"recorded_at": "2026-06-05T14:00:00Z"
}
],
"known_issues": [
{
"id": "ISS-001",
"description": "Refresh token rotation not implemented",
"severity": "medium",
"status": "open",
"opened_at": "2026-06-08T10:00:00Z"
}
],
"event_log": [
{ "type": "phase_started", "phase": "Phase 1", "timestamp": "2026-06-01T09:00:00Z" },
{ "type": "phase_completed", "phase": "Phase 1", "timestamp": "2026-06-03T17:30:00Z" },
{ "type": "adr_recorded", "adr": "ADR-001", "timestamp": "2026-06-05T14:00:00Z" }
],
"next_steps": "Implement JWT verify middleware",
"updated_at": "2026-06-13T10:00:00Z"
}Field reference
| Field | Type | Required in v1.1 | Notes |
schema_version | string | yes | "1.1" for this schema |
project_id | string | yes | Unique slug or UUID. Set once at init. |
project_name | string | yes | Human-readable project name |
current_phase | string | yes (inherited) | Same as v1.0 |
current_phase_started_at | string (ISO 8601) | recommended | Set when starting a phase |
completed_phases | array | yes (inherited) | Array of objects in v1.1 (strings also accepted) |
pending_phases | array | yes (inherited) | Array of strings |
architecture_decisions | array | yes (inherited) | Array of objects in v1.1 (strings also accepted) |
known_issues | array | yes (inherited) | Array of objects in v1.1 (strings also accepted) |
event_log | array | recommended | Chronological list of transition events |
next_steps | string | yes (inherited) | Same as v1.0 |
updated_at | string (ISO 8601) | recommended | Last modification timestamp |
Migration from v1.0
When loading an existing v1.0 project_state.json, the agent:
- Detects missing v1.1 fields
- Logs a warning listing which fields are absent
- Prompts the user: "This project uses the v1.0 schema. Add v1.1 fields (project_id, timestamps, event_log) for monitoring support? [y/N]"
- If yes, writes default values (
project_idfrom repo name,event_log: [], etc.) - Proceeds in either case — no hard error
Completed phases — object format
Each completed phase object:
| Field | Type | Required | Notes |
name | string | yes | Phase title |
started_at | ISO 8601 | recommended | When phase work began |
completed_at | ISO 8601 | yes | When phase was marked complete |
duration_hours | number | recommended | (completed_at - started_at) in hours |
If started_at is missing, duration_hours is omitted.
Architecture decisions — object format
Each ADR object:
| Field | Type | Required | Notes |
id | string | yes | "ADR-NNN" — monotonic |
title | string | yes | Short decision title |
status | string | recommended | "Proposed", "Accepted", "Deprecated", "Superseded" |
recorded_at | ISO 8601 | recommended | When the ADR was recorded |
Known issues — object format
Each issue object:
| Field | Type | Required | Notes |
id | string | yes | "ISS-NNN" — monotonic |
description | string | yes | Actionable problem description |
severity | string | yes | "low", "medium", "high", "critical" |
status | string | yes | "open", "in_progress", "resolved", "wontfix" |
opened_at | ISO 8601 | recommended | When the issue was created |
resolved_at | ISO 8601 | nullable | When the issue was closed (null if open) |
Event log
The event_log is a chronological array of project lifecycle events. It is the
source of truth for monitoring — every transition generates one event.
Event types
| Type | Trigger | Payload fields |
phase_started | A new phase begins | phase, timestamp |
phase_completed | A phase is marked complete | phase, timestamp, duration_hours |
phase_skipped | A phase is skipped/deprioritized | phase, timestamp, reason |
adr_recorded | An ADR is created | adr (ID), title, timestamp |
issue_opened | A known issue is created | issue (ID), description, severity, timestamp |
issue_resolved | An issue is closed | issue (ID), timestamp |
project_created | Project is initialized | project_id, timestamp |
Event format
{
"type": "phase_completed",
"phase": "Phase 2 — Database schema & migrations",
"timestamp": "2026-06-08T17:30:00Z",
"duration_hours": 32.5
}Ordering guarantees
- Events are appended in chronological order (newest at end)
- Timestamps should be monotonic — a new event MUST NOT have a timestamp older than the last event
- If the agent's clock cannot be trusted, use
updated_atas the event timestamp
Workflow
1. Initialize
Run this once when setting up a new project. Typically done by phase-tracking's
Initialize step with project-pulse adding monitoring fields.
- Ask the user for the complete list of phases.
- Ask for
project_id(default: repo directory name) andproject_name. - Write
project_state.json:- Set
schema_version: "1.1" - Set
project_idandproject_name - Set
current_phaseto Phase 1,current_phase_started_atto now completed_phases: []- All phases in
pending_phases event_log: []
- Set
- Append a
project_createdevent toevent_log. - Create the first todo breakdown for Phase 1 using
todowrite.
After every project_state.json write, run the validation gate (see Health checks & validation section).
If
project_state.jsonis missing: treat as fresh start (same asphase-tracking). Prompt forproject_idandproject_namebefore creating the file.
2. Start a phase
When beginning work on a phase:
- Read
project_state.jsonto confirm current phase. - Set
current_phase_started_atto the current timestamp (ISO 8601). - Break the phase into atomic tasks using
todowrite. - Append a
phase_startedevent toevent_log. - Mark the first todo
in_progressand proceed.
3. Complete a phase
When all todos for the current phase are marked completed:
- Calculate
duration_hoursfromcurrent_phase_started_atto now. - Move the phase to
completed_phasesas an object:{ "name": "Phase N — Title", "started_at": "<current_phase_started_at>", "completed_at": "<now>", "duration_hours": <calculated> } - Set
current_phaseto the next phase inpending_phases(shift from front). - Set
current_phase_started_atto the current timestamp for the new phase. - Append a
phase_completedevent toevent_log. - If no phases remain, set
current_phaseto"Complete"andcurrent_phase_started_atto null. - Update
next_stepswith the next phase goal. - Run full project verification (all tests, lint, typecheck).
4. Record an ADR
When an important architectural decision is made:
- Write the full ADR as a dedicated file at
docs/adr/NNN-title-of-decision.mdwith context, decision, consequences, and status. - Append an object to
architecture_decisions:{ "id": "ADR-NNN", "title": "Title of decision", "status": "Accepted", "recorded_at": "<now>" } - Append an
adr_recordedevent toevent_log. - Increment the ADR number (maintain monotonic ordering).
If no docs/adr/ directory exists, store the full ADR inline under
architecture_decisions as an object with a details field. Prefer dedicated files
once the project has more than 5 ADRs.
5. Manage known issues
When a problem is identified:
- Assign the next
ISS-NNNID. - Append an object to
known_issueswith all required fields. - Append an
issue_openedevent toevent_log.
When an issue is resolved:
- Set
statusto"resolved"andresolved_atto now. - Append an
issue_resolvedevent toevent_log.
6. Session handoff
When ending a session mid-phase:
- Ensure all v1.1 fields are set (timestamps, event_log entries appended).
- Update
updated_atto the current timestamp. - Update
next_stepsto precisely describe what comes next.
When resuming after a session gap:
- Read
project_state.jsonfirst. Checkschema_versionto decide which fields to expect. - If v1.0, offer to upgrade to v1.1 (see Migration from v1.0).
- Create fresh todos from
next_steps+current_phase.
Webhook delivery (external)
The agent's only webhook responsibility is appending events to event_log.
Delivery to external systems (Slack, Datadog, custom dashboards) is handled by a
sidecar process — cron, inotify, or CI — that reads project_state.json,
detects new events, and POSTs them with HMAC-SHA256 signing.
This keeps HTTP IO, retries, and error handling out of the agent's critical path.
See
project-pulse-webhook-sidecar.mdfor the full sidecar pattern, including delivery scripts, retry policies, and cursor-based event tracking.
Export & snapshot (external)
Exporting project_state.json to a collector, archive, or CI pipeline is also
handled outside the agent. Patterns include cron-based push, GitHub Actions
steps, and timestamped archive snapshots — all documented in the sidecar idea.
See
project-pulse-webhook-sidecar.mdfor export and delivery patterns.
Health checks & validation
Run these commands to verify project_state.json integrity.
v1.1 validation gate
Run after every project_state.json write:
python3 -c "
import json, sys
d = json.load(open('project_state.json'))
assert d.get('schema_version'), 'schema_version is required'
assert d.get('project_id'), 'project_id is required'
assert d.get('project_name'), 'project_name is required'
assert isinstance(d.get('event_log'), list), 'event_log must be a list'
assert isinstance(d.get('completed_phases'), list), 'completed_phases must be a list'
assert isinstance(d.get('pending_phases'), list), 'pending_phases must be a list'
print('project-pulse: state is valid (v1.1)')
"Assertions that must hold
schema_versionis present and non-emptyproject_idis a non-empty stringcompleted_phasesandpending_phaseshave no overlapping phase namescompleted_phasesis in chronological order bycompleted_atpending_phasesis in chronological order- ADR numbers are monotonic and sequential
current_phaseis never in bothcompleted_phasesandpending_phases- Event log entries have
type,timestampand type-specific required fields - No events reference phases not present in
completed_phasesorpending_phases - Timestamps are valid ISO 8601 strings
Integration with subagents
When delegating work for a project-pulse-monitored phase to a subagent, include
this context in the prompt:
CONTEXT: project-pulse monitoring active for [project_id].
State schema version: [1.0|1.1].
Current phase: [current_phase].
All state transitions MUST be recorded in event_log with ISO 8601 timestamps.This keeps subagents aligned with the monitoring requirements even though they don't have access to the full session history.
Loading order
When using both skills, load phase-tracking first (it creates project_state.json),
then project-pulse second (it manages monitoring fields).
// Correct loading order
// 1. phase-tracking — manages state mutations
// 2. project-pulse — manages monitoring and eventsNo locking is needed — agents operate sequentially within a single session. The two skills write to different sets of fields in the same JSON file.
Further reading
The full design exploration for monitoring dashboards, metrics, and visualization tools is documented alongside the sidecar delivery pattern:
- Dashboard & metrics design:
phase-tracking-monitoring-integration.md - Sidecar webhook delivery:
project-pulse-webhook-sidecar.md
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

