nacl-tl-reopened

SkillProductivity

Process tasks from YouGile Reopened column (failed verification/QA). Reads tester feedback from task chat, diagnoses root cause, fixes via /nacl-tl-fix, ships via /nacl-tl-ship, closes the verification loop. Use when: fix reopened tasks, process QA failures, handle rework, or the user says "/nacl-tl-reopened".

Available today. Use it from your connected AI after setup.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Then ask your AI: use the nacl-tl-reopened skill

What this skill tells your AI

The instructions your AI receives, as published by itsalt/nacl in nacl-tl-reopened/SKILL.md and read by ahel’s review.

Contract

Inputs this skill consumes:

  • nacl-tl-fix output (six-status vocabulary: PASS / BLOCKED / UNVERIFIED / NO_INFRA / RUNNER_BROKEN / REGRESSION; parsed from the authoritative Status: <VALUE> line in the Step 8 report — report headline is decoration only)
  • nacl-tl-review verdict (APPROVED / CHANGES REQUESTED)
  • nacl-tl-stubs result (severity counts)

Outputs this skill produces:

  • Rework report posted to YouGile task chat with 📊 Статус фикса field
  • Status table mirroring nacl-tl-fix Step 7 (one row per substatus encountered)
  • Auto-ship gated on fix status == PASS

Reopened outcome headlines (Step 10):

ConditionHeadline
Fix PASS, suite green, review approvedREOPENED COMPLETE
Fix BLOCKED, user confirmed proceedREOPENED APPLIED — UNVERIFIED (pre-existing failures)
Fix UNVERIFIED (no test exercises change)REOPENED HALTED — UNVERIFIED (no regression test)
Fix NO_INFRAREOPENED HALTED — NO_INFRA
Fix RUNNER_BROKENREOPENED HALTED — RUNNER_BROKEN
Fix REGRESSIONREOPENED INCOMPLETE — REGRESSION
Re-run gate fails at Step 8REOPENED INCOMPLETE — REGRESSION
Status: line missing from fix reportREOPENED HALTED — UNVERIFIED (fix report unparseable)
Regression-test seam absentREOPENED HALTED — UNVERIFIED (regression-test seam not honored)

Downstream consumers of this output:

  • Tester (human, via YouGile rework report)
  • No automated downstream consumers

Contract change discipline: If this skill's output contract changes — status vocabulary, headline format, exit codes, or report-field names — every downstream consumer in the list above must be audited and updated in the same release. The 0.10.0→0.10.1 regression (nacl-tl-reopened broke when nacl-tl-fix changed its output) was caused by skipping this discipline. Do not ship contract changes without auditing consumers.


Use with /goal

Wrap with: /nacl-goal reopened-drain (tier M)

This skill is a good fit for autonomous /goal loops because drain progress is graph-verifiable: each reopened task moves to a terminal YouGile column (DevDone or InWork-halted) and its Task node status updates in Neo4j. The wrapper composes a completion condition that the Reopened column is empty and no new reopened tasks have arrived for 2 consecutive turns.

Auto-retry behavior: any existing retry inside this skill is preserved; /goal loops between retries, not inside them.

Check script: nacl-goal/checks/reopened-drain.sh Refusals: see nacl-goal/refusal-catalog.md for the gates this wrapper guards. Background: docs/guides/goal-command.md


TeamLead — Reopened Task Handler

Your Role

You are the feedback loop closer. When /nacl-tl-verify or /nacl-tl-qa moves a task to the Reopened column (failed verification), you pick it up, understand what went wrong from tester feedback, orchestrate the fix, and push it back to DevDone. You close the gap between "verification failed" and "code is fixed."

Key Principle

/nacl-tl-verify ─── FAIL ──→ Reopened column
                              │
/nacl-tl-reopened → /nacl-tl-fix → /nacl-tl-ship → DevDone
                                       │
                          /nacl-tl-verify (re-verify) → PASS → ToRelease

You do NOT write fixes yourself — you delegate to /nacl-tl-fix (spec-first bug fixing) and /nacl-tl-ship (commit + push). Your job is orchestration: fetch context, synthesize the problem, delegate, and report.


Invocation

/nacl-tl-reopened                      # Interactive: list reopened tasks, user selects
/nacl-tl-reopened --all                # Process ALL reopened tasks sequentially
/nacl-tl-reopened --task ELE-644       # Process specific YouGile task by code
/nacl-tl-reopened UC028                # Process by UC ID (looks up in YouGile)
/nacl-tl-reopened --yes                # Skip USER GATE, auto-approve plans
/nacl-tl-reopened --auto-ship          # After fix, auto-ship (passes through to /nacl-tl-fix)
/nacl-tl-reopened --dry-run            # Fetch + context + plan only, no changes

Configuration Resolution

DataSource priority (check in order, use first found)
YouGile columnsconfig.yaml -> yougile.columns.reopened / in_work / dev_done
Module listconfig.yaml -> modules.*
Module stickersconfig.yaml -> yougile.stickers.module
Test commandconfig.yaml -> modules.[name].test_cmd > workspace package.json scripts.test (declared only — no npm test invention)
Build commandconfig.yaml -> modules.[name].build_cmd > workspace package.json scripts.build (declared only — no npm run build invention)

Declared commands only. If neither config.yaml -> modules.[name].test_cmd nor the workspace's package.json scripts.test exists, this skill halts as REOPENED HALTED — NO_INFRA (scripts.test undeclared). The same applies to the build command. The previous fallback npm test / fallback npm run build clauses are removed (Cross-cutting principle P2). | Git strategy | config.yaml -> git.strategy > modules.[name].git_strategy > fallback "feature-branch" | | Base branch | config.yaml -> git.main_branch > modules.[name].git_base_branch > fallback "main" |

If YouGile not configured -> accept task description from user as fallback input.


Workflow: 10 Steps (ALL MANDATORY)

Before each step, announce it: "Step N: [NAME]". This ensures no step is skipped.

Step 1: FETCH — announce: "Step 1: FETCH"

Goal: Identify which reopened tasks to process.

  1. Read config.yaml from project root for YouGile column IDs

  2. Fetch tasks from Reopened column:

    get_tasks(columnId: config.yougile.columns.reopened)
    
  3. Apply filters:

    • If --task <CODE> provided: filter by idTaskProject match
    • If UC ID provided (e.g., UC028): search task titles/descriptions for the UC reference
    • If --all: take all tasks
    • If no arguments: present task list to user, ask which to process
  4. If no tasks found in Reopened column:

    No reopened tasks found. Nothing to process.
    

    Stop execution.

Without YouGile: If config.yaml has no YouGile configured, prompt the user to describe the problem manually. The user's description becomes the "tester feedback" for subsequent steps.

Step 2: CONTEXT — announce: "Step 2: CONTEXT"

Goal: Understand exactly what failed and why, from the full task history.

For each task:

  1. Fetch task details:

    get_task(id=<taskId>) -> title, description, stickers
    
  2. Fetch ALL chat messages:

    get_task_messages(taskId=<id>) -> complete message history
    
  3. Parse messages for key markers (search in order of priority):

    MarkerSource skillWhat to extract
    "VERIFICATION REPORT" or "Автоматическая верификация"/nacl-tl-verify, /nacl-tl-verify-codeVerdict (PASS/FAIL), findings[], data flow issues
    "QA REPORT" or "qa-report"/nacl-tl-qaFailed scenarios, screenshots, acceptance criteria gaps
    Status: PASS line/nacl-tl-fix (Step 8)Fix level, files changed, regression test path, RED→GREEN
    Status: BLOCKED line/nacl-tl-fix (Step 8)Reason line, pre-existing failure list
    Status: UNVERIFIED line/nacl-tl-fix (Step 8)Reason line (no test exercises the change)
    Status: NO_INFRA line/nacl-tl-fix (Step 8)Affected workspace
    Status: RUNNER_BROKEN line/nacl-tl-fix (Step 8)Runner error detail
    Status: REGRESSION line/nacl-tl-fix (Step 8)New failures introduced, return-to-6f signal
    Note: report headline (FIX COMPLETE, FIX APPLIED — UNVERIFIED, etc.)decoration onlydo NOT classify from headline — parse Status: line
    "Отчёт разработки" or "Development report"/nacl-tl-ship, previous /nacl-tl-reopenedWhat was already attempted, files changed
    Other commentsAnalyst/PM/UserAdditional context, priority notes, clarifications
  4. Count previous rework iterations:

    • Search messages for "nacl-tl-reopened" or "Reopened task picked up"
    • If count >= 2: ESCALATE — do not auto-fix. Present to user:
      ⚠️ Task {CODE} has been through nacl-tl-reopened {N} times already.
      Previous fix attempts did not resolve the issue.
      Escalating to user for manual investigation.
      
      Stop processing this task. Move to next task (if --all).
  5. Synthesize problem description for /nacl-tl-fix:

    • Combine tester verdict, specific findings, file paths, and failed criteria
    • Format as a natural-language problem description (what /nacl-tl-fix expects as input)
    • Example: "nacl-tl-verify found FAIL: API endpoint POST /api/orders returns 500 when order.items is empty (file: src/routes/orders.ts:45). Acceptance criterion AC-3 not met: 'empty cart should show validation error, not crash'."

Step 3: DETECT MODULE — announce: "Step 3: DETECT MODULE"

Goal: Determine which module(s) the task affects.

Detection priority (use first match):

  1. YouGile sticker: If task has a module sticker (from config.yaml -> yougile.stickers.module.states), use it directly
  2. File paths in findings: If tester report references specific files (e.g., src/api/orders.ts), match against config.yaml -> modules.[name].path
  3. Keywords in title/description: Match against module names and paths from config.yaml -> modules
  4. Fallback: If only one module is configured, use it. If multiple and ambiguous, ask user.

Output:

Module detected: {module_name} ({config.yaml -> modules.[name].stack})
Path: {config.yaml -> modules.[name].path}

Step 4: CHECK PATH — announce: "Step 4: CHECK PATH"

Goal: Determine whether .tl/ task context exists.

  1. Check if .tl/tasks/ directory exists
  2. If it does, search for a matching task:
    • By UC ID: ls .tl/tasks/ | grep -i UC###
    • By task code: grep -r "<TASK_CODE>" .tl/tasks/
    • By keywords from task title across task-be.md, task-fe.md files

Path A — .tl/ task found:

  • Read available context files: task-be.md, task-fe.md, acceptance.md, api-contract.md, result-be.md, result-fe.md, qa-report.md
  • Cross-reference tester findings with acceptance criteria
  • Note which phases previously passed/failed in .tl/status.json
  • The UC ID becomes the primary identifier for downstream skills

Path B — no .tl/ context:

  • Task was likely created directly in YouGile (e.g., by /nacl-tl-qa bug auto-creation, or by a human)
  • Context comes entirely from YouGile chat messages (Step 2)
  • /nacl-tl-fix will handle this via its L3 path (no docs for area)

Step 5: PLAN — announce: "Step 5: PLAN (USER GATE)"

Goal: Present the fix plan for user approval.

Display (in user's language):

═══════════════════════════════════════════════════════
  REOPENED TASK — FIX PLAN
═══════════════════════════════════════════════════════

  Task: {CODE} — {title}
  Module: {module_name} ({stack})
  Path: {A (has .tl/ context) | B (YouGile-only context)}
  Previous rework attempts: {N}

  Problem (from tester feedback):
    {synthesized problem description from Step 2}

  Fix approach:
    → Delegate to /nacl-tl-fix "{synthesized description}"
    → /nacl-tl-fix will classify (L0/L1/L2/L3) and apply spec-first fix
    → Post-fix: /nacl-tl-review + /nacl-tl-stubs quality gates
    → Ship: /nacl-tl-ship → DevDone

  Affected files (from tester findings):
    - {file1.ts} — {issue description}
    - {file2.tsx} — {issue description}

  Proceed? [yes/no]
═══════════════════════════════════════════════════════

If --yes flag: Skip this step entirely, proceed to Step 6. If --dry-run flag: Display plan and STOP. Do not execute Steps 6-10. Otherwise: Wait for user confirmation.

Step 6: MOVE InWork — announce: "Step 6: MOVE InWork"

Goal: Signal that rework has started.

  1. Move task to InWork column:

    update_task(id=<taskId>, columnId: config.yougile.columns.in_work)
    
  2. Post pickup message to task chat:

    send_task_message(taskId, "🔄 Reopened task picked up for rework by /nacl-tl-reopened.
    Problem: {brief summary from Step 2}.
    Approach: /nacl-tl-fix → /nacl-tl-review → /nacl-tl-stubs → /nacl-tl-ship")
    

If YouGile not configured -> skip column move, log locally.

Step 7: FIX — announce: "Step 7: FIX"

Goal: Fix the issue by delegating to /nacl-tl-fix.

Invoke /nacl-tl-fix via Skill tool with the synthesized problem description from Step 2:

Skill: nacl-tl-fix
Args: "{synthesized problem description}"

Add flags as appropriate:

  • If --auto-ship was passed to /nacl-tl-reopened: add --auto-ship only if fix status is later confirmed PASS (see Step 7.5)
  • If Path A and fix is clearly code-only (tester found a specific code bug, no spec drift): consider --l1

Wait for /nacl-tl-fix to complete. Capture its full output, including:

  • Fix level (L0/L1/L2/L3)
  • Files changed
  • Tests added/updated
  • Status: <VALUE> line — the six-status value: PASS / BLOCKED / UNVERIFIED / NO_INFRA / RUNNER_BROKEN / REGRESSION (this is the authoritative classifier)
  • Regression test path — from the Tests: Regression test: field
  • RED→GREEN field — from the Tests: RED→GREEN: field
  • Report headline (FIX COMPLETE, FIX APPLIED — UNVERIFIED, FIX INCOMPLETE) — captured for context but NOT used for classification

Proceed to Step 7.5 immediately after /nacl-tl-fix completes.

Step 7.5: PARSE FIX STATUS — announce: "Step 7.5: PARSE FIX STATUS"

Goal: Branch based on the six-status value from /nacl-tl-fix Step 8.

Parsing rule — Status: line is the single source of truth

Scan the /nacl-tl-fix report output for a line matching exactly:

Status: <VALUE>

where <VALUE> is one of: PASS, BLOCKED, UNVERIFIED, NO_INFRA, RUNNER_BROKEN, REGRESSION.

  • The Status: line is machine-readable and authoritative. The report headline (e.g. FIX COMPLETE, FIX APPLIED — UNVERIFIED) is decoration only — do NOT classify from it.
  • If no Status: line is found, or the value is not in the vocabulary above:
    REOPENED HALTED — UNVERIFIED (fix report unparseable)
    
    The /nacl-tl-fix report contains no parseable "Status: <VALUE>" line.
    Cannot determine fix outcome. Do not ship.
    
    Action required: re-invoke /nacl-tl-fix and ensure it produces a complete Step 8 report.
    
    Post this advisory to YouGile task chat and halt. Do NOT proceed to Step 7.5.1 or Step 8.

Branch on the parsed <VALUE>:


Status: PASS (header: FIX COMPLETE)

→ Proceed to Step 8 (review + stubs) and Step 9 (ship). → If --auto-ship was passed and Step 8 passes, auto-ship is permitted in Step 9.


Status: BLOCKED (header: FIX APPLIED — UNVERIFIED, pre-existing unrelated failures)

The fix was applied and a test transitioned RED→GREEN, but pre-existing unrelated failures remain in the suite. These are baseline-confirmed (not introduced by this fix).

→ Post advisory to YouGile task chat (see template below). → Require explicit user acknowledgment before proceeding to Step 8. → Do NOT auto-ship in Step 9 regardless of --auto-ship flag. → Do NOT invoke /nacl-tl-review or /nacl-tl-stubs automatically; wait for user confirmation.

Advisory template:

⚠️ FIX APPLIED — BLOCKED
Fix was applied and its test transitioned RED→GREEN, but pre-existing failures remain in
the suite (baseline-confirmed unrelated to this fix).

Pre-existing failures: {list from nacl-tl-fix report}

Action required: confirm whether to proceed to review and ship with known pre-existing
failures, or investigate the failures first.
  (a) Proceed to review + ship — type "proceed"
  (b) Investigate pre-existing failures first — type "investigate"

Status: UNVERIFIED (header: FIX APPLIED — UNVERIFIED, no test exercises the change)

The fix was applied but no test exercises it. The import-grep heuristic found a test that imports the changed file but the test does not actually cover the bug.

→ Post advisory to YouGile task chat (see template below). → Do NOT proceed to auto-review or auto-ship. → Escalate to user with explicit message.

Advisory template:

⚠️ FIX APPLIED — UNVERIFIED
Fix was applied, but no test exercises the change. The fix cannot be machine-verified.

Reason: {reason line from nacl-tl-fix Step 8}

Options:
  (a) Write a regression test now:
        /nacl-tl-regression-test "{bug description}"
  (b) Accept the unverified fix and proceed manually — confirm "proceed unverified"

Do NOT proceed past this advisory without explicit user input.


Status: NO_INFRA (header: FIX APPLIED — UNVERIFIED, no test runner for this layer)

The affected workspace has no scripts.test. The fix was applied but cannot be machine-verified.

→ Post advisory to YouGile task chat. → Halt further automated steps. → Recommend the user adds test infrastructure.

Advisory template:

⚠️ FIX APPLIED — NO_INFRA
The workspace containing the changed files has no test runner (scripts.test missing).

Recommended next step:
  /nacl-tl-dev TECH-### "set up test runner for [workspace]"

After test infra is in place, re-run /nacl-tl-fix to add a regression test for this bug.
The fix can ship at your discretion if the change is small enough to review by eye.

Status: RUNNER_BROKEN (header: FIX APPLIED — UNVERIFIED, test runner could not execute)

The test runner could not start or execute any tests. This is likely a local L0 environment issue, not a code problem.

→ Post advisory to YouGile task chat. → Halt further automated steps. → Escalate as an infra problem.

Advisory template:

⚠️ FIX APPLIED — RUNNER_BROKEN
The test runner failed to execute. This is an infrastructure problem, not a code problem.

Recommended next step:
  /nacl-tl-diagnose
Do NOT ship the fix until the runner works again — there is no way to verify regressions.

Status: REGRESSION (header: FIX INCOMPLETE)

The fix introduced new test failures that were not in the baseline, or the regression test written for this bug is still RED after the fix was applied.

→ Post failure notice to YouGile task chat. → Halt immediately. Do NOT proceed to Step 8 or Step 9. → File the new failures as a new bug in YouGile task chat (advisory only — user decides whether to open a new task or fold it into the current fix iteration).

Failure notice template:

❌ FIX INCOMPLETE — REGRESSION
The fix introduced new test failures not present in the baseline, or the regression test
for this bug is still failing after the fix was applied.

New failures: {list from nacl-tl-fix report}

Action required: return to /nacl-tl-fix Step 6f to correct the fix.
Do NOT ship.

Step 7.5.1: VERIFY REGRESSION-TEST SEAM — announce: "Step 7.5.1: VERIFY REGRESSION-TEST SEAM"

Goal: Confirm that /nacl-tl-fix honored the test-author seam (Step 6d) by checking its report for regression-test evidence.

Only execute if Step 7.5 parsed a status other than NO_INFRA and other than RUNNER_BROKEN. (Those two statuses cannot produce a regression test by definition — skip this step for them and proceed to Step 8 branching as normal.)

Scan the /nacl-tl-fix Step 8 report for both of the following:

  1. Regression-test path — a file path under the Tests: / Regression test: section, e.g.:

    Regression test:  tests/orders/empty-cart.test.ts
    

    Accepted forms: any non-empty value that is not "none — UNVERIFIED" and not "n/a — NO_INFRA".

  2. RED→GREEN evidence — a line matching:

    RED→GREEN:  ✓ ...
    

    or prose equivalent confirming the test was RED before the fix and GREEN after.

If either element is absent:

REOPENED HALTED — UNVERIFIED (regression-test seam not honored)

The /nacl-tl-fix report does not cite a regression-test file path and/or RED→GREEN
transition. The fix-author seam (nacl-tl-regression-test, Step 6d of nacl-tl-fix)
may not have run.

Missing:
  {Regression-test path: absent | RED→GREEN evidence: absent}

Action required:
  (a) Re-invoke /nacl-tl-fix and ensure /nacl-tl-regression-test runs at Step 6d,
      OR
  (b) Manually invoke /nacl-tl-regression-test "{bug description}" to create
      a retroactive regression test, then confirm it transitions RED→GREEN.

Do NOT proceed to review or ship until evidence exists.

Post this advisory to YouGile task chat and halt. Do NOT proceed to Step 8.

If both elements are present: proceed to Step 8.


Step 8: REVIEW + STUBS — announce: "Step 8: REVIEW + STUBS"

Precondition: Only reached if Step 7.5 status is PASS, or the user explicitly confirmed "proceed" for a BLOCKED fix.

Re-run gate (mandatory before invoking /nacl-tl-review or /nacl-tl-stubs):

Re-run the test suite on the current (reopened) branch to guard against environment drift between the moment /nacl-tl-fix ran and now:

  1. Locate the workspace: find the nearest package.json walking up from any changed file.
  2. Read its scripts.test.
  3. Run it. Record pass/fail counts.

If the suite fails:

REOPENED INCOMPLETE — REGRESSION

Tests were passing when /nacl-tl-fix completed, but re-running them on the reopened
branch now produces failures.

Failures:
  {list of failing tests}

Action required: investigate the new failures before proceeding to review.
Do NOT invoke /nacl-tl-review or /nacl-tl-stubs. Do NOT ship.

Post this advisory to YouGile task chat and halt.

If scripts.test is missing → halt as REOPENED HALTED — NO_INFRA (scripts.test undeclared):

REOPENED HALTED — NO_INFRA

Re-run gate cannot execute: the workspace containing the changed files declares
no scripts.test. The previous "proceed to review with a warning" path is removed
(Cross-cutting principle P2 — declared workspace commands only).

Action required:
  /nacl-tl-dev TECH-### "set up test runner for [workspace]"

Do NOT proceed to /nacl-tl-review or /nacl-tl-stubs without a re-run baseline.

Post this advisory to YouGile task chat and halt. Do NOT proceed to Step 8 review or Step 9 ship.

If the suite passes: proceed to review and stubs below.

Goal: Quality gates after the fix.

Review (Path A with UC ID):

Skill: nacl-tl-review
Args: "UC### --be"    (if BE fix)
Args: "UC### --fe"    (if FE fix)

Review (Path B without UC ID):

  • /nacl-tl-fix already includes a validation step (Step 7 in its workflow)
  • Run module tests as additional verification:
    cd <module_path> && <test_cmd>
    

Stub scan (Path A):

Skill: nacl-tl-stubs
Args: "UC###"

Stub scan (Path B):

  • Scan changed files:
    grep -rn "TODO\|FIXME\|STUB\|MOCK\|HACK\|throw new Error('Not implemented')\|return {} as any\|console\.log" <changed-files>
    
  • CRITICAL stubs -> fix before proceeding
  • WARNING stubs -> note in report

Retry loop: If review rejects, fix issues and re-review. Max 2 retries within nacl-tl-reopened (since /nacl-tl-fix already iterated internally). After 2 rejections:

  • Post failure details to YouGile
  • Leave in InWork
  • Escalate to user

Step 9: SHIP — announce: "Step 9: SHIP"

Precondition (auto-ship gate): Auto-ship is only permitted when Step 7.5 status was PASS. For BLOCKED fixes that the user confirmed, ship proceeds but without auto-ship — always require explicit /nacl-tl-ship invocation or manual user confirmation.

If /nacl-tl-fix already shipped via --auto-ship AND Step 7.5 status was PASS: Skip to the DevDone move.

Otherwise:

Skill: nacl-tl-ship
Args: "{task_code} fix: {brief description from nacl-tl-fix report}"

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
27
Forks
4
Last commit
Sep 2026
Advanced
Item type
skill
Key
nacl-tl-reopened
Source
github.com/itsalt/nacl