<< All versions

Skill v1.0.1

currentAutomated scan100/100
benbrastmckie/nvim/skill-cslib-research-hard

+2 new

──Details
PublishedOctober 28, 2026 at 07:28 AM
Content Hashsha256:77314ec8ce38dd70...
Git SHA30b9df59c7f3
Bump Typepatch
Compare with v1.0.0
──Files
Files (1 file, 9.1 KB)
SKILL.md9.1 KBactive
SKILL.md · 297 lines · 9.1 KB

name: skill-cslib-research-hard description: Research CSLib formalization patterns with hard-mode contracts (H2 anti-analysis, H3 reference grounding with BibKey verification, H4 adversarial verification). Invoke for --hard cslib research tasks. allowed-tools: Agent, Bash, Edit, Read, Write metadata: version: "1.0.1"


CSLib Research Hard Skill

Hard-mode wrapper that delegates CSLib research to cslib-research-hard-agent subagent. Extends skill-cslib-research with hard-mode behavioral contracts (H2, H3, H4) and postflight logging of adversarial verification status.

Relationship to base skill: This skill is structurally identical to skill-cslib-research except it dispatches to cslib-research-hard-agent and logs adversarial_verification_triggered. Maintenance note: changes to skill-cslib-research postflight should be mirrored here.

Context References

Reference (do not load eagerly):

  • Path: .claude/context/formats/return-metadata-file.md - Metadata file schema
  • Path: .claude/context/contracts/anti-analysis.md - H2 contract (loaded by agent)
  • Path: .claude/context/contracts/reference-grounding.md - H3 contract (loaded by agent)
  • Path: .claude/extensions/cslib/context/project/cslib/standards/citation-conventions.md - BibKey format (loaded by agent)
  • Path: .claude/context/patterns/postflight-control.md - Marker file protocol

Trigger Conditions

This skill activates when:

  • /research N --hard is invoked and task type is cslib
  • Not currently routing-reachable: the routing-ladder collapse retired the skill-side routing/

routing_hard manifest blocks and their resolver. This skill is pending migration onto hard_contracts (a separate, not-yet-dispatched follow-on); until then it is reachable only by direct invocation, not through /research --hard dispatch


Execution Flow

Stage 1: Input Validation

Validate required inputs:

bash
task_data=$(jq -r --argjson num "$task_number" \
'.active_projects[] | select(.project_number == $num)' \
specs/state.json)
if [ -z "$task_data" ]; then
return error "Task $task_number not found"
fi
task_type=$(echo "$task_data" | jq -r '.task_type // "general"')
status=$(echo "$task_data" | jq -r '.status')
project_name=$(echo "$task_data" | jq -r '.project_name')
description=$(echo "$task_data" | jq -r '.description // ""')

Stage 1.5: Hard-Mode Cost Note

Emit one-time cost note on first hard-mode invocation:

bash
session_flag_file="/tmp/.hard-mode-notified-${SESSION_ID:-$$}"
if [ ! -f "$session_flag_file" ]; then
echo "[hard-mode] Hard mode active (cslib research). Cost: ~3-5x standard." >&2
touch "$session_flag_file"
fi

Stage 2 + Stage 3: Preflight Status Update and Postflight Marker

Source skill-base.sh once, then follow @.claude/context/patterns/skill-preflight-flow.md in full for Stage 2 (preflight status update) and Stage 3 (marker creation):

bash
source .claude/scripts/skill-base.sh
padded_num=$(printf "%03d" "$task_number")
skill_name="skill-cslib-research-hard"
operation="research"

Stage 3a: Read Artifact Number

bash
artifact_number=$(jq -r --argjson num "$task_number" \
'.active_projects[] | select(.project_number == $num) | .next_artifact_number // 1' \
specs/state.json)
if [ "$artifact_number" = "null" ] || [ -z "$artifact_number" ]; then
padded_num=$(printf "%03d" "$task_number")
count=$(ls "specs/${padded_num}_${project_name}/reports/"*[0-9][0-9]*.md 2>/dev/null | wc -l)
artifact_number=$((count + 1))
fi
artifact_padded=$(printf "%02d" "$artifact_number")

Stage 4a: Memory Retrieval (Auto)

bash
if [ "$clean_flag" != "true" ]; then
memory_context=$(bash .claude/scripts/memory-retrieve.sh "$description" "$task_type" "$focus_prompt" 2>/dev/null) || memory_context=""
fi
bash
# Literature briefing injection (independent of clean_flag)
lit_context=""
if [ "$lit_flag" = "true" ]; then
lit_context=$(bash .claude/scripts/literature-briefing.sh 2>/dev/null) || lit_context=""
fi
# lit_context will be empty string if:
# - lit_flag is not "true" (skipped)
# - specs/literature/ sub-index is empty or missing
# - script exited with error

Note: lit_flag is independent of clean_flag. Using --clean --lit suppresses memory retrieval but still injects literature briefing. Literature briefing is gated solely on lit_flag == "true".


Stage 4: Prepare Delegation Context

json
{
"session_id": "{session_id}",
"delegation_depth": 1,
"delegation_path": ["orchestrator", "research", "skill-cslib-research-hard"],
"timeout": 3600,
"task_context": {
"task_number": N,
"task_name": "{project_name}",
"description": "{description}",
"task_type": "cslib"
},
"artifact_number": "{artifact_number}",
"focus_prompt": "{optional focus}",
"effort_flag": "hard",
"model_flag": "{model_flag from command, null if not set}",
"roadmap_path": "specs/ROADMAP.md",
"metadata_file_path": "specs/{NNN}_{SLUG}/.return-meta.json"
}

Stage 4b: Read Format Specification

bash
format_content=$(cat .claude/context/formats/report-format.md)

Stage 5: Invoke Subagent

Tool: Agent
Parameters:
- subagent_type: "cslib-research-hard-agent"
- prompt: [task_context, delegation_context, format specification, memory_context, lit_context, focus]
- description: "Execute hard-mode CSLib research for task {N}"

Include format specification, memory context, and literature briefing in prompt.

  • If memory_context is non-empty, include it as a <memory-context> block after the format specification.
  • If lit_context is non-empty, include it as a <literature-briefing> block after the memory context.
  • Do NOT inject empty blocks when content is empty.

Stage 5b: Self-Execution Fallback

If Agent tool was not used, write .return-meta.json with status "researched" before postflight.


Postflight (ALWAYS EXECUTE)

Stage 6: Parse Subagent Return

Read metadata file and extract: status, artifact_path, artifact_type, artifact_summary, memory_candidates, and adversarial_verification_triggered.

bash
metadata_file="specs/${padded_num}_${project_name}/.return-meta.json"
if [ -f "$metadata_file" ] && jq empty "$metadata_file" 2>/dev/null; then
status=$(jq -r '.status' "$metadata_file")
artifact_path=$(jq -r '.artifacts[0].path // ""' "$metadata_file")
artifact_type=$(jq -r '.artifacts[0].type // ""' "$metadata_file")
artifact_summary=$(jq -r '.artifacts[0].summary // ""' "$metadata_file")
memory_candidates=$(jq -c '.memory_candidates // []' "$metadata_file")
adversarial_triggered=$(jq -r '.adversarial_verification_triggered // false' "$metadata_file")
else
status="failed"
adversarial_triggered="false"
fi
# Log adversarial verification status
echo "[hard-mode] Adversarial verification triggered: $adversarial_triggered" >&2

Stage 6a: Validate Artifact Content (non-blocking)

bash
if [ "$status" = "researched" ] && [ -n "$artifact_path" ] && [ -f "$artifact_path" ]; then
bash .claude/scripts/validate-artifact.sh "$artifact_path" report --fix || true
fi

Stage 7: Update Task Status (Postflight)

bash
if [ "$status" = "researched" ]; then
bash .claude/scripts/update-task-status.sh postflight "$task_number" research "$session_id"
bash .claude/scripts/state-write.sh \
'(.active_projects[] | select(.project_number == $num)).next_artifact_number =
(((.active_projects[] | select(.project_number == $num)).next_artifact_number // 1) + 1)' \
--session-id "$session_id" \
--argjson num "$task_number"
fi

Stage 7a: Propagate Memory Candidates

Same as skill-cslib-research Stage 7a.


Stage 8: Link Artifacts

Same as skill-cslib-research Stage 8 (two-step jq pattern for Issue #1132 safety).


Stage 8a: Lifecycle TTS Notification

bash
lifecycle_script=".claude/scripts/lifecycle-notify.sh"
if [ -f "$lifecycle_script" ]; then bash "$lifecycle_script" "$status" & fi

Stage 9: Cleanup

Follow @.claude/context/patterns/skill-postflight-flow.md's Stage 9 (cleanup):

bash
skill_cleanup "$padded_num" "$project_name"

MUST NOT (Postflight Boundary)

After the agent returns -- whether with status researched, partial, or failed -- this skill MUST proceed immediately to postflight (Stage 6). The skill MUST NOT:

  1. Edit Lean/report files - All research work is done by agent
  2. Run `lake build` or other Lean tooling - Verification is agent work
  3. Use MCP or WebSearch tools - Research tools are for agent use only
  4. Analyze or grep source - Analysis is agent work
  5. Write reports - Artifact creation is done by agent
PROHIBITION: If the subagent returned partial or failed status, the lead skill MUST NOT
attempt to continue, complete, or "fill in" the subagent's work. Report the partial/failed
status and let the user re-run /research --hard to resume.

The postflight phase is LIMITED TO:

  • Reading agent metadata file
  • Calling update-task-status.sh for status updates (state.json + TODO.md)
  • Linking artifacts in state.json
  • Cleanup of temp/marker files

Reference: @.claude/context/standards/postflight-tool-restrictions.md

← v1.0.0All versions