answerlisted
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