← ClaudeAtlas

answerlisted

Find every question this repo is holding open for a person and put them one at a time — contradictions waiting on a ruling, requirements nothing asserts, blocked items, checks that refused. Records each answer in the files. Use when asked what needs a decision, what is waiting on me, what questions are open, or to work through the open questions.
gitayg/productizer · ★ 0 · Testing & QA · score 76
Install: claude install-skill gitayg/productizer
# What this repo is waiting on a person for !`set -e; R="$(git rev-parse --show-toplevel)"; python3 - "$R" <<'PY' import io, os, re, sys root = sys.argv[1] def rd(p): f = os.path.join(root, p) if not os.path.exists(f): return None if not os.path.isfile(f) or not os.access(f, os.R_OK): return False return io.open(f, encoding='utf-8', errors='replace').read() spec = rd('.claude/productizer/spec.md') q = [] if spec is None: print(' no spec at .claude/productizer/spec.md - nothing to ask about') elif spec is False: print(' the spec exists and cannot be read. UNKNOWN, not "no questions".') else: body = spec.split('## Requirements')[-1].split('## Design')[0] active, dead = [], set() for m in re.finditer(r'^- \*\*(R\d+)\*\* — (.+)$', body, re.M): rid, txt = m.group(1), m.group(2) tail = body[m.end():m.end() + 240] if re.match(r'\s*\n\s+(Superseded by|Withdrawn)', tail): dead.add(rid); continue active.append((rid, txt)) acc = spec.split('## Acceptance criteria')[-1].split('## Change log')[0] rows = {} for l in acc.split('\n'): mm = re.match(r'^\| (R\d+) \| (.*?) \|\s*$', l) if mm: rows[mm.group(1)] = mm.group(2) for rid, txt in active: cell = rows.get(rid) if cell is None: q.append(('%s' % rid, 'no acceptance row at all - the table cannot say whether anything asserts it', txt[:70])) elif re.search(r'not yet verified|\*\*Nothing', cell