Unified NSF proposal requirements, question-answering, and preflight checking for a single proposal repository. Use when a user has an NSF solicitation PDF/text and needs to (1) ingest and normalize proposal requirements, (2) ask drafting-time questions such as "do we need X?" or "where does this go?", or (3) run a pre-submission gap check against the current proposal files.
Use this skill as the single entry point for NSF proposal compliance work inside one proposal repository.
This skill is NSF-first. If the user provides another sponsor's governing call
text, FAQ, or related requirements under <proposal-dir>/context/solicitation/,
you can still use the same ingest and QA workflow, but treat the supplied call
materials as authoritative over generic NSF expectations.
The skill has three operating modes:
ingest: parse the solicitation and build a requirements baselineqa: answer "is this required?" during draftingpreflight: check what is missing or risky before submissionKeep the raw solicitation inputs in
<proposal-dir>/context/solicitation/ and write durable guardrail artifacts
under <proposal-dir>/guardrail/. Reserve <proposal-dir>/out/ for temporary
build or compile outputs.
In a multi-proposal repo, use <proposal-dir> to mean one concrete proposal
workspace such as proposals/nsf-25-533-fairos.
For one proposal workspace, prefer this layout:
<proposal-dir>/
context/
solicitation/
solicitation.pdf
solicitation.txt
faq.txt
pappg-excerpt.txt
team/
notes/
guardrail/
solicitation-requirements.json
solicitation-qc.md
solicitation-from-pdf.txt
solicitation-source-check.json
solicitation-source-check.md
Only <proposal-dir>/context/solicitation/solicitation.txt is required for
parsing. Keep <proposal-dir>/context/solicitation/solicitation.pdf nearby for
manual verification of tables, footnotes, or formatting details that raw text
may flatten.
ingestUse this mode when:
When both PDF and text are available, start with a source cross-check:
python skills\nsf-proposal-guardrail\scripts\verify_solicitation_sources.py --pdf proposals\nsf-25-533-fairos\context\solicitation\solicitation.pdf --txt proposals\nsf-25-533-fairos\context\solicitation\solicitation.txt --pdf-text-output proposals\nsf-25-533-fairos\guardrail\solicitation-from-pdf.txt --report-json proposals\nsf-25-533-fairos\guardrail\solicitation-source-check.json --report-md proposals\nsf-25-533-fairos\guardrail\solicitation-source-check.md
This step does three things:
Then run the parser:
python skills\nsf-proposal-guardrail\scripts\parse_solicitation_text.py --input proposals\nsf-25-533-fairos\context\solicitation\solicitation.txt --output proposals\nsf-25-533-fairos\guardrail\solicitation-requirements.json
If there are supporting sources:
python skills\nsf-proposal-guardrail\scripts\parse_solicitation_text.py --input proposals\nsf-25-533-fairos\context\solicitation\solicitation.txt --input proposals\nsf-25-533-fairos\context\solicitation\faq.txt --input proposals\nsf-25-533-fairos\context\solicitation\pappg-excerpt.txt --output proposals\nsf-25-533-fairos\guardrail\solicitation-requirements.json
Then render the checklist:
python skills\nsf-proposal-guardrail\scripts\render_qc_checklist.py --requirements proposals\nsf-25-533-fairos\guardrail\solicitation-requirements.json --proposal-dir proposals\nsf-25-533-fairos --output proposals\nsf-25-533-fairos\guardrail\solicitation-qc.md
The parser is heuristic. Treat the generated JSON and markdown as candidate baselines, not final truth.
Open references/output-schema.md if you need field meanings. Open references/verification-rules.md when resolving ambiguity.
qaUse this mode when the user asks questions such as:
Workflow:
<proposal-dir>/guardrail/solicitation-requirements.json and <proposal-dir>/guardrail/solicitation-qc.md if they exist.ingest first.required, conditional, not required, or unclearWhen mapping to the proposal repository, use references/template-mapping.md.
preflightUse this mode immediately before submission or whenever the user asks:
Workflow:
ingest has been run on the current solicitation.python skills\nsf-proposal-guardrail\scripts\check_personnel_consistency.py --proposal-dir proposals\nsf-25-533-fairos --output-json proposals\nsf-25-533-fairos\guardrail\personnel-consistency.json --output-md proposals\nsf-25-533-fairos\guardrail\personnel-consistency.md
\section{}, \subsection{}, and
\subsubsection{} titles:python skills\nsf-proposal-guardrail\scripts\check_heading_case.py --proposal-dir proposals\nsf-25-533-fairos --output-json proposals\nsf-25-533-fairos\guardrail\heading-case.json --output-md proposals\nsf-25-533-fairos\guardrail\heading-case.md
<proposal-dir>/context/team/<person>/profile.md as a preflight gap, because
those files are the preferred drafting-time source for team qualification.
For the PI, a profile under template/context/team/<person>/profile.md
satisfies this check as a fallback — the PI's general profile is maintained
at the template level and shared across proposals.references/template-mapping.md for the full collaboration-vs-support
distinction and template locations.Treat preflight as a guardrail, not as a legal assertion. Surface ambiguity instead of pretending certainty.
required, conditional, and prohibited separate.scripts/parse_solicitation_text.pyParse one or more raw text files and emit a structured JSON file with requirement candidates and supporting evidence.
scripts/verify_solicitation_sources.pyExtract PDF text and compare it against <proposal-dir>/context/solicitation/solicitation.txt
before drafting-time use.
scripts/render_qc_checklist.pyRender the parsed JSON into a markdown checklist and optionally map common NSF sections to files in the current workspace.
scripts/check_personnel_consistency.pyCompare 30-collaborators.tex against the active proposal .tex files and
flag PI/co-PI role mismatches, unknown personnel mentions, missing institution
mentions in 03-team-qualification.tex, and missing cleaned team profiles
under context/team/.
scripts/check_heading_case.pyCheck whether sectioning commands in proposal .tex files follow the repo's
Title Case heading convention.
references/output-schema.mdDescribe the JSON shape used by both qa and preflight.
references/verification-rules.mdDefine source precedence, ambiguity-handling rules, and what to leave unresolved.
references/template-mapping.mdMap common NSF proposal components onto the repository layout.