693
library statements, one atomic statement per objective
0
model calls in either proposer: drafts are assembled from the data, not written
20 + 31
drafts in the synthetic Level 2 run: documentation, then remediation
49 of 51
of those accepted; both rejections were judgment calls
The whole pipeline
Two buttons on the assessment, both on the isolated runner, both reading every failing requirement.
Read or step
Rows written
Drafts live in their own tables so proposed text can never be counted as coverage. Nothing here changes a mark, a POA&M status or the score.
1
Document: drafts from the standard library
For a Define objective that isn't written down anywhere.
- Find the unwritten objectives. For each failing requirement, take its failing Define objectives. A requirement doesn't need a POA&M to get drafts; one that can't go on a POA&M gets drafts labeled "must be met before assessment".
- Pick library language. Each objective links to the statements that satisfy it. Each statement says one thing, so one objective can draw more than one. An objective with no library statement still gets a draft: an empty one, flagged for a person to write.
- Word it for this client. Tokens such as
{{company_name}} and {{it_lead}} are replaced with the client's values. Any token left unresolved is listed on the draft, never shipped silently.
- Say where it goes. If a client document matches the statement's owning document by name, the draft says "add to existing document" and links it; otherwise "new document needed", with a name and type.
- Write it as Proposed, linked to its source statement ("Based On"), the objective and the failing requirement, with a one-line rationale.
Re-running adds only drafts that don't exist yet. A draft already there is never re-created, so a rejected one stays rejected. One still Proposed is re-worded if a client value has changed since; an accepted one keeps the wording it was accepted with.
Where the client's values come from
When a document is reviewed in Phase 3, a parallel job reads it for the client's own values (company name, the person or provider who runs IT) and records each as "Extracted (verify)", quoting the passage it came from. It fills blanks only, and never touches a value a person confirmed. The consultant confirms them in their own view.
Confirm values before accepting. A draft takes the value present when it is generated, confirmed or not, and names every unconfirmed value in its notes. Confirming the value and re-running re-words any draft still Proposed.
3
Close the loop: by hand, on purpose
A draft is a suggestion. Only proof moves the assessment.
- Review. In the "Proposed (review)" views the consultant accepts, edits or rejects each draft. Accepted documentation is adopted into the client's real document; an accepted remediation is folded into the POA&M's plan, or, for a requirement that can't be deferred, into the work due before assessment.
- The client does the work. The new policy section or the changed setting produces evidence, collected in Phase 4.
- Link it. The consultant links that evidence to the draft through Implemented As and sets it Implemented.
- Re-score in Phase 5. The objective is marked MET from the evidence, the score moves, and the POA&M shows as stale until the consultant closes it.
Why none of this is automatic. Accepting a draft says the fix is right, not that it's done; marking it Implemented says it was done, not that the evidence proves the objective. Each step stays a person's decision, and only the Phase 5 marks change the score.
Decision log
The calls that shaped the recommendation phase, and when they were made.
| Decision | Why | When |
| Proposals as child rows of the POA&M, not fields on it | Several typed fixes per gap, and the consultant's plan stays untouched | 2026-07-22 |
| Assemble drafts from data, with no model | Every word traces to the library or the client's records | 2026-07-22 |
| Recommendations in their own table, apart from evidence | Proposed text must never count as coverage | 2026-07-22 |
| Route by the evidence recipe's function, not the broad requirement-to-technology map | The broad map fans out to a dozen loosely relevant categories per requirement | 2026-07-22 |
| Harvest values across all documents, fill blanks only, never overwrite a confirmed one | A person's confirmation outranks a model's extraction | 2026-07-28 |
Resolve {{technology}} in both directions; list any leftover token on the draft | 14 of 31 drafts in one run carried a raw placeholder | 2026-09-19 |
| Draft for every failing requirement and link the draft to the requirement; link a POA&M only where one exists | Starting from POA&Ms skipped the heaviest gaps: 28 of 59 failing requirements had none, and the re-run gave them 42 documentation drafts and 27 remediations | 2026-09-30 |
| Flag unconfirmed values and missing library statements on the draft itself | The consultant reads the review queue, not the run log | 2026-09-30 |
Known gaps
- "Extend coverage" is never proposed, and placement never suggests revising existing language; it's add or new.
- A rejected draft blocks a fresh one. Re-running won't propose that fix again, even after the situation changes, until the rejected row is deleted.
- Nothing reaches the client portal yet. Drafts are reviewed in NocoDB and shared by the consultant.