Skip to main content
Checked against the product · 2026-10-05

Past Performance Library

Your past performance is the evidence that you can do the work — and in government contracting it is evaluated, not assumed. The Past Performance Library is where that evidence lives as structured records rather than as a folder of old proposals: one record per contract you have performed, with the narrative sections an evaluator expects, the CPARS ratings you earned, and explicit assertions about what each engagement proves you can do. NEO reads this library when it scores an opportunity, so a thin library does not merely look bad in a proposal — it quietly suppresses your bid scores.

For: capture and BD analysts, proposal managers · Time: ~15 minutes · You'll need: the FP&A module and the contract documents or old proposals you want to draw from.

How to access​

Navigate to Past Performance in the Business Development section of the sidebar, or go directly to /bd/past-performance. Opening a specific record gives it its own URL, so a record can be linked to and shared.


Part 1 — The ideas you need first (read once)​

A record is evidence, not a description​

Each record represents one contract you have performed. It carries structured fields (customer, agency, value, period, NAICS), the CPARS ratings for that engagement where they exist, a set of narrative sections — the prose an evaluator reads — and capability assertions, which are the explicit claims this engagement supports.

The assertions are the part people skip and the part that does the work. A record that says "we ran a $12M help desk" is a description. A record that asserts this proves we can staff a 24/7 tier-2 operation under a firm-fixed-price vehicle is evidence you can point a proposal at.

AI proposes, you confirm​

Extraction runs through a queue, not straight into your library. When Arcvue reads a document, the result lands in the extraction queue for a human to approve or reject — individually, or in bulk once you trust a batch. Nothing becomes a library record because a model produced it.

This is deliberate and it matches how Arcvue treats every AI-authored artifact: the machine drafts, a person confirms, and the confirmation is what makes it real. If you find yourself approving a queue without reading it, you have converted a control into a formality.

Three bulk operations, and they are not the same thing​

The library offers three sweeps across records. They solve different problems and it is worth knowing which you want:

OperationWhat it is for
ExtractPull structured fields and narrative out of source documents you have attached
RemediateGo back over existing records and fill in what is missing or malformed
SynthesizeGenerate narrative sections from the structured data already held

Each sweep runs across every record in the library, so each asks you to confirm in a dialog that says so before it starts.

Remediate is the one to reach for on an inherited library — it improves what is already there. Synthesize is for records where the facts are correct but the prose an evaluator needs was never written.

What Arcvue deliberately will not do​

It will not invent a CPARS rating you did not receive, and it will not promote an extraction into your library without a human approving it. Records with unknown status are shown as unknown rather than guessed into a category.


Part 2 — How to run it​

The assertion form is a toggle: Add Assertion opens it and Cancel closes it again without adding anything.

Step 1 — Understand the three panels​

The screen is three panels, left to right:

  • Left — filters. Search, plus status, agency, contract value, CPARS and grade. This is how you find one record in a library of hundreds. Search also reaches every record's capability assertions — type a capability ("zero trust", "help desk") and the list narrows to the records that assert it, even when the phrase appears nowhere in the title or narrative.
  • Center — the record list. A paginated card list that appends as you load more, so scrolling deepens the list rather than replacing it.
  • Right — the record detail. The structured fields, CPARS, the narrative sections, the capability assertions, and a changelog of who changed what.

Select a record on the left or center and it opens on the right, editable in place.

Reading a record card​

Each card in the center panel carries the title, the client, the period of performance, the value, and a row of badges. Four things on it are easy to misread, and all four are decided somewhere other than where they appear.

The status badge: Active is a flag, not a date​

One of four badges sits on every card: Active, Expired ≤5y, Expired or Unknown.

Active means the record is flagged active. It is not a comparison against today's date. Arcvue checks that flag first and stops there — the period of performance is never consulted. So a contract that finished last year still reads Active until somebody clears the flag on the record. If a card's dates look finished and the badge says otherwise, the badge is reporting the flag faithfully and the flag is what is stale.

The other three badges are date arithmetic, and only reached when the flag is not set:

  • Expired ≤5y — the end date falls inside the five-year recency window. This is the same bucket the filter rail spells Expired < 5 years; the card abbreviates it and the rail does not.
  • Expired — the end date is older than that window.
  • Unknown — Arcvue could not read an end date. That covers a record with no end date recorded and one whose end date is not in a form Arcvue can read. The badge does not tell you which, so open the record.

→ Present on the date line does not mean ongoing​

The date line prints the start, an arrow, and the end. When no end date is recorded it prints Present — that is the blank being rendered, not a statement that the work continues.

So read the date line and the badge together. Present with an Active badge is genuinely live work. Present with an Unknown badge is the same missing field showing up twice: nobody recorded an end date, and the card has nothing to print. A missing start date prints ?.

An em dash in the value is "not recorded or zero"​

The value line shows an em dash when there is no contract value and when the value is exactly zero. Those two are indistinguishable on the card. Open the record if the difference matters — the same rule the rest of Arcvue follows, where an unset number is shown as unset rather than as a figure that looks measured.

The tick box is for export, not for viewing​

Clicking anywhere on a card opens that record on the right. The small tick box in its corner does something different: Select for export adds the record to the set an export will carry, and deliberately does not change which record is open. You can tick a dozen cards while reading one.

The count of ticked records appears at the top of the list beside the totals, so you can see how many an export will carry without scrolling back.

12 of 240 is loaded-of-matched, not matched-of-everything​

The line above the list reads N of total. The first number is how many cards have loaded; the second is how many records match your current filters. Load more appends the next page — it never re-runs or relaxes the filters. So a narrow filter showing 12 of 240 means 240 records matched and you are looking at the first twelve of them.

When nothing matches, the panel says so and names the filters as the reason, which is almost always what it is.

The filter rail​

Status takes more than one value at a time: Active, Expired < 5 years, Expired > 5 years, and Unknown.

The split at five years is the recency line, not a tidy bucket. A record that expired inside five years still carries weight in a source selection; one older than that generally does not. Filtering to Expired < 5 years is how you see the evidence you can still lean on, and it is the single most useful narrowing on this screen.

Completeness offers All, A+B or C.

A+B is a completeness grade, not a performance rating. It means the record is well filled in — not that the work went well. CPARS ratings are a separate filter with their own values. Reading A+B as a performance grade inverts the meaning of the shortlist you build from it, which is the mistake this section exists to stop.

Active only is a checkbox and is not the same control as the Active status option — one is a toggle, the other a member of the multi-select. Setting either narrows to live work; setting both is not stricter than setting one.

All NAICS is the unset state of the NAICS picker, meaning no code filter rather than every code explicitly chosen.

Three controls clear different things, and the names say which: Clear search empties the search box only, Clear all filters resets the rail, and Clear on the library view drops the current selection.

Step 2 — Get source material in​

Import your existing contracts and proposals, and attach source documents to records. This is the raw material every later step reads; a library built by hand-typing will always be thinner than one built from the documents you already have.

Reading one document straight into a record​

Import Past Performance from Document takes a single .docx or .pdf and drafts a record from it, rather than asking you to key the fields.

It runs in four steps and the third is the one that matters: Arcvue reads the document, shows you a draft with every field filled in, and writes nothing until you save. Correct anything in place first — this is the same AI proposes, you confirm rule as everywhere else in the library, on one screen.

The draft covers Contract Title, Contract Number, Agency, Agency Category, CPARS Rating, Contract Type, Contract Vehicle, Period of Performance, Place of Performance, Prime Contractor, FTEs, NAICS Codes, Contract Value and a Description Summary.

It also tells you how much text it actually read, and which model read it. That is worth a glance before you trust a sparse draft: a short character count on a long document means the file did not extract well — a scanned PDF, or one whose text layer is missing — and the fix is a better source file, not more typing. Cancel closes it without creating anything.

Step 3 — Run extraction, then work the queue​

Run extraction across your imported documents, then go to the extraction queue and adjudicate it. Approve what is right, reject what is not, correct what is close. Bulk-approve only a batch you have actually sampled.

Before a bulk run — what the confirmation asks​

Each bulk action stops and asks before it starts, naming what it is about to touch:

  • Run AI extraction on every record? — extraction runs in the background across every record in the library. Proposals appear in each record's extraction panel as they are queued, and nothing is saved until you approve it.
  • Run AI cleanup on every record? — a conservative narrative copyedit across every record. Changes require your approval before saving.
  • Distill oversized sections on every record? — compresses PWS-style content in Size and Magnitude and in Requirements, preserving proposal-critical facts.

Cancel is the default. The dialog opens with Cancel focused, so pressing Enter without reading does not start a run across the whole library. While the request is being sent the dialog stays open and both buttons are disabled — it closes when the server has accepted the job, not when you clicked, so a refusal never looks like a start.

These say every record in the library rather than a count on purpose: the job runs against the whole table, and a number printed here would be a second copy of that fact, free to go stale.

Step 4 — Fill the gaps​

With records in place, use remediate to complete partial records and synthesize to produce narrative where you have facts but no prose. Then read the results — these are AI-drafted and they are going into proposals under your name.

Step 5 — Write the capability assertions​

For each significant record, state what the engagement proves. Be specific and be honest: assertions are what NEO matches against when it scores an opportunity, so an inflated assertion produces a confident recommendation to bid something you cannot staff.

Each assertion already on the record carries edit, which reopens it in the same form, and remove, which deletes it. Remove asks you to confirm first, and once you confirm there is no undo. Deleting a supporting document and removing a staff row ask the same way, for the same reason. The two sit next to each other, both small and both gray until you hover. If you meant to reword an assertion, you want edit — removing and retyping loses the record of what the claim used to say.

Step 6 — Keep CPARS current​

Enter CPARS ratings as they are issued. They are among the strongest evidence in the library and among the most commonly stale.


Step 7 — Choose what an export carries​

Configure Export decides which fields each record contributes to an export, so a proposal package carries what that customer asked for and nothing else.

Fourteen header fields can be turned on or off — Agency, Contract Number, Prime Contractor, Subcontract Number, Period of Performance, Contract Value, Contract Type, FTEs, NAICS Codes, PSC, Place of Performance, Contract Vehicle, Workshare % and Recompete — with Select all and Clear all for the whole set, and All / None where a group offers them. The narrative blocks are separate toggles under Additional Sections, which is where the executive summary lives.

Your selection is remembered in this browser, not on your account. It is stored locally, so a colleague opening the same library sees the defaults, you see the defaults again on a different machine, and clearing your browser's site data resets it. If a package has to be built the same way twice, write the field list down somewhere durable rather than relying on the screen to remember it. Cancel leaves the configuration as it was.

What a record carries beyond its narrative​

Opening a record shows two sections a proposal actually draws on.

Key Personnel / LCATs​

A table of who you staffed: LCAT, FTEs, and Qualifications (certs, clearances). + Add Row appends an empty row for you to fill. Edits save as you leave a field — there is no separate save — so a row you start and abandon is a blank row on the record, not a discarded draft.

The × at the right-hand end of a row deletes it, immediately and without asking. It is the only control in this table that is not a text field, and it sits one tab-stop past the qualifications box.

This is the part a proposal cites. "We staffed three cleared Senior Systems Engineers" is a claim an evaluator can check; a narrative alone is not. A record with no staff rows can still be cited, but it cannot answer the question an evaluator asks next.

Supporting Documents​

CPARS ratings, modification letters, kudos emails — anything that backs the record up. The upload control is not in this section: it is Upload Supporting Doc in the top-right toolbar. The section lists what is already attached.

The character count on each row is the important part, and it is easy to READ PAST. Each attachment shows either a count of extracted characters or an em dash. Extracted text feeds the AI narrative synthesis, so a document showing a dash is filed but is not feeding anything. The record looks supported, and the narrative behind it was written without that document.

delete at the end of a row removes that attachment. It does not ask, and there is no undo. The document goes, and so does the extracted text that was feeding the narrative synthesis — so a record can quietly lose the evidence behind a paragraph somebody already wrote. Re-upload is the only way back, and it re-extracts from scratch.

A scanned letter is the usual cause — a photograph of a page carries no text layer. If a document matters to the narrative and shows a dash, replace it with one that has real text rather than assuming the AI read it.

Retry re-runs a load that failed.

Part 3 — When something looks wrong​

"NEO says we have no qualifying past performance and I know we do." NEO matches against library records, not against your memory or your file share. Check the record exists, is approved out of the extraction queue, and carries capability assertions covering the work in question. A record with no assertions is very hard to match.

"An extraction got the numbers wrong." That is what the queue is for — reject or correct it there. If a whole batch is wrong in the same way, the source documents are probably a format the extractor has not seen; fix one by hand and raise the pattern rather than correcting fifty individually.

"Synthesize produced narrative I would not put in a proposal." Treat synthesized prose as a first draft. It is generated from the structured data you hold, so thin structured data produces thin narrative — the fix is usually upstream, in the record, not in the wording.

"Two records look like the same contract." Likely one came from an import and one from an extraction. Keep the richer record, move any assertions across, and retire the other — the changelog on each will tell you which is which.


One-line summary​

One record per contract you have performed, extracted from real documents, approved by a human out of the queue, and carrying explicit capability assertions — because NEO scores your bids against this library, so what is missing here costs you opportunities elsewhere.


  • NEO — the adjudication engine that reads this library. "Matched past performance" and "no qualifying past performance" in a NEO decision both trace back to records here.
  • Pricing — proposals that cite this evidence.