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
| State | Files | Status for us | |
|---|---|---|---|
| PR 5 | Merged 2026-11-05 (2a1847e, approved and merged by Mark) | observe_view-and-manage-frameworks.md, observe_manage-framework.md | The spec |
| PR 6 | Open when evaluated; merged later on 2026-11-05 (6df1426) | report_view-reports.md, report_create-report.md | A proposal, and it reads PR 5 as its companion |
| PR 4 and earlier | Merged 2026-10-23 or before | Already 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
- 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.
- One measure: "Policy enforcement posture". Off / Observe / Enforce counts and proportions, with the denominator visible.
- 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.
- 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.
- 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.
- No mapped policies reads "No mapped policies" with an unavailable ratio, never 0% or 100%. Unsupported requirements sit outside the denominator.
- Framework detail has four parts: understand the framework, controls and mapped policies, posture, posture over time.
- 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.
- 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.
- Other evidence (Sessions, Finding resolution, configuration history) can be described separately but adds no posture units.
- 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 5 | Result |
|---|---|---|
| "Compliance Posture" as one % | Off / Observe / Enforce distribution, labelled "Policy enforcement posture" | Replace |
| Enforce 1, Observe 0.25, Off 0 | Three buckets, no weights | Replace |
Averaged per person, from applicability() | Published default mode only; subject-weighting excluded | Replace |
| An exception weakens the number; an allow takes 10 points | Exceptions annotate each bucket | Replace. Named as future work, so deferred rather than rejected |
| Observe-only policies count as full when observing | Mode only | Replace, and this leaves a question (below) |
| Green / orange / red bar by threshold | Not specified | Replace. A health colour reads as a rating, which the intent warns against |
| "Compliance Score", options A–F | Compliance 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 base | Findings are linked and never read as proof; PR 6 reports Enforced / Observed with the unit stated | Keep as a plain Findings column, no base |
| Coverage column and machine removed | "not overall framework coverage" | Keep |
| Unaddressable items leave the table for Gaps | Outside the denominator, not zero-scored | Keep, rename Gaps |
| Pill shows the policy's own mode | Published default mode | Keep |
| "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:
| Framework | Rows mapped | Units | Off (exc.) | Observe (exc.) | Enforce (exc.) | Ratio | Bar today |
|---|---|---|---|---|---|---|---|
| OWASP LLM (tracked) | 10 / 10 | 28 | 5 (2) | 21 (2) | 2 (3) | 18 / 75 / 7 | 50% |
| OWASP Agentic | 10 / 10 | 36 | 6 (2) | 27 (2) | 3 (3) | 17 / 75 / 8 | 54% |
| NIST AI RMF | 15 / 18 | 38 | 6 (1) | 22 (2) | 10 (3) | 16 / 58 / 26 | 54% |
| ISO 27001 | 2 / 3 | 4 | 2 (2) | 1 (0) | 1 (0) | 50 / 25 / 25 | 43% |
| SOC 2 | 0 / 3 | 0 | unavailable | "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=adoptionworld, 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 there | PR 5 | Action |
|---|---|---|
| Compliance Posture bar with % | Distribution, denominator, exception counts | Conflict: replace |
| Compliance Score cell and "checks" footnote | Out of scope | Conflict: retire; decide on a Findings column |
| "Stop tracking" | Untrack | Conflict: rename |
| Tracked / Available sections | Tracked / Untracked states; untracked stays browsable | Rename the section. The behaviour already fits |
| Track stages a change in the Policy Config draft | Saves independently of publication | Conflict: the listing doesn't move until publish today |
| No publisher or edition in the row | Name, publisher, edition, description, state | Missing |
| Subtitle "auto-tagged to the control", "instrumented", "evaluated continuously" | Mappings show relevance, not coverage | Conflict: rewrite the copy |
| Dead "Add" button | Fixed catalog; no custom frameworks | Remove |
| Five frameworks, ISO 27001 among them | Three proposed; approval is separate | Decision: F4 ruled four, with Agentic |
| No audit of tracking | Actor, time, previous and new state | Missing |
Framework detail (/mock/compliance/detail)
| What's there | PR 5 | Action |
|---|---|---|
| Title row with kind, publisher, version | Adds source link and tracking state | Missing: source link, mapping revision |
| Quiet Tracked pill with a Stop tracking confirm | Same Track / Untrack control | Fits; rename |
| Nothing marks an untracked framework as excluded | "clearly identifying it as excluded from active reporting" | Missing |
| Donut of distinct policies | Distribution of mapping units | Conflict: change the basis |
| Open findings machine | Not required, not forbidden | Keep. 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 example | Rewrite |
| Flat table, ID and label | Native groupings: NIST functions, SOC 2 categories | Missing |
| "Name" header; OWASP reads "Items" (Mark, 2026-11-03) | Umbrella "framework controls"; OWASP risks | Decision: this undoes a recent ruling |
| Rows carry policy pills by own mode | Same | Fits |
note shows only under the bar on procedural rows | Rationale and limits alongside each control | Partial: show it on every row |
| Per-row posture % | Not required; units are per pair | Decision: row units add up exactly to the band, so a small bar can stay honest |
| Gaps section | Outside the denominator, disclosed | Keep, 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 history | Posture over time, with reconstruction and revision marks | Missing, the largest new piece |
| No exception detail | Inspect scopes and overrides without changing the count | Missing |
| No other evidence | Described separately, no units | Missing |
Policies (/mock/policies, policy detail)
The policy model is untouched. PR 5 reaches Policies in three places.
| What's there | PR 5 | Action |
|---|---|---|
| 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 group | Conflict: remove. c126 C5 and c123 X1/X2 already planned this |
| "Active frameworks req…" column | Tracked frameworks, read-only | Rename |
PolicyFrameworks: Requirement, Contributes, "Not tracked" | Source terms, rationale and limits, Untracked | Revise. Its link also opens the record page rather than the composed mock |
| Policy detail's Findings, mode and Exceptions | Canonical home for those | Fits; the framework page links here |
framework-track as a Policy Config line | Outside the draft | Conflict: 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.
| c128 | PR 6 | Result |
|---|---|---|
| Three reports: Posture, Inventory, Deployment status | Four: Inventory, Findings, Compliance, Executive Summary | Conflict |
| Findings is a section of Posture (Mark, 2026-11-03) | Its own report | Conflict with a ruling |
| Board folds into the catalog's band (Mark, 2026-11-03) | Executive Summary is its own report | Conflict with a ruling |
| Compliance stays with c123 | Compliance Report in the catalog | Conflict. c123 still owns the definition |
| Live reader, window in the URL | Fixed snapshot PDF; live browser reports out of scope | Conflict |
| No generated list | Create → Generating / Ready / Failed → download, with a history list | Missing |
| CSV and JSON (D7) | Out of scope | Conflict |
| Rolling, calendar, custom, compare | 7, 30, 90, custom; start and end comparison inside the period | Partial. The shared picker stays for operator pages |
| Findings / SLA, past-target lists | "SLA-specific reporting is not a new v1 requirement" | Conflict |
| No MTTR | MTTR with cohort size, trend, and new / resolved / reopened per bucket | Missing |
| Posture score 78 leads the report | Not in PR 6; "not an invented numeric risk score" for severity | Conflict, and it clears up the "posture" collision |
| "Framework evidence": with evidence, partly, none | Off / Observe / Enforce against mappings | Conflict, from PR 5 directly |
| Evidence pack lands in Reports | "A full audit evidence package" out of scope | Conflict |
| No recommendations | Enforce-pilot candidates, v1 target | Missing, and needs monitored-activity counts |
| Team scope ruled, not built | All Teams or one, on all four | Missing |
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:
| Today | Goes to |
|---|---|
| Posture · Posture score, What lowers it, At-risk harnesses | Leaves Reports; stays on /posture |
| Posture · Findings and SLA | Findings report, SLA replaced by MTTR |
| Posture · Data protection, Egress | Not in PR 6. Drop, or raise as additions |
| Posture · Policies in force | Compliance report |
| Posture · Framework evidence | Compliance report, rewritten |
| Inventory · all but Spend | Inventory report |
| Inventory · Spend | Not in PR 6. Cost Center keeps it |
| Deployment · Coverage, States, People, Stale | Inventory report's monitoring questions |
| Deployment · Shadow installs, Versions | Not in PR 6; raise, or leave with the operator pages |
| Catalog's Board band | Executive Summary report |
Our own open questions, now answered
From CYCLE.md and the gap check in intents-redline.md §5.
| Question or ask | PR 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 migration | Edition and mapping revision kept with each measurement. How updates are released stays open |
| Open Q4: browse untracked? | Yes |
| Redline 1: split by object | Yes, as two intents, with tracking folded in |
| Redline 2: evidence as mapping targets | Declined |
| Redline 3: Enforced / Observed / Evidenced / Outside | Declined in favour of Off / Observe / Enforce |
| Redline 4: tracking moves Off to Observe | Declined, tracking moves nothing |
| Redline 5: version pinning | Accepted, plus mapping revision |
| Redline 6: fit and provenance per mapping | Mostly: 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.
- Observe-only policies cap the Enforce ratio (above). An annotation would solve it without changing the calculation.
- Pilots are invisible in the ratio (above). Should the framework page show tightening vs loosening, as PR 6's report does?
- The catalog omits OWASP Agentic, which F4 ruled in on 2026-10-27.
- 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.
- "Qplane". PR 6 calls the app Qplane throughout, and
enforce_publish-policy-configuration.mdon main uses it too. Nothing on the design side does. Is it the product's name? - Leftover wording. PR 6 still says "enabled framework" and "disabled periods"; PR 5 keeps "framework toggles".
- Superseded intents on main: the two older framework files, plus the four the redline lists.
- Findings on a framework page. PR 5 doesn't say which window or basis applies. Report and page should agree.