SkillAgentSearch skills...

nirman

Code reviews catch the _outbound_ leg of a workflow — "click X on page A, navigate to page B, complete action". They miss the _return_ leg — "go back to page A, did the new state appear?" The bug pattern: a mutation on page B creates/changes data tied to a parent context A, but B's mutation only inv…

Install / Use

npx skills add senecaSparsh/nirman

Installs into whichever agent you are using.

About this skill
🤖

Devin Config

Devin AI agent config

Quality Score

69/100

Category

Automation

Supported Platforms

Devin

Our assessment of nirman

nirman scores 69/100 on our quality scale, 2687th of 2,880 Automation skills we index.

Its Devin Config is 11 KB long, well organised into 18 sections with 6 code examples: a thorough specification that gives an agent plenty to work with.

It has no GitHub stars yet, so there is no community track record; judge it on its content.

Substance
29/30
Structure
20/20
Description
15/15
Adoption
0/20
Freshness
5/15

Maintenance, license and trust

  • We could not determine when the repository was last updated.
  • No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
  • Its trust signals score 68/100, with 3 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.

nirman compared with similar skills

All 4 of these similar skills score higher than nirman; compare them before choosing.

SkillScoreStarsUpdatedFormat
nirman (this skill)by senecaSparsh690—Devin Config
Agent-Reachby Panniantong100103.3k1d agoCLAUDE.md
Scraplingby D4Vinci10089.9ktodayMCP Server
rufloby ruvnet10079.5ktodayMCP Server
ui-ux-pro-maxby nextlevelbuilder100137.2k12d agoSKILL.md

Frequently asked questions

How do I install nirman?
Run npx skills add senecaSparsh/nirman. The install tabs above show the steps for each supported agent.
Which AI agents does nirman work with?
It is written for Devin, as a Devin Config file. Other agents that read the same format can often use it too.
Is nirman safe to use?
It declares no license and scores 68/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
Is nirman still maintained?
We could not determine when the repository was last updated.

Round-Trip Workflow Integrity

Why this exists

Code reviews catch the outbound leg of a workflow — "click X on page A, navigate to page B, complete action". They miss the return leg — "go back to page A, did the new state appear?"

The bug pattern: a mutation on page B creates/changes data tied to a parent context A, but B's mutation only invalidates B's own query. A's cached state is stale on return. The user sees an empty list, thinks the action failed, retries, creates a duplicate (or worse — gives up and assumes the system is broken).

Static analysis can't catch this — it's a TanStack Query / SWR / Apollo cache-invalidation gap that only surfaces under interaction.

The smoking-gun example (2026-04-30, vite-flare-starter)

1. Open project /dashboard/projects/X — empty conversation list
2. Type prompt + click "Start chat" — navigates to /dashboard/chat?projectId=X
3. Conversation creates, agent replies — works fine on the chat side
4. Click "Back to project" → /dashboard/projects/X
5. Conversation list STILL shows empty state
6. Hard reload → conversation appears

Server side was fine. Conversation persisted. But the project-detail TanStack query (['projects', id]) didn't refetch because the chat page only invalidated ['conversations'].

User-facing symptom: "I'm not sure how I get back, the project is just empty if I go back, maybe I can stay in the project when I'm working in a project?" — three problems stacking (weak breadcrumb, sidebar disorientation, stale cache) that all compound the perception of a broken workflow.

The protocol — required during Phase 3 walkthrough

For every workflow that traverses pages (A → B → A pattern), exercise the full round-trip:

1. Open page A. Capture: state, count of items, latest timestamp, current URL.
2. Trigger an action on A that navigates to B (a button, a link, a form-submit).
3. Complete a mutation on B (send a message, create a thing, approve an item).
4. Navigate back to A. Use the discoverable back affordance (breadcrumb,
   browser back, sidebar item) — NOT a hard reload.
5. Verify A's state reflects the new data:
   - Item count incremented?
   - New row visible?
   - Latest timestamp updated?
   - Unread badge updated?
6. ALSO verify the back affordance was discoverable:
   - Visible without hover at first paint
   - Labelled clearly ("Back to {parent}", not just "←")
   - Sized like a control, not decoration
   - Sidebar still highlights the parent context (or has a sub-state)

If A is stale or the back affordance is hidden, log a finding.

Where this lives in the audit

This is mandatory for every multi-page workflow. The Interaction Manifest must include a round-trip entry for every cross-page mutation observed. Without it, the verdict is Incomplete.

ROUND-TRIP MANIFEST — project → chat → project
  [✓] 14:32:01 Open /dashboard/projects/X — capture: 0 conversations
  [✓] 14:32:05 Type prompt "Quote a bathroom reno" + click Start chat
  [✓] 14:32:06 Navigated to /dashboard/chat?projectId=X
  [✓] 14:32:08 Verify breadcrumb visible at first paint:
                "← Quoting / New chat" — yes, ~14em wide, font-medium
  [✓] 14:32:10 Wait for AI reply (Workers AI Kimi K2.6) — completed
  [✓] 14:32:14 Click breadcrumb back-link → /dashboard/projects/X
  [✓] 14:32:15 Verify conversation appears WITHOUT reload:
                expected 1 conversation, got 1 ("Quote a bathroom reno · just now")
  [✓] 14:32:15 Verify sidebar highlight:
                Projects highlighted (not "AI Chat"), no flicker

Surface inventory — every round-trip in the app

Build this list during Phase 2 (Discovery). Each entry is a candidate for the Phase 3 round-trip protocol.

Examples for vite-flare-starter:

| Outbound (A → B) | Mutation on B | Inbound (B → A) | What A must reflect | | ---------------------------------------- | ----------------------------------- | ---------------------------- | -------------------------------------- | | Project page → Start chat | Conversation created with projectId | Breadcrumb back | New conversation in project's list | | Spaces list → enter space → send message | Message persisted | Browser back | Last-message timestamp updated | | Inbox → click finding (opens chat) | Finding marked read | Browser back | Unread count decreases on bell | | Approvals → approve | Approval status → decided | Sidebar Approvals | Item gone from "Pending" tab | | Approvals page approve | Approval status → decided | Sidebar Inbox | Item also gone from Inbox unified view | | Inbox bulk-approve | Approval(s) status → decided | Header bell | Unread count decreases | | Skills → save edit (with diff approval) | Skill body updated | Skills list page | Updated body shows on next select | | Connections → connect Google | OAuth + connection persisted | Browser back to /connections | New connection appears in list | | Routines /new → submit | Routine created | Sidebar Routines | New routine appears in list | | Settings → API tokens → create | Token created | Same page | List updates without reload |

If any of these is NOT exercised in Phase 3, the audit is Incomplete for that surface.

Detection heuristics

When you can't manually walk every workflow, these heuristics surface candidates fast:

Heuristic 1 — Cross-key invalidation

Grep the codebase for useMutation and check what it invalidates. If the mutation can affect data shown on a different page that uses a different query key, the mutation MUST invalidate both.

# Find every mutation
grep -rn 'useMutation' src/client/modules/*/hooks/*.ts

# For each, check invalidations
grep -A 10 'useMutation' src/client/modules/X/hooks/Y.ts | grep invalidateQueries

For each mutation, ask:

  • "What query keys consume the data this mutation affects?"
  • "Are ALL of those keys invalidated?"

The classic miss: mutation invalidates ['inbox'] only, but the same data also appears under ['notifications'] (unread count) and ['approvals'] (approvals tab) — invalidating one leaves the others stale.

Heuristic 2 — Header badges that depend on list state

Audit every UI badge / unread-count / pip indicator at the top of the layout. Each one is consumer of a query that ANY mutation across the app might invalidate.

Common badges that drift:

  • Notification bell unread count
  • Inbox unread tab count
  • Approvals pending count
  • Sidebar item dot ("you have something here")

For each badge, list every mutation that should affect it. Verify each mutation invalidates the badge's query key.

Heuristic 3 — Breadcrumb size + placement

For every page reachable from a parent, the back-to-parent affordance must satisfy:

  • Visible without hover at first paint (not opacity-0 or in an overflow menu)
  • Labelled with the parent's name (not generic "Back")
  • Sized like a primary control, not decoration
  • In a consistent location across pages (top-left or in a breadcrumb row)
  • Click target ≥ 32×32px (touch-friendly)

If the back affordance is a small pill near the page title, that's a smell — users don't read pills as wayfinding. Use breadcrumb-style links: [← Parent name] / Current page.

Heuristic 4 — Sidebar context disorientation

When a workflow navigates from page A (sidebar item X highlighted) to page B (sidebar item Y highlighted), but A's context is still active (the user IS still working in X conceptually):

  • Sidebar should ideally keep X highlighted (showing the parent context)
  • OR the chrome should clearly show the parent context as a breadcrumb / pill / header strip
  • WITHOUT one of those, the user feels like they switched apps

This is the single biggest source of "I'm not sure how I got there" UX feedback.

Findings — how to log

A round-trip finding has two halves:

ID: H-N
Layer: Interaction
Severity: High
Surface: /dashboard/projects/:id (round-trip from /dashboard/chat)
Persona: SME owner

Reproduce:
  1. Open project /dashboard/projects/X
  2. Type a prompt, click Start chat
  3. Wait for AI reply
  4. Click "Back to project" breadcrumb (or browser back)

Observed: Project page shows empty conversations list — "Start a chat to keep
conversations organised and re-use project knowledge." User sees no evidence
the chat just happened.

Expected: Project page shows the new conversation as a row with title +
timestamp ("just now").

Reload-confirms-server-fine: hitting Cmd+R on the project page reveals
the conversation. Server-side persistence is fine. The bug is client-cache.

Evidence: .jez/audit-evidence/2026-04-30/01-project-stale.png
Suspected location: src/client/modules/chat/pages/ChatPage.tsx — the
useChat completion effect invalidates ['conversations'] but not
['projects', urlProjectId].
Suggested fix: when conversationId becomes set + urlProjectId is non-null,
invalidate ['projects', urlProjectId] alongside ['conversations'].

Keep severity High for round-trip cache misses — they look like data loss to the user.

Companion checks

After fixing one round-trip bug, sweep for the same pattern across the codebase:

# Find every mutation that touches a child resource of a parent
grep -rn 'invalidateQueries' src/client/modules/ | grep -v 'queryKey:.*\[\(parent_key\)\]'

Then for each mutation that touches a relationship (e.g. conversation has projectId, finding has agentRunId, approval has conversationId, skill has agent), verify ALL parent query keys are invalidated.

Anti-patterns

  • "Reload always works" is not a fix. Users don't reload by reflex; they assume the system is broken.
  • refetchOnWindowFocus: true as a panacea — relies on the user actually leaving the tab and coming back. Doesn't help when they navigate within the SPA.
  • Showing a stale list with a manual "Refresh" button — the user has to know to click it. Better to invalidate on the mutation.
  • Polling intervals "every 30s" — masks the bug, doesn't fix it. Wastes bandwidth + battery.

Related skill rules

  • rules/api-client-alignment.md — server-side returns the data correctly; the client just doesn't ask again.
  • rules/react-vite.md — TanStack Query patterns + key alignment.
  • rules/think-in-contracts-not-code.md — the right contract is "every mutation declares which parent query keys it affects". Implementations like inbox-keys.ts / query-keys/index.ts reduce drift by centralising the relationships.

Last Updated: 2026-04-30

Related Skills

View on GitHub
GitHub Stars0
CategoryAutomation
UpdatedNaNy ago
Forks0

Trust signals

68/100

From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.

2 medium1 low