Claude Cursor Skill

release-governance

Use when preparing, auditing, releasing, PDF-hardening, or rebuttal-hardening academic manuscripts, datasets, artifacts, reviewer packets, or claim registers involving multiple refs, local assets, human labels, agent-assisted drafts, wide tables, figure provenance, submission PDF

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download yha9806-academic-writing-toolkit-archive_skills_release-governance-184e482.zip · 11 KB
Part of yha9806/academic-writing-toolkit — 21 skills

Install

skills CLI npx skills add https://github.com/yha9806/academic-writing-toolkit/tree/main/archive/skills/release-governance
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install yha9806-academic-writing-toolkit@llmmart
Git git clone https://github.com/yha9806/academic-writing-toolkit.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole yha9806/academic-writing-toolkit collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

/release-governance - Release Evidence Governance

Purpose

Prepare release-facing academic artifacts with explicit evidence control. The core rule is:

release truth = ref + artifact + gate

Do not infer release truth from memory, a branch name, a pull request title, a local file cache, or an agent draft.

Trigger Words

This skill activates on: release governance, release evidence, camera-ready, rebuttal packet, artifact packet, claim ledger, human evidence gate, release packet, /release-governance.

Core Rules

  1. Name the exact ref, artifact, and gate behind every release-facing claim.
  2. Keep draft advisory evidence, verified artifacts, and final human evidence separate.
  3. Do not promote agent or Gemini review output into final evidence.
  4. Do not treat ignored, untracked, cached, or local-only assets as submitted artifacts.
  5. Do not treat a repository check as venue, submission-system, or scientific compliance.
  6. If two refs diverge, name both and scope which one is canonical for each artifact.
  7. If a worktree is dirty, list the dirty paths and mark the packet as draft until changes are committed or explicitly scoped.
  8. Freeze evidence and argument separately. An evidence ref or result snapshot does not authorise an unapproved narrative, and an approved manuscript spine does not validate changed numbers.

Evidence States

Use references/evidence_state_schema.md for the shared states:

  • draft_advisory
  • verified_artifact
  • human_final

human_final requires an explicit human confirmation gate when the project schema provides one. Agent drafts, reviewer suggestions, generated summaries, simulations, and prefilled labels stay draft_advisory.

Workflow

1. Declare Scope

Create release/release_scope.md with scope date, artifact name, intended use, included refs, excluded refs, the evidence baseline, the argument baseline, and the highest-risk open question. For a manuscript, the evidence baseline names the frozen results, data/configuration, and artifact refs; the argument baseline names the author-approved intent and manuscript version.

2. Map Repository Truth

Run narrow ref checks before reading a checkout as final state:

git fetch --all --prune
git status --short --branch
git worktree list --porcelain
git branch --all --verbose --no-abbrev

Create release/canonical_refs.csv. Detached HEADs are acceptable only when the exact SHA is recorded.

3. Inventory Assets

Create release/local_asset_inventory.csv to separate tracked, ignored, untracked, external-store, and generated assets. Local assets may support review, but release claims require an artifact anchor or explicit exclusion.

4. Anchor Artifacts And Claims

Create:

  • release/artifact_anchors.csv
  • release/claim_ledger.csv
  • release/evidence_gates.csv

Every paper-facing number, qualitative conclusion, table value, figure, dataset count, and human-label claim should point to the artifact and gate that support it.

5. Review Advisory Evidence

Gemini or another agent may review the scope, packet, or diff, but its result is advisory. Record advisory review in the verification report without changing any evidence state to human_final.

5.5 Reframe And PDF-Harden Manuscripts

When a manuscript draft reads like a module inventory, project report, internal validation packet, or artifact dump, use references/manuscript_reframing_patterns.md before final release checks. Apply it to separate the scientific gap, contribution chain, results narrative, main-text table design, figure roles, PDF/render checks, generative-component positioning, and submission-readiness blockers.

6. Verify Packet

Use references/release_workflow_templates.md for columns and report structure. If Python is available, run:

python {skill_dir}/scripts/check_release_packet.py <project_root>

The helper checks required packet files, CSV/JSON/YAML readability, evidence-state values, required columns, local absolute paths, and obvious template markers. YAML files use PyYAML when installed; otherwise the helper applies a basic local syntax check for simple mappings and lists. It does not run experiments, access networks, push branches, or judge scientific validity.

Stop Conditions

Stop and report a blocker if:

  • a final claim depends on a dirty or ambiguous ref
  • a human-label claim lacks a human confirmation gate
  • a release artifact exists only as an ignored, untracked, cache, or local-only file
  • a count comes from a pointer, stub, generated preview, or non-canonical ref
  • a manuscript release cannot identify both its evidence baseline and its author-approved argument baseline
  • a draft pull request, closed-unmerged pull request, or advisory review is being treated as final release state
  • the packet validator reports issues that affect release-facing claims
Files (academic-writing-toolkit)
  • references
    • evidence_state_schema.md 2.7 KB
      # Release Evidence State Schema
      
      Release governance uses three states so agent-assisted drafts, verified files, and final human evidence stay visibly separate.
      
      | State | Meaning | Allowed use | Promotion gate |
      | --- | --- | --- | --- |
      | `draft_advisory` | Agent review, Gemini review, prefill output, simulation, draft label, reviewer note, or provisional working file. | Planning, triage, risk review, candidate wording, and follow-up tracking. | Cannot support final claims. Requires artifact verification or human confirmation before promotion. |
      | `verified_artifact` | A concrete file, count, checksum, manifest, figure, table, dataset slice, or export has been checked against an exact ref or named external artifact. | Artifact existence, provenance, counts, checksums, and bounded claims within the verified scope. | Requires a command, checksum, manifest, or manual artifact check recorded in the packet. |
      | `human_final` | A human reviewer, adjudicator, coordinator, or author has explicitly confirmed the evidence according to the project gate. | Human-label claims, adjudication conclusions, reviewer decisions, final wording approvals, and release sign-off. | Requires explicit human confirmation fields, reviewer identity or role, review date, and matching denominator or scope. |
      
      ## Minimal Packet Schema
      
      Required files:
      
      - `release/release_scope.md`
      - `release/canonical_refs.csv`
      - `release/local_asset_inventory.csv`
      - `release/artifact_anchors.csv`
      - `release/evidence_gates.csv`
      - `release/claim_ledger.csv`
      - `release/verification_report.md`
      
      Required CSV columns:
      
      | File | Columns |
      | --- | --- |
      | `canonical_refs.csv` | `ref_name`, `sha`, `date`, `status`, `canonical_for`, `caveat` |
      | `local_asset_inventory.csv` | `path`, `status`, `file_count`, `size`, `role`, `release_action` |
      | `artifact_anchors.csv` | `artifact_id`, `source_ref`, `source_path`, `count_or_checksum`, `evidence_state`, `verified_by`, `claim_supported` |
      | `evidence_gates.csv` | `gate_id`, `artifact_id`, `evidence_state`, `human_confirmed`, `reviewer`, `review_date`, `validator`, `status` |
      | `claim_ledger.csv` | `claim_id`, `claim_text`, `artifact_ids`, `evidence_state`, `denominator`, `scope_boundary`, `human_gate_required`, `status` |
      
      ## Gate Rules
      
      1. `draft_advisory` rows must not be described as final evidence.
      2. `verified_artifact` rows need an exact ref, artifact path, manifest, count, checksum, or recorded manual check.
      3. `human_final` rows need explicit confirmation, reviewer or coordinator identity, review date, and a denominator or scope boundary.
      4. Agent or Gemini review can flag risks, but it cannot promote any row to `human_final`.
      5. Repository checks prove repository state only; they do not prove venue, ethics, licensing, or scientific compliance.
      
    • manuscript_reframing_patterns.md 8 KB
      # Manuscript Reframing Patterns
      
      Use this reference when a draft reads like an engineering report, module inventory, internal validation packet, or project status report rather than a scientific manuscript.
      
      ## Core Reframing Rule
      
      Write around the scientific problem, not the implementation inventory.
      
      Bad center of gravity:
      
      ```text
      We built module A, module B, module C, reports, figures, and generative-model tests.
      ```
      
      Better center of gravity:
      
      ```text
      The field assumes X, but downstream use requires Y. This work defines the missing interface, evaluates the reliability gap, and shows how conservative routing changes what can be safely surfaced.
      ```
      
      ## Problem First, Modules Second
      
      Before rewriting, force the manuscript into one sentence:
      
      ```text
      This paper solves [specific reliability / evidence / workflow gap] between [upstream technical output] and [downstream scientific or operator-facing use].
      ```
      
      For action-adjacent or human-facing AI manuscripts, prefer problem statements such as:
      
      - Segmentation outputs are not automatically evidence objects.
      - High mask metrics do not guarantee downstream task reliability.
      - Uncertain perception should be routed, not silently converted into support.
      - Reports and interfaces need explicit claim boundaries.
      - Machine-readable records must not imply execution permission unless validated for that role.
      
      ## Contribution Shape
      
      Avoid long module lists. Use a small contribution chain that explains why each piece exists.
      
      Recommended structure:
      
      1. Problem formulation: define the reliability or evidence gap.
      2. Interface definition: convert raw outputs into structured evidence objects.
      3. Bottleneck measurement: quantify where upstream metrics and downstream claims diverge.
      4. Conservative routing: expose reliability-coverage trade-offs and review capture.
      5. Bounded output: produce traceable reports or records without unsupported claims.
      
      Each contribution should answer: what gap does this close, and what evidence supports it?
      
      ## Results Narrative
      
      Do not present results as raw artifact counts or CSV-style metrics. Use result paragraphs that explain the transition:
      
      - Perception metric: what the frozen model achieved.
      - Direct conversion: what fails when outputs are treated as task evidence.
      - Gate effect: how selective support changes agreement and coverage.
      - Failure taxonomy: which bottleneck dominates.
      - Bounded output audit: whether generated reports or records stayed within evidence.
      
      Keep exact numbers in tables. In prose, translate audit-zero metrics into natural language when clearer:
      
      ```text
      The audit detected no unsupported statements, contradictions, or prohibited action claims.
      ```
      
      instead of
      
      ```text
      unsupported rate 0.000, contradiction rate 0.000, prohibited rate 0.000
      ```
      
      ## Handling Low Values
      
      Low support or coverage is not automatically a failure. Explain whether it means:
      
      - the model missed evidence,
      - geometry conversion failed,
      - the gate correctly withheld weak evidence,
      - a task is intentionally conservative,
      - or the dataset lacks enough evaluable cases.
      
      Use wording such as:
      
      ```text
      Low supported coverage indicates conservative evidence routing under the frozen gate, not a direct measure of segmentation accuracy.
      ```
      
      ## Generative-Model Positioning
      
      Do not let generative-model experiments steal the manuscript thesis unless they are the locked primary experiment.
      
      Safe hierarchy:
      
      - Primary result: deterministic, evidence-grounded, rule-based, or schema-validated workflow.
      - Supplementary extension: frozen text-only or image-conditioned formatting tests.
      - Future work: live clinical reporting, open-ended reasoning, or deployment validation.
      
      Boundary phrases:
      
      - format structured evidence only
      - no new findings
      - no geometry recomputation
      - no gate override
      - no action command
      - no clinical or execution decision
      
      Avoid phrases that imply clinical reasoning, autonomous operation, controller updates, or action recommendations unless explicitly negated as non-goals.
      
      ## Figure Design
      
      Figures must carry the argument, not decorate the paper.
      
      Useful figure roles:
      
      1. Gap figure: show traditional pipeline versus proposed evidence-routed pipeline.
      2. Dataset/evidence standard figure: show source images, annotation states, and evidence products.
      3. Boundary figure: show what may pass through the interface and what is blocked.
      4. Real-example figure: show actual cases where visual plausibility and task evidence diverge.
      
      Keep small operational details in captions or supplement. Avoid tiny file names, internal IDs, dense JSON fragments, or floating checklist boxes inside figures.
      
      ### Figure Evidence Boundaries
      
      Do not let a figure imply stronger evidence than the artifact supports.
      
      - Use `panel`, `evidence construction panel`, `record-grounded replay panel`, or another function-specific label when the figure explains an evidence interface rather than showing raw empirical imagery.
      - Avoid `schematic`, `synthetic`, and `proxy` in submission-facing captions when those words make the figure look like a placeholder or weaken confidence in the data source.
      - Do not call a panel `raw microscopy`, `real replay`, or `ground truth` unless it is anchored to the actual locked artifact.
      - State what the figure reads from: stored evidence fields, gated records, replay overlays, boundary cards, or raw image data.
      - If no locked raw image panel exists, say the limitation in status notes or cover materials; do not smuggle it into a caption as if the figure were final empirical evidence.
      
      ## Table Design
      
      Main tables should be compact and interpretation-led.
      
      - Bold key locked values if journal style permits.
      - Move wide per-case/per-item logs to supplement.
      - Avoid raw CSV-style tables in the main manuscript.
      - If a denominator is small, say so next to the value.
      - If confidence intervals are descriptive only, label them as such.
      
      ### Main-Text Table Hardening
      
      Main-text tables should be rewritten for the paper, not copied from reproducibility artifacts.
      
      - Remove local paths, source columns, representative case IDs, filenames, JSON field names, and internal snake_case headers from main-text tables.
      - Convert raw artifact tables into compact reader-facing summaries with title-case headers and interpretation columns.
      - Keep only fields needed to answer the research question; move traceability fields to source maps, appendices, or reproducibility packages.
      - Prefer p-column wrapping and fewer columns over `\resizebox{\linewidth}{!}`. A table that fits by becoming unreadable has not been fixed.
      - Replace slash-heavy or unbreakable tokens when they cause layout issues, e.g. use `oocyte and oolemma geometry` rather than `oocyte/oolemma geometry`.
      - Treat tables that render as tiny bands, illegible text, or dense horizontal strips as blockers even if LaTeX reports no overfull warning.
      
      ### PDF Artifact Hygiene
      
      Before calling a manuscript PDF ready for review, verify the rendered PDF, not only the source files.
      
      - Compile until the final log has no undefined citations, undefined references, or overfull table warnings.
      - Render the PDF pages to images and inspect a contact sheet plus any table/figure-heavy pages at full size.
      - Extract PDF text and scan for stale version markers, placeholder terms, local paths, `\textbackslash`, raw snake_case fields, and copied table-number prefixes.
      - Use explicit required/forbidden marker checks for known review issues, such as required figure captions and forbidden placeholder wording.
      - Keep final generated PDFs outside sync-sensitive paths when requested or when sync/permission problems are likely; use a temp or explicit release directory instead.
      
      ## Submission Readiness Gate
      
      A draft can be scientifically improved but still not submission-ready. Check separately:
      
      - author list and affiliations
      - ethics approval or waiver statement
      - funding
      - competing interests
      - CRediT roles
      - data/code availability
      - reference verification
      - figure source provenance
      - no placeholders in the main manuscript
      
      Classify honestly:
      
      - supervisor-review ready
      - submission-prep ready
      - submission ready
      
      Do not call a paper submission-ready while metadata, ethics, data availability, or references remain unresolved.
      
    • release_workflow_templates.md 3.3 KB
      # Release Workflow Templates
      
      These templates are intentionally file-driven. They are for manuscripts, datasets, review packets, artifact bundles, claim registers, rebuttal packages, and camera-ready checks.
      
      ## Scope
      
      `release/release_scope.md`
      
      ```text
      # Release Scope
      
      Scope date: 2026-05-31
      Paper/artifact: Generic review packet
      Deadline/use: collaborator handoff
      Included refs: refs/heads/main at abcdef1234567890
      Excluded refs: none
      Evidence baseline: results/table snapshot or artifact ref at abcdef1234567890
      Argument baseline: author-approved intent and manuscript version
      Open question: whether an optional asset should stay local-only
      ```
      
      ## Canonical Refs
      
      `release/canonical_refs.csv`
      
      ```text
      ref_name,sha,date,status,canonical_for,caveat
      main,abcdef1234567890,2026-05-31,clean,manuscript,none
      ```
      
      ## Local Asset Inventory
      
      `release/local_asset_inventory.csv`
      
      ```text
      path,status,file_count,size,role,release_action
      figures/source/tracked.png,tracked,1,42K,figure source,keep tracked
      data/private-cache,ignored,120,80M,local review cache,exclude and document boundary
      ```
      
      Allowed status values can be project-specific, but common values are `tracked`, `ignored`, `untracked`, `external-store`, and `generated`.
      
      ## Artifact Anchors
      
      `release/artifact_anchors.csv`
      
      ```text
      artifact_id,source_ref,source_path,count_or_checksum,evidence_state,verified_by,claim_supported
      fig1,main,figures/source/tracked.png,sha256:abc,verified_artifact,manual checksum,figure provenance
      ```
      
      ## Evidence Gates
      
      `release/evidence_gates.csv`
      
      ```text
      gate_id,artifact_id,evidence_state,human_confirmed,reviewer,review_date,validator,status
      gate1,fig1,human_final,true,Reviewer One,2026-05-31,manual packet review,passed
      ```
      
      Use `draft_advisory` for agent or Gemini reviews. Use `verified_artifact` for deterministic artifact checks. Use `human_final` only for explicit human confirmation.
      
      ## Claim Ledger
      
      `release/claim_ledger.csv`
      
      ```text
      claim_id,claim_text,artifact_ids,evidence_state,denominator,scope_boundary,human_gate_required,status
      c1,The figure is anchored to a tracked source artifact,fig1,verified_artifact,one figure,provenance only,false,supported
      ```
      
      Check every row for:
      
      - stale denominators
      - subset-to-universe inflation
      - "final", "submitted", "merged", or "human" wording unsupported by the gate
      - local-only assets used as if they were release artifacts
      - advisory reviews used as final evidence
      
      ## Verification Report
      
      `release/verification_report.md`
      
      ```text
      # Verification Report
      
      Canonical refs:
      - main at abcdef1234567890 -> manuscript and tracked artifacts
      
      Advisory reviews:
      - Gemini scope review -> risks reviewed; no evidence-state promotion
      
      Verification:
      - python .claude/skills/release-governance/scripts/check_release_packet.py . -> clean
      - git diff --check -> clean
      
      Residual risk:
      - Optional external asset still needs owner decision before submission.
      ```
      
      ## Handoff Packet
      
      End release or rebuttal handoff with:
      
      | Item | Location | Ref/SHA | Owner | Next action |
      | --- | --- | --- | --- | --- |
      | Manuscript | `chapters/` or final export | exact SHA | author | final venue checklist |
      | Artifact manifest | `release/artifact_anchors.csv` | exact SHA | maintainer | checksum review |
      | Claim ledger | `release/claim_ledger.csv` | exact SHA | reviewer | approve or revise unsupported claims |
      
  • scripts
    • check_release_packet.py 8.5 KB
      #!/usr/bin/env python3
      """Lightweight validation for release-governance packets."""
      
      from __future__ import annotations
      
      import argparse
      import csv
      import json
      import re
      import sys
      from pathlib import Path
      from typing import Dict, Iterable, List, Optional, Sequence, Tuple
      
      
      ALLOWED_EVIDENCE_STATES = {"draft_advisory", "verified_artifact", "human_final"}
      
      REQUIRED_FILES: Dict[str, Sequence[str]] = {
          "release/release_scope.md": (),
          "release/canonical_refs.csv": ("ref_name", "sha", "date", "status", "canonical_for", "caveat"),
          "release/local_asset_inventory.csv": ("path", "status", "file_count", "size", "role", "release_action"),
          "release/artifact_anchors.csv": (
              "artifact_id",
              "source_ref",
              "source_path",
              "count_or_checksum",
              "evidence_state",
              "verified_by",
              "claim_supported",
          ),
          "release/evidence_gates.csv": (
              "gate_id",
              "artifact_id",
              "evidence_state",
              "human_confirmed",
              "reviewer",
              "review_date",
              "validator",
              "status",
          ),
          "release/claim_ledger.csv": (
              "claim_id",
              "claim_text",
              "artifact_ids",
              "evidence_state",
              "denominator",
              "scope_boundary",
              "human_gate_required",
              "status",
          ),
          "release/verification_report.md": (),
      }
      
      TEXT_EXTENSIONS = {".csv", ".json", ".md", ".txt", ".yaml", ".yml"}
      STRUCTURED_EXTENSIONS = {".csv", ".json", ".yaml", ".yml"}
      
      UNRESOLVED_CJK_MARKERS = "|".join((chr(0x5F85) + chr(0x8865), chr(0x5F85) + chr(0x5B9A)))
      MARKER_RE = re.compile(
          r"\b(to\s*do|tbd|fix\s*me|xxx|replace me|fill in|pending update|placeholder|path/to|sample only)\b|"
          + UNRESOLVED_CJK_MARKERS,
          re.IGNORECASE,
      )
      LOCAL_PATH_RE = re.compile(
          r"(^|[\s'\"(,;:])((/[Uu]sers|/[Hh]ome|/[Pp]rivate|/[Tt]mp|/[Vv]ar/[Ff]olders)(/|\b)|[A-Za-z]:\\)"
      )
      
      
      def issue(kind: str, path: str, detail: str, line: Optional[int] = None) -> Dict[str, object]:
          item: Dict[str, object] = {"kind": kind, "path": path, "detail": detail}
          if line is not None:
              item["line"] = line
          return item
      
      
      def iter_packet_files(root: Path) -> Iterable[Path]:
          release_dir = root / "release"
          if not release_dir.is_dir():
              return []
          return (path for path in sorted(release_dir.rglob("*")) if path.is_file())
      
      
      def read_text(path: Path) -> str:
          return path.read_text(encoding="utf-8-sig")
      
      
      def check_text(path: Path, rel: str) -> List[Dict[str, object]]:
          issues: List[Dict[str, object]] = []
          if path.suffix.lower() not in TEXT_EXTENSIONS:
              return issues
          try:
              text = read_text(path)
          except UnicodeDecodeError as exc:
              return [issue("decode-error", rel, str(exc))]
          for line_no, line in enumerate(text.splitlines(), start=1):
              if MARKER_RE.search(line):
                  issues.append(issue("placeholder-text", rel, "remove unresolved template marker or working note", line_no))
              if LOCAL_PATH_RE.search(line):
                  issues.append(issue("local-absolute-path", rel, "replace local absolute path with a relative path or external artifact identifier", line_no))
          return issues
      
      
      def read_csv(path: Path) -> Tuple[List[str], List[Dict[str, str]]]:
          with path.open("r", encoding="utf-8-sig", newline="") as handle:
              reader = csv.DictReader(handle)
              rows = list(reader)
          if reader.fieldnames is None:
              raise ValueError("no header row")
          return list(reader.fieldnames), rows
      
      
      def parse_yaml_fallback(text: str) -> None:
          stack = []
          for raw_line in text.splitlines():
              line = raw_line.strip()
              if not line or line.startswith("#"):
                  continue
              if line.startswith("- "):
                  stack.append(line)
                  continue
              if ":" not in line:
                  raise ValueError("line is not a simple yaml mapping or list item")
      
      
      def parse_structured(path: Path) -> None:
          suffix = path.suffix.lower()
          if suffix == ".csv":
              read_csv(path)
          elif suffix == ".json":
              json.loads(read_text(path))
          elif suffix in {".yaml", ".yml"}:
              text = read_text(path)
              try:
                  import yaml  # type: ignore
              except Exception:
                  parse_yaml_fallback(text)
              else:
                  yaml.safe_load(text)
      
      
      def check_required_file(root: Path, rel: str, columns: Sequence[str]) -> List[Dict[str, object]]:
          path = root / rel
          if not path.exists():
              return [issue("missing-file", rel, "required release packet file is missing")]
          if not path.is_file():
              return [issue("not-file", rel, "required path is not a file")]
          if path.suffix.lower() != ".csv":
              return []
          try:
              fieldnames, rows = read_csv(path)
          except Exception as exc:
              return [issue("csv-parse-error", rel, str(exc))]
          missing = [column for column in columns if column not in fieldnames]
          issues: List[Dict[str, object]] = []
          if missing:
              issues.append(issue("missing-columns", rel, ", ".join(missing)))
          issues.extend(check_evidence_states(rel, rows))
          issues.extend(check_human_final_gate(rel, rows))
          return issues
      
      
      def check_evidence_states(rel: str, rows: List[Dict[str, str]]) -> List[Dict[str, object]]:
          issues: List[Dict[str, object]] = []
          for index, row in enumerate(rows, start=2):
              value = (row.get("evidence_state") or "").strip()
              if value and value not in ALLOWED_EVIDENCE_STATES:
                  issues.append(issue("invalid-evidence-state", rel, value, index))
          return issues
      
      
      def truthy(value: str) -> bool:
          return value.strip().lower() in {"true", "yes", "y", "1", "confirmed", "passed"}
      
      
      def check_human_final_gate(rel: str, rows: List[Dict[str, str]]) -> List[Dict[str, object]]:
          issues: List[Dict[str, object]] = []
          for index, row in enumerate(rows, start=2):
              if (row.get("evidence_state") or "").strip() != "human_final":
                  continue
              if "human_confirmed" in row and not truthy(row.get("human_confirmed", "")):
                  issues.append(issue("human-final-gate-missing", rel, "human_final row needs human_confirmed=true", index))
              if "reviewer" in row and not row.get("reviewer", "").strip():
                  issues.append(issue("human-final-gate-missing", rel, "human_final row needs reviewer", index))
              if "review_date" in row and not row.get("review_date", "").strip():
                  issues.append(issue("human-final-gate-missing", rel, "human_final row needs review_date", index))
          return issues
      
      
      def validate(root: Path) -> List[Dict[str, object]]:
          issues: List[Dict[str, object]] = []
          release_dir = root / "release"
          if not release_dir.is_dir():
              issues.append(issue("missing-directory", "release", "release packet directory is missing"))
      
          for rel, columns in REQUIRED_FILES.items():
              issues.extend(check_required_file(root, rel, columns))
      
          for path in iter_packet_files(root):
              rel = path.relative_to(root).as_posix()
              issues.extend(check_text(path, rel))
              if path.suffix.lower() in STRUCTURED_EXTENSIONS:
                  try:
                      parse_structured(path)
                  except Exception as exc:
                      issues.append(issue("parse-error", rel, str(exc)))
          return issues
      
      
      def emit_text(root: Path, issues: List[Dict[str, object]]) -> None:
          print("Release packet root: {}".format(root))
          if not issues:
              print("- no release packet issues detected")
              return
          print("- issues: {}".format(len(issues)))
          for item in issues:
              location = item["path"]
              if "line" in item:
                  location = "{}:{}".format(location, item["line"])
              print("- {kind}: {location}: {detail}".format(location=location, **item))
      
      
      def main() -> int:
          parser = argparse.ArgumentParser(description="Validate a release-governance packet.")
          parser.add_argument("root", nargs="?", default=".", help="project root containing release/")
          parser.add_argument("--json", action="store_true", dest="emit_json", help="emit machine-readable output")
          args = parser.parse_args()
      
          root = Path(args.root).resolve()
          if not root.is_dir():
              sys.stderr.write("error: root is not a directory\n")
              return 2
      
          issues = validate(root)
          payload = {
              "schema_version": 1,
              "root": str(root),
              "issues": issues,
              "issue_count": len(issues),
              "allowed_evidence_states": sorted(ALLOWED_EVIDENCE_STATES),
          }
          if args.emit_json:
              print(json.dumps(payload, indent=2, sort_keys=True))
          else:
              emit_text(root, issues)
          return 1 if issues else 0
      
      
      if __name__ == "__main__":
          raise SystemExit(main())
      
  • SKILL.md 5.2 KB
    ---
    name: release-governance
    description: Use when preparing, auditing, releasing, PDF-hardening, or rebuttal-hardening academic manuscripts, datasets, artifacts, reviewer packets, or claim registers involving multiple refs, local assets, human labels, agent-assisted drafts, wide tables, figure provenance, submission PDFs, or evidence-boundary checks.
    allowed-tools: Read, Glob, Grep, Bash, Edit, Write
    ---
    
    # /release-governance - Release Evidence Governance
    
    ## Purpose
    
    Prepare release-facing academic artifacts with explicit evidence control. The core rule is:
    
    ```text
    release truth = ref + artifact + gate
    ```
    
    Do not infer release truth from memory, a branch name, a pull request title, a local file cache, or an agent draft.
    
    ## Trigger Words
    
    This skill activates on: `release governance`, `release evidence`, `camera-ready`, `rebuttal packet`, `artifact packet`, `claim ledger`, `human evidence gate`, `release packet`, `/release-governance`.
    
    ## Core Rules
    
    1. Name the exact ref, artifact, and gate behind every release-facing claim.
    2. Keep draft advisory evidence, verified artifacts, and final human evidence separate.
    3. Do not promote agent or Gemini review output into final evidence.
    4. Do not treat ignored, untracked, cached, or local-only assets as submitted artifacts.
    5. Do not treat a repository check as venue, submission-system, or scientific compliance.
    6. If two refs diverge, name both and scope which one is canonical for each artifact.
    7. If a worktree is dirty, list the dirty paths and mark the packet as draft until changes are committed or explicitly scoped.
    8. Freeze evidence and argument separately. An evidence ref or result snapshot does not authorise an unapproved narrative, and an approved manuscript spine does not validate changed numbers.
    
    ## Evidence States
    
    Use `references/evidence_state_schema.md` for the shared states:
    
    - `draft_advisory`
    - `verified_artifact`
    - `human_final`
    
    `human_final` requires an explicit human confirmation gate when the project schema provides one. Agent drafts, reviewer suggestions, generated summaries, simulations, and prefilled labels stay `draft_advisory`.
    
    ## Workflow
    
    ### 1. Declare Scope
    
    Create `release/release_scope.md` with scope date, artifact name, intended use,
    included refs, excluded refs, the evidence baseline, the argument baseline, and
    the highest-risk open question. For a manuscript, the evidence baseline names
    the frozen results, data/configuration, and artifact refs; the argument baseline
    names the author-approved intent and manuscript version.
    
    ### 2. Map Repository Truth
    
    Run narrow ref checks before reading a checkout as final state:
    
    ```bash
    git fetch --all --prune
    git status --short --branch
    git worktree list --porcelain
    git branch --all --verbose --no-abbrev
    ```
    
    Create `release/canonical_refs.csv`. Detached HEADs are acceptable only when the exact SHA is recorded.
    
    ### 3. Inventory Assets
    
    Create `release/local_asset_inventory.csv` to separate tracked, ignored, untracked, external-store, and generated assets. Local assets may support review, but release claims require an artifact anchor or explicit exclusion.
    
    ### 4. Anchor Artifacts And Claims
    
    Create:
    
    - `release/artifact_anchors.csv`
    - `release/claim_ledger.csv`
    - `release/evidence_gates.csv`
    
    Every paper-facing number, qualitative conclusion, table value, figure, dataset count, and human-label claim should point to the artifact and gate that support it.
    
    ### 5. Review Advisory Evidence
    
    Gemini or another agent may review the scope, packet, or diff, but its result is advisory. Record advisory review in the verification report without changing any evidence state to `human_final`.
    
    
    ### 5.5 Reframe And PDF-Harden Manuscripts
    
    When a manuscript draft reads like a module inventory, project report, internal validation packet, or artifact dump, use `references/manuscript_reframing_patterns.md` before final release checks. Apply it to separate the scientific gap, contribution chain, results narrative, main-text table design, figure roles, PDF/render checks, generative-component positioning, and submission-readiness blockers.
    
    ### 6. Verify Packet
    
    Use `references/release_workflow_templates.md` for columns and report structure. If Python is available, run:
    
    ```bash
    python {skill_dir}/scripts/check_release_packet.py <project_root>
    ```
    
    The helper checks required packet files, CSV/JSON/YAML readability, evidence-state values, required columns, local absolute paths, and obvious template markers. YAML files use PyYAML when installed; otherwise the helper applies a basic local syntax check for simple mappings and lists. It does not run experiments, access networks, push branches, or judge scientific validity.
    
    ## Stop Conditions
    
    Stop and report a blocker if:
    
    - a final claim depends on a dirty or ambiguous ref
    - a human-label claim lacks a human confirmation gate
    - a release artifact exists only as an ignored, untracked, cache, or local-only file
    - a count comes from a pointer, stub, generated preview, or non-canonical ref
    - a manuscript release cannot identify both its evidence baseline and its author-approved argument baseline
    - a draft pull request, closed-unmerged pull request, or advisory review is being treated as final release state
    - the packet validator reports issues that affect release-facing claims
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related