Skip to content
Back to skills

1259 Fn 12 A8ade8f7

ASecurity

Change epic ID format from `fn-N` to `fn-N-xxx` where `xxx` is a 3-char alphanumeric suffix. Prevents merge conflicts when multiple team members create epics simultaneously (both getting `fn-5` → collision).

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
documentationgodocumentation

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 1259-fn-12_a8ade8f7 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 1259 Fn 12 A8ade8f7?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 1259 Fn 12 A8ade8f7
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-1259-fn-12-a8ade8f7/badge)](https://www.skillsdirectory.com/skills/tools-only-1259-fn-12-a8ade8f7)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
# fn-12 Collision-resistant epic IDs (fn-N-xxx format)

## Overview
Change epic ID format from `fn-N` to `fn-N-xxx` where `xxx` is a 3-char alphanumeric suffix. Prevents merge conflicts when multiple team members create epics simultaneously (both getting `fn-5` → collision).

## Problem
Sequential numeric IDs cause:
- Merge conflicts when team members create epics in parallel
- ID collisions requiring manual renumbering
- File conflicts in `.flow/epics/`, `.flow/tasks/`, `.flow/specs/`

## Solution
Format: `fn-N-xxx` where:
- `N` = next available number (scan-based, same as today)
- `xxx` = 3-char random alphanumeric (a-z0-9), e.g., `fn-5-x7k`

Task IDs follow: `fn-N-xxx.M` (e.g., `fn-5-x7k.1`)

## Approach
**Dual-pattern support** - no migration needed:
- Accept both `fn-N` (legacy) and `fn-N-xxx` (new) formats
- New epics always get suffix
- Existing epics continue working unchanged

## Files to modify

### Core (flowctl.py)
- `parse_id()` line ~336: Add suffix group to regex
- `scan_max_epic_id()` line ~933: Extract number ignoring suffix
- `epic create` line ~1494: Generate suffix on creation
- `EpicId`/`TaskId` types: Update validation

### Ralph hooks (ralph-guard.py)
- Receipt parsing ~line 50: Update `plan-` and `impl-` patterns
- ID extraction: Handle suffix in receipt filenames

### TUI (flow-next-tui)
- `runs.ts`: Update `TASK_ID_PATTERN` and epic extraction regex
- Display: Truncate suffix in tight spaces if needed

### Tests
- `test_flowctl.py`: Update hardcoded IDs and expected patterns
- `test_runs.ts`: Update TUI test fixtures

### Documentation
- `plugins/flow-next/README.md`: Document new format
- `CHANGELOG.md`: Note backwards-compatible change
- `plans/` runbooks: Update examples

## Quick commands
- `bun test` (TUI tests)
- `plugins/flow-next/scripts/smoke_test.sh`
- `plugins/flow-next/scripts/ralph_smoke_test.sh`

## Acceptance
- [ ] `flowctl epic create "test"` produces `fn-N-xxx` format
- [ ] `flowctl show fn-5` still works (legacy)
- [ ] `flowctl show fn-5-x7k` works (new)
- [ ] Ralph receipts work with new format
- [ ] TUI displays and filters new format correctly
- [ ] All smoke tests pass
- [ ] No migration required for existing `.flow/` dirs

## Risk assessment

**High confidence (95%+):**
- Dual-pattern regex is straightforward: `fn-(\d+)(?:-[a-z0-9]{3})?`
- Existing `fn-N` IDs will match (optional suffix group)
- No migration = no data risk
- 28 smoke + 15 ralph tests catch regressions

**Medium confidence areas:**
- `scan_max_epic_id()` must extract number ignoring suffix - easy but needs care
- TUI regex updates - isolated, has tests

**Low risk but needs attention:**
- Receipt filename parsing in ralph-guard.py
- Ensuring glob patterns (`fn-*.json`) still work (they will)

**What could go wrong:**
1. Typo in regex breaks existing ID parsing → caught by smoke tests
2. scan_max returns wrong number → caught by epic create test
3. TUI can't parse new format → caught by bun test

**Verdict:** High confidence. Dual-pattern approach is inherently safe. Every change has test coverage.

## References
- Analysis: Deep search of all ID patterns in codebase
- Patterns found: 10+ regex across flowctl.py, ralph-guard.py, TUI
- Backwards compat: Dual-pattern matching, no breaking changes

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.