feature-spec — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited feature-spec (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The Feature Spec skill enables product managers to write detailed, implementation-ready feature specifications that bridge design and engineering. It combines functional requirements, technical specifications, and UX flows into a single source of truth.
Feature Name: [Clear, descriptive name] Feature ID: [Unique identifier] Owner (PM): [Name] Owner (Engineering): [Name] Status: [Draft / Review / Approved / In Development] Last Updated: [Date]
One-sentence description: [What does this feature do in user terms]
Business context: [Why are we building this, customer problem, business goal]
Key metrics: [How success will be measured]
Use Case 1: [Name]
Requirement 1: Real-Time Updates
Description: When a team member updates a task, all other team members viewing that project should see the update within 2 seconds.
Acceptance criteria:
Technical notes:
Requirement 2: Activity Feed Display
Description: Users can view a timeline of all changes to a project in reverse chronological order.
Acceptance criteria:
Technical notes:
Requirement 3: Notification Delivery
Description: Users receive notifications when activities relevant to them occur.
Acceptance criteria:
Technical notes:
Scenario 1: Network Disconnection During Status Update
Scenario 2: Duplicate Update Event
Scenario 3: Concurrent Updates to Same Task
Scenario 4: User Permissions Changed During Viewing
Scenario 5: Very Large Activity Feeds (1000+ items)
Table: activities
CREATE TABLE activities (
id UUID PRIMARY KEY,
project_id UUID NOT NULL REFERENCES projects(id),
actor_id UUID NOT NULL REFERENCES users(id),
action_type VARCHAR(50) NOT NULL,
-- task_status_changed, task_comment_added, task_assigned, etc.
target_type VARCHAR(50) NOT NULL,
-- task, comment, assignment, project
target_id UUID NOT NULL,
-- ID of the object being changed
old_value JSONB,
-- Previous state (for updates): { "status": "todo" }
new_value JSONB,
-- New state: { "status": "done" }
metadata JSONB,
-- Extra context: { "duration_hours": 8, "effort_score": 5 }
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
CONSTRAINT check_values CHECK (
(old_value IS NOT NULL OR new_value IS NOT NULL)
)
);
CREATE INDEX idx_activities_project_created
ON activities(project_id, created_at DESC);
CREATE INDEX idx_activities_actor_created
ON activities(actor_id, created_at DESC);Table: notification_preferences
CREATE TABLE notification_preferences (
id UUID PRIMARY KEY,
user_id UUID NOT NULL UNIQUE REFERENCES users(id),
-- Activity type toggles
task_status_changed BOOLEAN DEFAULT true,
task_comment_added BOOLEAN DEFAULT true,
task_assigned_to_me BOOLEAN DEFAULT true,
-- Delivery method (can choose multiple)
email_enabled BOOLEAN DEFAULT true,
in_app_enabled BOOLEAN DEFAULT true,
slack_enabled BOOLEAN DEFAULT false,
mobile_push_enabled BOOLEAN DEFAULT true,
-- Do not disturb
dnd_enabled BOOLEAN DEFAULT false,
dnd_start TIME, -- 22:00
dnd_end TIME, -- 08:00
-- Batching
email_batch_frequency VARCHAR(20) DEFAULT 'hourly',
-- realtime, daily, weekly, never
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);Table: activity_subscriptions
CREATE TABLE activity_subscriptions (
id UUID PRIMARY KEY,
user_id UUID NOT NULL REFERENCES users(id),
resource_type VARCHAR(50) NOT NULL, -- task, project
resource_id UUID NOT NULL,
subscription_type VARCHAR(50) NOT NULL,
-- all_activities, mentions_only, assigned_only
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE UNIQUE INDEX idx_user_resource_subscription
ON activity_subscriptions(user_id, resource_type, resource_id);Field: action_type
Field: old_value and new_value
// For task_status_changed
{
"old": { "status": "todo" },
"new": { "status": "in_progress" }
}
// For task_comment_added
{
"new": {
"comment_id": "abc123",
"text": "This is a comment",
"commenter": "Sarah"
}
}
// For task_assigned
{
"new": {
"assignee_id": "user123",
"assignee_name": "John"
}
}Request:
GET /api/v1/projects/{projectId}/activities
Query parameters:
- limit: number (default: 20, max: 100)
- offset: number (default: 0)
- action_type: string (optional, filter)
- actor_id: string (optional, filter)
- start_date: ISO8601 (optional, filter)
- end_date: ISO8601 (optional, filter)
- search: string (optional, keyword search)
Headers:
- Authorization: Bearer {token}Response (200 OK):
{
"data": [
{
"id": "activity-123",
"project_id": "proj-456",
"actor": {
"id": "user-789",
"name": "Sarah Chen",
"avatar_url": "https://..."
},
"action_type": "task_status_changed",
"action_label": "changed status",
"target": {
"type": "task",
"id": "task-999",
"name": "Build user auth",
"url": "/tasks/task-999"
},
"old_value": { "status": "todo" },
"new_value": { "status": "in_progress" },
"created_at": "2024-02-20T14:30:00Z",
"metadata": {
"duration_in_status": "2 days"
}
}
],
"pagination": {
"total": 250,
"offset": 0,
"limit": 20,
"has_more": true
}
}Response (401 Unauthorized):
{
"error": "Unauthorized",
"message": "Authentication required"
}Response (403 Forbidden):
{
"error": "Forbidden",
"message": "You don't have access to this project"
}Request:
PATCH /api/v1/tasks/{taskId}
Body:
{
"status": "in_progress"
}
Headers:
- Authorization: Bearer {token}
- Content-Type: application/jsonResponse (200 OK):
{
"id": "task-999",
"name": "Build user auth",
"status": "in_progress",
"updated_at": "2024-02-20T14:30:00Z",
"activity_id": "activity-123"
}Activity created automatically:
Request:
PUT /api/v1/notifications/preferences
Body:
{
"email_enabled": true,
"in_app_enabled": true,
"slack_enabled": false,
"mobile_push_enabled": true,
"email_batch_frequency": "hourly",
"dnd_enabled": true,
"dnd_start": "22:00",
"dnd_end": "08:00"
}Response (200 OK):
{
"id": "pref-123",
"user_id": "user-789",
"email_enabled": true,
"in_app_enabled": true,
"slack_enabled": false,
"mobile_push_enabled": true,
"updated_at": "2024-02-20T14:30:00Z"
}Connect:
WS /api/v1/ws?token={token}&project_id={projectId}Subscribe to project activities:
{
"type": "subscribe",
"project_id": "proj-456"
}Receive activity (broadcasted):
{
"type": "activity_created",
"data": {
"id": "activity-123",
"project_id": "proj-456",
"action_type": "task_status_changed",
"actor": { "id": "user-789", "name": "Sarah Chen" },
"target": { "type": "task", "id": "task-999", "name": "Build user auth" },
"new_value": { "status": "in_progress" },
"created_at": "2024-02-20T14:30:00Z"
}
}Screen 1: Activity Feed List
┌─────────────────────────────────────┐
│ Activity Feed │
├─────────────────────────────────────┤
│ [Filter ▼] [Search _______________] │
├─────────────────────────────────────┤
│ Sarah Chen changed status │
│ "Build auth" → in progress │
│ 2 hours ago │
│ │
│ John Lee added comment │
│ "Build auth" - "Great progress" │
│ 3 hours ago │
│ │
│ Project created "Mobile App" │
│ by Jane Doe │
│ Yesterday │
│ │
│ [Load more] │
└─────────────────────────────────────┘Interactions:
Current state: Task in "todo" status
User action: Click task, change status dropdown to "in_progress"
System behavior:
Screen: Notification Settings Modal
┌──────────────────────────────────────┐
│ Notification Preferences │
├──────────────────────────────────────┤
│ Activity Types │
│ ☑ Task status changed │
│ ☑ Task assigned to me │
│ ☑ New comments │
│ ☐ Task description updated │
│ │
│ Delivery Methods │
│ ☑ Email │
│ ☑ In-app │
│ ☐ Slack │
│ ☑ Mobile push │
│ │
│ Email Settings │
│ Batch frequency: [Hourly ▼] │
│ │
│ Do Not Disturb │
│ ☑ Enabled │
│ From: [22:00] To: [08:00] │
│ │
│ [Save] [Cancel] │
└──────────────────────────────────────┘| Operation | Target | Acceptable | Unacceptable |
|---|---|---|---|
| Get activity feed | 500ms | 1s | >2s |
| Real-time broadcast | 2s | 3s | >5s |
| Update task status | 1s | 2s | >3s |
| Search activities | 1s | 2s | >3s |
| Load notifications settings | 500ms | 1s | >2s |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.