Skip to documentation

Generic examplesSign in to personalize workspace URLs.

Download OpenAPI

Report workflow

Use facts → optional narrative → preview → immutable snapshot → read/PDF. Each stage checks current project, window, creator role and plan. Preview is not a saved snapshot.

Read the saved report library

Operation: reports.list · GET /report-builder

Read saved reports, current snapshot IDs and existing pooled usage, optionally selecting one client/project. Stored share grants/hashes are omitted. Newest update first; no pagination. Current key scopes, creator actions, plan and tenant/project restrictions apply on every call and successful replay. Money precision, confidence and sample thresholds use the existing factual model.

Required key scope: reports:read. Current creator action: reports.read. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Composition client/project must belong to each other inside the tenant; optional saved-report id must retain that same selection.

  • Ordered reporting dates and current plan windows apply to new facts/previews/narratives/snapshots, while stored reads reproduce original evidence.

  • Monthly shipment quota and AI token allowance are separate from technical traffic limits.

  • All responses are synchronous. Retry uncertain writes with the original key and identical body; external uncertainty never authorizes a second provider dispatch.

  • Sharing, report deletion and email/Slack/Teams distribution remain unavailable.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "in": "query",
    "name": "clientId",
    "required": false,
    "schema": {
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } }, { "example": "11111111-1111-4111-8111-111111111111", "in": "query", "name": "projectId", "required": false, "schema": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } } ]

Success statuses: 200. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "reports": [
    {
      "context": {
        "clientId": "22222222-2222-4222-8222-222222222222",
        "clientName": "example-reports Retail",
        "period": "Q1 2026",
        "periodEnd": "2026-03-31",
        "periodStart": "2026-01-01",
        "projectId": "11111111-1111-4111-8111-111111111111",
        "projectName": "example-reports Checkout Replatform",
        "qid": null,
        "timeRange": "Jan 1–Mar 31"
      },
      "createdAt": "2026-10-01T08:30:28.684Z",
      "id": "33333333-3333-4333-8333-333333333333",
      "lastSharedAt": null,
      "name": "Synthetic delivery report",
      "shares": [],
      "snapshotId": "44444444-4444-4444-8444-444444444444",
      "status": "draft",
      "updatedAt": "2026-10-01T08:30:28.684Z"
    }
  ],
  "usage": {
    "branded": false,
    "cap": "unlimited",
    "effectivePlan": "growth",
    "shippedThisMonth": 0
  }
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request GET "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/report-builder?projectId=11111111-1111-4111-8111-111111111111" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY"

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/report-builder?projectId=11111111-1111-4111-8111-111111111111", {
  method: "GET",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`
},
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"]}
response = requests.request("GET", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/report-builder?projectId=11111111-1111-4111-8111-111111111111", headers=headers, timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Read deterministic report facts and template tones

Operation: reports.facts · GET /report-builder/facts

Read supported source facts, partial/no-evidence states and three deterministic template narratives for one project and ordered period. GET never dispatches a model. Current plan data windows apply. Current key scopes, creator actions, plan and tenant/project restrictions apply on every call and successful replay. Money precision, confidence and sample thresholds use the existing factual model.

Required key scope: reports:read. Current creator action: reports.read. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Composition client/project must belong to each other inside the tenant; optional saved-report id must retain that same selection.

  • Ordered reporting dates and current plan windows apply to new facts/previews/narratives/snapshots, while stored reads reproduce original evidence.

  • Monthly shipment quota and AI token allowance are separate from technical traffic limits.

  • All responses are synchronous. Retry uncertain writes with the original key and identical body; external uncertainty never authorizes a second provider dispatch.

  • Sharing, report deletion and email/Slack/Teams distribution remain unavailable.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "11111111-1111-4111-8111-111111111111",
    "in": "query",
    "name": "projectId",
    "required": true,
    "schema": {
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } }, { "example": "2026-01-01", "in": "query", "name": "start", "required": true, "schema": { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" } }, { "example": "2026-03-31", "in": "query", "name": "end", "required": true, "schema": { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" } } ]

Success statuses: 200. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "agencyName": "Example report workspace",
  "engine": "template",
  "facts": {
    "actions": [
      {
        "action": "Review added items with the client and formalize the next-cycle scope.",
        "n": 1,
        "tag": "Margin",
        "title": "Convert scope expansion into a change request",
        "tone": "amber",
        "why": "$6,600 of estimated delivery investment came from work added after scope lock."
      },
      {
        "action": "Create a dedicated discovery / clarification budget bucket.",
        "n": 2,
        "tag": "Process",
        "title": "Separate discovery from implementation budget",
        "tone": "blue",
        "why": "1 meetings (1 h) were attributed to this project."
      },
      {
        "action": "Require ticket IDs in branch names and PR titles.",
        "n": 3,
        "tag": "Data",
        "title": "Improve ticket-to-PR traceability",
        "tone": "neutral",
        "why": "0% of PRs were not linked to tickets."
      },
      {
        "action": "Add an AI-assisted field or label to relevant work items.",
        "n": 4,
        "tag": "AI",
        "title": "Track AI-assisted work explicitly",
        "tone": "purple",
        "why": "AI-assisted delivery cannot be measured until assisted work is tagged."
      },
      {
        "action": "Use the executive summary and scope expansion sections in the next QBR or invoice discussion.",
        "n": 5,
        "tag": "Client",
        "title": "Use this report in the next client review",
        "tone": "green",
        "why": "The report provides a shared view of shipped work, cost, scope movement, and risks — useful for QBRs, retainer reviews, and invoice discussions."
      }
    ],
    "ai": null,
    "aiInsufficientSample": null,
    "assumptions": [
      {
        "effectiveFrom": "2026-01-01",
        "effectiveTo": null,
        "id": "cost-basis",
        "source": "default",
        "status": "needs_verification",
        "title": "Cost estimate basis",
        "unitOrMethod": "person_then_role",
        "value": "$150/h",
        "versionId": null
      },
      {
        "effectiveFrom": "2026-01-01",
        "effectiveTo": null,
        "id": "scope-baseline",
        "source": "default",
        "status": "needs_verification",
        "title": "Scope baseline",
        "unitOrMethod": "engagement_start",
        "value": "1 work items",
        "versionId": null
      },
      {
        "effectiveFrom": "2026-01-01",
        "effectiveTo": null,
        "id": "meeting-attribution",
        "source": "default",
        "status": "needs_verification",
        "title": "Meeting attribution",
        "unitOrMethod": "project_tagged",
        "value": "100% tagged",
        "versionId": null
      },
      {
        "effectiveFrom": "2026-01-01",
        "effectiveTo": null,
        "id": "ai-attribution",
        "source": "default",
        "status": "needs_verification",
        "title": "AI attribution",
        "unitOrMethod": "self_reported",
        "value": "Self-reported labels and trailers",
        "versionId": null
      },
      {
        "effectiveFrom": "2026-01-01",
        "effectiveTo": null,
        "id": "reporting-period",
        "source": "default",
        "status": "needs_verification",
        "title": "Reporting period",
        "unitOrMethod": "active_range",
        "value": "Jan 1 – Mar 31, 2026",
        "versionId": null
      },
      {
        "effectiveFrom": "2026-01-01",
        "effectiveTo": null,
        "id": "work-cost-allocation",
        "source": "default",
        "status": "needs_verification",
        "title": "Work-item cost allocation",
        "unitOrMethod": "not_allocated",
        "value": "Team estimate only",
        "versionId": null
      }
    ],
    "confidence": {
      "hints": [
        "Tag calendar events with the client or project.",
        "Add person-level rates for worked hours; role rates remain partial.",
        "Explicitly mark AI-assisted merged work with labels or commit trailers.",
        "Reconnect or sync sources so their latest successful data is current.",
        "Confirm or rectify the reporting assumptions used for this period.",
        "Connect deployment evidence to completed work items."
      ],
      "label": "Medium",
      "score": 80,
      "signals": [
        {
          "contribution": 29.63,
          "evidence": {
            "denominator": 2,
            "numerator": 2,
            "query": "Merged code changes linked to normalized work items in the report period."
          },
          "id": "prs_linked",
          "label": "PRs linked to tickets",
          "note": "Linked merged changes",
          "pct": 100,
          "weight": 16
        },
        {
          "contribution": 25.93,
          "evidence": {
            "denominator": 3,
            "numerator": 3,
            "query": "Workspace work items in the report period with a normalized project mapping."
          },
          "id": "items_mapped",
          "label": "Tickets mapped to client / project",
          "note": "Workspace mapping coverage",
          "pct": 100,
          "weight": 14
        },
        {
          "contribution": null,
          "evidence": {
            "denominator": null,
            "numerator": null,
            "query": "An active Google Calendar connection is required before calendar tagging is measured."
          },
          "id": "meetings_tagged",
          "label": "Meetings tagged to client / project",
          "note": "No active calendar source",
          "pct": null,
          "weight": 12
        },
        {
          "contribution": null,
          "evidence": {
            "denominator": 0,
            "numerator": 0,
            "query": "Project time entries priced by person-level rates (100%) or role-level rates (60%)."
          },
          "id": "rate_card",
          "label": "Rate card precision",
          "note": "No labour hours in this period",
          "pct": null,
          "weight": 14
        },
        {
          "contribution": null,
          "evidence": {
            "denominator": null,
            "numerator": null,
            "query": "Explicit self-reported AI labels or commit trailers on merged changes."
          },
          "id": "ai_tagging",
          "label": "AI-assisted work tagging",
          "note": "Not tagged",
          "pct": null,
          "weight": 12
        },
        {
          "contribution": 9.26,
          "evidence": {
            "denominator": 2,
            "numerator": 1,
            "query": "Completed project work items linked to a merged change and a release through explicit evidence links."
          },
          "id": "release_evidence",
          "label": "Release / deployment evidence",
          "note": "Completed work with linked release evidence",
          "pct": 50,
          "weight": 10
        },
        {
          "contribution": 14.81,
          "evidence": {
            "denominator": 100,
            "numerator": 100,
            "query": "Synced rather than manual or CSV evidence rows in the report context."
          },
          "id": "manual_entry_share",
          "label": "Synced evidence share",
          "note": "Synced evidence coverage",
          "pct": 100,
          "weight": 8
        },
        {
          "contribution": null,
          "evidence": {
            "denominator": 0,
            "numerator": 0,
            "query": "Latest successful sync per active connection, measured against the report period end."
          },
          "id": "freshness",
          "label": "Source freshness",
          "note": "No active sources",
          "pct": null,
          "weight": 8
        },
        {
          "contribution": 0,
          "evidence": {
            "denominator": 6,
            "numerator": 0,
            "query": "Resolved confirmed or rectified report assumptions at the workspace, client, project, and reporting-period scope."
          },
          "id": "assumptions",
          "label": "Confirmed reporting assumptions",
          "note": "0 of 6 reporting assumptions are confirmed or rectified for this period.",
          "pct": 0,
          "weight": 6
        }
      ]
    },
    "coordination": {
      "blendedHourlyRateCents": 15000,
      "costCents": 15000,
      "declined": 0,
      "hours": 1,
      "meetings": 1,
      "taggingPct": 100
    },
    "currency": "USD",
    "delivery": {
      "completedItems": 2,
      "mergedChanges": 2,
      "milestones": 0,
      "objectivesCompleted": 0,
      "objectivesTotal": 0,
      "prsLinkedPct": 100,
      "releaseRows": [
        {
          "items": 1,
          "name": "v1.4.0",
          "releasedAt": "2026-02-12T18:00:00.000Z",
          "releaseId": "00000000-0000-4000-8000-000000000007"
        }
      ],
      "releases": 1,
      "rows": [
        {
          "completedAt": "2026-03-01T10:00:00.000Z",
          "externalKey": "EXAMPLE-REPORTS-42",
          "linkedChanges": 1,
          "title": "Refunds fail for split tender",
          "type": "bug",
          "url": null,
          "workItemId": "00000000-0000-4000-8000-000000000005"
        },
        {
          "completedAt": "2026-02-10T16:30:00.000Z",
          "externalKey": "EXAMPLE-REPORTS-1",
          "linkedChanges": 1,
          "title": "Card vault migration",
          "type": "story",
          "url": null,
          "workItemId": "00000000-0000-4000-8000-000000000006"
        }
      ]
    },
    "evidencePackages": [],
    "investment": {
      "cloudCents": 0,
      "coordinationCents": 15000,
      "coordinationPct": null,
      "costEvidence": {
        "cloudLines": 0,
        "linkedTimeEntries": 0,
        "timeEntries": 0
      },
      "currencyConflict": false,
      "estimated": false,
      "estimatedCloudCents": 0,
      "invoicedCents": null,
      "labourCategories": [],
      "labourCents": 0,
      "labourHours": 0,
      "reworkCents": 0,
      "reworkPct": null,
      "roleBandHours": 0,
      "scopeCents": 660000,
      "scopePct": null,
      "totalCents": null,
      "unpricedHours": 0
    },
    "manualEntrySharePct": 0,
    "periodEnd": "2026-03-31",
    "periodStart": "2026-01-01",
    "scope": {
      "addedCents": 660000,
      "addedItems": 2,
      "blendedHourlyRateCents": 15000,
      "grownCents": 0,
      "grownItems": 0,
      "priced": true,
      "reopenedCents": 0,
      "reopenedItems": 0,
      "scopeLockOn": "2026-01-01",
      "totalCents": 660000,
      "unestimated": 0
    },
    "sources": [
      {
        "label": "Contracts",
        "source": "commercial",
        "state": "data_present"
      },
      {
        "label": "Tracker",
        "source": "tracker",
        "state": "data_present"
      },
      {
        "label": "Code",
        "source": "code",
        "state": "data_present"
      },
      {
        "label": "Releases",
        "source": "release",
        "state": "data_present"
      },
      {
        "label": "Calendar",
        "source": "calendar",
        "state": "data_present"
      }
    ]
  },
  "narratives": {
    "default": "During 2026-01-01 – 2026-03-31, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.",
    "executive": "2026-01-01 – 2026-03-31 — example-reports Retail · example-reports Checkout Replatform. Period delivery spend is not yet available; contract value is not treated as period spend. Estimated scope expansion is $6,600 introduced after the baseline. AI delivery gain: not yet measured. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period. Recommended action: convert added scope into a formal change request before the next cycle.",
    "friendly": "Hi example-reports team — here’s the recap for 2026-01-01 – 2026-03-31. We delivered 2 work items, merged 2 PRs, and shipped 1 release. Additional work items were introduced after we locked scope, with an estimated value of $6,600. We’d love to align the next cycle around a formal change request."
  }
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request GET "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/report-builder/facts?projectId=11111111-1111-4111-8111-111111111111&start=2026-01-01&end=2026-03-31" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY"

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/report-builder/facts?projectId=11111111-1111-4111-8111-111111111111&start=2026-01-01&end=2026-03-31", {
  method: "GET",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`
},
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"]}
response = requests.request("GET", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/report-builder/facts?projectId=11111111-1111-4111-8111-111111111111&start=2026-01-01&end=2026-03-31", headers=headers, timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Keep missing/partial/inferred coverage explicit. Build schema-compatible composition from your own facts, selected layout and client/project IDs, replacing all synthetic UUIDs.

Generate optional guarded report prose

Operation: reports.narrative · POST /report-builder/narrative

Generate one optional synchronous slotted narrative with the existing model allowlist, current monthly AI allowance and reservation ledger. Provider absence, budget denial or unusable output returns truthful template provenance. Durable request identity prevents another billable dispatch; stored result reconciliation recovers interrupted acknowledgement. An unresolved external outcome stays pending. Current key scopes, creator actions, plan and tenant/project restrictions apply on every call and successful replay. Money precision, confidence and sample thresholds use the existing factual model.

Required key scope: reports:write. Current creator action: reports.create. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Composition client/project must belong to each other inside the tenant; optional saved-report id must retain that same selection.

  • Ordered reporting dates and current plan windows apply to new facts/previews/narratives/snapshots, while stored reads reproduce original evidence.

  • Monthly shipment quota and AI token allowance are separate from technical traffic limits.

  • All responses are synchronous. Retry uncertain writes with the original key and identical body; external uncertainty never authorizes a second provider dispatch.

  • Sharing, report deletion and email/Slack/Teams distribution remain unavailable.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "example-reports.narrative",
    "in": "header",
    "name": "idempotency-key",
    "required": true,
    "schema": {
      "pattern": "^[\\x21-\\x7e]{1,200}
quot;
, "type": "string" } } ]

Request body schema:

View schema or synthetic response
JSON

{
  "content": {
    "application/json": {
      "examples": {
        "synthetic1": {
          "value": {
            "clientName": "Synthetic customer",
            "end": "2026-03-31",
            "period": "Q1 2026",
            "projectId": "11111111-1111-4111-8111-111111111111",
            "projectName": "Synthetic delivery",
            "start": "2026-01-01",
            "tone": "default"
          }
        }
      },
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "clientName": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "end": {
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" }, "period": { "maxLength": 80, "minLength": 1, "type": "string" }, "projectId": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" }, "projectName": { "maxLength": 200, "minLength": 1, "type": "string" }, "start": { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" }, "tone": { "enum": [ "default", "executive", "friendly" ], "type": "string" } }, "required": [ "projectId", "start", "end", "tone", "clientName", "projectName", "period" ], "type": "object" } } }, "required": true }

Success statuses: 200. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "engine": "template",
  "narrative": "During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.",
  "provenance": {
    "modelId": null,
    "outcome": "template",
    "promptVersion": null,
    "provider": null
  }
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request POST "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/report-builder/narrative" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: example-operation-attempt-1' \
  --data-raw '{"projectId":"11111111-1111-4111-8111-111111111111","start":"2026-01-01","end":"2026-03-31","tone":"default","clientName":"Synthetic customer","projectName":"Synthetic delivery","period":"Q1 2026"}'

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/report-builder/narrative", {
  method: "POST",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`,
  "Content-Type": "application/json",
  "Idempotency-Key": "example-operation-attempt-1"
},
  body: JSON.stringify({
  "projectId": "11111111-1111-4111-8111-111111111111",
  "start": "2026-01-01",
  "end": "2026-03-31",
  "tone": "default",
  "clientName": "Synthetic customer",
  "projectName": "Synthetic delivery",
  "period": "Q1 2026"
}),
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"],"Content-Type":"application/json","Idempotency-Key":"example-operation-attempt-1"}
response = requests.request("POST", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/report-builder/narrative", headers=headers, json=__import__("json").loads("{\"projectId\":\"11111111-1111-4111-8111-111111111111\",\"start\":\"2026-01-01\",\"end\":\"2026-03-31\",\"tone\":\"default\",\"clientName\":\"Synthetic customer\",\"projectName\":\"Synthetic delivery\",\"period\":\"Q1 2026\"}"), timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Narrative is optional and bounded. Inspect provider/template/fallback status instead of claiming live AI success. Retain the original key for uncertain provider work; facts and commercial values remain authoritative.

Preview a report composition

Operation: reports.preview · POST /report-builder/preview

Build deterministic document facts and escaped rendered HTML from a complete composition. Current project/client ownership and plan window apply before generation. Preview is synchronous and does not save a report, create a share or send a message. Current key scopes, creator actions, plan and tenant/project restrictions apply on every call and successful replay. Money precision, confidence and sample thresholds use the existing factual model.

Required key scope: reports:write. Current creator action: reports.create. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Composition client/project must belong to each other inside the tenant; optional saved-report id must retain that same selection.

  • Ordered reporting dates and current plan windows apply to new facts/previews/narratives/snapshots, while stored reads reproduce original evidence.

  • Monthly shipment quota and AI token allowance are separate from technical traffic limits.

  • All responses are synchronous. Retry uncertain writes with the original key and identical body; external uncertainty never authorizes a second provider dispatch.

  • Sharing, report deletion and email/Slack/Teams distribution remain unavailable.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "example-reports.preview",
    "in": "header",
    "name": "idempotency-key",
    "required": true,
    "schema": {
      "pattern": "^[\\x21-\\x7e]{1,200}
quot;
, "type": "string" } } ]

Request body schema:

View schema or synthetic response
JSON

{
  "content": {
    "application/json": {
      "examples": {
        "synthetic1": {
          "value": {
            "composition": {
              "context": {
                "clientId": "22222222-2222-4222-8222-222222222222",
                "clientName": "Synthetic customer",
                "period": "Q1 2026",
                "periodEnd": "2026-03-31",
                "periodStart": "2026-01-01",
                "projectId": "11111111-1111-4111-8111-111111111111",
                "projectName": "Synthetic delivery",
                "qid": null,
                "timeRange": "Jan 1–Mar 31"
              },
              "items": {},
              "layout": {
                "order": [
                  "rs1",
                  "rs2",
                  "rs3",
                  "rs4",
                  "rs5",
                  "rs6",
                  "rs7",
                  "rs8",
                  "rs9",
                  "rs10"
                ],
                "sections": {
                  "rs1": true,
                  "rs10": true,
                  "rs2": true,
                  "rs3": true,
                  "rs4": true,
                  "rs5": true,
                  "rs6": true,
                  "rs7": false,
                  "rs8": true,
                  "rs9": true
                }
              },
              "narrative": "During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.",
              "narrativeProvenance": {
                "modelId": null,
                "outcome": "template",
                "promptVersion": null,
                "provider": null
              },
              "tone": "default"
            }
          }
        }
      },
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "composition": {
            "properties": {
              "context": {
                "properties": {
                  "clientId": {
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" }, "clientName": { "maxLength": 200, "minLength": 1, "type": "string" }, "period": { "maxLength": 80, "minLength": 1, "type": "string" }, "periodEnd": { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" }, "periodStart": { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" }, "projectId": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" }, "projectName": { "maxLength": 200, "minLength": 1, "type": "string" }, "qid": { "type": [ "string", "null" ] }, "timeRange": { "maxLength": 80, "minLength": 1, "type": "string" } }, "required": [ "clientId", "clientName", "projectId", "projectName", "periodStart", "periodEnd", "period", "timeRange", "qid" ], "type": "object" }, "invoiceNarratives": { "additionalProperties": { "maxLength": 20000, "type": "string" }, "propertyNames": { "maxLength": 100, "minLength": 1, "type": "string" }, "type": "object" }, "items": { "properties": { "ai": { "additionalProperties": { "type": "boolean" }, "propertyNames": { "type": "string" }, "type": "object" }, "forensics": { "additionalProperties": { "type": "boolean" }, "propertyNames": { "type": "string" }, "type": "object" }, "invoice": { "additionalProperties": { "additionalProperties": { "type": "boolean" }, "propertyNames": { "type": "string" }, "type": "object" }, "propertyNames": { "type": "string" }, "type": "object" } }, "type": "object" }, "layout": { "properties": { "order": { "items": { "type": "string" }, "type": "array" }, "sections": { "anyOf": [ { "additionalProperties": { "type": "boolean" }, "propertyNames": { "type": "string" }, "type": "object" }, { "type": "null" } ] } }, "required": [ "order", "sections" ], "type": "object" }, "narrative": { "maxLength": 20000, "type": "string" }, "narrativeProvenance": { "properties": { "modelId": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "outcome": { "enum": [ "template", "generated" ], "type": "string" }, "promptVersion": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "provider": { "anyOf": [ { "enum": [ "openai", "anthropic" ], "type": "string" }, { "type": "null" } ] } }, "required": [ "outcome", "provider", "modelId", "promptVersion" ], "type": "object" }, "tone": { "enum": [ "default", "executive", "friendly", "custom" ], "type": "string" } }, "required": [ "context", "layout", "items", "narrative", "tone" ], "type": "object" } }, "required": [ "composition" ], "type": "object" } } }, "required": true }

Success statuses: 200. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "document": {
    "agencyName": "Example report workspace",
    "branded": false,
    "composition": {
      "context": {
        "clientId": "22222222-2222-4222-8222-222222222222",
        "clientName": "example-reports Retail",
        "period": "Q1 2026",
        "periodEnd": "2026-03-31",
        "periodStart": "2026-01-01",
        "projectId": "11111111-1111-4111-8111-111111111111",
        "projectName": "example-reports Checkout Replatform",
        "qid": null,
        "timeRange": "Jan 1–Mar 31"
      },
      "items": {},
      "layout": {
        "order": [
          "rs1",
          "rs2",
          "rs3",
          "rs4",
          "rs5",
          "rs6",
          "rs7",
          "rs8",
          "rs9",
          "rs10"
        ],
        "sections": {
          "rs1": true,
          "rs10": true,
          "rs2": true,
          "rs3": true,
          "rs4": true,
          "rs5": true,
          "rs6": true,
          "rs7": false,
          "rs8": true,
          "rs9": true
        }
      },
      "narrative": "During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.",
      "narrativeProvenance": {
        "modelId": null,
        "outcome": "template",
        "promptVersion": null,
        "provider": null
      },
      "tone": "default"
    },
    "facts": {
      "actions": [
        {
          "action": "Review added items with the client and formalize the next-cycle scope.",
          "n": 1,
          "tag": "Margin",
          "title": "Convert scope expansion into a change request",
          "tone": "amber",
          "why": "$6,600 of estimated delivery investment came from work added after scope lock."
        },
        {
          "action": "Create a dedicated discovery / clarification budget bucket.",
          "n": 2,
          "tag": "Process",
          "title": "Separate discovery from implementation budget",
          "tone": "blue",
          "why": "1 meetings (1 h) were attributed to this project."
        },
        {
          "action": "Require ticket IDs in branch names and PR titles.",
          "n": 3,
          "tag": "Data",
          "title": "Improve ticket-to-PR traceability",
          "tone": "neutral",
          "why": "0% of PRs were not linked to tickets."
        },
        {
          "action": "Add an AI-assisted field or label to relevant work items.",
          "n": 4,
          "tag": "AI",
          "title": "Track AI-assisted work explicitly",
          "tone": "purple",
          "why": "AI-assisted delivery cannot be measured until assisted work is tagged."
        },
        {
          "action": "Use the executive summary and scope expansion sections in the next QBR or invoice discussion.",
          "n": 5,
          "tag": "Client",
          "title": "Use this report in the next client review",
          "tone": "green",
          "why": "The report provides a shared view of shipped work, cost, scope movement, and risks — useful for QBRs, retainer reviews, and invoice discussions."
        }
      ],
      "ai": null,
      "aiInsufficientSample": null,
      "assumptions": [
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "cost-basis",
          "source": "default",
          "status": "needs_verification",
          "title": "Cost estimate basis",
          "unitOrMethod": "person_then_role",
          "value": "$150/h",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "scope-baseline",
          "source": "default",
          "status": "needs_verification",
          "title": "Scope baseline",
          "unitOrMethod": "engagement_start",
          "value": "1 work items",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "meeting-attribution",
          "source": "default",
          "status": "needs_verification",
          "title": "Meeting attribution",
          "unitOrMethod": "project_tagged",
          "value": "100% tagged",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "ai-attribution",
          "source": "default",
          "status": "needs_verification",
          "title": "AI attribution",
          "unitOrMethod": "self_reported",
          "value": "Self-reported labels and trailers",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "reporting-period",
          "source": "default",
          "status": "needs_verification",
          "title": "Reporting period",
          "unitOrMethod": "active_range",
          "value": "Jan 1 – Mar 31, 2026",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "work-cost-allocation",
          "source": "default",
          "status": "needs_verification",
          "title": "Work-item cost allocation",
          "unitOrMethod": "not_allocated",
          "value": "Team estimate only",
          "versionId": null
        }
      ],
      "confidence": {
        "hints": [
          "Tag calendar events with the client or project.",
          "Add person-level rates for worked hours; role rates remain partial.",
          "Explicitly mark AI-assisted merged work with labels or commit trailers.",
          "Reconnect or sync sources so their latest successful data is current.",
          "Confirm or rectify the reporting assumptions used for this period.",
          "Connect deployment evidence to completed work items."
        ],
        "label": "Medium",
        "score": 80,
        "signals": [
          {
            "contribution": 29.63,
            "evidence": {
              "denominator": 2,
              "numerator": 2,
              "query": "Merged code changes linked to normalized work items in the report period."
            },
            "id": "prs_linked",
            "label": "PRs linked to tickets",
            "note": "Linked merged changes",
            "pct": 100,
            "weight": 16
          },
          {
            "contribution": 25.93,
            "evidence": {
              "denominator": 3,
              "numerator": 3,
              "query": "Workspace work items in the report period with a normalized project mapping."
            },
            "id": "items_mapped",
            "label": "Tickets mapped to client / project",
            "note": "Workspace mapping coverage",
            "pct": 100,
            "weight": 14
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": null,
              "numerator": null,
              "query": "An active Google Calendar connection is required before calendar tagging is measured."
            },
            "id": "meetings_tagged",
            "label": "Meetings tagged to client / project",
            "note": "No active calendar source",
            "pct": null,
            "weight": 12
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": 0,
              "numerator": 0,
              "query": "Project time entries priced by person-level rates (100%) or role-level rates (60%)."
            },
            "id": "rate_card",
            "label": "Rate card precision",
            "note": "No labour hours in this period",
            "pct": null,
            "weight": 14
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": null,
              "numerator": null,
              "query": "Explicit self-reported AI labels or commit trailers on merged changes."
            },
            "id": "ai_tagging",
            "label": "AI-assisted work tagging",
            "note": "Not tagged",
            "pct": null,
            "weight": 12
          },
          {
            "contribution": 9.26,
            "evidence": {
              "denominator": 2,
              "numerator": 1,
              "query": "Completed project work items linked to a merged change and a release through explicit evidence links."
            },
            "id": "release_evidence",
            "label": "Release / deployment evidence",
            "note": "Completed work with linked release evidence",
            "pct": 50,
            "weight": 10
          },
          {
            "contribution": 14.81,
            "evidence": {
              "denominator": 100,
              "numerator": 100,
              "query": "Synced rather than manual or CSV evidence rows in the report context."
            },
            "id": "manual_entry_share",
            "label": "Synced evidence share",
            "note": "Synced evidence coverage",
            "pct": 100,
            "weight": 8
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": 0,
              "numerator": 0,
              "query": "Latest successful sync per active connection, measured against the report period end."
            },
            "id": "freshness",
            "label": "Source freshness",
            "note": "No active sources",
            "pct": null,
            "weight": 8
          },
          {
            "contribution": 0,
            "evidence": {
              "denominator": 6,
              "numerator": 0,
              "query": "Resolved confirmed or rectified report assumptions at the workspace, client, project, and reporting-period scope."
            },
            "id": "assumptions",
            "label": "Confirmed reporting assumptions",
            "note": "0 of 6 reporting assumptions are confirmed or rectified for this period.",
            "pct": 0,
            "weight": 6
          }
        ]
      },
      "coordination": {
        "blendedHourlyRateCents": 15000,
        "costCents": 15000,
        "declined": 0,
        "hours": 1,
        "meetings": 1,
        "taggingPct": 100
      },
      "currency": "USD",
      "delivery": {
        "completedItems": 2,
        "mergedChanges": 2,
        "milestones": 0,
        "objectivesCompleted": 0,
        "objectivesTotal": 0,
        "prsLinkedPct": 100,
        "releaseRows": [
          {
            "items": 1,
            "name": "v1.4.0",
            "releasedAt": "2026-02-12T18:00:00.000Z",
            "releaseId": "00000000-0000-4000-8000-000000000007"
          }
        ],
        "releases": 1,
        "rows": [
          {
            "completedAt": "2026-03-01T10:00:00.000Z",
            "externalKey": "EXAMPLE-REPORTS-42",
            "linkedChanges": 1,
            "title": "Refunds fail for split tender",
            "type": "bug",
            "url": null,
            "workItemId": "00000000-0000-4000-8000-000000000005"
          },
          {
            "completedAt": "2026-02-10T16:30:00.000Z",
            "externalKey": "EXAMPLE-REPORTS-1",
            "linkedChanges": 1,
            "title": "Card vault migration",
            "type": "story",
            "url": null,
            "workItemId": "00000000-0000-4000-8000-000000000006"
          }
        ]
      },
      "evidencePackages": [],
      "investment": {
        "cloudCents": 0,
        "coordinationCents": 15000,
        "coordinationPct": null,
        "costEvidence": {
          "cloudLines": 0,
          "linkedTimeEntries": 0,
          "timeEntries": 0
        },
        "currencyConflict": false,
        "estimated": false,
        "estimatedCloudCents": 0,
        "invoicedCents": null,
        "labourCategories": [],
        "labourCents": 0,
        "labourHours": 0,
        "reworkCents": 0,
        "reworkPct": null,
        "roleBandHours": 0,
        "scopeCents": 660000,
        "scopePct": null,
        "totalCents": null,
        "unpricedHours": 0
      },
      "manualEntrySharePct": 0,
      "periodEnd": "2026-03-31",
      "periodStart": "2026-01-01",
      "scope": {
        "addedCents": 660000,
        "addedItems": 2,
        "blendedHourlyRateCents": 15000,
        "grownCents": 0,
        "grownItems": 0,
        "priced": true,
        "reopenedCents": 0,
        "reopenedItems": 0,
        "scopeLockOn": "2026-01-01",
        "totalCents": 660000,
        "unestimated": 0
      },
      "sources": [
        {
          "label": "Contracts",
          "source": "commercial",
          "state": "data_present"
        },
        {
          "label": "Tracker",
          "source": "tracker",
          "state": "data_present"
        },
        {
          "label": "Code",
          "source": "code",
          "state": "data_present"
        },
        {
          "label": "Releases",
          "source": "release",
          "state": "data_present"
        },
        {
          "label": "Calendar",
          "source": "calendar",
          "state": "data_present"
        }
      ]
    },
    "generatedAt": "2026-10-01T08:30:28.625Z",
    "teamType": null,
    "version": 1
  },
  "html": "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\" />\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n<title>example-reports Retail — example-reports Checkout Replatform · Q1 2026</title>\n<meta name=\"scopeworth:question-category\" content=\"Invoice\" />\n<style>\n  :root{\n    --navy:#0F172A; --charcoal:#1E293B; --bg:#F8FAFC; --card:#FFFFFF; --border:#E2E8F0;\n    --muted:#64748B; --slate:#CBD5E1; --blue:#2563EB; --teal:#14B8A6; --green:#10B981;\n    --amber:#F59E0B; --red:#EF4444; --ink:#0F172A; --subtle:#F1F5F9;\n  }\n  *{box-sizing:border-box}\n  html,body{margin:0;padding:0;background:var(--bg);color:var(--ink);}\n  body{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.55;-webkit-font-smoothing:antialiased;font-feature-settings:\"ss01\",\"cv11\";}\n  .num{font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\"}\n  .mono{font-family:'JetBrains Mono',ui-monospace,Menlo,Consolas,monospace}\n  .report{max-width:840px;margin:0 auto;padding:24px 16px 80px;}\n  .report-page{background:var(--card);border:1px solid var(--border);border-radius:14px;margin-bottom:28px;padding:56px 64px;box-shadow:0 1px 0 rgba(15,23,42,0.02), 0 8px 24px -16px rgba(15,23,42,0.10);position:relative;overflow:hidden;}\n  .page-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;margin-bottom:32px;border-bottom:1px solid var(--border);font-size:11px;color:var(--muted);letter-spacing:0.06em;text-transform:uppercase;font-weight:500;}\n  .page-header .brand{display:flex;align-items:center;gap:8px;color:var(--ink);font-weight:600;letter-spacing:0.02em;text-transform:none;font-size:12px}\n  .page-header .brand svg{height:22.5px;width:auto;display:block}\n  .page-header .crumb{display:flex;gap:10px;align-items:center}\n  .page-header .crumb .dot{width:3px;height:3px;border-radius:50%;background:var(--slate)}\n  .page-num{font-variant-numeric:tabular-nums}\n  .logo-wordmark{height:26px;width:auto;display:block}\n  h1,h2,h3,h4{margin:0;color:var(--ink);letter-spacing:-0.01em}\n  h1{font-size:34px;font-weight:700;line-height:1.15;letter-spacing:-0.02em}\n  h2{font-size:24px;font-weight:700;line-height:1.2;letter-spacing:-0.015em}\n  h3{font-size:16px;font-weight:600}\n  h4{font-size:13px;font-weight:600;color:var(--charcoal)}\n  p{margin:0 0 12px}\n  .eyebrow{font-size:11px;font-weight:600;letter-spacing:0.14em;text-transform:uppercase;color:var(--blue);}\n  .muted{color:var(--muted)}\n  .lead{font-size:15px;line-height:1.65;color:var(--charcoal)}\n  .section-title{display:flex;align-items:baseline;justify-content:space-between;gap:24px;margin-bottom:24px;}\n  .section-title h2{flex:1}\n  .section-title .meta{font-size:12px;color:var(--muted);white-space:nowrap}\n  .grid{display:grid;gap:16px}\n  .grid-2{grid-template-columns:repeat(2,1fr)}\n  .grid-3{grid-template-columns:repeat(3,1fr)}\n  .grid-4{grid-template-columns:repeat(4,1fr)}\n  .card{background:var(--card);border:1px solid var(--border);border-radius:10px;padding:20px;}\n  .card.tight{padding:16px}\n  .card .label{font-size:11px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--muted);margin-bottom:8px}\n  .card .value{font-size:28px;font-weight:700;line-height:1.1;letter-spacing:-0.02em}\n  .card .sub{font-size:12px;color:var(--muted);margin-top:6px;line-height:1.5}\n  .kpi{border:1px solid var(--border);border-radius:10px;padding:18px;background:var(--card);position:relative;}\n  .kpi .label{font-size:11px;letter-spacing:0.1em;text-transform:uppercase;font-weight:600;color:var(--muted);margin-bottom:10px}\n  .kpi .value{font-size:30px;font-weight:700;letter-spacing:-0.02em;line-height:1}\n  .kpi .value .unit{font-size:16px;font-weight:600;color:var(--muted);margin-left:4px}\n  .kpi ul{margin:14px 0 0;padding:0;list-style:none;border-top:1px dashed var(--border);padding-top:12px}\n  .kpi ul li{display:flex;justify-content:space-between;font-size:12px;color:var(--charcoal);padding:3px 0}\n  .kpi ul li .v{font-weight:600;font-variant-numeric:tabular-nums}\n  .kpi.accent-blue{box-shadow:inset 3px 0 0 var(--blue)}\n  .kpi.accent-teal{box-shadow:inset 3px 0 0 var(--teal)}\n  .kpi.accent-amber{box-shadow:inset 3px 0 0 var(--amber)}\n  .kpi.accent-green{box-shadow:inset 3px 0 0 var(--green)}\n  .kpi.accent-red{box-shadow:inset 3px 0 0 var(--red)}\n  .chip{display:inline-flex;align-items:center;gap:6px;padding:3px 8px;border-radius:999px;font-size:11px;font-weight:500;background:var(--subtle);color:var(--charcoal);border:1px solid var(--border);}\n  .chip .dot{width:6px;height:6px;border-radius:50%;background:var(--slate)}\n  .chip.green{background:rgba(16,185,129,.08);color:#047857;border-color:rgba(16,185,129,.25)}\n  .chip.green .dot{background:var(--green)}\n  .chip.amber{background:rgba(245,158,11,.08);color:#92400e;border-color:rgba(245,158,11,.25)}\n  .chip.amber .dot{background:var(--amber)}\n  .chip.red{background:rgba(239,68,68,.08);color:#991b1b;border-color:rgba(239,68,68,.25)}\n  .chip.red .dot{background:var(--red)}\n  .chip.blue{background:rgba(37,99,235,.08);color:#1d4ed8;border-color:rgba(37,99,235,.25)}\n  .chip.blue .dot{background:var(--blue)}\n  table{width:100%;border-collapse:separate;border-spacing:0;font-size:13px;border:1px solid var(--border);border-radius:10px;overflow:hidden;}\n  thead th{background:var(--subtle);text-align:left;font-weight:600;font-size:11px;letter-spacing:0.08em;text-transform:uppercase;color:var(--muted);padding:10px 14px;border-bottom:1px solid var(--border);}\n  tbody td{padding:12px 14px;border-bottom:1px solid var(--border);vertical-align:top;}\n  tbody tr:last-child td{border-bottom:none}\n  td.num, th.num{text-align:right;font-variant-numeric:tabular-nums}\n  td .row-title{font-weight:600;color:var(--ink)}\n  td .row-sub{color:var(--muted);font-size:12px;margin-top:2px}\n  .callout{background:linear-gradient(180deg,#F8FAFF 0%, #F1F5F9 100%);border:1px solid var(--border);border-left:3px solid var(--blue);padding:16px 18px;border-radius:8px;font-size:13px;color:var(--charcoal);}\n  .callout strong{color:var(--ink)}\n  .callout.amber{border-left-color:var(--amber);background:linear-gradient(180deg,#FFFBF1 0%, #FEF3C7 5%, #FFFBEB 100%)}\n  .callout.green{border-left-color:var(--green);background:linear-gradient(180deg,#F0FDF7 0%, #ECFDF5 100%)}\n  .bar-row{display:grid;grid-template-columns:1fr;gap:8px;margin-bottom:10px}\n  .bar-track{position:relative;height:10px;border-radius:6px;background:var(--subtle);overflow:hidden;border:1px solid var(--border);}\n  .bar-fill{position:absolute;inset:0 auto 0 0;background:var(--blue);border-radius:6px}\n  .bar-meta{display:flex;justify-content:space-between;font-size:12px;color:var(--charcoal)}\n  .bar-meta .name{font-weight:500}\n  .bar-meta .v{font-variant-numeric:tabular-nums;color:var(--muted)}\n  .stack{display:flex;height:14px;border-radius:8px;overflow:hidden;border:1px solid var(--border);background:var(--subtle);}\n  .stack > div{height:100%}\n  .stack-legend{display:flex;flex-wrap:wrap;gap:14px;margin-top:14px}\n  .stack-legend .item{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--charcoal)}\n  .stack-legend .sw{width:10px;height:10px;border-radius:3px}\n  .cover{padding:0;overflow:hidden;border:1px solid var(--border);}\n  .cover-inner{background:radial-gradient(1200px 500px at 110% -10%, rgba(37,99,235,.35), transparent 55%),radial-gradient(900px 400px at -10% 110%, rgba(20,184,166,.22), transparent 55%),linear-gradient(180deg,#0B1224 0%,#0F172A 60%,#0B1020 100%);color:#E2E8F0;padding:64px 64px 56px;min-height:980px;display:flex;flex-direction:column;justify-content:space-between;position:relative;}\n  .cover-top{display:flex;align-items:center;justify-content:space-between;color:#CBD5E1;position:relative;z-index:1}\n  .cover-top .brand{display:flex;align-items:center;gap:10px;font-weight:600;letter-spacing:0.04em;color:#F8FAFC}\n  .cover-top .brand svg{height:30px;width:auto}\n  .cover-meta{font-size:11px;letter-spacing:0.14em;text-transform:uppercase;color:#94A3B8}\n  .cover-headline{margin-top:48px;max-width:560px;position:relative;z-index:1}\n  .cover-headline .eyebrow{color:#7DD3FC;font-weight:600}\n  .cover-headline h1{color:#F8FAFC;font-size:54px;line-height:1.05;letter-spacing:-0.025em;margin:14px 0 16px;font-weight:700;}\n  .cover-headline .tag{color:#CBD5E1;font-size:18px;line-height:1.5;max-width:520px}\n  .cover-graphic{position:absolute;right:-60px;top:200px;width:440px;height:480px;opacity:.55;pointer-events:none;z-index:0;}\n  .cover-meta-grid{margin-top:auto;display:grid;grid-template-columns:repeat(4,1fr);gap:24px;padding-top:36px;border-top:1px solid rgba(203,213,225,.18);position:relative;z-index:1;}\n  .cover-meta-grid .m-label{font-size:10px;letter-spacing:0.16em;text-transform:uppercase;color:#94A3B8;margin-bottom:6px}\n  .cover-meta-grid .m-value{font-size:14px;color:#F8FAFC;font-weight:500;line-height:1.4}\n  .cover-footer{display:flex;justify-content:space-between;align-items:center;margin-top:28px;font-size:11px;color:#94A3B8;position:relative;z-index:1;}\n  .cover-note{font-size:11px;color:#94A3B8;max-width:420px;line-height:1.5;}\n  .integration-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}\n  .int-badge{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:999px;background:rgba(248,250,252,.06);border:1px solid rgba(203,213,225,.18);color:#E2E8F0;font-size:11px;font-weight:500;}\n  .int-badge .b-dot{width:6px;height:6px;border-radius:50%;background:#7DD3FC}\n  .equation{display:flex;align-items:center;justify-content:center;gap:16px;padding:22px;background:var(--subtle);border:1px solid var(--border);border-radius:10px;font-variant-numeric:tabular-nums;}\n  .eq-num{font-size:28px;font-weight:700;color:var(--ink);letter-spacing:-0.02em}\n  .eq-op{font-size:22px;color:var(--muted);font-weight:500}\n  .eq-label{font-size:11px;color:var(--muted);letter-spacing:0.08em;text-transform:uppercase;font-weight:600;margin-top:4px;text-align:center}\n  .eq-cell{display:flex;flex-direction:column;align-items:center;min-width:120px}\n  .eq-cell.gain .eq-num{color:#047857}\n  .conf-head{display:flex;align-items:center;gap:18px;margin-bottom:18px}\n  .conf-ring{width:96px;height:96px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex:none;position:relative;}\n  .conf-ring::after{content:\"\";position:absolute;inset:8px;background:var(--card);border-radius:50%;}\n  .conf-ring .v{position:relative;z-index:1;font-size:20px;font-weight:700;letter-spacing:-0.02em}\n  .conf-ring .v small{font-size:11px;font-weight:500;color:var(--muted);display:block;text-align:center;letter-spacing:0.08em;text-transform:uppercase}\n  .rec-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}\n  .rec-card{border:1px solid var(--border);border-radius:10px;padding:18px;background:var(--card);display:flex;flex-direction:column;gap:8px;}\n  .rec-card .rc-num{width:24px;height:24px;border-radius:6px;background:var(--ink);color:#fff;font-size:11px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;}\n  .rec-card h4{font-size:14px}\n  .rec-card .rc-row{font-size:12px;color:var(--charcoal)}\n  .rec-card .rc-row b{color:var(--muted);font-weight:600;letter-spacing:0.06em;text-transform:uppercase;font-size:10px;display:block;margin-bottom:2px}\n  .footer-strip{display:flex;justify-content:space-between;align-items:end;padding-top:24px;border-top:1px solid var(--border);font-size:12px;color:var(--muted);}\n  .footer-strip .links{display:flex;gap:14px}\n  .made-with{display:flex;align-items:center;justify-content:center;gap:10px;margin:0 auto;padding:14px 18px;max-width:840px;font-size:12px;color:var(--muted);letter-spacing:0.04em}\n  .made-with svg{height:18px;width:auto}\n  .mt-8{margin-top:8px}.mt-12{margin-top:12px}.mt-16{margin-top:16px}.mt-20{margin-top:20px}\n  .mt-24{margin-top:24px}.mt-32{margin-top:32px}.mt-40{margin-top:40px}\n  .mb-8{margin-bottom:8px}.mb-12{margin-bottom:12px}.mb-16{margin-bottom:16px}.mb-24{margin-bottom:24px}\n  .page-label{position:absolute;top:18px;right:24px;font-size:10px;letter-spacing:0.14em;text-transform:uppercase;color:var(--muted);font-weight:500;}\n  @media (max-width:780px){\n    .report-page{padding:36px 24px}\n    .grid-4{grid-template-columns:repeat(2,1fr)}\n    .grid-3{grid-template-columns:1fr}\n    .rec-grid{grid-template-columns:1fr}\n    .cover-inner{padding:36px 28px;min-height:auto}\n    .cover-headline h1{font-size:36px}\n    .cover-meta-grid{grid-template-columns:repeat(2,1fr)}\n    .cover-graphic{display:none}\n  }\n  *, *::before, *::after { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }\n  @media print{\n    @page { size: A4; margin: 14mm 14mm 16mm; }\n    @page :first { margin: 0; }\n    *, *::before, *::after { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }\n    html,body{background:#fff}\n    .report{max-width:none;margin:0;padding:0}\n    .report-page{border:none;border-radius:0;box-shadow:none;margin:0;padding:0 0 12mm;page-break-after:always;break-after:page;}\n    .report-page:last-child{page-break-after:auto}\n    .cover{padding:0;background:#0F172A;overflow:hidden}\n    .cover-inner{min-height:auto;padding:32mm 18mm 28mm}\n    .avoid-break, .kpi, .card, table, .callout, .rec-card, .equation, .conf-head{break-inside:avoid;page-break-inside:avoid;}\n    h2,h3{break-after:avoid;page-break-after:avoid}\n    a{color:var(--ink);text-decoration:none}\n    .page-label{display:none}\n  }\n</style>\n</head>\n<body>\n<main class=\"report\" role=\"main\">\n<section class=\"report-page cover\" aria-labelledby=\"cover-title\"><div class=\"cover-inner\">\n    <header class=\"cover-top\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#F8FAFC\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#F8FAFC\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#60A5FA\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#2DD4BF\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#F8FAFC\">Scopeworth</text></svg></div><div class=\"cover-meta num\">Q1 2026 · Client report</div></header>\n    <svg class=\"cover-graphic\" viewBox=\"0 0 520 560\" aria-hidden=\"true\"><defs><linearGradient id=\"paper\" x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#1E293B\" stop-opacity=\".95\"/><stop offset=\"1\" stop-color=\"#0F172A\" stop-opacity=\".7\"/></linearGradient><linearGradient id=\"line\" x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\"><stop offset=\"0\" stop-color=\"#7DD3FC\" stop-opacity=\"0\"/><stop offset=\".5\" stop-color=\"#7DD3FC\" stop-opacity=\".9\"/><stop offset=\"1\" stop-color=\"#5EEAD4\" stop-opacity=\"0\"/></linearGradient></defs><g transform=\"translate(120 60) rotate(-6)\"><rect width=\"320\" height=\"420\" rx=\"14\" fill=\"url(#paper)\" stroke=\"rgba(125,211,252,.18)\"/><rect x=\"24\" y=\"28\" width=\"120\" height=\"10\" rx=\"2\" fill=\"#7DD3FC\" opacity=\".8\"/><rect x=\"24\" y=\"48\" width=\"220\" height=\"6\" rx=\"2\" fill=\"#94A3B8\" opacity=\".5\"/><rect x=\"24\" y=\"60\" width=\"180\" height=\"6\" rx=\"2\" fill=\"#94A3B8\" opacity=\".5\"/><rect x=\"24\" y=\"92\" width=\"272\" height=\"78\" rx=\"6\" fill=\"rgba(37,99,235,.18)\" stroke=\"rgba(125,211,252,.25)\"/><rect x=\"24\" y=\"186\" width=\"272\" height=\"78\" rx=\"6\" fill=\"rgba(20,184,166,.14)\" stroke=\"rgba(94,234,212,.25)\"/><rect x=\"24\" y=\"280\" width=\"272\" height=\"78\" rx=\"6\" fill=\"rgba(245,158,11,.10)\" stroke=\"rgba(245,158,11,.25)\"/></g><g transform=\"translate(80 110) rotate(-2)\"><rect width=\"320\" height=\"420\" rx=\"14\" fill=\"url(#paper)\" stroke=\"rgba(125,211,252,.22)\"/><rect x=\"24\" y=\"28\" width=\"160\" height=\"12\" rx=\"3\" fill=\"#F8FAFC\" opacity=\".95\"/><rect x=\"24\" y=\"50\" width=\"240\" height=\"6\" rx=\"2\" fill=\"#94A3B8\" opacity=\".55\"/><g transform=\"translate(24 90)\"><rect width=\"272\" height=\"120\" rx=\"8\" fill=\"rgba(15,23,42,.6)\" stroke=\"rgba(125,211,252,.18)\"/><polyline points=\"14,90 50,72 86,80 122,52 158,60 194,38 230,46 258,28\" fill=\"none\" stroke=\"url(#line)\" stroke-width=\"2\"/><polyline points=\"14,100 50,92 86,96 122,84 158,88 194,76 230,80 258,70\" fill=\"none\" stroke=\"#5EEAD4\" stroke-opacity=\".55\" stroke-width=\"1.5\" stroke-dasharray=\"3 3\"/><g fill=\"#7DD3FC\"><circle cx=\"50\" cy=\"72\" r=\"2.5\"/><circle cx=\"122\" cy=\"52\" r=\"2.5\"/><circle cx=\"194\" cy=\"38\" r=\"2.5\"/><circle cx=\"258\" cy=\"28\" r=\"2.5\"/></g></g><g transform=\"translate(24 230)\"><rect width=\"272\" height=\"14\" rx=\"4\" fill=\"rgba(255,255,255,.08)\"/><rect width=\"174\" height=\"14\" rx=\"4\" fill=\"#2563EB\" opacity=\".85\"/><rect x=\"174\" width=\"26\" height=\"14\" fill=\"#14B8A6\" opacity=\".85\"/><rect x=\"200\" width=\"22\" height=\"14\" fill=\"#F59E0B\" opacity=\".85\"/><rect x=\"222\" width=\"36\" height=\"14\" rx=\"0\" fill=\"#EF4444\" opacity=\".55\"/><rect x=\"258\" width=\"14\" height=\"14\" rx=\"0\" fill=\"#94A3B8\" opacity=\".5\"/></g></g></svg>\n    <div class=\"cover-headline\"><div class=\"eyebrow\">Client SDLC ROI Report</div><h1 id=\"cover-title\">What changed,<br/>what shipped,<br/>and what it cost.</h1><p class=\"tag\">A client-ready summary of delivery value, scope movement, rework, coordination, and AI-assisted delivery economics — built from the signals already flowing through your tools.</p><div class=\"integration-row mt-24\"><span class=\"int-badge\"><span class=\"b-dot\"></span>Contracts</span><span class=\"int-badge\"><span class=\"b-dot\"></span>Tracker</span><span class=\"int-badge\"><span class=\"b-dot\"></span>Code</span><span class=\"int-badge\"><span class=\"b-dot\"></span>Releases</span><span class=\"int-badge\"><span class=\"b-dot\"></span>Calendar</span></div></div>\n    <div class=\"cover-meta-grid\">\n      <div><div class=\"m-label\">Prepared by</div><div class=\"m-value\">Example report workspace</div></div>\n      <div><div class=\"m-label\">Client</div><div class=\"m-value\">example-reports Retail</div></div>\n      <div><div class=\"m-label\">Project</div><div class=\"m-value\">example-reports Checkout Replatform</div></div>\n      <div><div class=\"m-label\">Reporting period</div><div class=\"m-value\">Q1 2026</div></div>\n      <div><div class=\"m-label\">Generated on</div><div class=\"m-value\">1 October 2026</div></div>\n      <div><div class=\"m-label\">Report version</div><div class=\"m-value\">Snapshot · v1.0</div></div>\n    </div>\n    <div class=\"cover-footer\"><p class=\"cover-note\">This report was generated by Scopeworth from the delivery signals connected to this workspace. Every figure links back to tickets, pull requests, releases and calendar evidence.</p><span>scopeworth.app</span></div>\n  </div></section>\n<section class=\"report-page\" aria-labelledby=\"exec-title\"><span class=\"page-label\">01 · Executive summary</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">01 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">Section one</div><h2 id=\"exec-title\">Executive summary</h2></div><div class=\"meta\">Period · Q1 2026</div></div>\n    <p class=\"lead\">During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.</p>\n    <div class=\"grid grid-4 mt-24\">\n      <div class=\"kpi accent-blue avoid-break\"><div class=\"label\">Delivered work</div><div class=\"value num\">2<span class=\"unit\">items</span></div><ul><li><span>Merged PRs</span><span class=\"v\">2</span></li><li><span>Releases</span><span class=\"v\">1</span></li><li><span>Milestones</span><span class=\"v\">0</span></li></ul></div>\n      <div class=\"kpi accent-teal avoid-break\"><div class=\"label\">Delivery investment</div><div class=\"value num\">—</div><ul><li><span>Coordination</span><span class=\"v num\">$150</span></li><li><span>Scope expansion</span><span class=\"v num\">$6,600</span></li><li><span>Rework</span><span class=\"v num\">$0</span></li></ul></div>\n      <div class=\"kpi accent-amber avoid-break\"><div class=\"label\">Scope expansion</div><div class=\"value num\">$6,600</div><ul><li><span>Items after scope lock</span><span class=\"v\">2</span></li><li><span>Reopened tickets</span><span class=\"v\">0</span></li><li><span>Margin risk</span><span class=\"v\">Unknown</span></li></ul></div>\n      <div class=\"kpi accent-blue avoid-break\"><div class=\"label\">AI delivery impact</div><div class=\"value num\" style=\"font-size:18px;line-height:1.25\">Not yet measured</div><ul><li><span>Tag AI-assisted PRs</span><span class=\"v\">to unlock</span></li></ul></div>\n    </div>\n    <div class=\"callout amber mt-24 avoid-break\" style=\"padding:18px 20px\"><div style=\"display:flex;justify-content:space-between;gap:20px;align-items:center;flex-wrap:wrap\"><div style=\"flex:1;min-width:280px\"><div style=\"display:flex;align-items:center;gap:8px;margin-bottom:6px\"><span style=\"display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:6px;background:rgba(245,158,11,.16);color:#92400e;font-size:11px;font-weight:700\">!</span><strong style=\"font-size:14px;color:var(--ink);letter-spacing:-0.005em\">Recommended commercial action</strong></div><div style=\"font-size:13px;line-height:1.55;color:var(--charcoal)\">Discuss scope expansion before the next reporting cycle and convert recurring unplanned work into a change request or retainer adjustment.</div></div><div style=\"display:flex;flex-direction:column;align-items:flex-end;gap:8px;flex:none\"><div style=\"display:inline-flex;align-items:center;gap:8px;background:#fff;border:1px solid rgba(245,158,11,.35);border-radius:999px;padding:6px 12px 6px 8px\"><span style=\"width:8px;height:8px;border-radius:50%;background:var(--amber);box-shadow:0 0 0 2px #fff;display:inline-block\"></span><span style=\"font-size:11px;font-weight:600;color:#92400e;letter-spacing:.04em;text-transform:uppercase\">Action this cycle</span></div><span style=\"font-size:11px;color:var(--muted)\">Owner · Delivery lead · due before next QBR</span></div></div></div>\n    <div class=\"grid grid-3 mt-24\">\n      <div class=\"card tight avoid-break\"><div class=\"label\" style=\"font-size:10px;letter-spacing:.1em;color:var(--muted);font-weight:600;text-transform:uppercase\">What shipped</div><p style=\"margin:6px 0 0;font-size:13px;color:var(--charcoal)\">Refunds fail for split tender, Card vault migration</p></div>\n      <div class=\"card tight avoid-break\"><div class=\"label\" style=\"font-size:10px;letter-spacing:.1em;color:var(--muted);font-weight:600;text-transform:uppercase\">What changed</div><p style=\"margin:6px 0 0;font-size:13px;color:var(--charcoal)\">2 items added after scope lock; 0 tickets reopened; 1h of attributed coordination.</p></div>\n      <div class=\"card tight avoid-break\"><div class=\"label\" style=\"font-size:10px;letter-spacing:.1em;color:var(--muted);font-weight:600;text-transform:uppercase\">Needs attention</div><p style=\"margin:6px 0 0;font-size:13px;color:var(--charcoal)\">Ticket-to-PR linkage at 100%, meeting tagging at 100%, and explicit AI-assisted work tagging.</p></div>\n    </div></section>\n<section class=\"report-page\" aria-labelledby=\"ship-title\"><span class=\"page-label\">02 · What shipped</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">02 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">Delivered work</div><h2 id=\"ship-title\">What shipped</h2></div><div class=\"meta\">Linked to tickets, PRs, and releases</div></div>\n    <div class=\"grid grid-4 mb-24\">\n      <div class=\"card avoid-break\"><div class=\"label\">Completed work items</div><div class=\"value num\">2</div><div class=\"sub\">Across feature, fix, and platform</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Merged PRs</div><div class=\"value num\">2</div><div class=\"sub\">100% linked to a ticket</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Releases</div><div class=\"value num\">1</div><div class=\"sub\">In the reporting period</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Delivery milestones</div><div class=\"value num\">0</div><div class=\"sub\">Customer-visible checkpoints</div></div>\n    </div>\n    <table class=\"avoid-break\" aria-label=\"Delivered work items\"><thead><tr><th>Work item</th><th>Type</th><th>Evidence</th><th>Status</th><th>Completed</th></tr></thead><tbody><tr><td><div class=\"row-title\">Refunds fail for split tender</div><div class=\"row-sub mono\">EXAMPLE-REPORTS-42</div></td><td><span class=\"chip \"><span class=\"dot\"></span>Bug fix</span></td><td class=\"num\">1 PR</td><td><span class=\"chip green\"><span class=\"dot\"></span>Shipped</span></td><td>2026-03-01</td></tr><tr><td><div class=\"row-title\">Card vault migration</div><div class=\"row-sub mono\">EXAMPLE-REPORTS-1</div></td><td><span class=\"chip blue\"><span class=\"dot\"></span>Feature</span></td><td class=\"num\">1 PR</td><td><span class=\"chip green\"><span class=\"dot\"></span>Shipped</span></td><td>2026-02-10</td></tr></tbody></table>\n    <div class=\"callout mt-24 avoid-break\"><strong>Delivery proof, not developer surveillance.</strong> Scopeworth links every report claim back to delivery evidence — tickets, pull requests, releases, and merges — so a client can verify what shipped without asking for a code review.</div></section>\n<section class=\"report-page\" aria-labelledby=\"cost-title\"><span class=\"page-label\">03 · What it cost</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">03 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">Delivery investment</div><h2 id=\"cost-title\">What it cost</h2></div><div class=\"meta\">Estimated · directional figures</div></div>\n    <div class=\"grid grid-2 mb-24\">\n      <div class=\"kpi accent-blue avoid-break\"><div class=\"label\">Total estimated delivery investment</div><div class=\"value num\">—</div><div class=\"sub\" style=\"margin-top:8px\">Period delivery spend is not available. Contract value is not period spend.</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Cost composition</div><div class=\"stack mt-8\" role=\"img\" aria-label=\"Cost composition stacked bar\"><div style=\"width:0%;background:#F59E0B\" title=\"Scope expansion\"></div><div style=\"width:0%;background:#14B8A6\" title=\"Meetings &amp; coordination\"></div><div style=\"width:0%;background:#A78BFA\" title=\"Rework\"></div></div><div class=\"stack-legend\"><div class=\"item\"><span class=\"sw\" style=\"background:#F59E0B\"></span>Scope expansion · —</div><div class=\"item\"><span class=\"sw\" style=\"background:#14B8A6\"></span>Meetings &amp; coordination · —</div><div class=\"item\"><span class=\"sw\" style=\"background:#A78BFA\"></span>Rework · —</div></div><p class=\"muted mt-12\" style=\"font-size:12px\">Feature build, review and other delivery support are attributed once Invoice Defense's cost model is connected.</p></div>\n    </div>\n    <div class=\"card avoid-break mb-24\" style=\"padding:22px\"><h4 class=\"mb-16\">Estimated cost by category</h4><div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Scope expansion</span><span class=\"v num\">$6,600 · —</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#F59E0B\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Meetings &amp; coordination</span><span class=\"v num\">$150 · —</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#14B8A6\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Rework</span><span class=\"v num\">$0 · —</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#A78BFA\"></div></div></div></div></div>\n    <p class=\"muted mt-16\" style=\"font-size:12px\">These figures are directional and depend on available data, role-based cost assumptions, and project mapping quality. See report confidence.</p></section>\n<section class=\"report-page\" aria-labelledby=\"scope-title\"><span class=\"page-label\">04 · Scope expansion</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">04 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\" style=\"color:var(--amber)\">Margin risk</div><h2 id=\"scope-title\">Where scope changed</h2></div><div class=\"meta\">Scope expansion impact · estimated</div></div>\n    <div class=\"kpi accent-amber avoid-break mb-24\" style=\"padding:22px\"><div style=\"display:flex;justify-content:space-between;align-items:flex-end;gap:24px;flex-wrap:wrap\"><div><div class=\"label\">Estimated scope expansion impact</div><div class=\"value num\" style=\"font-size:42px\">$6,600</div><div class=\"sub\" style=\"margin-top:8px;max-width:420px\">Work added after the original scope was agreed, plus reopened and re-sized baseline work.</div></div><div style=\"display:flex;gap:8px;flex-wrap:wrap\"><span class=\"chip amber\"><span class=\"dot\"></span>Margin risk: Unknown</span><span class=\"chip\"><span class=\"dot\"></span>Convert to change request</span></div></div></div>\n    <div class=\"grid grid-4 mb-24\">\n      <div class=\"card avoid-break\"><div class=\"label\">Added after scope lock</div><div class=\"value num\">2<span class=\"unit\" style=\"font-size:14px;font-weight:600;color:var(--muted)\"> items</span></div><div class=\"sub\">Tickets created after the cycle started</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Reopened tickets</div><div class=\"value num\">0</div><div class=\"sub\">Reopened baseline work</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Estimates grown after lock</div><div class=\"value num\">0</div><div class=\"sub\">Baseline items re-sized</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Attributed coordination</div><div class=\"value num\">1h</div><div class=\"sub\">Attributed meetings</div></div>\n    </div>\n    <h4 class=\"mb-12\">Scope expansion signals</h4>\n    <table class=\"avoid-break\" aria-label=\"Scope expansion signals\"><thead><tr><th>Signal</th><th class=\"num\">Count</th><th class=\"num\">Estimated impact</th><th>Suggested action</th></tr></thead><tbody>\n      <tr><td><div class=\"row-title\">Tickets added after scope lock</div><div class=\"row-sub\">Created after the baseline</div></td><td class=\"num\">2</td><td class=\"num\">$6,600</td><td>Convert into change request</td></tr>\n      <tr><td><div class=\"row-title\">Reopened baseline tickets</div><div class=\"row-sub\">Reason for reopening not classified</div></td><td class=\"num\">0</td><td class=\"num\">$0</td><td>Clarify acceptance criteria</td></tr>\n      <tr><td><div class=\"row-title\">Estimates grown after lock</div><div class=\"row-sub\">Baseline items re-sized mid-cycle</div></td><td class=\"num\">0</td><td class=\"num\">$0</td><td>Add review owner earlier</td></tr>\n      <tr><td><div class=\"row-title\">Attributed coordination meetings</div><div class=\"row-sub\">Meeting purpose not classified</div></td><td class=\"num\">1h</td><td class=\"num\">$150</td><td>Separate discovery from delivery budget</td></tr>\n    </tbody></table>\n    <div class=\"callout amber mt-24 avoid-break\"><div style=\"font-style:italic;color:var(--muted);margin-bottom:6px\">“Why is this month’s invoice higher than expected?”</div><strong>What the delivery evidence for Q1 2026 shows.</strong> The team delivered 2 work items, 2 PRs and 1 release for example-reports Retail during Q1 2026, while also absorbing 2 additional work items worth an estimated $6,600 after the scope baseline.</div></section>\n<section class=\"report-page\" aria-labelledby=\"rework-title\"><span class=\"page-label\">05 · Rework &amp; quality</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">05 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">Quality &amp; rework</div><h2 id=\"rework-title\">Where rework happened</h2></div><div class=\"meta\">Project-level signals · not individual scoring</div></div>\n    <div class=\"grid grid-4 mb-24\">\n      <div class=\"card avoid-break\"><div class=\"label\">Rework cost</div><div class=\"value num\">$0</div><div class=\"sub\">— of delivery investment</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Reopened tickets</div><div class=\"value num\">0</div><div class=\"sub\">Of 2 completed</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Estimates grown</div><div class=\"value num\">0</div><div class=\"sub\">Baseline items re-sized</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Unestimated movement</div><div class=\"value num\">0</div><div class=\"sub\">Counted, not valued</div></div>\n    </div>\n    <div class=\"callout avoid-break\"><strong>Interpretation.</strong> Rework here is reopened and re-sized baseline work, not individual performance. This suggests an opportunity to improve scope clarity and acceptance criteria before implementation starts — not to add pressure on individual engineers.</div>\n    <div class=\"callout green mt-12 avoid-break\"><strong>Recommended action.</strong> Add a scope confirmation checkpoint before implementation starts on high-complexity items. Capture acceptance criteria in the ticket and confirm with the client before the work enters the build queue.</div></section>\n<section class=\"report-page\" aria-labelledby=\"ai-title\"><span class=\"page-label\">06 · AI delivery economics</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">06 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\" style=\"color:var(--teal)\">AI-assisted delivery</div><h2 id=\"ai-title\">Modeled AI cycle-time comparison</h2></div><div class=\"meta\">Observed forge timestamps · self-reported AI tags</div></div>\n      <div class=\"callout avoid-break\"><strong>Not yet measured.</strong> AI-assisted delivery economics need at least one merged pull request tagged as AI-assisted and one non-assisted baseline merge in this project. Add an <em>ai-assisted</em> label or commit trailer to relevant work to unlock this section.</div></section>\n<section class=\"report-page\" aria-labelledby=\"conf-title\"><span class=\"page-label\">07 · Report confidence</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">07 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">Trust &amp; data health</div><h2 id=\"conf-title\">How trustworthy this report is</h2></div><div class=\"meta\">Report confidence · Medium</div></div>\n    <div class=\"card avoid-break mb-24\" style=\"padding:22px\"><div class=\"conf-head\"><div class=\"conf-ring\" role=\"img\" aria-label=\"Confidence score\" style=\"background:conic-gradient(var(--amber) 0 80%, var(--subtle) 80% 100%);\"><div class=\"v\">80%<small>Score</small></div></div><div><h3>Medium confidence</h3><p class=\"muted\" style=\"margin:4px 0 0;font-size:13px;max-width:520px\">Weaker coverage on confirmed reporting assumptions and release / deployment evidence. Review the recommendations on this page to improve evidence coverage.</p></div></div>\n    <div class=\"grid grid-2 mt-16\"><div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">PRs linked to tickets</span><span class=\"v num\">Linked merged changes</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:100%;background:#10B981\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Tickets mapped to client / project</span><span class=\"v num\">Workspace mapping coverage</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:100%;background:#10B981\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Meetings tagged to client / project</span><span class=\"v num\">No active calendar source</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#94A3B8\"></div></div></div></div><div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Rate card precision</span><span class=\"v num\">No labour hours in this period</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#94A3B8\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">AI-assisted work tagging</span><span class=\"v num\">Not tagged</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#94A3B8\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Release / deployment evidence</span><span class=\"v num\">Completed work with linked release evidence</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:50%;background:#F59E0B\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Synced evidence share</span><span class=\"v num\">Synced evidence coverage</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:100%;background:#10B981\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Source freshness</span><span class=\"v num\">No active sources</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#94A3B8\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Confirmed reporting assumptions</span><span class=\"v num\">0 of 6 reporting assumptions are confirmed or rectified for this period.</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#EF4444\"></div></div></div></div></div></div>\n    <div class=\"callout avoid-break mb-16\"><strong>Why this matters.</strong> Scopeworth does not pretend messy delivery data is perfect. Report confidence shows where the evidence is strong, where assumptions were used, and what should be improved before relying on the report for commercial decisions.</div>\n    <h4 class=\"mb-12\">Recommended data improvements</h4>\n    <div class=\"grid grid-2 mb-16\"><div class=\"card tight avoid-break\"><strong>1.</strong> Add client / project labels to all relevant tracker issues</div><div class=\"card tight avoid-break\"><strong>2.</strong> Include ticket IDs in PR titles or branch names</div><div class=\"card tight avoid-break\"><strong>3.</strong> Tag client / project names in calendar events</div><div class=\"card tight avoid-break\"><strong>4.</strong> Explicitly mark AI-assisted work where possible</div></div>\n    <div class=\"callout green avoid-break\"><strong>Scopeworth focuses on client, project, and team-level delivery proof.</strong> It is not designed to rank individual engineers or create performance-review leaderboards. Delivery proof, not developer surveillance.</div></section>\n<section class=\"report-page\" aria-labelledby=\"next-title\"><span class=\"page-label\">08 · Recommended actions</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">08 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">From insight to action</div><h2 id=\"next-title\">What to do next</h2></div><div class=\"meta\">Five commercial actions</div></div><div class=\"rec-grid mb-16\"><article class=\"rec-card avoid-break\"><div style=\"display:flex;justify-content:space-between;align-items:center\"><span class=\"rc-num\">01</span><span class=\"chip amber\"><span class=\"dot\"></span>Margin</span></div><h4>Convert scope expansion into a change request</h4><div class=\"rc-row\"><b>Why</b>$6,600 of estimated delivery investment came from work added after scope lock.</div><div class=\"rc-row\"><b>Action</b>Review added items with the client and formalize the next-cycle scope.</div></article><article class=\"rec-card avoid-break\"><div style=\"display:flex;justify-content:space-between;align-items:center\"><span class=\"rc-num\">02</span><span class=\"chip blue\"><span class=\"dot\"></span>Process</span></div><h4>Separate discovery from implementation budget</h4><div class=\"rc-row\"><b>Why</b>1 meetings (1 h) were attributed to this project.</div><div class=\"rc-row\"><b>Action</b>Create a dedicated discovery / clarification budget bucket.</div></article><article class=\"rec-card avoid-break\"><div style=\"display:flex;justify-content:space-between;align-items:center\"><span class=\"rc-num\">03</span><span class=\"chip\"><span class=\"dot\"></span>Data</span></div><h4>Improve ticket-to-PR traceability</h4><div class=\"rc-row\"><b>Why</b>0% of PRs were not linked to tickets.</div><div class=\"rc-row\"><b>Action</b>Require ticket IDs in branch names and PR titles.</div></article><article class=\"rec-card avoid-break\"><div style=\"display:flex;justify-content:space-between;align-items:center\"><span class=\"rc-num\">04</span><span class=\"chip\"><span class=\"dot\" style=\"background:#A78BFA\"></span>AI</span></div><h4>Track AI-assisted work explicitly</h4><div class=\"rc-row\"><b>Why</b>AI-assisted delivery cannot be measured until assisted work is tagged.</div><div class=\"rc-row\"><b>Action</b>Add an AI-assisted field or label to relevant work items.</div></article><article class=\"rec-card avoid-break\" style=\"grid-column:1 / -1\"><div style=\"display:flex;justify-content:space-between;align-items:center\"><span class=\"rc-num\">05</span><span class=\"chip green\"><span class=\"dot\"></span>Client</span></div><h4>Use this report in the next client review</h4><div class=\"rc-row\"><b>Why</b>The report provides a shared view of shipped work, cost, scope movement, and risks — useful for QBRs, retainer reviews, and invoice discussions.</div><div class=\"rc-row\"><b>Action</b>Use the executive summary and scope expansion sections in the next QBR or invoice discussion.</div></article></div></section>\n</main>\n\n</body>\n</html>"
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request POST "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/report-builder/preview" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: example-operation-attempt-1' \
  --data-raw '{"composition":{"context":{"clientId":"22222222-2222-4222-8222-222222222222","clientName":"Synthetic customer","projectId":"11111111-1111-4111-8111-111111111111","projectName":"Synthetic delivery","periodStart":"2026-01-01","periodEnd":"2026-03-31","period":"Q1 2026","timeRange":"Jan 1–Mar 31","qid":null},"layout":{"order":["rs1","rs2","rs3","rs4","rs5","rs6","rs7","rs8","rs9","rs10"],"sections":{"rs1":true,"rs2":true,"rs3":true,"rs4":true,"rs5":true,"rs6":true,"rs7":false,"rs8":true,"rs9":true,"rs10":true}},"items":{},"narrative":"During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.","tone":"default","narrativeProvenance":{"outcome":"template","provider":null,"modelId":null,"promptVersion":null}}}'

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/report-builder/preview", {
  method: "POST",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`,
  "Content-Type": "application/json",
  "Idempotency-Key": "example-operation-attempt-1"
},
  body: JSON.stringify({
  "composition": {
    "context": {
      "clientId": "22222222-2222-4222-8222-222222222222",
      "clientName": "Synthetic customer",
      "projectId": "11111111-1111-4111-8111-111111111111",
      "projectName": "Synthetic delivery",
      "periodStart": "2026-01-01",
      "periodEnd": "2026-03-31",
      "period": "Q1 2026",
      "timeRange": "Jan 1–Mar 31",
      "qid": null
    },
    "layout": {
      "order": [
        "rs1",
        "rs2",
        "rs3",
        "rs4",
        "rs5",
        "rs6",
        "rs7",
        "rs8",
        "rs9",
        "rs10"
      ],
      "sections": {
        "rs1": true,
        "rs2": true,
        "rs3": true,
        "rs4": true,
        "rs5": true,
        "rs6": true,
        "rs7": false,
        "rs8": true,
        "rs9": true,
        "rs10": true
      }
    },
    "items": {},
    "narrative": "During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.",
    "tone": "default",
    "narrativeProvenance": {
      "outcome": "template",
      "provider": null,
      "modelId": null,
      "promptVersion": null
    }
  }
}),
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"],"Content-Type":"application/json","Idempotency-Key":"example-operation-attempt-1"}
response = requests.request("POST", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/report-builder/preview", headers=headers, json=__import__("json").loads("{\"composition\":{\"context\":{\"clientId\":\"22222222-2222-4222-8222-222222222222\",\"clientName\":\"Synthetic customer\",\"projectId\":\"11111111-1111-4111-8111-111111111111\",\"projectName\":\"Synthetic delivery\",\"periodStart\":\"2026-01-01\",\"periodEnd\":\"2026-03-31\",\"period\":\"Q1 2026\",\"timeRange\":\"Jan 1–Mar 31\",\"qid\":null},\"layout\":{\"order\":[\"rs1\",\"rs2\",\"rs3\",\"rs4\",\"rs5\",\"rs6\",\"rs7\",\"rs8\",\"rs9\",\"rs10\"],\"sections\":{\"rs1\":true,\"rs2\":true,\"rs3\":true,\"rs4\":true,\"rs5\":true,\"rs6\":true,\"rs7\":false,\"rs8\":true,\"rs9\":true,\"rs10\":true}},\"items\":{},\"narrative\":\"During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.\",\"tone\":\"default\",\"narrativeProvenance\":{\"outcome\":\"template\",\"provider\":null,\"modelId\":null,\"promptVersion\":null}}}"), timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Review layout, warnings, currency, source coverage and period. Do not reuse composition after changing project selection.

Freeze a report snapshot

Operation: reports.create · POST /report-builder

Save a draft by default, or ship within the existing monthly report allowance when ship is true. Optional id freezes a new immutable revision of the same existing report/project. One successful receipt produces one snapshot and attributable audit chain. No delivery or share-token creation occurs. Current key scopes, creator actions, plan and tenant/project restrictions apply on every call and successful replay. Money precision, confidence and sample thresholds use the existing factual model.

Required key scope: reports:write. Current creator action: reports.create. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Composition client/project must belong to each other inside the tenant; optional saved-report id must retain that same selection.

  • Ordered reporting dates and current plan windows apply to new facts/previews/narratives/snapshots, while stored reads reproduce original evidence.

  • Monthly shipment quota and AI token allowance are separate from technical traffic limits.

  • All responses are synchronous. Retry uncertain writes with the original key and identical body; external uncertainty never authorizes a second provider dispatch.

  • Sharing, report deletion and email/Slack/Teams distribution remain unavailable.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "example-reports.create",
    "in": "header",
    "name": "idempotency-key",
    "required": true,
    "schema": {
      "pattern": "^[\\x21-\\x7e]{1,200}
quot;
, "type": "string" } } ]

Request body schema:

View schema or synthetic response
JSON

{
  "content": {
    "application/json": {
      "examples": {
        "synthetic1": {
          "value": {
            "composition": {
              "context": {
                "clientId": "22222222-2222-4222-8222-222222222222",
                "clientName": "Synthetic customer",
                "period": "Q1 2026",
                "periodEnd": "2026-03-31",
                "periodStart": "2026-01-01",
                "projectId": "11111111-1111-4111-8111-111111111111",
                "projectName": "Synthetic delivery",
                "qid": null,
                "timeRange": "Jan 1–Mar 31"
              },
              "items": {},
              "layout": {
                "order": [
                  "rs1",
                  "rs2",
                  "rs3",
                  "rs4",
                  "rs5",
                  "rs6",
                  "rs7",
                  "rs8",
                  "rs9",
                  "rs10"
                ],
                "sections": {
                  "rs1": true,
                  "rs10": true,
                  "rs2": true,
                  "rs3": true,
                  "rs4": true,
                  "rs5": true,
                  "rs6": true,
                  "rs7": false,
                  "rs8": true,
                  "rs9": true
                }
              },
              "narrative": "During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.",
              "narrativeProvenance": {
                "modelId": null,
                "outcome": "template",
                "promptVersion": null,
                "provider": null
              },
              "tone": "default"
            },
            "name": "Synthetic delivery report",
            "ship": false
          }
        }
      },
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "composition": {
            "properties": {
              "context": {
                "properties": {
                  "clientId": {
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" }, "clientName": { "maxLength": 200, "minLength": 1, "type": "string" }, "period": { "maxLength": 80, "minLength": 1, "type": "string" }, "periodEnd": { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" }, "periodStart": { "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))
quot;
, "type": "string" }, "projectId": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" }, "projectName": { "maxLength": 200, "minLength": 1, "type": "string" }, "qid": { "type": [ "string", "null" ] }, "timeRange": { "maxLength": 80, "minLength": 1, "type": "string" } }, "required": [ "clientId", "clientName", "projectId", "projectName", "periodStart", "periodEnd", "period", "timeRange", "qid" ], "type": "object" }, "invoiceNarratives": { "additionalProperties": { "maxLength": 20000, "type": "string" }, "propertyNames": { "maxLength": 100, "minLength": 1, "type": "string" }, "type": "object" }, "items": { "properties": { "ai": { "additionalProperties": { "type": "boolean" }, "propertyNames": { "type": "string" }, "type": "object" }, "forensics": { "additionalProperties": { "type": "boolean" }, "propertyNames": { "type": "string" }, "type": "object" }, "invoice": { "additionalProperties": { "additionalProperties": { "type": "boolean" }, "propertyNames": { "type": "string" }, "type": "object" }, "propertyNames": { "type": "string" }, "type": "object" } }, "type": "object" }, "layout": { "properties": { "order": { "items": { "type": "string" }, "type": "array" }, "sections": { "anyOf": [ { "additionalProperties": { "type": "boolean" }, "propertyNames": { "type": "string" }, "type": "object" }, { "type": "null" } ] } }, "required": [ "order", "sections" ], "type": "object" }, "narrative": { "maxLength": 20000, "type": "string" }, "narrativeProvenance": { "properties": { "modelId": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "outcome": { "enum": [ "template", "generated" ], "type": "string" }, "promptVersion": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "provider": { "anyOf": [ { "enum": [ "openai", "anthropic" ], "type": "string" }, { "type": "null" } ] } }, "required": [ "outcome", "provider", "modelId", "promptVersion" ], "type": "object" }, "tone": { "enum": [ "default", "executive", "friendly", "custom" ], "type": "string" } }, "required": [ "context", "layout", "items", "narrative", "tone" ], "type": "object" }, "id": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" }, "name": { "maxLength": 200, "minLength": 1, "type": "string" }, "ship": { "default": false, "type": "boolean" } }, "required": [ "name", "composition" ], "type": "object" } } }, "required": true }

Success statuses: 201. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "document": {
    "agencyName": "Example report workspace",
    "branded": false,
    "composition": {
      "context": {
        "clientId": "22222222-2222-4222-8222-222222222222",
        "clientName": "example-reports Retail",
        "period": "Q1 2026",
        "periodEnd": "2026-03-31",
        "periodStart": "2026-01-01",
        "projectId": "11111111-1111-4111-8111-111111111111",
        "projectName": "example-reports Checkout Replatform",
        "qid": null,
        "timeRange": "Jan 1–Mar 31"
      },
      "items": {},
      "layout": {
        "order": [
          "rs1",
          "rs2",
          "rs3",
          "rs4",
          "rs5",
          "rs6",
          "rs7",
          "rs8",
          "rs9",
          "rs10"
        ],
        "sections": {
          "rs1": true,
          "rs10": true,
          "rs2": true,
          "rs3": true,
          "rs4": true,
          "rs5": true,
          "rs6": true,
          "rs7": false,
          "rs8": true,
          "rs9": true
        }
      },
      "narrative": "During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.",
      "narrativeProvenance": {
        "modelId": null,
        "outcome": "template",
        "promptVersion": null,
        "provider": null
      },
      "tone": "default"
    },
    "facts": {
      "actions": [
        {
          "action": "Review added items with the client and formalize the next-cycle scope.",
          "n": 1,
          "tag": "Margin",
          "title": "Convert scope expansion into a change request",
          "tone": "amber",
          "why": "$6,600 of estimated delivery investment came from work added after scope lock."
        },
        {
          "action": "Create a dedicated discovery / clarification budget bucket.",
          "n": 2,
          "tag": "Process",
          "title": "Separate discovery from implementation budget",
          "tone": "blue",
          "why": "1 meetings (1 h) were attributed to this project."
        },
        {
          "action": "Require ticket IDs in branch names and PR titles.",
          "n": 3,
          "tag": "Data",
          "title": "Improve ticket-to-PR traceability",
          "tone": "neutral",
          "why": "0% of PRs were not linked to tickets."
        },
        {
          "action": "Add an AI-assisted field or label to relevant work items.",
          "n": 4,
          "tag": "AI",
          "title": "Track AI-assisted work explicitly",
          "tone": "purple",
          "why": "AI-assisted delivery cannot be measured until assisted work is tagged."
        },
        {
          "action": "Use the executive summary and scope expansion sections in the next QBR or invoice discussion.",
          "n": 5,
          "tag": "Client",
          "title": "Use this report in the next client review",
          "tone": "green",
          "why": "The report provides a shared view of shipped work, cost, scope movement, and risks — useful for QBRs, retainer reviews, and invoice discussions."
        }
      ],
      "ai": null,
      "aiInsufficientSample": null,
      "assumptions": [
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "cost-basis",
          "source": "default",
          "status": "needs_verification",
          "title": "Cost estimate basis",
          "unitOrMethod": "person_then_role",
          "value": "$150/h",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "scope-baseline",
          "source": "default",
          "status": "needs_verification",
          "title": "Scope baseline",
          "unitOrMethod": "engagement_start",
          "value": "1 work items",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "meeting-attribution",
          "source": "default",
          "status": "needs_verification",
          "title": "Meeting attribution",
          "unitOrMethod": "project_tagged",
          "value": "100% tagged",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "ai-attribution",
          "source": "default",
          "status": "needs_verification",
          "title": "AI attribution",
          "unitOrMethod": "self_reported",
          "value": "Self-reported labels and trailers",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "reporting-period",
          "source": "default",
          "status": "needs_verification",
          "title": "Reporting period",
          "unitOrMethod": "active_range",
          "value": "Jan 1 – Mar 31, 2026",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "work-cost-allocation",
          "source": "default",
          "status": "needs_verification",
          "title": "Work-item cost allocation",
          "unitOrMethod": "not_allocated",
          "value": "Team estimate only",
          "versionId": null
        }
      ],
      "confidence": {
        "hints": [
          "Tag calendar events with the client or project.",
          "Add person-level rates for worked hours; role rates remain partial.",
          "Explicitly mark AI-assisted merged work with labels or commit trailers.",
          "Reconnect or sync sources so their latest successful data is current.",
          "Confirm or rectify the reporting assumptions used for this period.",
          "Connect deployment evidence to completed work items."
        ],
        "label": "Medium",
        "score": 80,
        "signals": [
          {
            "contribution": 29.63,
            "evidence": {
              "denominator": 2,
              "numerator": 2,
              "query": "Merged code changes linked to normalized work items in the report period."
            },
            "id": "prs_linked",
            "label": "PRs linked to tickets",
            "note": "Linked merged changes",
            "pct": 100,
            "weight": 16
          },
          {
            "contribution": 25.93,
            "evidence": {
              "denominator": 3,
              "numerator": 3,
              "query": "Workspace work items in the report period with a normalized project mapping."
            },
            "id": "items_mapped",
            "label": "Tickets mapped to client / project",
            "note": "Workspace mapping coverage",
            "pct": 100,
            "weight": 14
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": null,
              "numerator": null,
              "query": "An active Google Calendar connection is required before calendar tagging is measured."
            },
            "id": "meetings_tagged",
            "label": "Meetings tagged to client / project",
            "note": "No active calendar source",
            "pct": null,
            "weight": 12
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": 0,
              "numerator": 0,
              "query": "Project time entries priced by person-level rates (100%) or role-level rates (60%)."
            },
            "id": "rate_card",
            "label": "Rate card precision",
            "note": "No labour hours in this period",
            "pct": null,
            "weight": 14
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": null,
              "numerator": null,
              "query": "Explicit self-reported AI labels or commit trailers on merged changes."
            },
            "id": "ai_tagging",
            "label": "AI-assisted work tagging",
            "note": "Not tagged",
            "pct": null,
            "weight": 12
          },
          {
            "contribution": 9.26,
            "evidence": {
              "denominator": 2,
              "numerator": 1,
              "query": "Completed project work items linked to a merged change and a release through explicit evidence links."
            },
            "id": "release_evidence",
            "label": "Release / deployment evidence",
            "note": "Completed work with linked release evidence",
            "pct": 50,
            "weight": 10
          },
          {
            "contribution": 14.81,
            "evidence": {
              "denominator": 100,
              "numerator": 100,
              "query": "Synced rather than manual or CSV evidence rows in the report context."
            },
            "id": "manual_entry_share",
            "label": "Synced evidence share",
            "note": "Synced evidence coverage",
            "pct": 100,
            "weight": 8
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": 0,
              "numerator": 0,
              "query": "Latest successful sync per active connection, measured against the report period end."
            },
            "id": "freshness",
            "label": "Source freshness",
            "note": "No active sources",
            "pct": null,
            "weight": 8
          },
          {
            "contribution": 0,
            "evidence": {
              "denominator": 6,
              "numerator": 0,
              "query": "Resolved confirmed or rectified report assumptions at the workspace, client, project, and reporting-period scope."
            },
            "id": "assumptions",
            "label": "Confirmed reporting assumptions",
            "note": "0 of 6 reporting assumptions are confirmed or rectified for this period.",
            "pct": 0,
            "weight": 6
          }
        ]
      },
      "coordination": {
        "blendedHourlyRateCents": 15000,
        "costCents": 15000,
        "declined": 0,
        "hours": 1,
        "meetings": 1,
        "taggingPct": 100
      },
      "currency": "USD",
      "delivery": {
        "completedItems": 2,
        "mergedChanges": 2,
        "milestones": 0,
        "objectivesCompleted": 0,
        "objectivesTotal": 0,
        "prsLinkedPct": 100,
        "releaseRows": [
          {
            "items": 1,
            "name": "v1.4.0",
            "releasedAt": "2026-02-12T18:00:00.000Z",
            "releaseId": "00000000-0000-4000-8000-000000000007"
          }
        ],
        "releases": 1,
        "rows": [
          {
            "completedAt": "2026-03-01T10:00:00.000Z",
            "externalKey": "EXAMPLE-REPORTS-42",
            "linkedChanges": 1,
            "title": "Refunds fail for split tender",
            "type": "bug",
            "url": null,
            "workItemId": "00000000-0000-4000-8000-000000000005"
          },
          {
            "completedAt": "2026-02-10T16:30:00.000Z",
            "externalKey": "EXAMPLE-REPORTS-1",
            "linkedChanges": 1,
            "title": "Card vault migration",
            "type": "story",
            "url": null,
            "workItemId": "00000000-0000-4000-8000-000000000006"
          }
        ]
      },
      "evidencePackages": [],
      "investment": {
        "cloudCents": 0,
        "coordinationCents": 15000,
        "coordinationPct": null,
        "costEvidence": {
          "cloudLines": 0,
          "linkedTimeEntries": 0,
          "timeEntries": 0
        },
        "currencyConflict": false,
        "estimated": false,
        "estimatedCloudCents": 0,
        "invoicedCents": null,
        "labourCategories": [],
        "labourCents": 0,
        "labourHours": 0,
        "reworkCents": 0,
        "reworkPct": null,
        "roleBandHours": 0,
        "scopeCents": 660000,
        "scopePct": null,
        "totalCents": null,
        "unpricedHours": 0
      },
      "manualEntrySharePct": 0,
      "periodEnd": "2026-03-31",
      "periodStart": "2026-01-01",
      "scope": {
        "addedCents": 660000,
        "addedItems": 2,
        "blendedHourlyRateCents": 15000,
        "grownCents": 0,
        "grownItems": 0,
        "priced": true,
        "reopenedCents": 0,
        "reopenedItems": 0,
        "scopeLockOn": "2026-01-01",
        "totalCents": 660000,
        "unestimated": 0
      },
      "sources": [
        {
          "label": "Contracts",
          "source": "commercial",
          "state": "data_present"
        },
        {
          "label": "Tracker",
          "source": "tracker",
          "state": "data_present"
        },
        {
          "label": "Code",
          "source": "code",
          "state": "data_present"
        },
        {
          "label": "Releases",
          "source": "release",
          "state": "data_present"
        },
        {
          "label": "Calendar",
          "source": "calendar",
          "state": "data_present"
        }
      ]
    },
    "generatedAt": "2026-10-01T08:30:28.683Z",
    "teamType": null,
    "version": 1
  },
  "report": {
    "context": {
      "clientId": "22222222-2222-4222-8222-222222222222",
      "clientName": "example-reports Retail",
      "period": "Q1 2026",
      "periodEnd": "2026-03-31",
      "periodStart": "2026-01-01",
      "projectId": "11111111-1111-4111-8111-111111111111",
      "projectName": "example-reports Checkout Replatform",
      "qid": null,
      "timeRange": "Jan 1–Mar 31"
    },
    "createdAt": "2026-10-01T08:30:28.684Z",
    "id": "33333333-3333-4333-8333-333333333333",
    "lastSharedAt": null,
    "name": "Synthetic delivery report",
    "shares": [],
    "snapshotId": "44444444-4444-4444-8444-444444444444",
    "status": "draft",
    "updatedAt": "2026-10-01T08:30:28.684Z"
  }
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request POST "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/report-builder" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: example-operation-attempt-1' \
  --data-raw '{"name":"Synthetic delivery report","composition":{"context":{"clientId":"22222222-2222-4222-8222-222222222222","clientName":"Synthetic customer","projectId":"11111111-1111-4111-8111-111111111111","projectName":"Synthetic delivery","periodStart":"2026-01-01","periodEnd":"2026-03-31","period":"Q1 2026","timeRange":"Jan 1–Mar 31","qid":null},"layout":{"order":["rs1","rs2","rs3","rs4","rs5","rs6","rs7","rs8","rs9","rs10"],"sections":{"rs1":true,"rs2":true,"rs3":true,"rs4":true,"rs5":true,"rs6":true,"rs7":false,"rs8":true,"rs9":true,"rs10":true}},"items":{},"narrative":"During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.","tone":"default","narrativeProvenance":{"outcome":"template","provider":null,"modelId":null,"promptVersion":null}},"ship":false}'

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/report-builder", {
  method: "POST",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`,
  "Content-Type": "application/json",
  "Idempotency-Key": "example-operation-attempt-1"
},
  body: JSON.stringify({
  "name": "Synthetic delivery report",
  "composition": {
    "context": {
      "clientId": "22222222-2222-4222-8222-222222222222",
      "clientName": "Synthetic customer",
      "projectId": "11111111-1111-4111-8111-111111111111",
      "projectName": "Synthetic delivery",
      "periodStart": "2026-01-01",
      "periodEnd": "2026-03-31",
      "period": "Q1 2026",
      "timeRange": "Jan 1–Mar 31",
      "qid": null
    },
    "layout": {
      "order": [
        "rs1",
        "rs2",
        "rs3",
        "rs4",
        "rs5",
        "rs6",
        "rs7",
        "rs8",
        "rs9",
        "rs10"
      ],
      "sections": {
        "rs1": true,
        "rs2": true,
        "rs3": true,
        "rs4": true,
        "rs5": true,
        "rs6": true,
        "rs7": false,
        "rs8": true,
        "rs9": true,
        "rs10": true
      }
    },
    "items": {},
    "narrative": "During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.",
    "tone": "default",
    "narrativeProvenance": {
      "outcome": "template",
      "provider": null,
      "modelId": null,
      "promptVersion": null
    }
  },
  "ship": false
}),
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"],"Content-Type":"application/json","Idempotency-Key":"example-operation-attempt-1"}
response = requests.request("POST", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/report-builder", headers=headers, json=__import__("json").loads("{\"name\":\"Synthetic delivery report\",\"composition\":{\"context\":{\"clientId\":\"22222222-2222-4222-8222-222222222222\",\"clientName\":\"Synthetic customer\",\"projectId\":\"11111111-1111-4111-8111-111111111111\",\"projectName\":\"Synthetic delivery\",\"periodStart\":\"2026-01-01\",\"periodEnd\":\"2026-03-31\",\"period\":\"Q1 2026\",\"timeRange\":\"Jan 1–Mar 31\",\"qid\":null},\"layout\":{\"order\":[\"rs1\",\"rs2\",\"rs3\",\"rs4\",\"rs5\",\"rs6\",\"rs7\",\"rs8\",\"rs9\",\"rs10\"],\"sections\":{\"rs1\":true,\"rs2\":true,\"rs3\":true,\"rs4\":true,\"rs5\":true,\"rs6\":true,\"rs7\":false,\"rs8\":true,\"rs9\":true,\"rs10\":true}},\"items\":{},\"narrative\":\"During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.\",\"tone\":\"default\",\"narrativeProvenance\":{\"outcome\":\"template\",\"provider\":null,\"modelId\":null,\"promptVersion\":null}},\"ship\":false}"), timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Save returned reportId/snapshotId. Current monthly saved-report quotas/create permission apply before persistence/replay. The snapshot is immutable. A ship flag follows the supported state contract and does not distribute it.

Retrieve stored report facts and HTML

Operation: reports.read · GET /report-builder/:id

Retrieve the existing report current immutable snapshot, stored document and rendered HTML. GET never rereads live facts or regenerates narrative. Optional one client/project selection must match the report. Historical snapshots and existing app/share behavior remain unchanged. Current key scopes, creator actions, plan and tenant/project restrictions apply on every call and successful replay. Money precision, confidence and sample thresholds use the existing factual model.

Required key scope: reports:read. Current creator action: reports.read. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Composition client/project must belong to each other inside the tenant; optional saved-report id must retain that same selection.

  • Ordered reporting dates and current plan windows apply to new facts/previews/narratives/snapshots, while stored reads reproduce original evidence.

  • Monthly shipment quota and AI token allowance are separate from technical traffic limits.

  • All responses are synchronous. Retry uncertain writes with the original key and identical body; external uncertainty never authorizes a second provider dispatch.

  • Sharing, report deletion and email/Slack/Teams distribution remain unavailable.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "33333333-3333-4333-8333-333333333333",
    "in": "path",
    "name": "id",
    "required": true,
    "schema": {
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } }, { "in": "query", "name": "clientId", "required": false, "schema": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } }, { "example": "11111111-1111-4111-8111-111111111111", "in": "query", "name": "projectId", "required": false, "schema": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } } ]

Success statuses: 200. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "document": {
    "agencyName": "Example report workspace",
    "branded": false,
    "composition": {
      "context": {
        "clientId": "22222222-2222-4222-8222-222222222222",
        "clientName": "example-reports Retail",
        "period": "Q1 2026",
        "periodEnd": "2026-03-31",
        "periodStart": "2026-01-01",
        "projectId": "11111111-1111-4111-8111-111111111111",
        "projectName": "example-reports Checkout Replatform",
        "qid": null,
        "timeRange": "Jan 1–Mar 31"
      },
      "items": {},
      "layout": {
        "order": [
          "rs1",
          "rs2",
          "rs3",
          "rs4",
          "rs5",
          "rs6",
          "rs7",
          "rs8",
          "rs9",
          "rs10"
        ],
        "sections": {
          "rs1": true,
          "rs10": true,
          "rs2": true,
          "rs3": true,
          "rs4": true,
          "rs5": true,
          "rs6": true,
          "rs7": false,
          "rs8": true,
          "rs9": true
        }
      },
      "narrative": "During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.",
      "narrativeProvenance": {
        "modelId": null,
        "outcome": "template",
        "promptVersion": null,
        "provider": null
      },
      "tone": "default"
    },
    "facts": {
      "actions": [
        {
          "action": "Review added items with the client and formalize the next-cycle scope.",
          "n": 1,
          "tag": "Margin",
          "title": "Convert scope expansion into a change request",
          "tone": "amber",
          "why": "$6,600 of estimated delivery investment came from work added after scope lock."
        },
        {
          "action": "Create a dedicated discovery / clarification budget bucket.",
          "n": 2,
          "tag": "Process",
          "title": "Separate discovery from implementation budget",
          "tone": "blue",
          "why": "1 meetings (1 h) were attributed to this project."
        },
        {
          "action": "Require ticket IDs in branch names and PR titles.",
          "n": 3,
          "tag": "Data",
          "title": "Improve ticket-to-PR traceability",
          "tone": "neutral",
          "why": "0% of PRs were not linked to tickets."
        },
        {
          "action": "Add an AI-assisted field or label to relevant work items.",
          "n": 4,
          "tag": "AI",
          "title": "Track AI-assisted work explicitly",
          "tone": "purple",
          "why": "AI-assisted delivery cannot be measured until assisted work is tagged."
        },
        {
          "action": "Use the executive summary and scope expansion sections in the next QBR or invoice discussion.",
          "n": 5,
          "tag": "Client",
          "title": "Use this report in the next client review",
          "tone": "green",
          "why": "The report provides a shared view of shipped work, cost, scope movement, and risks — useful for QBRs, retainer reviews, and invoice discussions."
        }
      ],
      "ai": null,
      "aiInsufficientSample": null,
      "assumptions": [
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "cost-basis",
          "source": "default",
          "status": "needs_verification",
          "title": "Cost estimate basis",
          "unitOrMethod": "person_then_role",
          "value": "$150/h",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "scope-baseline",
          "source": "default",
          "status": "needs_verification",
          "title": "Scope baseline",
          "unitOrMethod": "engagement_start",
          "value": "1 work items",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "meeting-attribution",
          "source": "default",
          "status": "needs_verification",
          "title": "Meeting attribution",
          "unitOrMethod": "project_tagged",
          "value": "100% tagged",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "ai-attribution",
          "source": "default",
          "status": "needs_verification",
          "title": "AI attribution",
          "unitOrMethod": "self_reported",
          "value": "Self-reported labels and trailers",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "reporting-period",
          "source": "default",
          "status": "needs_verification",
          "title": "Reporting period",
          "unitOrMethod": "active_range",
          "value": "Jan 1 – Mar 31, 2026",
          "versionId": null
        },
        {
          "effectiveFrom": "2026-01-01",
          "effectiveTo": null,
          "id": "work-cost-allocation",
          "source": "default",
          "status": "needs_verification",
          "title": "Work-item cost allocation",
          "unitOrMethod": "not_allocated",
          "value": "Team estimate only",
          "versionId": null
        }
      ],
      "confidence": {
        "hints": [
          "Tag calendar events with the client or project.",
          "Add person-level rates for worked hours; role rates remain partial.",
          "Explicitly mark AI-assisted merged work with labels or commit trailers.",
          "Reconnect or sync sources so their latest successful data is current.",
          "Confirm or rectify the reporting assumptions used for this period.",
          "Connect deployment evidence to completed work items."
        ],
        "label": "Medium",
        "score": 80,
        "signals": [
          {
            "contribution": 29.63,
            "evidence": {
              "denominator": 2,
              "numerator": 2,
              "query": "Merged code changes linked to normalized work items in the report period."
            },
            "id": "prs_linked",
            "label": "PRs linked to tickets",
            "note": "Linked merged changes",
            "pct": 100,
            "weight": 16
          },
          {
            "contribution": 25.93,
            "evidence": {
              "denominator": 3,
              "numerator": 3,
              "query": "Workspace work items in the report period with a normalized project mapping."
            },
            "id": "items_mapped",
            "label": "Tickets mapped to client / project",
            "note": "Workspace mapping coverage",
            "pct": 100,
            "weight": 14
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": null,
              "numerator": null,
              "query": "An active Google Calendar connection is required before calendar tagging is measured."
            },
            "id": "meetings_tagged",
            "label": "Meetings tagged to client / project",
            "note": "No active calendar source",
            "pct": null,
            "weight": 12
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": 0,
              "numerator": 0,
              "query": "Project time entries priced by person-level rates (100%) or role-level rates (60%)."
            },
            "id": "rate_card",
            "label": "Rate card precision",
            "note": "No labour hours in this period",
            "pct": null,
            "weight": 14
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": null,
              "numerator": null,
              "query": "Explicit self-reported AI labels or commit trailers on merged changes."
            },
            "id": "ai_tagging",
            "label": "AI-assisted work tagging",
            "note": "Not tagged",
            "pct": null,
            "weight": 12
          },
          {
            "contribution": 9.26,
            "evidence": {
              "denominator": 2,
              "numerator": 1,
              "query": "Completed project work items linked to a merged change and a release through explicit evidence links."
            },
            "id": "release_evidence",
            "label": "Release / deployment evidence",
            "note": "Completed work with linked release evidence",
            "pct": 50,
            "weight": 10
          },
          {
            "contribution": 14.81,
            "evidence": {
              "denominator": 100,
              "numerator": 100,
              "query": "Synced rather than manual or CSV evidence rows in the report context."
            },
            "id": "manual_entry_share",
            "label": "Synced evidence share",
            "note": "Synced evidence coverage",
            "pct": 100,
            "weight": 8
          },
          {
            "contribution": null,
            "evidence": {
              "denominator": 0,
              "numerator": 0,
              "query": "Latest successful sync per active connection, measured against the report period end."
            },
            "id": "freshness",
            "label": "Source freshness",
            "note": "No active sources",
            "pct": null,
            "weight": 8
          },
          {
            "contribution": 0,
            "evidence": {
              "denominator": 6,
              "numerator": 0,
              "query": "Resolved confirmed or rectified report assumptions at the workspace, client, project, and reporting-period scope."
            },
            "id": "assumptions",
            "label": "Confirmed reporting assumptions",
            "note": "0 of 6 reporting assumptions are confirmed or rectified for this period.",
            "pct": 0,
            "weight": 6
          }
        ]
      },
      "coordination": {
        "blendedHourlyRateCents": 15000,
        "costCents": 15000,
        "declined": 0,
        "hours": 1,
        "meetings": 1,
        "taggingPct": 100
      },
      "currency": "USD",
      "delivery": {
        "completedItems": 2,
        "mergedChanges": 2,
        "milestones": 0,
        "objectivesCompleted": 0,
        "objectivesTotal": 0,
        "prsLinkedPct": 100,
        "releaseRows": [
          {
            "items": 1,
            "name": "v1.4.0",
            "releasedAt": "2026-02-12T18:00:00.000Z",
            "releaseId": "00000000-0000-4000-8000-000000000007"
          }
        ],
        "releases": 1,
        "rows": [
          {
            "completedAt": "2026-03-01T10:00:00.000Z",
            "externalKey": "EXAMPLE-REPORTS-42",
            "linkedChanges": 1,
            "title": "Refunds fail for split tender",
            "type": "bug",
            "url": null,
            "workItemId": "00000000-0000-4000-8000-000000000005"
          },
          {
            "completedAt": "2026-02-10T16:30:00.000Z",
            "externalKey": "EXAMPLE-REPORTS-1",
            "linkedChanges": 1,
            "title": "Card vault migration",
            "type": "story",
            "url": null,
            "workItemId": "00000000-0000-4000-8000-000000000006"
          }
        ]
      },
      "evidencePackages": [],
      "investment": {
        "cloudCents": 0,
        "coordinationCents": 15000,
        "coordinationPct": null,
        "costEvidence": {
          "cloudLines": 0,
          "linkedTimeEntries": 0,
          "timeEntries": 0
        },
        "currencyConflict": false,
        "estimated": false,
        "estimatedCloudCents": 0,
        "invoicedCents": null,
        "labourCategories": [],
        "labourCents": 0,
        "labourHours": 0,
        "reworkCents": 0,
        "reworkPct": null,
        "roleBandHours": 0,
        "scopeCents": 660000,
        "scopePct": null,
        "totalCents": null,
        "unpricedHours": 0
      },
      "manualEntrySharePct": 0,
      "periodEnd": "2026-03-31",
      "periodStart": "2026-01-01",
      "scope": {
        "addedCents": 660000,
        "addedItems": 2,
        "blendedHourlyRateCents": 15000,
        "grownCents": 0,
        "grownItems": 0,
        "priced": true,
        "reopenedCents": 0,
        "reopenedItems": 0,
        "scopeLockOn": "2026-01-01",
        "totalCents": 660000,
        "unestimated": 0
      },
      "sources": [
        {
          "label": "Contracts",
          "source": "commercial",
          "state": "data_present"
        },
        {
          "label": "Tracker",
          "source": "tracker",
          "state": "data_present"
        },
        {
          "label": "Code",
          "source": "code",
          "state": "data_present"
        },
        {
          "label": "Releases",
          "source": "release",
          "state": "data_present"
        },
        {
          "label": "Calendar",
          "source": "calendar",
          "state": "data_present"
        }
      ]
    },
    "generatedAt": "2026-10-01T08:30:28.683Z",
    "teamType": null,
    "version": 1
  },
  "html": "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\" />\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n<title>example-reports Retail — example-reports Checkout Replatform · Q1 2026</title>\n<meta name=\"scopeworth:question-category\" content=\"Invoice\" />\n<style>\n  :root{\n    --navy:#0F172A; --charcoal:#1E293B; --bg:#F8FAFC; --card:#FFFFFF; --border:#E2E8F0;\n    --muted:#64748B; --slate:#CBD5E1; --blue:#2563EB; --teal:#14B8A6; --green:#10B981;\n    --amber:#F59E0B; --red:#EF4444; --ink:#0F172A; --subtle:#F1F5F9;\n  }\n  *{box-sizing:border-box}\n  html,body{margin:0;padding:0;background:var(--bg);color:var(--ink);}\n  body{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.55;-webkit-font-smoothing:antialiased;font-feature-settings:\"ss01\",\"cv11\";}\n  .num{font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\"}\n  .mono{font-family:'JetBrains Mono',ui-monospace,Menlo,Consolas,monospace}\n  .report{max-width:840px;margin:0 auto;padding:24px 16px 80px;}\n  .report-page{background:var(--card);border:1px solid var(--border);border-radius:14px;margin-bottom:28px;padding:56px 64px;box-shadow:0 1px 0 rgba(15,23,42,0.02), 0 8px 24px -16px rgba(15,23,42,0.10);position:relative;overflow:hidden;}\n  .page-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;margin-bottom:32px;border-bottom:1px solid var(--border);font-size:11px;color:var(--muted);letter-spacing:0.06em;text-transform:uppercase;font-weight:500;}\n  .page-header .brand{display:flex;align-items:center;gap:8px;color:var(--ink);font-weight:600;letter-spacing:0.02em;text-transform:none;font-size:12px}\n  .page-header .brand svg{height:22.5px;width:auto;display:block}\n  .page-header .crumb{display:flex;gap:10px;align-items:center}\n  .page-header .crumb .dot{width:3px;height:3px;border-radius:50%;background:var(--slate)}\n  .page-num{font-variant-numeric:tabular-nums}\n  .logo-wordmark{height:26px;width:auto;display:block}\n  h1,h2,h3,h4{margin:0;color:var(--ink);letter-spacing:-0.01em}\n  h1{font-size:34px;font-weight:700;line-height:1.15;letter-spacing:-0.02em}\n  h2{font-size:24px;font-weight:700;line-height:1.2;letter-spacing:-0.015em}\n  h3{font-size:16px;font-weight:600}\n  h4{font-size:13px;font-weight:600;color:var(--charcoal)}\n  p{margin:0 0 12px}\n  .eyebrow{font-size:11px;font-weight:600;letter-spacing:0.14em;text-transform:uppercase;color:var(--blue);}\n  .muted{color:var(--muted)}\n  .lead{font-size:15px;line-height:1.65;color:var(--charcoal)}\n  .section-title{display:flex;align-items:baseline;justify-content:space-between;gap:24px;margin-bottom:24px;}\n  .section-title h2{flex:1}\n  .section-title .meta{font-size:12px;color:var(--muted);white-space:nowrap}\n  .grid{display:grid;gap:16px}\n  .grid-2{grid-template-columns:repeat(2,1fr)}\n  .grid-3{grid-template-columns:repeat(3,1fr)}\n  .grid-4{grid-template-columns:repeat(4,1fr)}\n  .card{background:var(--card);border:1px solid var(--border);border-radius:10px;padding:20px;}\n  .card.tight{padding:16px}\n  .card .label{font-size:11px;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;color:var(--muted);margin-bottom:8px}\n  .card .value{font-size:28px;font-weight:700;line-height:1.1;letter-spacing:-0.02em}\n  .card .sub{font-size:12px;color:var(--muted);margin-top:6px;line-height:1.5}\n  .kpi{border:1px solid var(--border);border-radius:10px;padding:18px;background:var(--card);position:relative;}\n  .kpi .label{font-size:11px;letter-spacing:0.1em;text-transform:uppercase;font-weight:600;color:var(--muted);margin-bottom:10px}\n  .kpi .value{font-size:30px;font-weight:700;letter-spacing:-0.02em;line-height:1}\n  .kpi .value .unit{font-size:16px;font-weight:600;color:var(--muted);margin-left:4px}\n  .kpi ul{margin:14px 0 0;padding:0;list-style:none;border-top:1px dashed var(--border);padding-top:12px}\n  .kpi ul li{display:flex;justify-content:space-between;font-size:12px;color:var(--charcoal);padding:3px 0}\n  .kpi ul li .v{font-weight:600;font-variant-numeric:tabular-nums}\n  .kpi.accent-blue{box-shadow:inset 3px 0 0 var(--blue)}\n  .kpi.accent-teal{box-shadow:inset 3px 0 0 var(--teal)}\n  .kpi.accent-amber{box-shadow:inset 3px 0 0 var(--amber)}\n  .kpi.accent-green{box-shadow:inset 3px 0 0 var(--green)}\n  .kpi.accent-red{box-shadow:inset 3px 0 0 var(--red)}\n  .chip{display:inline-flex;align-items:center;gap:6px;padding:3px 8px;border-radius:999px;font-size:11px;font-weight:500;background:var(--subtle);color:var(--charcoal);border:1px solid var(--border);}\n  .chip .dot{width:6px;height:6px;border-radius:50%;background:var(--slate)}\n  .chip.green{background:rgba(16,185,129,.08);color:#047857;border-color:rgba(16,185,129,.25)}\n  .chip.green .dot{background:var(--green)}\n  .chip.amber{background:rgba(245,158,11,.08);color:#92400e;border-color:rgba(245,158,11,.25)}\n  .chip.amber .dot{background:var(--amber)}\n  .chip.red{background:rgba(239,68,68,.08);color:#991b1b;border-color:rgba(239,68,68,.25)}\n  .chip.red .dot{background:var(--red)}\n  .chip.blue{background:rgba(37,99,235,.08);color:#1d4ed8;border-color:rgba(37,99,235,.25)}\n  .chip.blue .dot{background:var(--blue)}\n  table{width:100%;border-collapse:separate;border-spacing:0;font-size:13px;border:1px solid var(--border);border-radius:10px;overflow:hidden;}\n  thead th{background:var(--subtle);text-align:left;font-weight:600;font-size:11px;letter-spacing:0.08em;text-transform:uppercase;color:var(--muted);padding:10px 14px;border-bottom:1px solid var(--border);}\n  tbody td{padding:12px 14px;border-bottom:1px solid var(--border);vertical-align:top;}\n  tbody tr:last-child td{border-bottom:none}\n  td.num, th.num{text-align:right;font-variant-numeric:tabular-nums}\n  td .row-title{font-weight:600;color:var(--ink)}\n  td .row-sub{color:var(--muted);font-size:12px;margin-top:2px}\n  .callout{background:linear-gradient(180deg,#F8FAFF 0%, #F1F5F9 100%);border:1px solid var(--border);border-left:3px solid var(--blue);padding:16px 18px;border-radius:8px;font-size:13px;color:var(--charcoal);}\n  .callout strong{color:var(--ink)}\n  .callout.amber{border-left-color:var(--amber);background:linear-gradient(180deg,#FFFBF1 0%, #FEF3C7 5%, #FFFBEB 100%)}\n  .callout.green{border-left-color:var(--green);background:linear-gradient(180deg,#F0FDF7 0%, #ECFDF5 100%)}\n  .bar-row{display:grid;grid-template-columns:1fr;gap:8px;margin-bottom:10px}\n  .bar-track{position:relative;height:10px;border-radius:6px;background:var(--subtle);overflow:hidden;border:1px solid var(--border);}\n  .bar-fill{position:absolute;inset:0 auto 0 0;background:var(--blue);border-radius:6px}\n  .bar-meta{display:flex;justify-content:space-between;font-size:12px;color:var(--charcoal)}\n  .bar-meta .name{font-weight:500}\n  .bar-meta .v{font-variant-numeric:tabular-nums;color:var(--muted)}\n  .stack{display:flex;height:14px;border-radius:8px;overflow:hidden;border:1px solid var(--border);background:var(--subtle);}\n  .stack > div{height:100%}\n  .stack-legend{display:flex;flex-wrap:wrap;gap:14px;margin-top:14px}\n  .stack-legend .item{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--charcoal)}\n  .stack-legend .sw{width:10px;height:10px;border-radius:3px}\n  .cover{padding:0;overflow:hidden;border:1px solid var(--border);}\n  .cover-inner{background:radial-gradient(1200px 500px at 110% -10%, rgba(37,99,235,.35), transparent 55%),radial-gradient(900px 400px at -10% 110%, rgba(20,184,166,.22), transparent 55%),linear-gradient(180deg,#0B1224 0%,#0F172A 60%,#0B1020 100%);color:#E2E8F0;padding:64px 64px 56px;min-height:980px;display:flex;flex-direction:column;justify-content:space-between;position:relative;}\n  .cover-top{display:flex;align-items:center;justify-content:space-between;color:#CBD5E1;position:relative;z-index:1}\n  .cover-top .brand{display:flex;align-items:center;gap:10px;font-weight:600;letter-spacing:0.04em;color:#F8FAFC}\n  .cover-top .brand svg{height:30px;width:auto}\n  .cover-meta{font-size:11px;letter-spacing:0.14em;text-transform:uppercase;color:#94A3B8}\n  .cover-headline{margin-top:48px;max-width:560px;position:relative;z-index:1}\n  .cover-headline .eyebrow{color:#7DD3FC;font-weight:600}\n  .cover-headline h1{color:#F8FAFC;font-size:54px;line-height:1.05;letter-spacing:-0.025em;margin:14px 0 16px;font-weight:700;}\n  .cover-headline .tag{color:#CBD5E1;font-size:18px;line-height:1.5;max-width:520px}\n  .cover-graphic{position:absolute;right:-60px;top:200px;width:440px;height:480px;opacity:.55;pointer-events:none;z-index:0;}\n  .cover-meta-grid{margin-top:auto;display:grid;grid-template-columns:repeat(4,1fr);gap:24px;padding-top:36px;border-top:1px solid rgba(203,213,225,.18);position:relative;z-index:1;}\n  .cover-meta-grid .m-label{font-size:10px;letter-spacing:0.16em;text-transform:uppercase;color:#94A3B8;margin-bottom:6px}\n  .cover-meta-grid .m-value{font-size:14px;color:#F8FAFC;font-weight:500;line-height:1.4}\n  .cover-footer{display:flex;justify-content:space-between;align-items:center;margin-top:28px;font-size:11px;color:#94A3B8;position:relative;z-index:1;}\n  .cover-note{font-size:11px;color:#94A3B8;max-width:420px;line-height:1.5;}\n  .integration-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}\n  .int-badge{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:999px;background:rgba(248,250,252,.06);border:1px solid rgba(203,213,225,.18);color:#E2E8F0;font-size:11px;font-weight:500;}\n  .int-badge .b-dot{width:6px;height:6px;border-radius:50%;background:#7DD3FC}\n  .equation{display:flex;align-items:center;justify-content:center;gap:16px;padding:22px;background:var(--subtle);border:1px solid var(--border);border-radius:10px;font-variant-numeric:tabular-nums;}\n  .eq-num{font-size:28px;font-weight:700;color:var(--ink);letter-spacing:-0.02em}\n  .eq-op{font-size:22px;color:var(--muted);font-weight:500}\n  .eq-label{font-size:11px;color:var(--muted);letter-spacing:0.08em;text-transform:uppercase;font-weight:600;margin-top:4px;text-align:center}\n  .eq-cell{display:flex;flex-direction:column;align-items:center;min-width:120px}\n  .eq-cell.gain .eq-num{color:#047857}\n  .conf-head{display:flex;align-items:center;gap:18px;margin-bottom:18px}\n  .conf-ring{width:96px;height:96px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex:none;position:relative;}\n  .conf-ring::after{content:\"\";position:absolute;inset:8px;background:var(--card);border-radius:50%;}\n  .conf-ring .v{position:relative;z-index:1;font-size:20px;font-weight:700;letter-spacing:-0.02em}\n  .conf-ring .v small{font-size:11px;font-weight:500;color:var(--muted);display:block;text-align:center;letter-spacing:0.08em;text-transform:uppercase}\n  .rec-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}\n  .rec-card{border:1px solid var(--border);border-radius:10px;padding:18px;background:var(--card);display:flex;flex-direction:column;gap:8px;}\n  .rec-card .rc-num{width:24px;height:24px;border-radius:6px;background:var(--ink);color:#fff;font-size:11px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;}\n  .rec-card h4{font-size:14px}\n  .rec-card .rc-row{font-size:12px;color:var(--charcoal)}\n  .rec-card .rc-row b{color:var(--muted);font-weight:600;letter-spacing:0.06em;text-transform:uppercase;font-size:10px;display:block;margin-bottom:2px}\n  .footer-strip{display:flex;justify-content:space-between;align-items:end;padding-top:24px;border-top:1px solid var(--border);font-size:12px;color:var(--muted);}\n  .footer-strip .links{display:flex;gap:14px}\n  .made-with{display:flex;align-items:center;justify-content:center;gap:10px;margin:0 auto;padding:14px 18px;max-width:840px;font-size:12px;color:var(--muted);letter-spacing:0.04em}\n  .made-with svg{height:18px;width:auto}\n  .mt-8{margin-top:8px}.mt-12{margin-top:12px}.mt-16{margin-top:16px}.mt-20{margin-top:20px}\n  .mt-24{margin-top:24px}.mt-32{margin-top:32px}.mt-40{margin-top:40px}\n  .mb-8{margin-bottom:8px}.mb-12{margin-bottom:12px}.mb-16{margin-bottom:16px}.mb-24{margin-bottom:24px}\n  .page-label{position:absolute;top:18px;right:24px;font-size:10px;letter-spacing:0.14em;text-transform:uppercase;color:var(--muted);font-weight:500;}\n  @media (max-width:780px){\n    .report-page{padding:36px 24px}\n    .grid-4{grid-template-columns:repeat(2,1fr)}\n    .grid-3{grid-template-columns:1fr}\n    .rec-grid{grid-template-columns:1fr}\n    .cover-inner{padding:36px 28px;min-height:auto}\n    .cover-headline h1{font-size:36px}\n    .cover-meta-grid{grid-template-columns:repeat(2,1fr)}\n    .cover-graphic{display:none}\n  }\n  *, *::before, *::after { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }\n  @media print{\n    @page { size: A4; margin: 14mm 14mm 16mm; }\n    @page :first { margin: 0; }\n    *, *::before, *::after { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }\n    html,body{background:#fff}\n    .report{max-width:none;margin:0;padding:0}\n    .report-page{border:none;border-radius:0;box-shadow:none;margin:0;padding:0 0 12mm;page-break-after:always;break-after:page;}\n    .report-page:last-child{page-break-after:auto}\n    .cover{padding:0;background:#0F172A;overflow:hidden}\n    .cover-inner{min-height:auto;padding:32mm 18mm 28mm}\n    .avoid-break, .kpi, .card, table, .callout, .rec-card, .equation, .conf-head{break-inside:avoid;page-break-inside:avoid;}\n    h2,h3{break-after:avoid;page-break-after:avoid}\n    a{color:var(--ink);text-decoration:none}\n    .page-label{display:none}\n  }\n</style>\n</head>\n<body>\n<main class=\"report\" role=\"main\">\n<section class=\"report-page cover\" aria-labelledby=\"cover-title\"><div class=\"cover-inner\">\n    <header class=\"cover-top\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#F8FAFC\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#F8FAFC\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#60A5FA\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#2DD4BF\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#F8FAFC\">Scopeworth</text></svg></div><div class=\"cover-meta num\">Q1 2026 · Client report</div></header>\n    <svg class=\"cover-graphic\" viewBox=\"0 0 520 560\" aria-hidden=\"true\"><defs><linearGradient id=\"paper\" x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#1E293B\" stop-opacity=\".95\"/><stop offset=\"1\" stop-color=\"#0F172A\" stop-opacity=\".7\"/></linearGradient><linearGradient id=\"line\" x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\"><stop offset=\"0\" stop-color=\"#7DD3FC\" stop-opacity=\"0\"/><stop offset=\".5\" stop-color=\"#7DD3FC\" stop-opacity=\".9\"/><stop offset=\"1\" stop-color=\"#5EEAD4\" stop-opacity=\"0\"/></linearGradient></defs><g transform=\"translate(120 60) rotate(-6)\"><rect width=\"320\" height=\"420\" rx=\"14\" fill=\"url(#paper)\" stroke=\"rgba(125,211,252,.18)\"/><rect x=\"24\" y=\"28\" width=\"120\" height=\"10\" rx=\"2\" fill=\"#7DD3FC\" opacity=\".8\"/><rect x=\"24\" y=\"48\" width=\"220\" height=\"6\" rx=\"2\" fill=\"#94A3B8\" opacity=\".5\"/><rect x=\"24\" y=\"60\" width=\"180\" height=\"6\" rx=\"2\" fill=\"#94A3B8\" opacity=\".5\"/><rect x=\"24\" y=\"92\" width=\"272\" height=\"78\" rx=\"6\" fill=\"rgba(37,99,235,.18)\" stroke=\"rgba(125,211,252,.25)\"/><rect x=\"24\" y=\"186\" width=\"272\" height=\"78\" rx=\"6\" fill=\"rgba(20,184,166,.14)\" stroke=\"rgba(94,234,212,.25)\"/><rect x=\"24\" y=\"280\" width=\"272\" height=\"78\" rx=\"6\" fill=\"rgba(245,158,11,.10)\" stroke=\"rgba(245,158,11,.25)\"/></g><g transform=\"translate(80 110) rotate(-2)\"><rect width=\"320\" height=\"420\" rx=\"14\" fill=\"url(#paper)\" stroke=\"rgba(125,211,252,.22)\"/><rect x=\"24\" y=\"28\" width=\"160\" height=\"12\" rx=\"3\" fill=\"#F8FAFC\" opacity=\".95\"/><rect x=\"24\" y=\"50\" width=\"240\" height=\"6\" rx=\"2\" fill=\"#94A3B8\" opacity=\".55\"/><g transform=\"translate(24 90)\"><rect width=\"272\" height=\"120\" rx=\"8\" fill=\"rgba(15,23,42,.6)\" stroke=\"rgba(125,211,252,.18)\"/><polyline points=\"14,90 50,72 86,80 122,52 158,60 194,38 230,46 258,28\" fill=\"none\" stroke=\"url(#line)\" stroke-width=\"2\"/><polyline points=\"14,100 50,92 86,96 122,84 158,88 194,76 230,80 258,70\" fill=\"none\" stroke=\"#5EEAD4\" stroke-opacity=\".55\" stroke-width=\"1.5\" stroke-dasharray=\"3 3\"/><g fill=\"#7DD3FC\"><circle cx=\"50\" cy=\"72\" r=\"2.5\"/><circle cx=\"122\" cy=\"52\" r=\"2.5\"/><circle cx=\"194\" cy=\"38\" r=\"2.5\"/><circle cx=\"258\" cy=\"28\" r=\"2.5\"/></g></g><g transform=\"translate(24 230)\"><rect width=\"272\" height=\"14\" rx=\"4\" fill=\"rgba(255,255,255,.08)\"/><rect width=\"174\" height=\"14\" rx=\"4\" fill=\"#2563EB\" opacity=\".85\"/><rect x=\"174\" width=\"26\" height=\"14\" fill=\"#14B8A6\" opacity=\".85\"/><rect x=\"200\" width=\"22\" height=\"14\" fill=\"#F59E0B\" opacity=\".85\"/><rect x=\"222\" width=\"36\" height=\"14\" rx=\"0\" fill=\"#EF4444\" opacity=\".55\"/><rect x=\"258\" width=\"14\" height=\"14\" rx=\"0\" fill=\"#94A3B8\" opacity=\".5\"/></g></g></svg>\n    <div class=\"cover-headline\"><div class=\"eyebrow\">Client SDLC ROI Report</div><h1 id=\"cover-title\">What changed,<br/>what shipped,<br/>and what it cost.</h1><p class=\"tag\">A client-ready summary of delivery value, scope movement, rework, coordination, and AI-assisted delivery economics — built from the signals already flowing through your tools.</p><div class=\"integration-row mt-24\"><span class=\"int-badge\"><span class=\"b-dot\"></span>Contracts</span><span class=\"int-badge\"><span class=\"b-dot\"></span>Tracker</span><span class=\"int-badge\"><span class=\"b-dot\"></span>Code</span><span class=\"int-badge\"><span class=\"b-dot\"></span>Releases</span><span class=\"int-badge\"><span class=\"b-dot\"></span>Calendar</span></div></div>\n    <div class=\"cover-meta-grid\">\n      <div><div class=\"m-label\">Prepared by</div><div class=\"m-value\">Example report workspace</div></div>\n      <div><div class=\"m-label\">Client</div><div class=\"m-value\">example-reports Retail</div></div>\n      <div><div class=\"m-label\">Project</div><div class=\"m-value\">example-reports Checkout Replatform</div></div>\n      <div><div class=\"m-label\">Reporting period</div><div class=\"m-value\">Q1 2026</div></div>\n      <div><div class=\"m-label\">Generated on</div><div class=\"m-value\">1 October 2026</div></div>\n      <div><div class=\"m-label\">Report version</div><div class=\"m-value\">Snapshot · v1.0</div></div>\n    </div>\n    <div class=\"cover-footer\"><p class=\"cover-note\">This report was generated by Scopeworth from the delivery signals connected to this workspace. Every figure links back to tickets, pull requests, releases and calendar evidence.</p><span>scopeworth.app</span></div>\n  </div></section>\n<section class=\"report-page\" aria-labelledby=\"exec-title\"><span class=\"page-label\">01 · Executive summary</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">01 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">Section one</div><h2 id=\"exec-title\">Executive summary</h2></div><div class=\"meta\">Period · Q1 2026</div></div>\n    <p class=\"lead\">During Q1 2026, Example report workspace delivered 2 work items, merged 2 PRs, and shipped 1 release for example-reports Retail on example-reports Checkout Replatform. Scope movement after the agreed baseline: 2 additional work items entered the cycle after lock, contributing an estimated $6,600 to the delivery investment. AI-assisted delivery is not yet measured — tag AI-assisted pull requests to unlock it. Report confidence is currently 80% — improving confirmed reporting assumptions can improve confidence next period.</p>\n    <div class=\"grid grid-4 mt-24\">\n      <div class=\"kpi accent-blue avoid-break\"><div class=\"label\">Delivered work</div><div class=\"value num\">2<span class=\"unit\">items</span></div><ul><li><span>Merged PRs</span><span class=\"v\">2</span></li><li><span>Releases</span><span class=\"v\">1</span></li><li><span>Milestones</span><span class=\"v\">0</span></li></ul></div>\n      <div class=\"kpi accent-teal avoid-break\"><div class=\"label\">Delivery investment</div><div class=\"value num\">—</div><ul><li><span>Coordination</span><span class=\"v num\">$150</span></li><li><span>Scope expansion</span><span class=\"v num\">$6,600</span></li><li><span>Rework</span><span class=\"v num\">$0</span></li></ul></div>\n      <div class=\"kpi accent-amber avoid-break\"><div class=\"label\">Scope expansion</div><div class=\"value num\">$6,600</div><ul><li><span>Items after scope lock</span><span class=\"v\">2</span></li><li><span>Reopened tickets</span><span class=\"v\">0</span></li><li><span>Margin risk</span><span class=\"v\">Unknown</span></li></ul></div>\n      <div class=\"kpi accent-blue avoid-break\"><div class=\"label\">AI delivery impact</div><div class=\"value num\" style=\"font-size:18px;line-height:1.25\">Not yet measured</div><ul><li><span>Tag AI-assisted PRs</span><span class=\"v\">to unlock</span></li></ul></div>\n    </div>\n    <div class=\"callout amber mt-24 avoid-break\" style=\"padding:18px 20px\"><div style=\"display:flex;justify-content:space-between;gap:20px;align-items:center;flex-wrap:wrap\"><div style=\"flex:1;min-width:280px\"><div style=\"display:flex;align-items:center;gap:8px;margin-bottom:6px\"><span style=\"display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:6px;background:rgba(245,158,11,.16);color:#92400e;font-size:11px;font-weight:700\">!</span><strong style=\"font-size:14px;color:var(--ink);letter-spacing:-0.005em\">Recommended commercial action</strong></div><div style=\"font-size:13px;line-height:1.55;color:var(--charcoal)\">Discuss scope expansion before the next reporting cycle and convert recurring unplanned work into a change request or retainer adjustment.</div></div><div style=\"display:flex;flex-direction:column;align-items:flex-end;gap:8px;flex:none\"><div style=\"display:inline-flex;align-items:center;gap:8px;background:#fff;border:1px solid rgba(245,158,11,.35);border-radius:999px;padding:6px 12px 6px 8px\"><span style=\"width:8px;height:8px;border-radius:50%;background:var(--amber);box-shadow:0 0 0 2px #fff;display:inline-block\"></span><span style=\"font-size:11px;font-weight:600;color:#92400e;letter-spacing:.04em;text-transform:uppercase\">Action this cycle</span></div><span style=\"font-size:11px;color:var(--muted)\">Owner · Delivery lead · due before next QBR</span></div></div></div>\n    <div class=\"grid grid-3 mt-24\">\n      <div class=\"card tight avoid-break\"><div class=\"label\" style=\"font-size:10px;letter-spacing:.1em;color:var(--muted);font-weight:600;text-transform:uppercase\">What shipped</div><p style=\"margin:6px 0 0;font-size:13px;color:var(--charcoal)\">Refunds fail for split tender, Card vault migration</p></div>\n      <div class=\"card tight avoid-break\"><div class=\"label\" style=\"font-size:10px;letter-spacing:.1em;color:var(--muted);font-weight:600;text-transform:uppercase\">What changed</div><p style=\"margin:6px 0 0;font-size:13px;color:var(--charcoal)\">2 items added after scope lock; 0 tickets reopened; 1h of attributed coordination.</p></div>\n      <div class=\"card tight avoid-break\"><div class=\"label\" style=\"font-size:10px;letter-spacing:.1em;color:var(--muted);font-weight:600;text-transform:uppercase\">Needs attention</div><p style=\"margin:6px 0 0;font-size:13px;color:var(--charcoal)\">Ticket-to-PR linkage at 100%, meeting tagging at 100%, and explicit AI-assisted work tagging.</p></div>\n    </div></section>\n<section class=\"report-page\" aria-labelledby=\"ship-title\"><span class=\"page-label\">02 · What shipped</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">02 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">Delivered work</div><h2 id=\"ship-title\">What shipped</h2></div><div class=\"meta\">Linked to tickets, PRs, and releases</div></div>\n    <div class=\"grid grid-4 mb-24\">\n      <div class=\"card avoid-break\"><div class=\"label\">Completed work items</div><div class=\"value num\">2</div><div class=\"sub\">Across feature, fix, and platform</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Merged PRs</div><div class=\"value num\">2</div><div class=\"sub\">100% linked to a ticket</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Releases</div><div class=\"value num\">1</div><div class=\"sub\">In the reporting period</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Delivery milestones</div><div class=\"value num\">0</div><div class=\"sub\">Customer-visible checkpoints</div></div>\n    </div>\n    <table class=\"avoid-break\" aria-label=\"Delivered work items\"><thead><tr><th>Work item</th><th>Type</th><th>Evidence</th><th>Status</th><th>Completed</th></tr></thead><tbody><tr><td><div class=\"row-title\">Refunds fail for split tender</div><div class=\"row-sub mono\">EXAMPLE-REPORTS-42</div></td><td><span class=\"chip \"><span class=\"dot\"></span>Bug fix</span></td><td class=\"num\">1 PR</td><td><span class=\"chip green\"><span class=\"dot\"></span>Shipped</span></td><td>2026-03-01</td></tr><tr><td><div class=\"row-title\">Card vault migration</div><div class=\"row-sub mono\">EXAMPLE-REPORTS-1</div></td><td><span class=\"chip blue\"><span class=\"dot\"></span>Feature</span></td><td class=\"num\">1 PR</td><td><span class=\"chip green\"><span class=\"dot\"></span>Shipped</span></td><td>2026-02-10</td></tr></tbody></table>\n    <div class=\"callout mt-24 avoid-break\"><strong>Delivery proof, not developer surveillance.</strong> Scopeworth links every report claim back to delivery evidence — tickets, pull requests, releases, and merges — so a client can verify what shipped without asking for a code review.</div></section>\n<section class=\"report-page\" aria-labelledby=\"cost-title\"><span class=\"page-label\">03 · What it cost</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">03 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">Delivery investment</div><h2 id=\"cost-title\">What it cost</h2></div><div class=\"meta\">Estimated · directional figures</div></div>\n    <div class=\"grid grid-2 mb-24\">\n      <div class=\"kpi accent-blue avoid-break\"><div class=\"label\">Total estimated delivery investment</div><div class=\"value num\">—</div><div class=\"sub\" style=\"margin-top:8px\">Period delivery spend is not available. Contract value is not period spend.</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Cost composition</div><div class=\"stack mt-8\" role=\"img\" aria-label=\"Cost composition stacked bar\"><div style=\"width:0%;background:#F59E0B\" title=\"Scope expansion\"></div><div style=\"width:0%;background:#14B8A6\" title=\"Meetings &amp; coordination\"></div><div style=\"width:0%;background:#A78BFA\" title=\"Rework\"></div></div><div class=\"stack-legend\"><div class=\"item\"><span class=\"sw\" style=\"background:#F59E0B\"></span>Scope expansion · —</div><div class=\"item\"><span class=\"sw\" style=\"background:#14B8A6\"></span>Meetings &amp; coordination · —</div><div class=\"item\"><span class=\"sw\" style=\"background:#A78BFA\"></span>Rework · —</div></div><p class=\"muted mt-12\" style=\"font-size:12px\">Feature build, review and other delivery support are attributed once Invoice Defense's cost model is connected.</p></div>\n    </div>\n    <div class=\"card avoid-break mb-24\" style=\"padding:22px\"><h4 class=\"mb-16\">Estimated cost by category</h4><div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Scope expansion</span><span class=\"v num\">$6,600 · —</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#F59E0B\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Meetings &amp; coordination</span><span class=\"v num\">$150 · —</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#14B8A6\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Rework</span><span class=\"v num\">$0 · —</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#A78BFA\"></div></div></div></div></div>\n    <p class=\"muted mt-16\" style=\"font-size:12px\">These figures are directional and depend on available data, role-based cost assumptions, and project mapping quality. See report confidence.</p></section>\n<section class=\"report-page\" aria-labelledby=\"scope-title\"><span class=\"page-label\">04 · Scope expansion</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">04 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\" style=\"color:var(--amber)\">Margin risk</div><h2 id=\"scope-title\">Where scope changed</h2></div><div class=\"meta\">Scope expansion impact · estimated</div></div>\n    <div class=\"kpi accent-amber avoid-break mb-24\" style=\"padding:22px\"><div style=\"display:flex;justify-content:space-between;align-items:flex-end;gap:24px;flex-wrap:wrap\"><div><div class=\"label\">Estimated scope expansion impact</div><div class=\"value num\" style=\"font-size:42px\">$6,600</div><div class=\"sub\" style=\"margin-top:8px;max-width:420px\">Work added after the original scope was agreed, plus reopened and re-sized baseline work.</div></div><div style=\"display:flex;gap:8px;flex-wrap:wrap\"><span class=\"chip amber\"><span class=\"dot\"></span>Margin risk: Unknown</span><span class=\"chip\"><span class=\"dot\"></span>Convert to change request</span></div></div></div>\n    <div class=\"grid grid-4 mb-24\">\n      <div class=\"card avoid-break\"><div class=\"label\">Added after scope lock</div><div class=\"value num\">2<span class=\"unit\" style=\"font-size:14px;font-weight:600;color:var(--muted)\"> items</span></div><div class=\"sub\">Tickets created after the cycle started</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Reopened tickets</div><div class=\"value num\">0</div><div class=\"sub\">Reopened baseline work</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Estimates grown after lock</div><div class=\"value num\">0</div><div class=\"sub\">Baseline items re-sized</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Attributed coordination</div><div class=\"value num\">1h</div><div class=\"sub\">Attributed meetings</div></div>\n    </div>\n    <h4 class=\"mb-12\">Scope expansion signals</h4>\n    <table class=\"avoid-break\" aria-label=\"Scope expansion signals\"><thead><tr><th>Signal</th><th class=\"num\">Count</th><th class=\"num\">Estimated impact</th><th>Suggested action</th></tr></thead><tbody>\n      <tr><td><div class=\"row-title\">Tickets added after scope lock</div><div class=\"row-sub\">Created after the baseline</div></td><td class=\"num\">2</td><td class=\"num\">$6,600</td><td>Convert into change request</td></tr>\n      <tr><td><div class=\"row-title\">Reopened baseline tickets</div><div class=\"row-sub\">Reason for reopening not classified</div></td><td class=\"num\">0</td><td class=\"num\">$0</td><td>Clarify acceptance criteria</td></tr>\n      <tr><td><div class=\"row-title\">Estimates grown after lock</div><div class=\"row-sub\">Baseline items re-sized mid-cycle</div></td><td class=\"num\">0</td><td class=\"num\">$0</td><td>Add review owner earlier</td></tr>\n      <tr><td><div class=\"row-title\">Attributed coordination meetings</div><div class=\"row-sub\">Meeting purpose not classified</div></td><td class=\"num\">1h</td><td class=\"num\">$150</td><td>Separate discovery from delivery budget</td></tr>\n    </tbody></table>\n    <div class=\"callout amber mt-24 avoid-break\"><div style=\"font-style:italic;color:var(--muted);margin-bottom:6px\">“Why is this month’s invoice higher than expected?”</div><strong>What the delivery evidence for Q1 2026 shows.</strong> The team delivered 2 work items, 2 PRs and 1 release for example-reports Retail during Q1 2026, while also absorbing 2 additional work items worth an estimated $6,600 after the scope baseline.</div></section>\n<section class=\"report-page\" aria-labelledby=\"rework-title\"><span class=\"page-label\">05 · Rework &amp; quality</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">05 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">Quality &amp; rework</div><h2 id=\"rework-title\">Where rework happened</h2></div><div class=\"meta\">Project-level signals · not individual scoring</div></div>\n    <div class=\"grid grid-4 mb-24\">\n      <div class=\"card avoid-break\"><div class=\"label\">Rework cost</div><div class=\"value num\">$0</div><div class=\"sub\">— of delivery investment</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Reopened tickets</div><div class=\"value num\">0</div><div class=\"sub\">Of 2 completed</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Estimates grown</div><div class=\"value num\">0</div><div class=\"sub\">Baseline items re-sized</div></div>\n      <div class=\"card avoid-break\"><div class=\"label\">Unestimated movement</div><div class=\"value num\">0</div><div class=\"sub\">Counted, not valued</div></div>\n    </div>\n    <div class=\"callout avoid-break\"><strong>Interpretation.</strong> Rework here is reopened and re-sized baseline work, not individual performance. This suggests an opportunity to improve scope clarity and acceptance criteria before implementation starts — not to add pressure on individual engineers.</div>\n    <div class=\"callout green mt-12 avoid-break\"><strong>Recommended action.</strong> Add a scope confirmation checkpoint before implementation starts on high-complexity items. Capture acceptance criteria in the ticket and confirm with the client before the work enters the build queue.</div></section>\n<section class=\"report-page\" aria-labelledby=\"ai-title\"><span class=\"page-label\">06 · AI delivery economics</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">06 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\" style=\"color:var(--teal)\">AI-assisted delivery</div><h2 id=\"ai-title\">Modeled AI cycle-time comparison</h2></div><div class=\"meta\">Observed forge timestamps · self-reported AI tags</div></div>\n      <div class=\"callout avoid-break\"><strong>Not yet measured.</strong> AI-assisted delivery economics need at least one merged pull request tagged as AI-assisted and one non-assisted baseline merge in this project. Add an <em>ai-assisted</em> label or commit trailer to relevant work to unlock this section.</div></section>\n<section class=\"report-page\" aria-labelledby=\"conf-title\"><span class=\"page-label\">07 · Report confidence</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">07 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">Trust &amp; data health</div><h2 id=\"conf-title\">How trustworthy this report is</h2></div><div class=\"meta\">Report confidence · Medium</div></div>\n    <div class=\"card avoid-break mb-24\" style=\"padding:22px\"><div class=\"conf-head\"><div class=\"conf-ring\" role=\"img\" aria-label=\"Confidence score\" style=\"background:conic-gradient(var(--amber) 0 80%, var(--subtle) 80% 100%);\"><div class=\"v\">80%<small>Score</small></div></div><div><h3>Medium confidence</h3><p class=\"muted\" style=\"margin:4px 0 0;font-size:13px;max-width:520px\">Weaker coverage on confirmed reporting assumptions and release / deployment evidence. Review the recommendations on this page to improve evidence coverage.</p></div></div>\n    <div class=\"grid grid-2 mt-16\"><div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">PRs linked to tickets</span><span class=\"v num\">Linked merged changes</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:100%;background:#10B981\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Tickets mapped to client / project</span><span class=\"v num\">Workspace mapping coverage</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:100%;background:#10B981\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Meetings tagged to client / project</span><span class=\"v num\">No active calendar source</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#94A3B8\"></div></div></div></div><div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Rate card precision</span><span class=\"v num\">No labour hours in this period</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#94A3B8\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">AI-assisted work tagging</span><span class=\"v num\">Not tagged</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#94A3B8\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Release / deployment evidence</span><span class=\"v num\">Completed work with linked release evidence</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:50%;background:#F59E0B\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Synced evidence share</span><span class=\"v num\">Synced evidence coverage</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:100%;background:#10B981\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Source freshness</span><span class=\"v num\">No active sources</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#94A3B8\"></div></div></div><div class=\"bar-row\"><div class=\"bar-meta\"><span class=\"name\">Confirmed reporting assumptions</span><span class=\"v num\">0 of 6 reporting assumptions are confirmed or rectified for this period.</span></div><div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:0%;background:#EF4444\"></div></div></div></div></div></div>\n    <div class=\"callout avoid-break mb-16\"><strong>Why this matters.</strong> Scopeworth does not pretend messy delivery data is perfect. Report confidence shows where the evidence is strong, where assumptions were used, and what should be improved before relying on the report for commercial decisions.</div>\n    <h4 class=\"mb-12\">Recommended data improvements</h4>\n    <div class=\"grid grid-2 mb-16\"><div class=\"card tight avoid-break\"><strong>1.</strong> Add client / project labels to all relevant tracker issues</div><div class=\"card tight avoid-break\"><strong>2.</strong> Include ticket IDs in PR titles or branch names</div><div class=\"card tight avoid-break\"><strong>3.</strong> Tag client / project names in calendar events</div><div class=\"card tight avoid-break\"><strong>4.</strong> Explicitly mark AI-assisted work where possible</div></div>\n    <div class=\"callout green avoid-break\"><strong>Scopeworth focuses on client, project, and team-level delivery proof.</strong> It is not designed to rank individual engineers or create performance-review leaderboards. Delivery proof, not developer surveillance.</div></section>\n<section class=\"report-page\" aria-labelledby=\"next-title\"><span class=\"page-label\">08 · Recommended actions</span><header class=\"page-header\"><div class=\"brand\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 240 56\" fill=\"none\" role=\"img\" aria-label=\"Scopeworth\"><g transform=\"translate(4, 8)\"><path d=\"M10 2 L2 2 L2 38 L10 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M30 2 L38 2 L38 38 L30 38\" stroke=\"#0F172A\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><path d=\"M9 28 L16 28 L16 22 L24 22 L24 14 L31 14\" stroke=\"#2563EB\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"></path><circle cx=\"31\" cy=\"14\" r=\"2.2\" fill=\"#14B8A6\"></circle></g><text x=\"54\" y=\"36\" font-family=\"'Space Grotesk', system-ui, sans-serif\" font-size=\"26\" font-weight=\"600\" letter-spacing=\"-0.02em\" fill=\"#0F172A\">Scopeworth</text></svg></div><div class=\"crumb\"><span>example-reports Retail</span><span class=\"dot\"></span><span>example-reports Checkout Replatform</span><span class=\"dot\"></span><span class=\"num\">Q1 2026</span></div><div class=\"page-num num\">08 / 08</div></header><div class=\"section-title\"><div><div class=\"eyebrow mb-8\">From insight to action</div><h2 id=\"next-title\">What to do next</h2></div><div class=\"meta\">Five commercial actions</div></div><div class=\"rec-grid mb-16\"><article class=\"rec-card avoid-break\"><div style=\"display:flex;justify-content:space-between;align-items:center\"><span class=\"rc-num\">01</span><span class=\"chip amber\"><span class=\"dot\"></span>Margin</span></div><h4>Convert scope expansion into a change request</h4><div class=\"rc-row\"><b>Why</b>$6,600 of estimated delivery investment came from work added after scope lock.</div><div class=\"rc-row\"><b>Action</b>Review added items with the client and formalize the next-cycle scope.</div></article><article class=\"rec-card avoid-break\"><div style=\"display:flex;justify-content:space-between;align-items:center\"><span class=\"rc-num\">02</span><span class=\"chip blue\"><span class=\"dot\"></span>Process</span></div><h4>Separate discovery from implementation budget</h4><div class=\"rc-row\"><b>Why</b>1 meetings (1 h) were attributed to this project.</div><div class=\"rc-row\"><b>Action</b>Create a dedicated discovery / clarification budget bucket.</div></article><article class=\"rec-card avoid-break\"><div style=\"display:flex;justify-content:space-between;align-items:center\"><span class=\"rc-num\">03</span><span class=\"chip\"><span class=\"dot\"></span>Data</span></div><h4>Improve ticket-to-PR traceability</h4><div class=\"rc-row\"><b>Why</b>0% of PRs were not linked to tickets.</div><div class=\"rc-row\"><b>Action</b>Require ticket IDs in branch names and PR titles.</div></article><article class=\"rec-card avoid-break\"><div style=\"display:flex;justify-content:space-between;align-items:center\"><span class=\"rc-num\">04</span><span class=\"chip\"><span class=\"dot\" style=\"background:#A78BFA\"></span>AI</span></div><h4>Track AI-assisted work explicitly</h4><div class=\"rc-row\"><b>Why</b>AI-assisted delivery cannot be measured until assisted work is tagged.</div><div class=\"rc-row\"><b>Action</b>Add an AI-assisted field or label to relevant work items.</div></article><article class=\"rec-card avoid-break\" style=\"grid-column:1 / -1\"><div style=\"display:flex;justify-content:space-between;align-items:center\"><span class=\"rc-num\">05</span><span class=\"chip green\"><span class=\"dot\"></span>Client</span></div><h4>Use this report in the next client review</h4><div class=\"rc-row\"><b>Why</b>The report provides a shared view of shipped work, cost, scope movement, and risks — useful for QBRs, retainer reviews, and invoice discussions.</div><div class=\"rc-row\"><b>Action</b>Use the executive summary and scope expansion sections in the next QBR or invoice discussion.</div></article></div></section>\n</main>\n\n</body>\n</html>",
  "report": {
    "context": {
      "clientId": "22222222-2222-4222-8222-222222222222",
      "clientName": "example-reports Retail",
      "period": "Q1 2026",
      "periodEnd": "2026-03-31",
      "periodStart": "2026-01-01",
      "projectId": "11111111-1111-4111-8111-111111111111",
      "projectName": "example-reports Checkout Replatform",
      "qid": null,
      "timeRange": "Jan 1–Mar 31"
    },
    "createdAt": "2026-10-01T08:30:28.684Z",
    "id": "33333333-3333-4333-8333-333333333333",
    "lastSharedAt": null,
    "name": "Synthetic delivery report",
    "shares": [],
    "snapshotId": "44444444-4444-4444-8444-444444444444",
    "status": "draft",
    "updatedAt": "2026-10-01T08:30:28.684Z"
  }
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request GET "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/report-builder/33333333-3333-4333-8333-333333333333?projectId=11111111-1111-4111-8111-111111111111" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY"

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/report-builder/33333333-3333-4333-8333-333333333333?projectId=11111111-1111-4111-8111-111111111111", {
  method: "GET",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`
},
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"]}
response = requests.request("GET", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/report-builder/33333333-3333-4333-8333-333333333333?projectId=11111111-1111-4111-8111-111111111111", headers=headers, timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Download the stored snapshot as PDF

Operation: reports.pdf · GET /report-builder/:id/pdf

Download application/pdf with attachment filename report.pdf, private/no-store. Requires current reports.export independently of the reports:read key scope. The existing bounded renderer/store prints frozen snapshot HTML; cached downloads do not regenerate facts. Missing rendering support returns 503, never a fabricated file. No asynchronous job or polling route exists. Current key scopes, creator actions, plan and tenant/project restrictions apply on every call and successful replay. Money precision, confidence and sample thresholds use the existing factual model.

Required key scope: reports:read. Current creator action: reports.export. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

  • Composition client/project must belong to each other inside the tenant; optional saved-report id must retain that same selection.

  • Ordered reporting dates and current plan windows apply to new facts/previews/narratives/snapshots, while stored reads reproduce original evidence.

  • Monthly shipment quota and AI token allowance are separate from technical traffic limits.

  • All responses are synchronous. Retry uncertain writes with the original key and identical body; external uncertainty never authorizes a second provider dispatch.

  • Sharing, report deletion and email/Slack/Teams distribution remain unavailable.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "example": "33333333-3333-4333-8333-333333333333",
    "in": "path",
    "name": "id",
    "required": true,
    "schema": {
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } }, { "in": "query", "name": "clientId", "required": false, "schema": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } }, { "example": "11111111-1111-4111-8111-111111111111", "in": "query", "name": "projectId", "required": false, "schema": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } } ]

Success statuses: 200. The response is immutable PDF bytes; save as a file.

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request GET "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/report-builder/33333333-3333-4333-8333-333333333333/pdf?projectId=11111111-1111-4111-8111-111111111111" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY"

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/report-builder/33333333-3333-4333-8333-333333333333/pdf?projectId=11111111-1111-4111-8111-111111111111", {
  method: "GET",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`
},
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const pdf = new Uint8Array(await response.arrayBuffer());

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"]}
response = requests.request("GET", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/report-builder/33333333-3333-4333-8333-333333333333/pdf?projectId=11111111-1111-4111-8111-111111111111", headers=headers, timeout=30)
response.raise_for_status()
pdf = response.content

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Export checks permission independently of read. Bytes render the stored snapshot and accepted frozen attachments, not recalculated live evidence. Save binary as a file, not JSON. Failed export does not prove creation failed.

New reports use the workspace's existing presentation mode: client delivery reporting for agencies, internal delivery and investment review for in-house teams, and supplier delivery, invoice differences and scope review for external-development buyers. External mode does not present seller-only billable/write-off choices or supplier margin actions. These labels do not alter resource IDs, permissions, invoice approval or contractual acceptance. Historical immutable snapshots keep their accepted wording.

Provider consent, public sharing, recipients, scheduling/distribution remain app workflows. The API does not promise full UI parity or provider success. See plans/limits.

Search documentation

Enter a word or phrase to search documentation.