← Design · c123

intents-pr5-evaluation.md

Thread `intents-pr5`: evaluation (2026-11-05)

From intents-pr5-prompt.md. It feeds intents-pr5-plan.md.

Evaluated against the lab as it stands today, uncommitted work included: the running :3000 pages, their code, and PR 5's counting rule run over the lab's world.

Update, same day (Mark): merging PR 5 wasn't meant to settle anything over the Nov 4 metric, so the "Replace" results below say what PR 5 asks for, not what's been decided. Mark's rule: posture reports only on what Qpoint can know and govern. Mark then ruled two metrics: a posture score of progress toward each policy's best possible mode, and a separate exceptions metric. Compliance Score stays as built, marked projected, and living reports stay over PDF. PR 6 merged later the same day; Mark ruled that its four reports replace our three, as living pages. See the plan's rulings.

The short version

Compliance and framework detail need rework, not a polish. PR 5 excludes what the 2026-11-04 posture-score thread built. That thread's Compliance Posture is subject-weighted and exception-adjusted, and PR 5 lists both as v1 exclusions. Compliance Score is out as well. The instinct behind the thread survives: configuration and what actually happened stay two separate readings.

Policies needs little. The frameworks strip has to go, which c126 and c123 already planned. PR 5 now makes it a requirement.

Reports is the largest change, but it's driven by PR 6, not PR 5. PR 6 is still open and unreviewed. It replaces our three live reports with four generated PDFs. PR 5 only forces the framework section to change.

One earlier ruling reverses. Tracking no longer stages policies at Observe (c118 A6 and Q10, c123 F8). Tracking is now a reporting preference outside the draft.

What changed in ../intents

StateFilesStatus for us
PR 5Merged 2026-11-05 (2a1847e, approved and merged by Mark)observe_view-and-manage-frameworks.md, observe_manage-framework.mdThe spec
PR 6Open when evaluated; merged later on 2026-11-05 (6df1426)report_view-reports.md, report_create-report.mdA proposal, and it reads PR 5 as its companion
PR 4 and earlierMerged 2026-10-23 or beforeAlready taken in by c121

PR 5 only adds files. The older observe_view-a-framework-details.md and observe_view-policies-and-frameworks.md are still on main and still describe coverage states and gaps. Treat the two new files as the current word.

PR 5's rules

  1. Track / Untrack, Tracked / Untracked. Tracking is an organization reporting preference. It changes no policy, it saves outside the shared draft and publish, and each change is audited with actor, time and previous and new state.
  2. One measure: "Policy enforcement posture". Off / Observe / Enforce counts and proportions, with the denominator visible.
  3. The unit is a distinct policy-to-control mapping. Each one counts once, equally weighted, and takes the policy's published organization default mode. Pending changes don't move it.
  4. Exceptions annotate; they don't count. Each bucket shows its distinct active published exception records (once per bucket, whatever the mapping count). Expired, revoked and pending ones are excluded.
  5. Excluded in v1: a single weighted score, compliance scoring, and exception-adjusted, subject-weighted or device-weighted calculations. More sophisticated exception-aware calculations are named as future work.
  6. No mapped policies reads "No mapped policies" with an unavailable ratio, never 0% or 100%. Unsupported requirements sit outside the denominator.
  7. Framework detail has four parts: understand the framework, controls and mapped policies, posture, posture over time.
  8. Vocabulary: "framework controls" is the umbrella term. Source terms stay: OWASP risks, NIST AI RMF outcomes, SOC 2 criteria. Native groupings stay. Short labels are told apart from official titles.
  9. History is reconstructed from retained policy, exception and mapping history, including periods before or while untracked. Reconstructed ranges are marked, and missing history is unavailable rather than zero. Mapping changes are marked so a denominator change doesn't look like progress.
  10. Other evidence (Sessions, Finding resolution, configuration history) can be described separately but adds no posture units.
  11. Fixed v1 scope. No tailoring, custom frameworks or editable mappings. Future tailoring is described but not committed.

The two metrics against PR 5

This is the core conflict, so it comes first.

posture-score (2026-11-04, uncommitted)PR 5Result
"Compliance Posture" as one %Off / Observe / Enforce distribution, labelled "Policy enforcement posture"Replace
Enforce 1, Observe 0.25, Off 0Three buckets, no weightsReplace
Averaged per person, from applicability()Published default mode only; subject-weighting excludedReplace
An exception weakens the number; an allow takes 10 pointsExceptions annotate each bucketReplace. Named as future work, so deferred rather than rejected
Observe-only policies count as full when observingMode onlyReplace, and this leaves a question (below)
Green / orange / red bar by thresholdNot specifiedReplace. A health colour reads as a rating, which the intent warns against
"Compliance Score", options A–FCompliance scoring out of scope; PR 6: "not a compliance score"Retire the name and the options
Findings folded into a Score cell, with a checks baseFindings are linked and never read as proof; PR 6 reports Enforced / Observed with the unit statedKeep as a plain Findings column, no base
Coverage column and machine removed"not overall framework coverage"Keep
Unaddressable items leave the table for GapsOutside the denominator, not zero-scoredKeep, rename Gaps
Pill shows the policy's own modePublished default modeKeep
"Enforcement Posture" naming"Policy enforcement posture"Keep, one word longer

What survives from Mark's prompt: how we're configured and how it's going are still two readings, and each covers the other's blind spot. PR 6's Compliance Report is built the same way: posture, then Enforced / Observed Findings. Only the formula and the word "score" go.

The numbers: what the mock would show

PR 5's rule run over the lab's established world, with exceptions counted as live() counts them:

FrameworkRows mappedUnitsOff (exc.)Observe (exc.)Enforce (exc.)RatioBar today
OWASP LLM (tracked)10 / 10285 (2)21 (2)2 (3)18 / 75 / 750%
OWASP Agentic10 / 10366 (2)27 (2)3 (3)17 / 75 / 854%
NIST AI RMF15 / 18386 (1)22 (2)10 (3)16 / 58 / 2654%
ISO 270012 / 342 (2)1 (0)1 (0)50 / 25 / 2543%
SOC 20 / 30unavailable"No Qpoint policy"

Three things this shows:

  • The story changes. "50%" reads as half-done. "7% Enforce" reads as an org that's mostly observing, which is true of this world.
  • The band has to change too. Framework detail's donut counts distinct policies (16: 2 / 10 / 4). PR 5 counts mappings (28: 2 / 21 / 5). If both appeared they would disagree, so the donut's basis moves.
  • SOC 2 is empty. It's in PR 5's proposed catalog with nothing mapped in the lab, so most of its page can't be reviewed until mappings exist.

Two consequences of the rule are worth raising. Neither is a defect in the mock:

  • Observe-only policies cap the ratio. 11 of OWASP LLM's 28 units sit on policies that can't enforce, so it can never pass 61% Enforce. The intent doesn't say so, and a reader will assume 100% is reachable.
  • Pilots don't move the ratio. In the ?stage=adoption world, OWASP LLM reads 11 / 89 / 0 with 5 exceptions, while Engineering and Dev are enforcing. The adoption story's main progress shows only as an annotation. PR 6 asks for a tightening / loosening summary in the report; the framework page probably needs it too.

Surface by surface

Compliance listing (/mock/compliance)

What's therePR 5Action
Compliance Posture bar with %Distribution, denominator, exception countsConflict: replace
Compliance Score cell and "checks" footnoteOut of scopeConflict: retire; decide on a Findings column
"Stop tracking"UntrackConflict: rename
Tracked / Available sectionsTracked / Untracked states; untracked stays browsableRename the section. The behaviour already fits
Track stages a change in the Policy Config draftSaves independently of publicationConflict: the listing doesn't move until publish today
No publisher or edition in the rowName, publisher, edition, description, stateMissing
Subtitle "auto-tagged to the control", "instrumented", "evaluated continuously"Mappings show relevance, not coverageConflict: rewrite the copy
Dead "Add" buttonFixed catalog; no custom frameworksRemove
Five frameworks, ISO 27001 among themThree proposed; approval is separateDecision: F4 ruled four, with Agentic
No audit of trackingActor, time, previous and new stateMissing

Framework detail (/mock/compliance/detail)

What's therePR 5Action
Title row with kind, publisher, versionAdds source link and tracking stateMissing: source link, mapping revision
Quiet Tracked pill with a Stop tracking confirmSame Track / Untrack controlFits; rename
Nothing marks an untracked framework as excluded"clearly identifying it as excluded from active reporting"Missing
Donut of distinct policiesDistribution of mapping unitsConflict: change the basis
Open findings machineNot required, not forbiddenKeep. Its count differs from the Score column today, so the two need one basis
"How these are worked out"Explain the unit, with the worked exampleRewrite
Flat table, ID and labelNative groupings: NIST functions, SOC 2 categoriesMissing
"Name" header; OWASP reads "Items" (Mark, 2026-11-03)Umbrella "framework controls"; OWASP risksDecision: this undoes a recent ruling
Rows carry policy pills by own modeSameFits
note shows only under the bar on procedural rowsRationale and limits alongside each controlPartial: show it on every row
Per-row posture %Not required; units are per pairDecision: row units add up exactly to the band, so a small bar can stay honest
Gaps sectionOutside the denominator, disclosedKeep, rename, say "fixed v1 scope"
Footnote: "nothing on this page is evidence for an auditor""maps selected policies and evidence"Rewrite; F1 still holds
No historyPosture over time, with reconstruction and revision marksMissing, the largest new piece
No exception detailInspect scopes and overrides without changing the countMissing
No other evidenceDescribed separately, no unitsMissing

Policies (/mock/policies, policy detail)

The policy model is untouched. PR 5 reaches Policies in three places.

What's therePR 5Action
Frameworks strip on the listing: "Active Compliance frameworks", "Activate All", "Enable Required Policies", % complete, "Show inactive"Tracking never changes a policy; a framework is not a managed policy groupConflict: remove. c126 C5 and c123 X1/X2 already planned this
"Active frameworks req…" columnTracked frameworks, read-onlyRename
PolicyFrameworks: Requirement, Contributes, "Not tracked"Source terms, rationale and limits, UntrackedRevise. Its link also opens the record page rather than the composed mock
Policy detail's Findings, mode and ExceptionsCanonical home for thoseFits; the framework page links here
framework-track as a Policy Config lineOutside the draftConflict: see below

There's no bulk route left for "turn on this framework's policies". PR 5's journey is: Manage Framework → Review Policy → Configure and Publish. Framework detail needs a way to go from "5 Off" to those policies. Today it only has per-pill links.

Reassuring: the lab's world is already live state, with the draft shown only under ?preview=draft. So "use published state" costs nothing, and the preview just needs labelling. Removing framework-track from the draft is close to one line, because OPERATIONAL in useGovernanceMock.ts already marks the kinds that apply live.

Reports (/mock/reports)

PR 6 is open, so this is a proposal, but the structure differs enough to weigh now.

c128PR 6Result
Three reports: Posture, Inventory, Deployment statusFour: Inventory, Findings, Compliance, Executive SummaryConflict
Findings is a section of Posture (Mark, 2026-11-03)Its own reportConflict with a ruling
Board folds into the catalog's band (Mark, 2026-11-03)Executive Summary is its own reportConflict with a ruling
Compliance stays with c123Compliance Report in the catalogConflict. c123 still owns the definition
Live reader, window in the URLFixed snapshot PDF; live browser reports out of scopeConflict
No generated listCreate → Generating / Ready / Failed → download, with a history listMissing
CSV and JSON (D7)Out of scopeConflict
Rolling, calendar, custom, compare7, 30, 90, custom; start and end comparison inside the periodPartial. The shared picker stays for operator pages
Findings / SLA, past-target lists"SLA-specific reporting is not a new v1 requirement"Conflict
No MTTRMTTR with cohort size, trend, and new / resolved / reopened per bucketMissing
Posture score 78 leads the reportNot in PR 6; "not an invented numeric risk score" for severityConflict, and it clears up the "posture" collision
"Framework evidence": with evidence, partly, noneOff / Observe / Enforce against mappingsConflict, from PR 5 directly
Evidence pack lands in Reports"A full audit evidence package" out of scopeConflict
No recommendationsEnforce-pilot candidates, v1 targetMissing, and needs monitored-activity counts
Team scope ruled, not builtAll Teams or one, on all fourMissing

What holds: R2's basis tags are PR 6's "selected period vs current snapshot". R6's hatching is its "unavailable, not zero". R3 is its "share definitions". R4 is its "read-only". The footer has the data cutoff. The document face and the rollups all carry over. The window picker stays because c128 D5 makes it the operator pages' control.

Where today's sections go if PR 6 lands:

TodayGoes to
Posture · Posture score, What lowers it, At-risk harnessesLeaves Reports; stays on /posture
Posture · Findings and SLAFindings report, SLA replaced by MTTR
Posture · Data protection, EgressNot in PR 6. Drop, or raise as additions
Posture · Policies in forceCompliance report
Posture · Framework evidenceCompliance report, rewritten
Inventory · all but SpendInventory report
Inventory · SpendNot in PR 6. Cost Center keeps it
Deployment · Coverage, States, People, StaleInventory report's monitoring questions
Deployment · Shadow installs, VersionsNot in PR 6; raise, or leave with the operator pages
Catalog's Board bandExecutive Summary report

Our own open questions, now answered

From CYCLE.md and the gap check in intents-redline.md §5.

Question or askPR 5's answer
Open Q1: control layer above policies?Yes. Controls, then policies
Open Q2: what covers a requirement besides policies?Described separately, no units. Our four-state proposal is declined
Open Q3: version migrationEdition and mapping revision kept with each measurement. How updates are released stays open
Open Q4: browse untracked?Yes
Redline 1: split by objectYes, as two intents, with tracking folded in
Redline 2: evidence as mapping targetsDeclined
Redline 3: Enforced / Observed / Evidenced / OutsideDeclined in favour of Off / Observe / Enforce
Redline 4: tracking moves Off to ObserveDeclined, tracking moves nothing
Redline 5: version pinningAccepted, plus mapping revision
Redline 6: fit and provenance per mappingMostly: rationale, limits and revision

CYCLE.md's objective needs matching edits: "no percentage" (PR 5 allows proportions, never a score or a % of controls satisfied), "non-policy evidence covers a requirement", the four working states, and F8.

The OWASP tour still uses Evidenced as a per-mitigation chip. That can stay as a description of what Qpoint does for one mitigation, as long as it isn't presented as a posture.

Worth raising with Peterson

Nothing has been sent; the memory rule stands that he revises the intents himself. These are for Mark to bring if he wants to.

  1. Observe-only policies cap the Enforce ratio (above). An annotation would solve it without changing the calculation.
  2. Pilots are invisible in the ratio (above). Should the framework page show tightening vs loosening, as PR 6's report does?
  3. The catalog omits OWASP Agentic, which F4 ruled in on 2026-10-27.
  4. Should an untracked framework show current posture? Expected Behavior says the catalog shows posture, and also that retained samples must not read as current. Read together, it's unclear.
  5. "Qplane". PR 6 calls the app Qplane throughout, and enforce_publish-policy-configuration.md on main uses it too. Nothing on the design side does. Is it the product's name?
  6. Leftover wording. PR 6 still says "enabled framework" and "disabled periods"; PR 5 keeps "framework toggles".
  7. Superseded intents on main: the two older framework files, plus the four the redline lists.
  8. Findings on a framework page. PR 5 doesn't say which window or basis applies. Report and page should agree.

Qpoint Brand Style Guide