Skill v1.0.1
currentAutomated scan100/100+2 new
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 --hardis invoked and task type iscslib- 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:
task_data=$(jq -r --argjson num "$task_number" \'.active_projects[] | select(.project_number == $num)' \specs/state.json)if [ -z "$task_data" ]; thenreturn error "Task $task_number not found"fitask_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:
session_flag_file="/tmp/.hard-mode-notified-${SESSION_ID:-$$}"if [ ! -f "$session_flag_file" ]; thenecho "[hard-mode] Hard mode active (cslib research). Cost: ~3-5x standard." >&2touch "$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):
source .claude/scripts/skill-base.shpadded_num=$(printf "%03d" "$task_number")skill_name="skill-cslib-research-hard"operation="research"
Stage 3a: Read Artifact Number
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" ]; thenpadded_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))fiartifact_padded=$(printf "%02d" "$artifact_number")
Stage 4a: Memory Retrieval (Auto)
if [ "$clean_flag" != "true" ]; thenmemory_context=$(bash .claude/scripts/memory-retrieve.sh "$description" "$task_type" "$focus_prompt" 2>/dev/null) || memory_context=""fi
# Literature briefing injection (independent of clean_flag)lit_context=""if [ "$lit_flag" = "true" ]; thenlit_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
{"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
format_content=$(cat .claude/context/formats/report-format.md)
Stage 5: Invoke Subagent
Tool: AgentParameters:- 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_contextis non-empty, include it as a<memory-context>block after the format specification. - If
lit_contextis 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.
metadata_file="specs/${padded_num}_${project_name}/.return-meta.json"if [ -f "$metadata_file" ] && jq empty "$metadata_file" 2>/dev/null; thenstatus=$(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")elsestatus="failed"adversarial_triggered="false"fi# Log adversarial verification statusecho "[hard-mode] Adversarial verification triggered: $adversarial_triggered" >&2
Stage 6a: Validate Artifact Content (non-blocking)
if [ "$status" = "researched" ] && [ -n "$artifact_path" ] && [ -f "$artifact_path" ]; thenbash .claude/scripts/validate-artifact.sh "$artifact_path" report --fix || truefi
Stage 7: Update Task Status (Postflight)
if [ "$status" = "researched" ]; thenbash .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
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):
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:
- Edit Lean/report files - All research work is done by agent
- Run `lake build` or other Lean tooling - Verification is agent work
- Use MCP or WebSearch tools - Research tools are for agent use only
- Analyze or grep source - Analysis is agent work
- Write reports - Artifact creation is done by agent
PROHIBITION: If the subagent returned partial or failed status, the lead skill MUST NOTattempt to continue, complete, or "fill in" the subagent's work. Report the partial/failedstatus and let the user re-run/research --hardto resume.
The postflight phase is LIMITED TO:
- Reading agent metadata file
- Calling
update-task-status.shfor status updates (state.json + TODO.md) - Linking artifacts in state.json
- Cleanup of temp/marker files
Reference: @.claude/context/standards/postflight-tool-restrictions.md