{"id":"ops/review-goals","relativePath":"ops/review-goals.md","title":"Review Goals Audit","markdown":"# Review Goals Audit\n\n`pnpm review:goals` is the 10/10 review-goal audit. It collects the local gates\nthat came out of the project review and separates them from evidence that cannot\nbe fabricated locally.\n\nRun it locally:\n\n```bash\npnpm review:goals\npnpm review:goals:local\npnpm review:goals:check\n```\n\nUse `pnpm review:goals:local` in CI when the expected state is \"all local gates\nare complete, but real-world evidence is still pending.\" It exits non-zero only\nwhen `score.incomplete > 0`, and version-5+ artifacts expose the same result as\ntop-level `localGateStatus: \"passed\" | \"failed\"`. Use `pnpm review:goals:check`\nfor the final strict 10/10 gate; version-20+ artifacts expose that result as\ntop-level `strictGateStatus: \"passed\" | \"failed\"`, and it must keep failing\nuntil production, partner, and customer evidence is actually present.\n\nThe command writes timestamped JSON and Markdown evidence to\n`artifacts/review-goals/`, including `review-goals-latest.json` and\n`review-goals-latest.md`. JSON artifact `version: 45` adds top-level\n`readinessClaim`, a machine-readable boundary that names the allowed local-gate\nclaim, the blocked strict-production claim, and the production proof scopes\nstill needed before anyone can call the project strict 10/10 ready. Version 44 adds\n`blockedByExternalEvidenceGoals[].actionBreakdown[].blockerCount`,\n`artifactCount`, and `requirementCount`, so each blocked-goal action exposes\ndashboard-ready totals without counting its blocker, artifact, or requirement\narrays. Version 42 adds\n`blockedByExternalEvidenceGoals[].scopeBreakdown[].nextActionIds`, so each\nnamed blocked goal can join scoped handoffs to grouped `nextActions` rows\nwithout interpreting legacy `actionIds`. Version 41 adds\n`blockedByExternalEvidenceGoals[].scopeCount`, so each named blocked goal shows\nwhether its remaining work spans one or multiple execution lanes without\ncounting `executionScopes[]`. Version 40 adds\n`blockedByExternalEvidenceGoals[].actionCount`, `commandCount`, and\n`artifactCount`, so each named blocked goal exposes dashboard-ready handoff\ntotals without counting arrays. Version 39 adds\n`blockedByExternalEvidenceGoals[].nextEvidenceRequirements` and\n`requirementCount`, so each blocked-goal handoff carries its exact acceptance\ncriteria directly. Version 38 adds\n`externalEvidenceBlockerSummary[].nextActionIds` and scoped `actionCount`, so\neach blocker-scope summary points directly at the grouped remediation actions.\nVersion 37 adds\n`externalEvidenceBlockerSummary[].nextEvidenceRequirements` and scoped\n`requirementCount`, so each blocker-scope summary carries its acceptance\ncriteria directly. Version 36 adds `nextActionSummary[].actionCount`, so each\nexecution-scope lane exposes its action total directly while legacy `count`\nremains for compatibility. Version 35 adds top-level\n`strictGateHandoff.nextActionCount` and scoped\n`strictGateHandoff.scopeBreakdown[].nextActionCount`, so strict handoff\ndashboards can display executable action totals without counting action ID\narrays. Version 34 adds scoped\n`blockedByExternalEvidenceGoals[].scopeBreakdown[].remediationCommands`,\n`artifactTargets`, and `nextEvidenceRequirements`, so per-goal blocked\nhandoffs carry the executable operator payload without joining back through\n`actionBreakdown`. Version 33 adds\n`blockedByExternalEvidenceGoals[].scopeBreakdown[].actionCount`,\n`commandCount`, `artifactCount`, and `requirementCount`, so per-goal blocked\nhandoffs can display scoped action, command, artifact, and acceptance-criteria\ntotals without counting nested arrays. Version 32 adds\n`strictGateHandoff.requirementCount` and scoped\n`strictGateHandoff.scopeBreakdown[].requirementCount`, so dashboards can display\ndistinct next-evidence acceptance criteria without counting long requirement\narrays; these counts are deduplicated and can be lower than blocker counts.\nVersion 31 adds `strictGateHandoff.artifactCount` and scoped\n`strictGateHandoff.scopeBreakdown[].artifactCount`, so dashboards can display\ndistinct evidence-artifact target totals without counting arrays. Version 30\nadds `strictGateHandoff.commandCount` and scoped\n`strictGateHandoff.scopeBreakdown[].commandCount`, so dashboards can display\ndistinct remediation-command totals without counting arrays; scoped action\ncounts remain separate because one command can appear in more than one\nexecution scope. Version 29 adds `strictGateHandoff.goalCount` and scoped\n`strictGateHandoff.scopeBreakdown[].goalCount`, so the strict-gate operator\npayload exposes affected-goal totals without consumers counting arrays. Version\n28 adds\n`strictGateHandoff.nextActionIds[]` and scoped\n`strictGateHandoff.scopeBreakdown[].nextActionIds[]`, so the strict-gate\noperator payload points directly at the executable `nextActions[]` rows without\nreconstructing command/scope keys. Version 27 adds\n`strictGateHandoff.blockerIds[]` and scoped\n`strictGateHandoff.scopeBreakdown[].blockerIds[]`, so the strict-gate operator\npayload names the exact failing checks without requiring consumers to join\nthrough goal rows or blocker summaries. Version 26 adds\n`strictGateHandoff.scopeBreakdown[]`, so the strict-gate operator payload keeps\ndeployment-environment and real-world-evidence commands, artifacts, blockers,\ngoals, and evidence requirements separated without another join. Version 25 adds\n`strictGateHandoff.nextEvidenceRequirements[]`, so the consolidated strict-gate\noperator payload includes the exact evidence sentences from the scoped action\nrows, not only commands and artifact paths. Version 24 adds top-level\n`strictGateHandoff`, a machine-readable strict-gate operator handoff that\nconsolidates failing summary IDs, execution scopes, blocker count, affected\ngoals, remediation commands, and artifact targets without requiring consumers\nto re-join the summary rows. Version 23 extends the runtime invariant guard so\nevery `strictGateFailureSummary[]` field must match the derived strict-gate\nrows, not just the row IDs. Version 22 adds top-level\n`strictGateFailureSummary[]`, a structured dashboard-ready form of strict gate\nfailure rows with kind, scope, blocker counts, goals, commands, artifacts, and\nthe matching human reason. Version 21 adds top-level\n`strictGateFailureReasons[]`, so a failed strict 10/10 gate names the local,\ndeployment-environment, and real-world evidence lanes that still block launch\nreadiness instead of forcing dashboards to reconstruct those sentences. Version\n20 adds top-level `strictGateStatus`, the machine-readable result for\n`pnpm review:goals:check`, so CI, dashboards, and launch handoffs do not have\nto infer strict 10/10 readiness from the broader status string. Version 19 keys\n`nextActions` by\nremediation command plus `executionScope`, so a command that appears in both\ndeployment setup and real-world evidence collection produces separate action\nrows instead of one mixed-scope handoff. Version 18 adds top-level\n`externalEvidenceBlockerSummary[]` rows that aggregate raw blocker IDs, goals,\ncommands, and artifact targets by `executionScope`, independently from grouped\nactions, so blocker debt is visible even before operators inspect\n`nextActions`. Version 17 is the first shape where\ngoal-level and report-level external-evidence blocker rows carry their own\n`executionScope`, so each blocker can be triaged as `local-refresh`,\n`deployment-environment`, or `real-world-evidence` without joining through\n`nextActions`. Version 16 is the first shape where\ntop-level `nextActionSummary[]` rows include distinct `commands` and\n`artifactTargets`, so each execution-scope lane is executable without joining\nthrough `nextActions`. Version 15 added `goalIds`, `goalTitles`,\n`goalCategories`, and `goalCount`, so each lane identifies the goals it affects\ninstead of only action and blocker totals. Version 14 added\n`blockedByExternalEvidenceGoals[].scopeBreakdown[]` to split each blocked goal's\naction IDs, next-action IDs, and blocker IDs by `local-refresh`,\n`deployment-environment`, and `real-world-evidence`, so operators can see\nwhether a named goal needs deploy wiring or real adoption/customer/30-day\nevidence. Version 13 localized\n`blockedByExternalEvidenceGoals[].actionBreakdown[].nextEvidenceRequirements`\nto the blocker IDs for that same goal, so shared commands do not inherit\nrequirements from unrelated goals. The schema now requires every blocked\nexternal-evidence goal to include at least one blocker id, next action id,\nexecution scope, remediation command, artifact target, and action-breakdown row,\nplus per-action blocker, artifact, and requirement counts, plus all three scope\nsummary rows, and generated blocker/action/scope/artifact arrays must be\nunique, so blocked goals cannot degrade into duplicated or prose-only handoffs.\nVersion 12 added `actionBreakdown` entries\nmapping each command to the goal-local blocker IDs it remediates, version 11\nadded exact `blockerIds`, version 10 added `nextActionIds`, `executionScopes`,\n`remediationCommands`, and `artifactTargets` to those rows, version 9 added the\nnamed blocked-goal records,\nversion 8 added `score.blockedByExternalEvidence`, version 7 added top-level\n`nextActionSummary` counts by execution scope; version 6 added\n`executionScope` on each grouped `nextActions` row, version 5 added a top-level\n`localGateStatus`, version 4 added machine-readable `artifactTargets`\non each grouped action row, version 3 added machine-readable\n`nextEvidenceRequirements`, version 2 was the first shape with top-level\n`nextActions`, and earlier version-1 artifacts are\npre-action-plan evidence handoffs. Each JSON artifact includes a `$schema` pointer to\n`docs/schemas/review-goals.schema.json` and each goal includes\n`evidenceArtifacts` paths that name where proof should land plus\n`evidenceArtifactStatuses` observations for the latest local file state\n(`missing`, `present`, `pass`, `failed`, `blocked`, and blocker counts). The\nservice exports the report version as `REVIEW_GOALS_REPORT_VERSION`, and the\nscript contract tests require the JSON schema `version.const` and emitted report\nversion to match that constant before the contract is accepted. Before the CLI\nprints or writes an artifact, it also compares the generated JSON shape against\nthe schema-required keys and every `additionalProperties: false` object promised\nby the schema for top-level report fields, score fields, goal rows, evidence\nrows, blocked-goal handoffs, next actions, and next-action summaries, so\nschema/report drift fails before a malformed handoff can be emitted. Goals\nthat depend on specific checks inside a larger artifact also include\n`evidenceArtifactCheckStatuses`; for example, launch readiness now preserves the\nspecific deployment-preflight and launch-review checks that are passing,\nfailing, or missing, managed-pilot packets derive entitlement/outreach/\nbilling/activation/support/KPI/retention checks from the packet fields, long-term and\nEra C exit-gate artifacts expose their SLO, uptime, adoption, p95, and KPI\nchecks, ActivityStreams artifacts expose their consumer and subscription checks,\nand Render validation/reconciliation service probes can be complete when their\n`/health` checks pass even if the broader production preflight is still failing\nfor unrelated storage or smoke reasons. Activity\nsyndication proof also preserves accepted and rejected callback evidence rows;\nsubscriptions only count when they are active external HTTPS callbacks whose\npublic, non-placeholder callback host matches the callback URL, are updated\ninside the evidence window, and cover Create, Update, and Delete. The coarse\nActivityStreams syndication readiness flag also requires the selected\n`activity.declaredConsumers` and `activity.durableSubscriptions` rows to pass,\nso a top-level ready artifact cannot hide missing durable subscriptions. Use the\nMarkdown file as the human handoff summary for the remaining external blockers.\nManaged-pilot billing checks also revalidate the invoice reference directly:\ndemo, fixture, internal, placeholder, sample, smoke, or test invoice tokens fail\nthe selected `pilot.billing.invoice` gate even if an artifact says billing is\nready. The coarse paid-pilot readiness flag also requires every selected\nmanaged-pilot check to pass: entitlement, billing, outreach, selected account,\nactivation milestones, support load, required KPIs, and retention signal.\nFor the Render validation/reconciliation goal, documented local fallback text is\nnot sufficient: the audit only counts the goal as deployed evidence when both\nselected service checks contain passing public HTTPS Render `/health` probe\nevidence; HTTP, non-health, placeholder, local, or private-network probe text\nremains a deployment blocker.\n\nBefore the CLI writes JSON or Markdown artifacts, it validates report invariants\nthat the JSON schema cannot express: score totals must match the goal list,\n`status`, `localGateStatus`, `strictGateStatus`,\n`strictGateFailureReasons`, every `strictGateFailureSummary[]` field, and the\nconsolidated `strictGateHandoff` must match those totals and blocker summaries,\n`score.blockedByExternalEvidence` must match the blocked-goal handoff count,\neach `blockerCount` must match its blocker IDs, blocked-goal action references\nmust point at known `nextActions`, and every `nextActionSummary` lane must match\nthe actions, commands, artifact targets, goals, and blockers in that same\nexecution scope. Each `nextActions[]` row must contain only blocker IDs whose\nraw external-evidence blocker has the same `executionScope`, so deployment\noperators cannot accidentally inherit customer, partner, or 30-day evidence\ndebt from a shared package command.\n\nSelected checks are readiness gates, not decorative annotations. A goal with\n`evidenceArtifactCheckStatuses` cannot be counted complete while any selected\ncheck is `fail`, `blocked`, `collecting`, `missing`, or otherwise not ready,\neven if a higher-level external flag was set.\nThe `launchEvidenceReady` coarse flag follows the same rule: it requires the\nselected launch-evidence, launch-review, and deployment-preflight rows to pass,\nso a hand-edited `status: ready` launch packet cannot hide a failing public URL,\nauth, worker scheduler, crawler-preview, Render probe, or SLO/tile check.\nLaunch readiness selects both `observability.publicBaseUrl` and\n`observability.socialPreviewBaseUrl` from deployment preflight, so a localhost,\nprotected, divergent, or non-HTTPS share URL stays visible as its own 10/10\nblocker before crawler-preview evidence is trusted.\nIt also selects `auth.secret`, `auth.github`, and `auth.routes`, so Auth.js\nsecret presence, GitHub OAuth credential presence, and deployed signin/session\nreachability all stay visible as distinct launch-readiness evidence.\nIt selects `runtime.workerScheduler` as well, preserving whether projection and\npublication drains are scheduled with `CRON_SECRET` or intentionally disabled\nbehind projection/publish scale flags before those workflows are enabled.\nIt selects `observability.uptime` from deployment preflight too, so the audit\nseparates \"a production-safe uptime source exists\" from the still-external\nrequirement to accumulate a passing 30-day uptime window; probe-based uptime\nmust point at the final public HTTPS deployment URL unless a Prometheus source\nis configured.\nIt also selects `evidence.validationService` and\n`evidence.reconciliationService` from deployment preflight, so launch readiness\nkeeps the deployed Render `/health` probes visible alongside the dedicated\nRender-services goal.\nThe 30-day SLO/uptime goal selects the Era C exit-gate checks `sota204P95`,\n`publicReadUptime`, `activityFeedAdoption`, and `sota26Kpis`, so performance\nmisses, insufficient uptime depth, missing external consumers, and KPI export\ngaps become their own real-world blocker rows with the\n`pnpm era-c:exit-gate:public` remediation command. Its coarse readiness flag\nalso requires the selected long-term runway rows and these Era C rows to pass,\nso a top-level ready runway artifact cannot hide a failing exit-gate check.\nIt also selects `smoke.crawlerPreview` from both launch evidence and launch\nreview packets, so social metadata cannot be accidentally dropped from the final\nlaunch-review gate while still appearing green in an earlier smoke step.\nLaunch evidence packets also carry per-step `nextEvidenceNeeded` and\n`remediation` fields for failed or skipped steps, so the top-level audit can be\nhanded to an operator with concrete commands and artifact paths instead of a\ngeneric \"launch readiness blocked\" note.\n`pnpm review:goals` preserves those fields inside\n`evidenceArtifactCheckStatuses` as `nextEvidenceNeeded`,\n`remediationCommand`, and `remediationArtifact`, which keeps the JSON schema,\nMarkdown handoff, and underlying launch packet aligned.\nWhen a source artifact uses launch-preflight or launch-review fields such as\n`recommendation`, `command`, or `evidencePath`, the collector normalizes those\ninto the same next-evidence/remediation fields. Derived pilot, long-term, and\nActivityStreams checks also receive default package-script and artifact targets\nso no selected blocker row is left as prose-only evidence debt.\nEach goal also includes `externalEvidenceBlockers`, a machine-readable list of\nthe unresolved real-world evidence requirements. It includes both coarse flags\nsuch as `launchEvidenceReady` and artifact-specific checks such as\n`artifacts/launch/launch-evidence-latest.json#hardening.securityDr`, with status,\nnext evidence, and remediation fields. Coarse external checks carry their own\nnext-evidence text, operator command, and artifact target, so production launch,\nRender service probe, long-term SLO/uptime, ActivityStreams syndication, and\npaid-pilot blockers can be handed off without inheriting misleading prose from\nthe enclosing goal or reverse-engineering the right package script.\nThe report also flattens all goal-level blockers into a top-level\n`externalEvidenceBlockers` array with `goalId`, `goalTitle`, `goalCategory`, and\n`goalStatus`, so CI, dashboards, and operator handoffs do not need to walk each\ngoal before listing the remaining real-world evidence.\nThe report also includes a top-level `nextActions` array that groups blockers by\nremediation command and unions every referenced artifact path into\n`artifactTargets`. A grouped action is keyed by both command and\n`executionScope`, so the same package script may appear once for deployment\nsetup and once for real-world proof without collapsing those lanes. A grouped\naction keeps every distinct evidence sentence from\nthe underlying blockers in `nextEvidenceRequirements`, while\n`nextEvidenceNeeded` stays as a compact human string, and the display `artifact`\nis generated from the same machine-readable target list. It also carries\n`executionScope` as `local-refresh`, `deployment-environment`, or\n`real-world-evidence`; `blockerIds` are goal-scoped references in the form\n`<goalId>:<externalCheckOrArtifactCheckId>` so a blocker reused by launch and a\nlong-term goal is not collapsed into one ambiguous id, and `blockerCount`\nmatches the number of scoped references in that list. The top-level\n`nextActionSummary` gives counts, action IDs, distinct commands, artifact\ntargets, blocker totals, distinct goal IDs, goal titles, goal categories, and\ngoal counts for each scope. That lets stale local reruns, deploy/env fixes, and\ncustomer or 30-day proof be queued separately. This lets one\n`pnpm launch:preflight:production` row preserve separate storage, SSL,\nrole-override, or service-probe requirements without forcing CI or dashboards to\nparse prose or path lists. Use this as the short operator run list; keep\n`externalEvidenceBlockers` for the full per-check audit trail.\nThe `score.blockedByExternalEvidence` metric combines `localComplete` and\n`externalEvidenceRequired`, making the total number of goals still blocked from\n10/10 visible even when one goal is marked `local-gate-complete` rather than\n`external-evidence-required`. The top-level `blockedByExternalEvidenceGoals`\narray names those same goals with id, title, category, status, next evidence,\nblocker count, exact blocker ids, grouped action ids, execution scopes, commands,\nartifact targets, a per-goal action breakdown, and a per-goal scope breakdown.\nThat lets an operator or dashboard list the four external-proof handoffs and see\nwhich command remediates which blocker, with goal-local evidence requirements\nand scope-specific blocker totals, without deriving them from the full goals\ntable or joining through `nextActions`.\nThe top-level `strictGateStatus` is the final gate result: it is `passed` only\nwhen the report status is `ten-of-ten-ready`; it remains `failed` for both\nmissing local gates and local-green reports that still need production,\npartner, customer, or 30-day evidence.\nThe top-level `strictGateFailureReasons[]` array is empty only when\n`strictGateStatus` is `passed`; otherwise it lists incomplete local gates and\nthe non-empty blocker lanes with blocker counts, goal counts, and remediation\ncommands.\nThe top-level `strictGateFailureSummary[]` array carries the same information in\nclosed structured rows, including `kind`, optional `scope`, `goalIds`,\n`remediationCommands`, and `artifactTargets`, so consumers can filter\ndeployment-environment blockers from real-world evidence blockers without\nparsing prose.\nThe top-level `strictGateHandoff` object consolidates those strict-gate rows\ninto one operator payload with summary IDs, execution scopes, blocker count,\nexact blocker IDs, exact next-action IDs, affected goal count and IDs/titles,\ndistinct remediation-command count, remediation commands, distinct artifact\ntarget count, artifact targets, distinct next-evidence requirement count, and\nevery distinct next-evidence requirement from the matching scoped actions. Its\n`scopeBreakdown[]` rows repeat those handoff fields per execution scope, so\ndeployment-environment work and real-world proof remain separable in dashboards\nand launch packets. Its arrays are empty only when the strict gate has passed.\n\nThe nightly Era C evidence workflow also runs `pnpm review:goals` and uploads\n`artifacts/review-goals/**` so the current 10/10 blocker state is captured with\nthe SLO, uptime, ActivityStreams, and KPI evidence packet.\nThe long-term packet also carries a `collectionPlan` with the daily workflow\ncadence, next scheduled run, missing distinct SLO/uptime days, missing external\nconsumer count, and earliest possible ready date when no hard SLO/uptime failure\nneeds operator intervention.\n\n## Status Meanings\n\n| Status | Meaning |\n|---|---|\n| `complete` | The local command, doc, test, and evidence checks for that goal are present and no external evidence is required. |\n| `local-gate-complete` | The local gate exists, but the goal still needs production evidence before it can be counted as truly complete. |\n| `external-evidence-required` | The local machinery exists, but real production, partner, or customer evidence is still missing. |\n| `incomplete` | A local command, doc, or test is missing and must be fixed before evidence collection is meaningful. |\n\n## Current Intent\n\nThe audit is allowed to fail `--check` until every real-world blocker is resolved.\nThat is intentional: the project should not claim 10/10 while SLO history,\nexternal ActivityStreams consumers, or real paid pilot evidence are still absent.\nThe local-gate command should pass during that interim state, proving the\nremaining failures are external evidence requirements rather than missing local\nscripts, docs, or tests.\n\nThe current local goal is `incomplete: 0`; after that, the remaining blockers must\ncome from real evidence. The latest local refresh pass also drives\n`nextActionSummary.local-refresh` to zero, so remaining action lanes are\ndeployment-environment setup and real-world evidence collection:\n\n- production launch readiness and long-term SLO/uptime depth,\n- real external ActivityStreams consumers with durable callback subscriptions,\n- real managed pilot support, activation, KPI, retention, and non-placeholder\n  invoice-backed billing evidence.\n\n## Evidence Artifact Targets\n\nThe remaining external blockers are proven by these latest artifacts:\n\n| Blocker | Latest artifact targets |\n|---|---|\n| Launch readiness | `artifacts/launch/launch-evidence-latest.json`, `artifacts/launch/launch-review-latest.json`, `artifacts/launch/deployment-preflight-latest.json`, `artifacts/exit-gate/era-c-exit-gate-latest.json`; selected launch-review and deployment-preflight checks are listed in `evidenceArtifactCheckStatuses` |\n| 30-day SLO and uptime | `artifacts/long-term-evidence/long-term-evidence-runway-latest.json`, `artifacts/long-term-evidence/long-term-evidence-maintenance-latest.json`, `artifacts/long-term-evidence/long-term-evidence-maintenance-latest.md`, `artifacts/exit-gate/era-c-exit-gate-latest.json`, `monitoring/public-read-uptime-history.json`, `artifacts/performance/k6-slo-trend.json`; selected runway SLO/uptime/adoption checks plus Era C `sota204P95`, `publicReadUptime`, `activityFeedAdoption`, and `sota26Kpis` checks are listed in `evidenceArtifactCheckStatuses`, while the maintenance artifact names failed samples, clean passing days, and the earliest failure-free window date |\n| ActivityStreams syndication | `artifacts/activity-syndication/activity-syndication-evidence-latest.json`, `storage/activity-consumers.json`, `storage/activity-subscriptions.json`; selected declared-consumer and durable-subscription checks are listed in `evidenceArtifactCheckStatuses`, and accepted/rejected callback rows prove whether external HTTPS subscriptions use public non-placeholder callback hosts, match the callback URL, are fresh, and cover Create/Update/Delete |\n| Managed pilot evidence | `artifacts/pilot-evidence/pilot-evidence-latest.json`, `artifacts/pilot-evidence/pilot-evidence-latest.md`; selected entitlement, non-placeholder invoice-backed billing, outreach, activation, support-load, KPI, and retention-signal checks are listed in `evidenceArtifactCheckStatuses` |\n","sections":[{"level":2,"heading":"Status Meanings","anchor":"status-meanings"},{"level":2,"heading":"Current Intent","anchor":"current-intent"},{"level":2,"heading":"Evidence Artifact Targets","anchor":"evidence-artifact-targets"}],"html":"<h1 id=\"review-goals-audit\">Review Goals Audit</h1>\n<p>`pnpm review:goals` is the 10/10 review-goal audit. It collects the local gates</p>\n<p>that came out of the project review and separates them from evidence that cannot</p>\n<p>be fabricated locally.</p>\n<p>Run it locally:</p>\n<pre><code>\npnpm review:goals\npnpm review:goals:local\npnpm review:goals:check\n</code></pre>\n<p>Use `pnpm review:goals:local` in CI when the expected state is &quot;all local gates</p>\n<p>are complete, but real-world evidence is still pending.&quot; It exits non-zero only</p>\n<p>when `score.incomplete &gt; 0`, and version-5+ artifacts expose the same result as</p>\n<p>top-level `localGateStatus: &quot;passed&quot; | &quot;failed&quot;`. Use `pnpm review:goals:check`</p>\n<p>for the final strict 10/10 gate; version-20+ artifacts expose that result as</p>\n<p>top-level `strictGateStatus: &quot;passed&quot; | &quot;failed&quot;`, and it must keep failing</p>\n<p>until production, partner, and customer evidence is actually present.</p>\n<p>The command writes timestamped JSON and Markdown evidence to</p>\n<p>`artifacts/review-goals/`, including `review-goals-latest.json` and</p>\n<p>`review-goals-latest.md`. JSON artifact `version: 45` adds top-level</p>\n<p>`readinessClaim`, a machine-readable boundary that names the allowed local-gate</p>\n<p>claim, the blocked strict-production claim, and the production proof scopes</p>\n<p>still needed before anyone can call the project strict 10/10 ready. Version 44 adds</p>\n<p>`blockedByExternalEvidenceGoals[].actionBreakdown[].blockerCount`,</p>\n<p>`artifactCount`, and `requirementCount`, so each blocked-goal action exposes</p>\n<p>dashboard-ready totals without counting its blocker, artifact, or requirement</p>\n<p>arrays. Version 42 adds</p>\n<p>`blockedByExternalEvidenceGoals[].scopeBreakdown[].nextActionIds`, so each</p>\n<p>named blocked goal can join scoped handoffs to grouped `nextActions` rows</p>\n<p>without interpreting legacy `actionIds`. Version 41 adds</p>\n<p>`blockedByExternalEvidenceGoals[].scopeCount`, so each named blocked goal shows</p>\n<p>whether its remaining work spans one or multiple execution lanes without</p>\n<p>counting `executionScopes[]`. Version 40 adds</p>\n<p>`blockedByExternalEvidenceGoals[].actionCount`, `commandCount`, and</p>\n<p>`artifactCount`, so each named blocked goal exposes dashboard-ready handoff</p>\n<p>totals without counting arrays. Version 39 adds</p>\n<p>`blockedByExternalEvidenceGoals[].nextEvidenceRequirements` and</p>\n<p>`requirementCount`, so each blocked-goal handoff carries its exact acceptance</p>\n<p>criteria directly. Version 38 adds</p>\n<p>`externalEvidenceBlockerSummary[].nextActionIds` and scoped `actionCount`, so</p>\n<p>each blocker-scope summary points directly at the grouped remediation actions.</p>\n<p>Version 37 adds</p>\n<p>`externalEvidenceBlockerSummary[].nextEvidenceRequirements` and scoped</p>\n<p>`requirementCount`, so each blocker-scope summary carries its acceptance</p>\n<p>criteria directly. Version 36 adds `nextActionSummary[].actionCount`, so each</p>\n<p>execution-scope lane exposes its action total directly while legacy `count`</p>\n<p>remains for compatibility. Version 35 adds top-level</p>\n<p>`strictGateHandoff.nextActionCount` and scoped</p>\n<p>`strictGateHandoff.scopeBreakdown[].nextActionCount`, so strict handoff</p>\n<p>dashboards can display executable action totals without counting action ID</p>\n<p>arrays. Version 34 adds scoped</p>\n<p>`blockedByExternalEvidenceGoals[].scopeBreakdown[].remediationCommands`,</p>\n<p>`artifactTargets`, and `nextEvidenceRequirements`, so per-goal blocked</p>\n<p>handoffs carry the executable operator payload without joining back through</p>\n<p>`actionBreakdown`. Version 33 adds</p>\n<p>`blockedByExternalEvidenceGoals[].scopeBreakdown[].actionCount`,</p>\n<p>`commandCount`, `artifactCount`, and `requirementCount`, so per-goal blocked</p>\n<p>handoffs can display scoped action, command, artifact, and acceptance-criteria</p>\n<p>totals without counting nested arrays. Version 32 adds</p>\n<p>`strictGateHandoff.requirementCount` and scoped</p>\n<p>`strictGateHandoff.scopeBreakdown[].requirementCount`, so dashboards can display</p>\n<p>distinct next-evidence acceptance criteria without counting long requirement</p>\n<p>arrays; these counts are deduplicated and can be lower than blocker counts.</p>\n<p>Version 31 adds `strictGateHandoff.artifactCount` and scoped</p>\n<p>`strictGateHandoff.scopeBreakdown[].artifactCount`, so dashboards can display</p>\n<p>distinct evidence-artifact target totals without counting arrays. Version 30</p>\n<p>adds `strictGateHandoff.commandCount` and scoped</p>\n<p>`strictGateHandoff.scopeBreakdown[].commandCount`, so dashboards can display</p>\n<p>distinct remediation-command totals without counting arrays; scoped action</p>\n<p>counts remain separate because one command can appear in more than one</p>\n<p>execution scope. Version 29 adds `strictGateHandoff.goalCount` and scoped</p>\n<p>`strictGateHandoff.scopeBreakdown[].goalCount`, so the strict-gate operator</p>\n<p>payload exposes affected-goal totals without consumers counting arrays. Version</p>\n<p>28 adds</p>\n<p>`strictGateHandoff.nextActionIds[]` and scoped</p>\n<p>`strictGateHandoff.scopeBreakdown[].nextActionIds[]`, so the strict-gate</p>\n<p>operator payload points directly at the executable `nextActions[]` rows without</p>\n<p>reconstructing command/scope keys. Version 27 adds</p>\n<p>`strictGateHandoff.blockerIds[]` and scoped</p>\n<p>`strictGateHandoff.scopeBreakdown[].blockerIds[]`, so the strict-gate operator</p>\n<p>payload names the exact failing checks without requiring consumers to join</p>\n<p>through goal rows or blocker summaries. Version 26 adds</p>\n<p>`strictGateHandoff.scopeBreakdown[]`, so the strict-gate operator payload keeps</p>\n<p>deployment-environment and real-world-evidence commands, artifacts, blockers,</p>\n<p>goals, and evidence requirements separated without another join. Version 25 adds</p>\n<p>`strictGateHandoff.nextEvidenceRequirements[]`, so the consolidated strict-gate</p>\n<p>operator payload includes the exact evidence sentences from the scoped action</p>\n<p>rows, not only commands and artifact paths. Version 24 adds top-level</p>\n<p>`strictGateHandoff`, a machine-readable strict-gate operator handoff that</p>\n<p>consolidates failing summary IDs, execution scopes, blocker count, affected</p>\n<p>goals, remediation commands, and artifact targets without requiring consumers</p>\n<p>to re-join the summary rows. Version 23 extends the runtime invariant guard so</p>\n<p>every `strictGateFailureSummary[]` field must match the derived strict-gate</p>\n<p>rows, not just the row IDs. Version 22 adds top-level</p>\n<p>`strictGateFailureSummary[]`, a structured dashboard-ready form of strict gate</p>\n<p>failure rows with kind, scope, blocker counts, goals, commands, artifacts, and</p>\n<p>the matching human reason. Version 21 adds top-level</p>\n<p>`strictGateFailureReasons[]`, so a failed strict 10/10 gate names the local,</p>\n<p>deployment-environment, and real-world evidence lanes that still block launch</p>\n<p>readiness instead of forcing dashboards to reconstruct those sentences. Version</p>\n<p>20 adds top-level `strictGateStatus`, the machine-readable result for</p>\n<p>`pnpm review:goals:check`, so CI, dashboards, and launch handoffs do not have</p>\n<p>to infer strict 10/10 readiness from the broader status string. Version 19 keys</p>\n<p>`nextActions` by</p>\n<p>remediation command plus `executionScope`, so a command that appears in both</p>\n<p>deployment setup and real-world evidence collection produces separate action</p>\n<p>rows instead of one mixed-scope handoff. Version 18 adds top-level</p>\n<p>`externalEvidenceBlockerSummary[]` rows that aggregate raw blocker IDs, goals,</p>\n<p>commands, and artifact targets by `executionScope`, independently from grouped</p>\n<p>actions, so blocker debt is visible even before operators inspect</p>\n<p>`nextActions`. Version 17 is the first shape where</p>\n<p>goal-level and report-level external-evidence blocker rows carry their own</p>\n<p>`executionScope`, so each blocker can be triaged as `local-refresh`,</p>\n<p>`deployment-environment`, or `real-world-evidence` without joining through</p>\n<p>`nextActions`. Version 16 is the first shape where</p>\n<p>top-level `nextActionSummary[]` rows include distinct `commands` and</p>\n<p>`artifactTargets`, so each execution-scope lane is executable without joining</p>\n<p>through `nextActions`. Version 15 added `goalIds`, `goalTitles`,</p>\n<p>`goalCategories`, and `goalCount`, so each lane identifies the goals it affects</p>\n<p>instead of only action and blocker totals. Version 14 added</p>\n<p>`blockedByExternalEvidenceGoals[].scopeBreakdown[]` to split each blocked goal&#39;s</p>\n<p>action IDs, next-action IDs, and blocker IDs by `local-refresh`,</p>\n<p>`deployment-environment`, and `real-world-evidence`, so operators can see</p>\n<p>whether a named goal needs deploy wiring or real adoption/customer/30-day</p>\n<p>evidence. Version 13 localized</p>\n<p>`blockedByExternalEvidenceGoals[].actionBreakdown[].nextEvidenceRequirements`</p>\n<p>to the blocker IDs for that same goal, so shared commands do not inherit</p>\n<p>requirements from unrelated goals. The schema now requires every blocked</p>\n<p>external-evidence goal to include at least one blocker id, next action id,</p>\n<p>execution scope, remediation command, artifact target, and action-breakdown row,</p>\n<p>plus per-action blocker, artifact, and requirement counts, plus all three scope</p>\n<p>summary rows, and generated blocker/action/scope/artifact arrays must be</p>\n<p>unique, so blocked goals cannot degrade into duplicated or prose-only handoffs.</p>\n<p>Version 12 added `actionBreakdown` entries</p>\n<p>mapping each command to the goal-local blocker IDs it remediates, version 11</p>\n<p>added exact `blockerIds`, version 10 added `nextActionIds`, `executionScopes`,</p>\n<p>`remediationCommands`, and `artifactTargets` to those rows, version 9 added the</p>\n<p>named blocked-goal records,</p>\n<p>version 8 added `score.blockedByExternalEvidence`, version 7 added top-level</p>\n<p>`nextActionSummary` counts by execution scope; version 6 added</p>\n<p>`executionScope` on each grouped `nextActions` row, version 5 added a top-level</p>\n<p>`localGateStatus`, version 4 added machine-readable `artifactTargets`</p>\n<p>on each grouped action row, version 3 added machine-readable</p>\n<p>`nextEvidenceRequirements`, version 2 was the first shape with top-level</p>\n<p>`nextActions`, and earlier version-1 artifacts are</p>\n<p>pre-action-plan evidence handoffs. Each JSON artifact includes a `$schema` pointer to</p>\n<p>`docs/schemas/review-goals.schema.json` and each goal includes</p>\n<p>`evidenceArtifacts` paths that name where proof should land plus</p>\n<p>`evidenceArtifactStatuses` observations for the latest local file state</p>\n<p>(`missing`, `present`, `pass`, `failed`, `blocked`, and blocker counts). The</p>\n<p>service exports the report version as `REVIEW_GOALS_REPORT_VERSION`, and the</p>\n<p>script contract tests require the JSON schema `version.const` and emitted report</p>\n<p>version to match that constant before the contract is accepted. Before the CLI</p>\n<p>prints or writes an artifact, it also compares the generated JSON shape against</p>\n<p>the schema-required keys and every `additionalProperties: false` object promised</p>\n<p>by the schema for top-level report fields, score fields, goal rows, evidence</p>\n<p>rows, blocked-goal handoffs, next actions, and next-action summaries, so</p>\n<p>schema/report drift fails before a malformed handoff can be emitted. Goals</p>\n<p>that depend on specific checks inside a larger artifact also include</p>\n<p>`evidenceArtifactCheckStatuses`; for example, launch readiness now preserves the</p>\n<p>specific deployment-preflight and launch-review checks that are passing,</p>\n<p>failing, or missing, managed-pilot packets derive entitlement/outreach/</p>\n<p>billing/activation/support/KPI/retention checks from the packet fields, long-term and</p>\n<p>Era C exit-gate artifacts expose their SLO, uptime, adoption, p95, and KPI</p>\n<p>checks, ActivityStreams artifacts expose their consumer and subscription checks,</p>\n<p>and Render validation/reconciliation service probes can be complete when their</p>\n<p>`/health` checks pass even if the broader production preflight is still failing</p>\n<p>for unrelated storage or smoke reasons. Activity</p>\n<p>syndication proof also preserves accepted and rejected callback evidence rows;</p>\n<p>subscriptions only count when they are active external HTTPS callbacks whose</p>\n<p>public, non-placeholder callback host matches the callback URL, are updated</p>\n<p>inside the evidence window, and cover Create, Update, and Delete. The coarse</p>\n<p>ActivityStreams syndication readiness flag also requires the selected</p>\n<p>`activity.declaredConsumers` and `activity.durableSubscriptions` rows to pass,</p>\n<p>so a top-level ready artifact cannot hide missing durable subscriptions. Use the</p>\n<p>Markdown file as the human handoff summary for the remaining external blockers.</p>\n<p>Managed-pilot billing checks also revalidate the invoice reference directly:</p>\n<p>demo, fixture, internal, placeholder, sample, smoke, or test invoice tokens fail</p>\n<p>the selected `pilot.billing.invoice` gate even if an artifact says billing is</p>\n<p>ready. The coarse paid-pilot readiness flag also requires every selected</p>\n<p>managed-pilot check to pass: entitlement, billing, outreach, selected account,</p>\n<p>activation milestones, support load, required KPIs, and retention signal.</p>\n<p>For the Render validation/reconciliation goal, documented local fallback text is</p>\n<p>not sufficient: the audit only counts the goal as deployed evidence when both</p>\n<p>selected service checks contain passing public HTTPS Render `/health` probe</p>\n<p>evidence; HTTP, non-health, placeholder, local, or private-network probe text</p>\n<p>remains a deployment blocker.</p>\n<p>Before the CLI writes JSON or Markdown artifacts, it validates report invariants</p>\n<p>that the JSON schema cannot express: score totals must match the goal list,</p>\n<p>`status`, `localGateStatus`, `strictGateStatus`,</p>\n<p>`strictGateFailureReasons`, every `strictGateFailureSummary[]` field, and the</p>\n<p>consolidated `strictGateHandoff` must match those totals and blocker summaries,</p>\n<p>`score.blockedByExternalEvidence` must match the blocked-goal handoff count,</p>\n<p>each `blockerCount` must match its blocker IDs, blocked-goal action references</p>\n<p>must point at known `nextActions`, and every `nextActionSummary` lane must match</p>\n<p>the actions, commands, artifact targets, goals, and blockers in that same</p>\n<p>execution scope. Each `nextActions[]` row must contain only blocker IDs whose</p>\n<p>raw external-evidence blocker has the same `executionScope`, so deployment</p>\n<p>operators cannot accidentally inherit customer, partner, or 30-day evidence</p>\n<p>debt from a shared package command.</p>\n<p>Selected checks are readiness gates, not decorative annotations. A goal with</p>\n<p>`evidenceArtifactCheckStatuses` cannot be counted complete while any selected</p>\n<p>check is `fail`, `blocked`, `collecting`, `missing`, or otherwise not ready,</p>\n<p>even if a higher-level external flag was set.</p>\n<p>The `launchEvidenceReady` coarse flag follows the same rule: it requires the</p>\n<p>selected launch-evidence, launch-review, and deployment-preflight rows to pass,</p>\n<p>so a hand-edited `status: ready` launch packet cannot hide a failing public URL,</p>\n<p>auth, worker scheduler, crawler-preview, Render probe, or SLO/tile check.</p>\n<p>Launch readiness selects both `observability.publicBaseUrl` and</p>\n<p>`observability.socialPreviewBaseUrl` from deployment preflight, so a localhost,</p>\n<p>protected, divergent, or non-HTTPS share URL stays visible as its own 10/10</p>\n<p>blocker before crawler-preview evidence is trusted.</p>\n<p>It also selects `auth.secret`, `auth.github`, and `auth.routes`, so Auth.js</p>\n<p>secret presence, GitHub OAuth credential presence, and deployed signin/session</p>\n<p>reachability all stay visible as distinct launch-readiness evidence.</p>\n<p>It selects `runtime.workerScheduler` as well, preserving whether projection and</p>\n<p>publication drains are scheduled with `CRON_SECRET` or intentionally disabled</p>\n<p>behind projection/publish scale flags before those workflows are enabled.</p>\n<p>It selects `observability.uptime` from deployment preflight too, so the audit</p>\n<p>separates &quot;a production-safe uptime source exists&quot; from the still-external</p>\n<p>requirement to accumulate a passing 30-day uptime window; probe-based uptime</p>\n<p>must point at the final public HTTPS deployment URL unless a Prometheus source</p>\n<p>is configured.</p>\n<p>It also selects `evidence.validationService` and</p>\n<p>`evidence.reconciliationService` from deployment preflight, so launch readiness</p>\n<p>keeps the deployed Render `/health` probes visible alongside the dedicated</p>\n<p>Render-services goal.</p>\n<p>The 30-day SLO/uptime goal selects the Era C exit-gate checks `sota204P95`,</p>\n<p>`publicReadUptime`, `activityFeedAdoption`, and `sota26Kpis`, so performance</p>\n<p>misses, insufficient uptime depth, missing external consumers, and KPI export</p>\n<p>gaps become their own real-world blocker rows with the</p>\n<p>`pnpm era-c:exit-gate:public` remediation command. Its coarse readiness flag</p>\n<p>also requires the selected long-term runway rows and these Era C rows to pass,</p>\n<p>so a top-level ready runway artifact cannot hide a failing exit-gate check.</p>\n<p>It also selects `smoke.crawlerPreview` from both launch evidence and launch</p>\n<p>review packets, so social metadata cannot be accidentally dropped from the final</p>\n<p>launch-review gate while still appearing green in an earlier smoke step.</p>\n<p>Launch evidence packets also carry per-step `nextEvidenceNeeded` and</p>\n<p>`remediation` fields for failed or skipped steps, so the top-level audit can be</p>\n<p>handed to an operator with concrete commands and artifact paths instead of a</p>\n<p>generic &quot;launch readiness blocked&quot; note.</p>\n<p>`pnpm review:goals` preserves those fields inside</p>\n<p>`evidenceArtifactCheckStatuses` as `nextEvidenceNeeded`,</p>\n<p>`remediationCommand`, and `remediationArtifact`, which keeps the JSON schema,</p>\n<p>Markdown handoff, and underlying launch packet aligned.</p>\n<p>When a source artifact uses launch-preflight or launch-review fields such as</p>\n<p>`recommendation`, `command`, or `evidencePath`, the collector normalizes those</p>\n<p>into the same next-evidence/remediation fields. Derived pilot, long-term, and</p>\n<p>ActivityStreams checks also receive default package-script and artifact targets</p>\n<p>so no selected blocker row is left as prose-only evidence debt.</p>\n<p>Each goal also includes `externalEvidenceBlockers`, a machine-readable list of</p>\n<p>the unresolved real-world evidence requirements. It includes both coarse flags</p>\n<p>such as `launchEvidenceReady` and artifact-specific checks such as</p>\n<p>`artifacts/launch/launch-evidence-latest.json#hardening.securityDr`, with status,</p>\n<p>next evidence, and remediation fields. Coarse external checks carry their own</p>\n<p>next-evidence text, operator command, and artifact target, so production launch,</p>\n<p>Render service probe, long-term SLO/uptime, ActivityStreams syndication, and</p>\n<p>paid-pilot blockers can be handed off without inheriting misleading prose from</p>\n<p>the enclosing goal or reverse-engineering the right package script.</p>\n<p>The report also flattens all goal-level blockers into a top-level</p>\n<p>`externalEvidenceBlockers` array with `goalId`, `goalTitle`, `goalCategory`, and</p>\n<p>`goalStatus`, so CI, dashboards, and operator handoffs do not need to walk each</p>\n<p>goal before listing the remaining real-world evidence.</p>\n<p>The report also includes a top-level `nextActions` array that groups blockers by</p>\n<p>remediation command and unions every referenced artifact path into</p>\n<p>`artifactTargets`. A grouped action is keyed by both command and</p>\n<p>`executionScope`, so the same package script may appear once for deployment</p>\n<p>setup and once for real-world proof without collapsing those lanes. A grouped</p>\n<p>action keeps every distinct evidence sentence from</p>\n<p>the underlying blockers in `nextEvidenceRequirements`, while</p>\n<p>`nextEvidenceNeeded` stays as a compact human string, and the display `artifact`</p>\n<p>is generated from the same machine-readable target list. It also carries</p>\n<p>`executionScope` as `local-refresh`, `deployment-environment`, or</p>\n<p>`real-world-evidence`; `blockerIds` are goal-scoped references in the form</p>\n<p>`&lt;goalId&gt;:&lt;externalCheckOrArtifactCheckId&gt;` so a blocker reused by launch and a</p>\n<p>long-term goal is not collapsed into one ambiguous id, and `blockerCount`</p>\n<p>matches the number of scoped references in that list. The top-level</p>\n<p>`nextActionSummary` gives counts, action IDs, distinct commands, artifact</p>\n<p>targets, blocker totals, distinct goal IDs, goal titles, goal categories, and</p>\n<p>goal counts for each scope. That lets stale local reruns, deploy/env fixes, and</p>\n<p>customer or 30-day proof be queued separately. This lets one</p>\n<p>`pnpm launch:preflight:production` row preserve separate storage, SSL,</p>\n<p>role-override, or service-probe requirements without forcing CI or dashboards to</p>\n<p>parse prose or path lists. Use this as the short operator run list; keep</p>\n<p>`externalEvidenceBlockers` for the full per-check audit trail.</p>\n<p>The `score.blockedByExternalEvidence` metric combines `localComplete` and</p>\n<p>`externalEvidenceRequired`, making the total number of goals still blocked from</p>\n<p>10/10 visible even when one goal is marked `local-gate-complete` rather than</p>\n<p>`external-evidence-required`. The top-level `blockedByExternalEvidenceGoals`</p>\n<p>array names those same goals with id, title, category, status, next evidence,</p>\n<p>blocker count, exact blocker ids, grouped action ids, execution scopes, commands,</p>\n<p>artifact targets, a per-goal action breakdown, and a per-goal scope breakdown.</p>\n<p>That lets an operator or dashboard list the four external-proof handoffs and see</p>\n<p>which command remediates which blocker, with goal-local evidence requirements</p>\n<p>and scope-specific blocker totals, without deriving them from the full goals</p>\n<p>table or joining through `nextActions`.</p>\n<p>The top-level `strictGateStatus` is the final gate result: it is `passed` only</p>\n<p>when the report status is `ten-of-ten-ready`; it remains `failed` for both</p>\n<p>missing local gates and local-green reports that still need production,</p>\n<p>partner, customer, or 30-day evidence.</p>\n<p>The top-level `strictGateFailureReasons[]` array is empty only when</p>\n<p>`strictGateStatus` is `passed`; otherwise it lists incomplete local gates and</p>\n<p>the non-empty blocker lanes with blocker counts, goal counts, and remediation</p>\n<p>commands.</p>\n<p>The top-level `strictGateFailureSummary[]` array carries the same information in</p>\n<p>closed structured rows, including `kind`, optional `scope`, `goalIds`,</p>\n<p>`remediationCommands`, and `artifactTargets`, so consumers can filter</p>\n<p>deployment-environment blockers from real-world evidence blockers without</p>\n<p>parsing prose.</p>\n<p>The top-level `strictGateHandoff` object consolidates those strict-gate rows</p>\n<p>into one operator payload with summary IDs, execution scopes, blocker count,</p>\n<p>exact blocker IDs, exact next-action IDs, affected goal count and IDs/titles,</p>\n<p>distinct remediation-command count, remediation commands, distinct artifact</p>\n<p>target count, artifact targets, distinct next-evidence requirement count, and</p>\n<p>every distinct next-evidence requirement from the matching scoped actions. Its</p>\n<p>`scopeBreakdown[]` rows repeat those handoff fields per execution scope, so</p>\n<p>deployment-environment work and real-world proof remain separable in dashboards</p>\n<p>and launch packets. Its arrays are empty only when the strict gate has passed.</p>\n<p>The nightly Era C evidence workflow also runs `pnpm review:goals` and uploads</p>\n<p>`artifacts/review-goals/**` so the current 10/10 blocker state is captured with</p>\n<p>the SLO, uptime, ActivityStreams, and KPI evidence packet.</p>\n<p>The long-term packet also carries a `collectionPlan` with the daily workflow</p>\n<p>cadence, next scheduled run, missing distinct SLO/uptime days, missing external</p>\n<p>consumer count, and earliest possible ready date when no hard SLO/uptime failure</p>\n<p>needs operator intervention.</p>\n<h2 id=\"status-meanings\">Status Meanings</h2>\n<p>| Status | Meaning |</p>\n<p>|---|---|</p>\n<p>| `complete` | The local command, doc, test, and evidence checks for that goal are present and no external evidence is required. |</p>\n<p>| `local-gate-complete` | The local gate exists, but the goal still needs production evidence before it can be counted as truly complete. |</p>\n<p>| `external-evidence-required` | The local machinery exists, but real production, partner, or customer evidence is still missing. |</p>\n<p>| `incomplete` | A local command, doc, or test is missing and must be fixed before evidence collection is meaningful. |</p>\n<h2 id=\"current-intent\">Current Intent</h2>\n<p>The audit is allowed to fail `--check` until every real-world blocker is resolved.</p>\n<p>That is intentional: the project should not claim 10/10 while SLO history,</p>\n<p>external ActivityStreams consumers, or real paid pilot evidence are still absent.</p>\n<p>The local-gate command should pass during that interim state, proving the</p>\n<p>remaining failures are external evidence requirements rather than missing local</p>\n<p>scripts, docs, or tests.</p>\n<p>The current local goal is `incomplete: 0`; after that, the remaining blockers must</p>\n<p>come from real evidence. The latest local refresh pass also drives</p>\n<p>`nextActionSummary.local-refresh` to zero, so remaining action lanes are</p>\n<p>deployment-environment setup and real-world evidence collection:</p>\n<p>  invoice-backed billing evidence.</p>\n<ul><li>production launch readiness and long-term SLO/uptime depth,</li><li>real external ActivityStreams consumers with durable callback subscriptions,</li><li>real managed pilot support, activation, KPI, retention, and non-placeholder</li></ul>\n<h2 id=\"evidence-artifact-targets\">Evidence Artifact Targets</h2>\n<p>The remaining external blockers are proven by these latest artifacts:</p>\n<p>| Blocker | Latest artifact targets |</p>\n<p>|---|---|</p>\n<p>| Launch readiness | `artifacts/launch/launch-evidence-latest.json`, `artifacts/launch/launch-review-latest.json`, `artifacts/launch/deployment-preflight-latest.json`, `artifacts/exit-gate/era-c-exit-gate-latest.json`; selected launch-review and deployment-preflight checks are listed in `evidenceArtifactCheckStatuses` |</p>\n<p>| 30-day SLO and uptime | `artifacts/long-term-evidence/long-term-evidence-runway-latest.json`, `artifacts/long-term-evidence/long-term-evidence-maintenance-latest.json`, `artifacts/long-term-evidence/long-term-evidence-maintenance-latest.md`, `artifacts/exit-gate/era-c-exit-gate-latest.json`, `monitoring/public-read-uptime-history.json`, `artifacts/performance/k6-slo-trend.json`; selected runway SLO/uptime/adoption checks plus Era C `sota204P95`, `publicReadUptime`, `activityFeedAdoption`, and `sota26Kpis` checks are listed in `evidenceArtifactCheckStatuses`, while the maintenance artifact names failed samples, clean passing days, and the earliest failure-free window date |</p>\n<p>| ActivityStreams syndication | `artifacts/activity-syndication/activity-syndication-evidence-latest.json`, `storage/activity-consumers.json`, `storage/activity-subscriptions.json`; selected declared-consumer and durable-subscription checks are listed in `evidenceArtifactCheckStatuses`, and accepted/rejected callback rows prove whether external HTTPS subscriptions use public non-placeholder callback hosts, match the callback URL, are fresh, and cover Create/Update/Delete |</p>\n<p>| Managed pilot evidence | `artifacts/pilot-evidence/pilot-evidence-latest.json`, `artifacts/pilot-evidence/pilot-evidence-latest.md`; selected entitlement, non-placeholder invoice-backed billing, outreach, activation, support-load, KPI, and retention-signal checks are listed in `evidenceArtifactCheckStatuses` |</p>","updatedAt":"2018-10-20T01:46:40.000Z","checksum":"cc1459601a262f85b08064eef8b2d87f7f1ac758e728310d3e11d47ad21da3a4","checksumPrefix":"cc1459601a26","anchorCount":3,"lineCount":373,"rawUrl":"/api/docs/content?path=ops%2Freview-goals.md","htmlUrl":"/docs?doc=ops%2Freview-goals.md","apiUrl":"/api/docs/content?path=ops%2Freview-goals.md"}