Generated banner for Clinical Decision Support
Generated logo for Clinical Decision Support

Clinical Decision Support

K-DenseCommunityCreated by K-Dense Inc.

  • Skill
  • Content generator
  • Science and research
  • MIT
  • Low risk
  • Has scripts

From the author

Prepare and validate research-only clinical decision-support evaluation, evidence-profile, cohort, survival, biomarker/model, privacy, and governance artifacts. Use for aggregate or synthetic research documentation and traceability—not patient care or live clinical operation.
— the description by K-Dense Inc.

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured, offline workflow for researchers to create and validate governance, evaluation, and evidence-profile artifacts for clinical decision-support (CDS) systems. It emphasizes transparency, traceability, and rigorous documentation for aggregate or synthetic research data. The skill includes templates and scripts to assist in preparing survival analysis plans, cohort tables, biomarker evaluations, and de-identification checklists. It strictly prohibits use in patient care, clinical operations, or any activity involving patient-specific data, ensuring that all outputs remain within the realm of research and governance documentation.

What it does

  • Generates aggregate cohort table shells with disclosure controls.
  • Validates research-only governance and intended-use documentation.
  • Provides checklists for de-identification processes and evidence-source traceability.
  • Supports the creation of GRADE evidence profiles for research outcomes.
  • Evaluates aggregate model or biomarker performance metrics.
  • Facilitates the development of survival analysis plans.

When to use it

  • When documenting the research methodology for a clinical decision-support system.
  • When preparing governance artifacts for aggregate or synthetic clinical datasets.
  • When performing internal validation or evidence-profile reviews for research studies.
  • When ensuring research documentation aligns with reporting guidelines like STROBE or TRIPOD+AI.
  • When establishing traceability for decision logic in a research context.

Advantages

  • Operates entirely offline with no external dependencies or data transmission.
  • Enforces strict safety boundaries to prevent misuse in clinical settings.
  • Promotes transparency through standardized templates and reporting guidelines.
  • Provides a clear, audit-ready structure for research governance.
  • Reduces human error in documentation through automated validation scripts.

Usage examples

“I need to generate a template for an aggregate cohort table for my research study.”
The agent provides the aggregate_cohort_table_template.json and instructions on how to use cohort_table_generator.py to produce a compliant table.
“How do I document the intended use for my clinical decision-support research artifact?”
The agent guides the user through the artifact_intended_use_template.json and explains the required fields for governance and safety.
“Can you help me validate my survival analysis plan for a research project?”
The agent provides the survival_analysis_plan_template.json and uses survival_plan_validator.py to check for completeness and consistency.
“I need to check if my evidence profile meets the GRADE requirements.”
The agent assists in populating the evidence_profile_template.json and uses evidence_profile_check.py to validate the structure and citation links.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/k-dense-ai/clinical-decision-support/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip clinical-decision-support.zip -d .agents/skills

Documentation by K-Dense Inc.

Clinical Decision-Support Research and Evaluation

Hard Safety Boundary

This skill produces research, evaluation, documentation, and governance artifacts only.

Never use it to:

  • diagnose or classify a person;

  • recommend, select, sequence, start, stop, or modify treatment;

  • calculate or communicate a patient-specific dose;

  • triage, prioritize, alarm, alert, or determine urgency;

  • make or automate a patient-specific clinical decision;

  • support bedside, point-of-care, or live clinical operation;

  • replace professional judgment or a validated, authorized clinical system;

  • claim FDA authorization, regulatory conformity, HIPAA compliance, or legal compliance.

If a request could affect care for a person, stop the workflow and route the matter to a licensed healthcare professional using locally validated and appropriately authorized systems. Do not redirect to another skill for patient-specific care.

In Scope

  • Intended-use and limitation statements for research artifacts

  • Aggregate cohort table shells with disclosure controls

  • Statistical analysis plans and survival-analysis plan review

  • Aggregate model or biomarker performance evaluation

  • Transparent GRADE evidence-profile checklists

  • Evidence-source and decision-logic traceability

  • De-identification process checklists

  • Fairness, subgroup, calibration, uncertainty, external-validation, monitoring, change-control, audit, and human-factors documentation

Outputs remain drafts until qualified humans approve them. Reporting guidance improves transparency; it does not establish study quality, clinical utility, safety, effectiveness, authorization, or compliance.

Data Gate

Before any script:

  1. Confirm input is synthetic or aggregate.

  2. Reject patient rows, records, narratives, identifiers, free text, dates tied to people, images, waveforms, or genomic sequences.

  3. Keep source files local. Do not fetch URLs, call APIs, read environment variables, or send data to a model.

  4. Set disclosure thresholds before producing tables.

  5. Record provenance, data cut date, population, exclusions, missingness, and transformations.

The scripts cap file size, groups, rows, and text length. They reject URL-like paths and common row-level keys. These controls reduce accidental misuse; they are not a privacy determination.

Required Artifact Header

Every artifact must visibly include:

  • artifact_type, title, version, status, owner, date, and change summary;

  • intended purpose, intended users, aggregate population scope, and decision role;

  • all prohibited uses from the hard boundary;

  • data level and confirmation that no PHI or raw rows were supplied;

  • limitations, uncertainty, and foreseeable failure modes;

  • external-validation and subgroup applicability status;

  • human-review roles, completion status, and approval boundary;

  • source citations with versions or dates;

  • monitoring, change-control, retirement, and audit expectations;

  • the statement: Not for patient care or live clinical use.

Start from assets/artifact_intended_use_template.json.

Workflow

1. Frame the Research Question
  • Define the estimand or evaluation target before viewing results.

  • Distinguish descriptive, prognostic, predictive, diagnostic-accuracy, and causal questions.

  • Pre-specify outcomes, time origin, horizon, subgroups, cut points, missing-data handling, multiplicity, and sensitivity analyses.

  • Separate exploratory findings from confirmatory analyses.

2. Select the Artifact
NeedAssetScript
Intended-use/governance reviewassets/artifact_intended_use_template.jsonscripts/validate_cds_artifact.py
GRADE evidence profileassets/evidence_profile_template.jsonscripts/evidence_profile_check.py
Aggregate model/biomarker evaluationassets/aggregate_model_evaluation_template.jsonscripts/model_biomarker_evaluation.py
Aggregate cohort tableassets/aggregate_cohort_table_template.jsonscripts/cohort_table_generator.py
Survival analysis planassets/survival_analysis_plan_template.jsonscripts/survival_plan_validator.py
Logic traceability matrixassets/decision_logic_traceability_template.jsonscripts/decision_logic_traceability.py
De-identification process reviewassets/deidentification_checklist_template.jsonscripts/deidentification_checklist.py
3. Run Locally

All helpers are dependency-free:

python3 scripts/validate_cds_artifact.py --help
python3 scripts/evidence_profile_check.py --help
python3 scripts/model_biomarker_evaluation.py --help
python3 scripts/cohort_table_generator.py --help
python3 scripts/survival_plan_validator.py --help
python3 scripts/decision_logic_traceability.py --help
python3 scripts/deidentification_checklist.py --help

Write outputs only to a reviewed local directory. Never place generated reports in an EHR, alerting system, clinical portal, or device workflow.

4. Human Review

Require review proportionate to the artifact:

  • methodologist/statistician for design and analysis;

  • domain expert for clinical-scientific context;

  • privacy officer or qualified expert for disclosure decisions;

  • regulatory or legal counsel for jurisdiction-specific interpretations;

  • human-factors specialist for user studies;

  • authorized governance owner for release and change control.

Script success means only that declared fields and internal consistency checks passed.

GRADE Evidence Profiles

Do not infer a certainty rating from article text, study design alone, p-values, or keywords. Do not use the legacy 1A/2B shorthand as if it were universal GRADE output.

For each important outcome, a human panel must document:

  • risk of bias;

  • inconsistency;

  • indirectness;

  • imprecision;

  • publication bias;

  • any applicable upgrading considerations;

  • effect estimate and uncertainty;

  • rationale and source IDs for every judgment;

  • final certainty judgment and named review role.

The checker validates completeness and citation links only. It never calculates certainty or recommendation strength. See references/evidence_profiles.md.

Aggregate Model and Biomarker Evaluation

Do not derive thresholds, assign molecular or disease classes, match therapies, or emit person-level predictions.

The evaluator accepts only aggregate confusion counts and calibration bins. It reports bounded descriptive metrics with Wilson intervals, calibration gaps, subgroup differences, and explicit suppression. It does not determine fairness, clinical utility, or fitness for use. Require:

  • locked model/assay/version and pre-specified threshold provenance;

  • representative internal validation and independent external validation;

  • calibration and discrimination appropriate to the target;

  • subgroup performance with uncertainty and sample sizes;

  • missingness, spectrum/selection bias, dataset shift, and assay variability;

  • human-factors and prospective evaluation where relevant;

  • monitoring, change control, rollback, and retirement criteria.

See references/model_biomarker_evaluation.md.

Cohort Tables

Use aggregate cells only. Do not provide row-level data to the generator.

  • Choose the minimum cell threshold under an approved disclosure policy.

  • Apply primary and complementary suppression.

  • Report denominators and missingness.

  • Avoid baseline significance testing as a balance diagnostic.

  • Label adjusted, unadjusted, pre-specified, and exploratory results.

  • Do not interpret association as causation or clinical actionability.

The default threshold is an operational safeguard, not a HIPAA rule or guarantee. See references/cohort_evaluation.md and references/privacy_and_disclosure.md.

Survival Plans

Define time zero, event, competing events, censoring, intercurrent events, estimand, horizon, effect measure, and analysis population together.

  • Assess proportional hazards before treating a hazard ratio as constant.

  • Pre-specify alternatives such as time-varying effects or restricted mean survival time.

  • Use cumulative-incidence methods when competing events matter.

  • Address immortal-time, informative-censoring, delayed-entry, missing-data, and multiplicity risks.

  • Include sensitivity analyses and uncertainty, not only p-values.

The bundled helper validates a plan; it does not analyze survival data. See references/survival_analysis.md.

Decision Logic

Only document research or governance logic, such as evidence inclusion, validation gates, release holds, and human-review checkpoints. Each node must link to source IDs, tests, owner, version, and status.

Do not encode care pathways, urgency, medication actions, diagnostic rules, alarms, or patient-facing outputs. See references/decision_logic_traceability.md.

Privacy and De-identification

The HHS methods are Expert Determination and Safe Harbor. A checklist cannot perform either method by itself. Do not claim that removing a list of fields, hashing identifiers, using a minimum cell size, or passing this script proves de-identification or HIPAA compliance.

The helper inventories documented human work. It never reads a dataset. Escalate unresolved items, free text, dates, geography, rare combinations, linkage risk, genomics, and longitudinal patterns to qualified privacy review.

Reporting-Guideline Selection

  • Cohort/case-control/cross-sectional: STROBE; add RECORD for routinely collected data.

  • Prediction model development/evaluation: TRIPOD+AI and PROBAST+AI.

  • Tumor prognostic marker study: REMARK.

  • AI diagnostic accuracy: STARD-AI with STARD.

  • AI trial protocol: SPIRIT-AI with the current SPIRIT base statement.

  • AI randomized trial report: CONSORT-AI with the current CONSORT base statement.

  • Early live AI evaluation: DECIDE-AI—but live evaluation is outside this skill's execution scope.

These are reporting or appraisal tools, not automatic quality scores. See references/study_reporting.md.

Regulatory and Governance Context

FDA device status turns on intended use and function, not a document label. FDA's January 2026 CDS guidance distinguishes certain non-device CDS functions from device software functions; its examples are not a self-certification checklist. ONC HTI-1 requirements apply within the defined certification scope. ICH E6(R3) and E9/E9(R1) inform trial governance and statistical planning but do not make an artifact compliant.

Use references/regulatory_and_governance.md for dated context. Obtain qualified advice for an actual product, study, submission, deployment, or jurisdiction.

Verification

From this skill directory:

python3 -m unittest discover -s tests/clinical-decision-support -p 'test_*.py'

Run AST compilation without bytecode:

python3 -c "import ast,pathlib; [ast.parse(p.read_text()) for p in pathlib.Path('scripts').glob('*.py')]"

Reference Map

  • references/README.md — scope and navigation

  • references/safety_and_scope.md — refusal and escalation rules

  • references/regulatory_and_governance.md — FDA, ONC, ICH context

  • references/evidence_profiles.md — human GRADE workflow

  • references/study_reporting.md — EQUATOR and PROBAST+AI selection

  • references/cohort_evaluation.md — aggregate cohort methods

  • references/survival_analysis.md — time-to-event planning

  • references/model_biomarker_evaluation.md — model/biomarker evaluation

  • references/privacy_and_disclosure.md — de-identification and suppression

  • references/decision_logic_traceability.md — governance logic

  • references/sources.md — dated authoritative source ledger

  • references/security_validation.md — scan results and accepted LOW findings

Citing Scientific Agent Skills

This skill is part of Scientific Agent Skills by K-Dense. If it materially contributed to a manuscript, report, presentation, or code release, add the paper to the references or software section and tell the user you did so:

Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065

Always cite the current version. The DOI and https://arxiv.org/abs/2609.00065 resolve to the latest arXiv version, so never append a version suffix such as v1. When network access is available, fetch https://arxiv.org/abs/2609.00065 (or http://export.arxiv.org/api/query?id_list=2609.00065) before writing the reference and take the author list, year, and version from that record. If the record lists a journal reference or publisher DOI, cite the published version instead.

Files

scripts/evidence_profile_check.py

#!/usr/bin/env python3
"""Check a human-authored GRADE evidence profile without assigning grades."""

from __future__ import annotations

import argparse
import sys
from typing import Any

from _common import (
    InputError,
    IssueLog,
    load_json_object,
    print_report,
    require_list,
    require_nonempty_text,
    source_ids,
    validate_references,
    write_json,
)

DOMAINS = (
    "risk_of_bias",
    "inconsistency",
    "indirectness",
    "imprecision",
    "publication_bias",
)
DOMAIN_JUDGMENTS = {"not_serious", "serious", "very_serious", "unassessed"}
UPGRADING = ("large_effect", "dose_response", "residual_confounding")
UPGRADING_JUDGMENTS = {"none", "present", "unassessed", "not_applicable"}
CERTAINTY_LEVELS = {"high", "moderate", "low", "very_low", "unassessed"}
PLACEHOLDER_MARKERS = ("REPLACE_", "REQUIRES_", "YYYY-MM-DD")


def _profile_has_recommendation_key(value: Any) -> bool:
    if isinstance(value, dict):
        for key, nested in value.items():
            if str(key).strip().lower() in {
                "recommendation",
                "recommendation_strength",
                "treatment_recommendation",
            }:
                return True
            if _profile_has_recommendation_key(nested):
                return True
    elif isinstance(value, list):
        return any(_profile_has_recommendation_key(item) for item in value)
    return False


def _find_placeholders(value: Any, location: str = "$") -> list[str]:
    findings: list[str] = []
    if isinstance(value, dict):
        for key, nested in value.items():
            findings.extend(_find_placeholders(nested, f"{location}.{key}"))
    elif isinstance(value, list):
        for index, nested in enumerate(value):
            findings.extend(_find_placeholders(nested, f"{location}[{index}]"))
    elif isinstance(value, str) and any(marker in value for marker in PLACEHOLDER_MARKERS):
        findings.append(location)
    return findings


def check_profile(document: dict[str, Any]) -> tuple[IssueLog, list[dict[str, str]]]:
    log = IssueLog()
    summaries: list[dict[str, str]] = []
    try:
        require_nonempty_text(document.get("schema_version"), "schema_version")
        require_nonempty_text(document.get("profile_id"), "profile_id")
        require_nonempty_text(document.get("title"), "title")
        if document.get("data_level") not in {"published_aggregate_evidence", "synthetic"}:
            log.errors.append(
                "data_level must be published_aggregate_evidence or synthetic"
            )
        if document.get("human_judgments_required") is not True:
            log.errors.append("human_judgments_required must be true")
        if document.get("auto_grade") is not False:
            log.errors.append("auto_grade must be false")
        if _profile_has_recommendation_key(document):
            log.errors.append(
                "Recommendation fields are outside the evidence-profile checker"
            )
        governance = document.get("governance")
        if not isinstance(governance, dict):
            raise InputError("governance must be an object")
        for field in (
            "version",
            "owner",
            "change_summary",
            "auditability",
            "update_plan",
        ):
            require_nonempty_text(governance.get(field), f"governance.{field}")

        question = document.get("question")
        if not isinstance(question, dict):
            raise InputError("question must be an object")
        for field in ("population", "intervention_or_exposure", "comparator", "setting"):
            require_nonempty_text(question.get(field), f"question.{field}")

        known_sources = source_ids(document)
        outcomes = require_list(document.get("outcomes"), "outcomes", maximum=50)
        if not outcomes:
            log.errors.append("At least one outcome is required")

        names: set[str] = set()
        for index, outcome in enumerate(outcomes):
            prefix = f"outcomes[{index}]"
            if not isinstance(outcome, dict):
                raise InputError(f"{prefix} must be an object")
            name = require_nonempty_text(outcome.get("name"), f"{prefix}.name")
            if name in names:
                log.errors.append(f"Duplicate outcome name: {name}")
            names.add(name)
            importance = require_nonempty_text(
                outcome.get("importance"), f"{prefix}.importance"
            )
            if importance not in {"critical", "important", "not_important"}:
                log.errors.append(f"{prefix}.importance has an unsupported value")
            for field in (
                "effect_measure",
                "effect_estimate",
                "uncertainty_interval",
                "participants",
                "studies",
                "time_horizon",
            ):
                require_nonempty_text(outcome.get(field), f"{prefix}.{field}")

            domains = outcome.get("domains")
            if not isinstance(domains, dict):
                raise InputError(f"{prefix}.domains must be an object")
            for domain_name in DOMAINS:
                domain = domains.get(domain_name)
                field = f"{prefix}.domains.{domain_name}"
                if not isinstance(domain, dict):
                    raise InputError(f"{field} must be an object")
                judgment = require_nonempty_text(
                    domain.get("judgment"), f"{field}.judgment"
                )
                if judgment not in DOMAIN_JUDGMENTS:
                    log.errors.append(f"{field}.judgment is unsupported")
                if judgment == "unassessed":
                    log.errors.append(f"{field} requires a human judgment")
                require_nonempty_text(domain.get("rationale"), f"{field}.rationale")
                require_nonempty_text(
                    domain.get("reviewer_role"), f"{field}.reviewer_role"
                )
                validate_references(
                    domain.get("source_ids"), known_sources, f"{field}.source_ids"
                )

            upgrading = outcome.get("upgrading")
            if not isinstance(upgrading, dict):
                raise InputError(f"{prefix}.upgrading must be an object")
            for item_name in UPGRADING:
                item = upgrading.get(item_name)
                field = f"{prefix}.upgrading.{item_name}"
                if not isinstance(item, dict):
                    raise InputError(f"{field} must be an object")
                judgment = require_nonempty_text(
                    item.get("judgment"), f"{field}.judgment"
                )
                if judgment not in UPGRADING_JUDGMENTS:
                    log.errors.append(f"{field}.judgment is unsupported")
                if judgment == "unassessed":
                    log.errors.append(f"{field} requires a human judgment")
                require_nonempty_text(item.get("rationale"), f"{field}.rationale")
                if judgment == "present":
                    validate_references(
                        item.get("source_ids"), known_sources, f"{field}.source_ids"
                    )

            certainty = outcome.get("certainty")
            if not isinstance(certainty, dict):
                raise InputError(f"{prefix}.certainty must be an object")
            if certainty.get("human_judgment") is not True:
                log.errors.append(f"{prefix}.certainty.human_judgment must be true")
            level = require_nonempty_text(
                certainty.get("level"), f"{prefix}.certainty.level"
            )
            if level not in CERTAINTY_LEVELS:
                log.errors.append(f"{prefix}.certainty.level is unsupported")
            if level == "unassessed":
                log.errors.append(f"{prefix}.certainty requires a human judgment")
            require_nonempty_text(
                certainty.get("rationale"), f"{prefix}.certainty.rationale"
            )
            require_nonempty_text(
                certainty.get("reviewer_role"), f"{prefix}.certainty.reviewer_role"
            )
            require_nonempty_text(
                certainty.get("judgment_date"), f"{prefix}.certainty.judgment_date"
            )
            validate_references(
                certainty.get("source_ids"),
                known_sources,
                f"{prefix}.certainty.source_ids",
            )
            summaries.append(
                {
                    "outcome": name,
                    "importance": importance,
                    "human_entered_certainty": level,
                }
            )

        review = document.get("profile_review")
        if not isinstance(review, dict):
            raise InputError("profile_review must be an object")
        for field in ("prepared_by_role", "reviewed_by_role", "review_date"):
            require_nonempty_text(review.get(field), f"profile_review.{field}")
        if review.get("completed") is not True:
            log.errors.append("profile_review.completed must be true")
        placeholders = _find_placeholders(document)
        if placeholders:
            log.errors.append(
                "Unresolved template placeholders remain: "
                + ", ".join(placeholders[:10])
            )
    except InputError as exc:
        log.errors.append(str(exc))

    if log.ok:
        log.info.append(
            "Profile is structurally complete; all certainty labels remain human judgments"
        )
    return log, summaries


def main() -> int:
    parser = argparse.ArgumentParser(
        description=(
            "Check completeness and citation traceability of a human-authored "
            "GRADE evidence profile. This tool never assigns certainty."
        )
    )
    parser.add_argument("input", help="Local evidence-profile JSON")
    parser.add_argument("-o", "--output", help="Optional local JSON report")
    args = parser.parse_args()

    try:
        document = load_json_object(args.input)
        log, summaries = check_profile(document)
        report = log.as_dict()
        report["outcomes"] = summaries
        report["auto_grade_performed"] = False
        if args.output:
            write_json(args.output, report)
        print_report(report)
    except InputError as exc:
        print_report(IssueLog(errors=[str(exc)]).as_dict())
        return 2
    return 0 if report["status"] == "pass" else 1


if __name__ == "__main__":
    sys.exit(main())

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs network access, Needs Python, Needs Node.js

The author says: Python 3.11+; local files only; bundled scripts use the standard library and require no network, credentials, API keys, LLMs, or image services.

Security

What our scanner noticed· Low risk

  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
K-Dense Inc.
Publisher
K-Dense (Community)
Source
K-Dense-AI/claude-scientific-writer · skills/clinical-decision-support · commit 529b9f7
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced
Also distributed in
K-Dense-AI/claude-scientific-writer

AutoGineer is not affiliated with or endorsed by K-Dense Inc. or K-Dense.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download clinical-decision-support.zip