Skip to content

prior-approval-extraction-udm

Slugprior-approval-extraction-udm
Version0.1.0
Statusexperimental
Last fully evaluatednone
Eval stateno validated eval cases
Categoryextraction
Domainresearch-administration
Manifestationsprompt
Created2026-04-30
Updated2026-04-30

Tags: prior-approval post-award modifications federal-awards rtc 2-cfr-200 compliance udm structured-extraction json

Audience: sponsored-programs-staff, post-award-teams, ingest-pipelines

Manifestations in repo: prompt.md

Extracts all prior-approval requirements from a federal award document into a structured JSON object suitable for driving a tracking system of activities that need federal-agency authorization before they can be executed. Produces three logical buckets (budget-related, scope/timeline, approval procedures table) plus a list of Research Terms and Conditions (RTC) waivers and expanded-authority delegations.

Output contract: schema.json Contract scope: repo-local, UDM-aligned

Inputs

Full text of a federal award notice / agreement / terms-and-conditions document — pasted text, attached PDF/DOCX, or URL. Optional knowledge-base context from 2 CFR 200 (Uniform Guidance) or the Research Terms and Conditions is injected by the runtime workflow but not required by the prompt itself.

Outputs

A single JSON object with:

  • Scalar award metadataaward_number
  • Three logical buckets:
  • budget_approvals{rebudgeting_thresholds, equipment_approvals, subaward_approvals}
  • scope_timeline_approvals{pi_change_requirements, nce_requirements, foreign_travel_approvals}
  • approval_procedures — array of {approval_type, threshold, documentation, authority, timeline, consequences}
  • rtc_waivers — flat list of waived approvals

See schema.json for the authoritative definition and prompt.md for the encoding rules (verbatim threshold quotation, one-row-per-approval-type rule for the procedures table, and the placement contract that keeps procedure mechanics on the row rather than in the narrative bucket).

Contract scope

Repo-local, UDM-aligned. Per-row entries in approval_procedures resolve downstream to UDM Modification.Requires_Prior_Approval; budget_approvals.subaward_approvals resolves to Subaward. The three logical buckets do not duplicate any shared UDM schema — they are repo-local to this component and mirror the deliverable produced by the prior-approval-extraction Vandalizer workflow in the ui-insight/ProcessMapping process-mapping corpus.

Triad integration

  • Evaluation datasets: none yet — planned: an authorized, de-identified federal award notice with explicit equipment, foreign-travel, and PI-substitution approval thresholds; a separate case for an RTC-eligible award with documented waivers.
  • Harness notes: canonical manifestation is prompt.md. Validation surface is schema.json. The companion top-level workflows/prior-approval-extraction Vandalizer workflow at v0.1.0 implements the contract as a single Extraction task plus a Consolidation Prompt; record both single-call and post-consolidation signals when both are available.
  • Shared UDM relationship: aligned, not owning. Per-row entries match the Modification.Requires_Prior_Approval and Subaward UDM conventions but this component does not redefine UDM tables.

Runtime topology — the Vandalizer workflow

The canonical runtime for this component is the prior-approval-extraction workflow shipped at the top level of this repo. The single source of truth is workflows/prior-approval-extraction/manifest.yaml; the companion .vandalizer.json envelope is generated by scripts/build_vandalizer_workflows.py and committed alongside. The runtime mirrors the source ui-insight/ProcessMapping/workflows/prior-approval-extraction/ workflow:

  • Step 1 (Extraction) — one Extraction task with an embedded SearchSet whose item titles mirror this component's schema field names.
  • Step 2 (Consolidation Prompt) — assembles the extraction fragment into the schema-conformant object, normalizes the approval_procedures table into per-row objects, and ensures rtc_waivers covers only waived approvals (not kept approvals).

Regenerate the workflow JSON whenever this component bumps MINOR or MAJOR (or whenever the workflow manifest changes); CI fails if the committed .vandalizer.json drifts from a fresh build.

Manifestations

  • prompt.md — canonical, LLM-agnostic prompt

Evals

See evals/ for reference inputs and known-good outputs. Initial cases pending: a federal award notice with explicit equipment, foreign-travel, and PI-substitution approval thresholds; a separate case for an RTC-eligible award with documented waivers.

Provenance

Authored 2026-04-30 against the prior-approval-extraction (Workflow_ID: WF-PRIOR-APPROVAL-EXTRACTION) process-mapping workflow in ui-insight/ProcessMapping at commit b7176b0c913833a205efdb5e4ba00c17ff88af0f, which was built from walkthrough transcripts of post-award sponsored-programs staff working through prior-approval procedures.

Contract scope

  • Output format: json_object

  • Contract scope: shared_udm_semantics_repo_local_schema

  • Validation surfaces: json_schema

  • Schema entrypoints: #

  • Notes: Repo-local prior-approval-tracking contract. Three logical buckets (budget_approvals, scope_timeline_approvals, approval_procedures table) plus an rtc_waivers list. Per-row entries resolve to UDM Modification.Requires_Prior_Approval; subaward approvals resolve to Subaward.

  • Machine-readable catalog entry: component_catalog.json

Triad integration

  • UDM alignment: shared_udm_semantics_repo_local_schema — approval_procedures rows resolve to UDM Modification.Requires_Prior_Approval; budget_approvals.subaward_approvals resolves to Subaward. The three-bucket shape itself is repo-local.

  • Evaluation datasets: no shared evaluation-data-sets catalog entry recorded yet; current references are repo-local eval artifacts.

  • Harness notes: Validate JSON outputs against schema.json. Canonical single-call invocation surface is prompt.md. The companion top-level workflows/prior-approval-extraction Vandalizer workflow at v0.1.0 implements the same contract as a single Extraction task plus a Consolidation Prompt that normalizes the approval_procedures table into per-row objects; campaign authors should record both single- call and post-consolidation signals when both are available.

  • Related component: award-compliance-extraction-udm (drilldown_of) — award-compliance-extraction-udm.compliance_framework.prior_approval_requirements is a categorized list only; this component drills into the procedural mechanics (threshold / documentation / authority / timeline / consequences) of each approval type.

Prompt body

Source: prompt.md.

Show prompt

Prior Approval Extraction — UDM JSON

Purpose: Extract all prior-approval requirements from a federal award document into a structured JSON object suitable for driving a tracking system of activities that need federal-agency authorization before they can be executed.

Expected input: Full text of a federal award notice / agreement / terms-and-conditions document, optionally with Research Terms and Conditions (RTC) or 2 CFR 200 as knowledge-base context.

Expected output: A single JSON object that validates against schema.json. No prose, no markdown outside the JSON.

When to use this contract

This is the prior-approval cut of a federal award. It produces three logical buckets — budget-related, scope and timeline, and administrative approvals — plus a normalized approval procedures table (threshold / documentation / authority / timeline / consequences) and a list of RTC waivers delegated to the recipient. UDM-aligned: requires_prior_approval flags resolve to UDM Modification.Requires_Prior_Approval; subaward approval requirements resolve to Subaward.

This component does not cover the broader compliance framework (financial reporting, high-risk conditions, audit thresholds) — that lives in award-compliance-extraction-udm. It does not cover the FFR submission cadence — that lives in ffr-management-extraction-udm.


Prompt

You are extracting prior-approval requirements from a federal award document. Federal awards typically distinguish three families of activities that require sponsor authorization before they can occur: budget changes, scope/timeline changes, and administrative changes (PI substitutions, foreign travel, subawards, etc.). Capture every approval the document calls out, plus the procedures the recipient must follow.

Be 100% accurate. Quote thresholds ("$25,000", "25%", "three months") verbatim; never paraphrase a numeric threshold. When a category is not addressed, set the field to null. When the document explicitly waives an approval (typically via Research Terms and Conditions or expanded authorities), capture the waiver in rtc_waivers.

Search the entire document for content in or near sections titled Prior Approval, Pre-approval, Written Approval, Agency Approval, 2 CFR 200, or Research Terms and Conditions. Keywords to follow: prior approval, pre-approval, written approval, agency approval, permission, authorize, CFR 200, RTC, waive, delegate, threshold.

Return a single JSON object that validates against schema.json with these top-level keys:

  • award_number — federal award identification number (FAIN). String or null.

  • budget_approvals — object covering money-driven approvals:

  • rebudgeting_thresholds — string or null.

  • equipment_approvals — string or null.

  • subaward_approvals — string or null.

  • scope_timeline_approvals — object covering scope and time-driven approvals:

  • pi_change_requirements — string or null.

  • nce_requirements — string or null.

  • foreign_travel_approvals — string or null.

  • approval_procedures — array of {approval_type, threshold, documentation, authority, timeline, consequences} objects. Each row in the source approval-procedures table becomes one entry. Empty array when the document has no procedures table.

  • rtc_waivers — array of strings naming each Research Terms and Conditions waiver or expanded-authority delegation the document calls out. Empty array when none are stated.

Encoding rules

  1. One row per approval type in approval_procedures. A single row that says "Equipment > $5,000 requires written approval from PO within 30 days" becomes one entry with approval_type: "Equipment over $5,000", threshold: "$5,000", authority: "Program Officer", timeline: "30 days". Quote dollar thresholds and day-counts verbatim.

  2. Per-row text goes on the row, not in the top-level bucket. If the procedures table covers an approval type, the corresponding budget_approvals.* or scope_timeline_approvals.* field should be a narrative description; the procedure mechanics belong in the table row.

  3. rtc_waivers is for waived approvals only — items that the RTC or agency expanded authority lets the recipient handle without sponsor sign-off. Do not duplicate the kept approvals here.

  4. Boolean flags must be derivable. Downstream UDM ingest expects to be able to compute Modification.Requires_Prior_Approval from the presence of an entry; only state an approval requirement when the document actually requires one.

  5. Do not output any text outside the single JSON object.

Output

A single JSON object. No surrounding markdown.

Output schema

Source: schema.json.

Show schema.json
{

  "$schema": "https://json-schema.org/draft/2020-12/schema",

  "$id": "https://github.com/AI4RA/prompt-library/components/prior-approval-extraction-udm/schema.json",

  "title": "Prior Approval Extraction \u2014 UDM Output",

  "description": "JSON contract for prior-approval requirements extracted from a federal award document. Produces three logical buckets (budget approvals, scope/timeline approvals, approval procedures table) plus an RTC-waiver list. UDM-aligned: per-row entries resolve to UDM Modification.Requires_Prior_Approval; subaward approvals resolve to Subaward.",

  "version": "0.1.0",

  "type": "object",

  "additionalProperties": false,

  "required": [

    "budget_approvals",

    "scope_timeline_approvals",

    "approval_procedures",

    "rtc_waivers"

  ],

  "properties": {

    "award_number": {

      "type": [

        "string",

        "null"

      ],

      "description": "Federal Award Identification Number (FAIN) as printed on the award. Resolves downstream to UDM Award.Federal_Award_ID."

    },

    "budget_approvals": {

      "type": "object",

      "additionalProperties": false,

      "properties": {

        "rebudgeting_thresholds": {

          "type": [

            "string",

            "null"

          ],

          "description": "Re-budgeting thresholds and restrictions requiring prior approval. Quote dollar/percent thresholds verbatim."

        },

        "equipment_approvals": {

          "type": [

            "string",

            "null"

          ],

          "description": "Equipment-purchase approval requirements (typically tied to a $ threshold)."

        },

        "subaward_approvals": {

          "type": [

            "string",

            "null"

          ],

          "description": "Subcontracting / subaward approval requirements. Resolves downstream to UDM Subaward."

        }

      }

    },

    "scope_timeline_approvals": {

      "type": "object",

      "additionalProperties": false,

      "properties": {

        "pi_change_requirements": {

          "type": [

            "string",

            "null"

          ],

          "description": "Requirements for PI or key-personnel changes (substitution, reduction in effort, etc.)."

        },

        "nce_requirements": {

          "type": [

            "string",

            "null"

          ],

          "description": "No-cost extension request requirements (notice period, supporting documentation, sponsor route)."

        },

        "foreign_travel_approvals": {

          "type": [

            "string",

            "null"

          ],

          "description": "Foreign travel approval requirements when the award imposes them."

        }

      }

    },

    "approval_procedures": {

      "type": "array",

      "description": "Per-row procedure mechanics from the source approval-procedures table. Each entry covers one approval type. Empty array when the document has no procedures table.",

      "items": {

        "type": "object",

        "additionalProperties": false,

        "required": [

          "approval_type"

        ],

        "properties": {

          "approval_type": {

            "type": "string",

            "minLength": 1,

            "description": "Short label for the approval type (e.g., 'Equipment over $5,000', 'Foreign travel', 'PI substitution')."

          },

          "threshold": {

            "type": [

              "string",

              "null"

            ],

            "description": "Dollar or percent threshold that triggers the approval. Quote verbatim. Null when threshold-less."

          },

          "documentation": {

            "type": [

              "string",

              "null"

            ],

            "description": "Required supporting documentation."

          },

          "authority": {

            "type": [

              "string",

              "null"

            ],

            "description": "Approving authority (e.g., 'Program Officer', 'Grants Management Specialist')."

          },

          "timeline": {

            "type": [

              "string",

              "null"

            ],

            "description": "Time window for review or required notice period. Quote verbatim."

          },

          "consequences": {

            "type": [

              "string",

              "null"

            ],

            "description": "Consequences of proceeding without approval."

          }

        }

      }

    },

    "rtc_waivers": {

      "type": "array",

      "description": "Research Terms and Conditions waivers and expanded-authority delegations \u2014 approvals the recipient can handle without sponsor sign-off. Empty array when none are stated.",

      "items": {

        "type": "string",

        "minLength": 1

      }

    }

  }

}

Changelog

Source: CHANGELOG.md.

All notable changes to this component. Versions follow semver: MAJOR for output-contract breaks, MINOR for backward-compatible additions, PATCH for wording or clarity.

[0.1.0] — 2026-04-30

  • Initial experimental release.
  • Schema derived from the prior-approval-extraction v2 Vandalizer workflow in ui-insight/ProcessMapping (single Extraction task + Formatting task; 8 source fields).
  • Three logical buckets (budget_approvals, scope_timeline_approvals, approval_procedures) plus rtc_waivers match the deliverable produced by the canonical extraction prompt.
  • Scalar award_number field added on top of the source workflow's eight Extraction fields so a single extraction resolves cleanly to UDM Award.
  • approval_procedures realized as an array of {approval_type, threshold, documentation, authority, timeline, consequences} objects (rather than the source Table field) so per-row procedure mechanics are attached to the correct approval type.
  • UDM column bindings preserved: per-row entries resolve to Modification.Requires_Prior_Approval; budget_approvals.subaward_approvals resolves to Subaward.
  • No eval cases yet — status experimental until at least one golden extraction is added under evals/cases/.