learn-bdd-scenarios
Interactive guidance on writing complete, effective BDD scenarios for story-flow.
Interactive guidance on why human code review is essential for readability and maintainability.
Claude Code
$ npx -y skills add Intai/story-flow --skill learn-review-implementation --agent claude-code
Codex
$ npx skills add Intai/story-flow --skill learn-review-implementation -a codex -y
Cursor
$ npx skills add Intai/story-flow --skill learn-review-implementation -a cursor -y
Gemini CLI
$ npx skills add Intai/story-flow --skill learn-review-implementation -a gemini-cli -y
GitHub Copilot
$ npx skills add Intai/story-flow --skill learn-review-implementation -a github-copilot -y
OpenCode
$ npx skills add Intai/story-flow --skill learn-review-implementation -a opencode -y
Windsurf
$ npx skills add Intai/story-flow --skill learn-review-implementation -a windsurf -y
name: Learn why to review implementation even with 100% test coverage description: Interactive guidance on why human code review is essential for readability and maintainability. user-invocable: false
This learning module helps junior developers understand why, as of today in 2026, human code review remains essential even when AI-generated code has 100% unit test coverage. Tests only verify code doesn't crash - humans must verify correctness, readability, and maintainability.
Present the following content interactively. After each section, use `AskUserQuestion` to offer 3 options:
---
Explain what test coverage measures and its limitations:
**What 100% test coverage proves:**
**That's it.** Coverage doesn't verify correctness - test assertions could be inadequate, wrong, or missing entirely.
**What 100% test coverage does NOT prove:**
**The key insight:**
Tests answer "Does it crash?" not necessarily "Does it work?" or "Is it good code?" All three questions matter.
---
Since 100% coverage only proves code doesn't crash, the test assertions themselves are critical - and they need human review.
// This test "passes" but proves nothing
test('should process order', () => {
const result = processOrder(mockOrder);
expect(result).toBeDefined(); // Weak assertion - just checks it exists
});
// This test passes but has wrong expectation
test('should calculate total', () => {
const total = calculateTotal([10, 20, 30]);
expect(total).toBe(50); // Wrong! Should be 60
});
// This test is missing assertions entirely
test('should update user', async () => {
await updateUser({ id: 1, name: 'John' });
// No assertions - test passes if it doesn't crash
});All three tests pass. None prove correctness.
**1. Are assertions actually verifying behavior?**
**2. Are assertions checking the right values?**
**3. Are critical assertions present?**
**4. Do assertions match requirements?**
---
Present examples of working code that has readability issues:
// Passes tests but hard to understand const d = new Date(); const t = d.getTime(); const x = t - (24 * 60 * 60 * 1000); const r = items.filter(i => i.c > x); // BETTER - Self-documenting const now = new Date(); const currentTimestamp = now.getTime(); const oneDayAgo = currentTimestamp - (24 * 60 * 60 * 1000); const recentItems = items.filter(item => item.createdAt > oneDayAgo);
Both pass the same tests. Only one is readable.
// Passes tests but requires mental parsing
return users.filter(u => u.a && u.r.includes('admin') && !u.d).map(u => ({...u, p: u.p.filter(p => p.e)}));
// BETTER - Step by step
const activeUsers = users.filter(user => user.isActive);
const adminUsers = activeUsers.filter(user => user.roles.includes('admin'));
const nonDeletedAdmins = adminUsers.filter(user => !user.isDeleted);
return nonDeletedAdmins.map(user => ({
...user,
permissions: user.permissions.filter(permission => permission.enabled)
}));// Passes tests but meaning is unclear
if (status === 3 && retries < 5) {
setTimeout(retry, 30000);
}
// BETTER - Named constants explain intent
const STATUS_FAILED = 3;
const MAX_RETRIES = 5;
const RETRY_DELAY_MS = 30000;
if (status === STATUS_FAILED && retries < MAX_RETRIES) {
setTimeout(retry, RETRY_DELAY_MS);
}---
Present examples of code that passes tests but will cause problems later:
// Passes tests but over-engineered for a simple task
interface ConfigurationStrategy {
getConfig(): Config;
}
class JsonConfigStrategy implements ConfigurationStrategy {
getConfig() { return JSON.parse(fs.readFileSync('config.json')); }
}
class ConfigFactory {
static create(type: string): ConfigurationStrategy {
if (type === 'json') return new JsonConfigStrategy();
throw new Error('Unknown type');
}
}
const config = ConfigFactory.create('json').getConfig();
// BETTER - Simple solution for simple problem
const config = JSON.parse(fs.readFileSync('config.json'));// Passes tests but duplicates logic that should be shared
function validateUserEmail(email) {
return email.includes('@') && email.includes('.') && email.length > 5;
}
function validateContactEmail(Interactive guidance on writing complete, effective BDD scenarios for story-flow.
Interactive guidance on creating technical design PRs to align with your team before coding.
Parse story markdown to identify task dependencies and parallel execution opportunities.
Generate a draft story markdown by analyzing a story tracker or feature description, Figma designs, and the codebase.
Execute BDD test scenarios from .feature files using browser automation.
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.