fimo 2.6.0-staging.1 → 2.6.0-staging.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -44,7 +44,7 @@ A Fimo project is identified by `.fimo/project.json`, written by `fimo init`. Th
44
44
 
45
45
  ## Critical: commands target the Branch matching the current git branch
46
46
 
47
- A project can have multiple **Branches** — each is a git branch _plus_ its own DB, sandbox, preview, and assets. Project-scoped commands (`deploy`, `status`, `entries`, `diff`, …) operate on the Branch matching the **current git branch**, and print a one-line banner saying which one. New projects start on `main`. Override for a single command with the canonical `--branch <name>` flag; the removed `--env <name>` spelling is rejected. Never edit the link file to switch. The full git-shaped workflow (`branch` / `checkout` / `switch` / `pull` / `diff` / `merge` / `status` / `publish`) lives in `references/branches.md`.
47
+ A project can have multiple **Branches** — each is a git branch _plus_ its own DB, sandbox, preview, and assets. Project-scoped commands (`deploy`, `status`, `entries`, `diff`, …) operate on the Branch matching the **current git branch**, and print a one-line banner saying which one. Analytics reads are the exception: they default to canonical `prod`, independent of the checkout; see `references/analytics.md`. Annotation writes keep the current or explicit Branch. New projects start on `main`. Override for a single command with the canonical `--branch <name>` flag; the removed `--env <name>` spelling is rejected. Never edit the link file to switch. The full git-shaped workflow (`branch` / `checkout` / `switch` / `pull` / `diff` / `merge` / `status` / `publish`) lives in `references/branches.md`.
48
48
 
49
49
  ## Quick Start
50
50
 
@@ -4,6 +4,19 @@ Pageview aggregates for the **published** site are stored in Fimo's analytics pi
4
4
 
5
5
  Analytics has a **retained preview for every org** — free included. The free default is a 7-day retention window, so short ranges (`today`, `yesterday`, `this_week`, `last_week`, `last_7_days`) work for everyone. **Extended date ranges and longer retention are paid** — `last_30_days`, `last_90_days`, `this_month`, `last_month`, `last_quarter`, `last_year`, and `custom` require the `canUseExtendedDateRanges` privilege, which only paid orgs have. Asking for an extended range as a free user returns a 403 with an upgrade hint.
6
6
 
7
+ ## Select published traffic
8
+
9
+ For traffic, growth, or site-performance questions, read **`prod`**, regardless of the current Git branch, `FIMO_ENV`, or the source branch published to Production. Analytics reads (`pageviews`, `top`, `annotations list`) default to this canonical published target. On older CLI versions, select it explicitly:
10
+
11
+ ```bash
12
+ fimo --branch prod analytics pageviews --days 7 --json
13
+ fimo --branch prod analytics top countries --json
14
+ ```
15
+
16
+ Structured read results include `branch` (`data.branch` in the CLI JSON envelope). Check it before interpreting metrics. An intentional `--branch <name>` overrides the default; zero traffic on `main` or a preview branch does **not** mean the published site has no traffic. Preview visits are not collected. If publication or access is unavailable, report that limitation; do not fall back to another branch or present the failure as zero traffic.
17
+
18
+ SDK and hosted MCP reads also default omitted `branch` to `prod` and return the selected `branch`. Annotation **writes** keep the current/explicit Branch and its existing permissions; the read default does not grant permission to write to `prod`.
19
+
7
20
  ## Bot traffic is excluded
8
21
 
9
22
  Every number below is **humans only**. Bot hits — AI crawlers and headless browsers — are tagged
@@ -37,6 +50,7 @@ The headline command returns everything in one payload — KPIs, the visitors se
37
50
 
38
51
  ```json
39
52
  {
53
+ "branch": "prod",
40
54
  "range": { "preset": "last_30_days", "effectiveFrom": "...", "effectiveTo": "...", "groupBy": "day", ... },
41
55
  "deviceFilter": null,
42
56
  "visitors": 1240, "pageviews": 3870, "bounceRate": 42.5, "viewsPerVisit": 3.12, "averageVisitDurationSeconds": 95.4,
@@ -33,6 +33,17 @@ Declare redirects, headers, rewrites, and URL shape in
33
33
 
34
34
  Every field is optional. Only what you declare is emitted.
35
35
 
36
+ ## Preview and security headers
37
+
38
+ A restrictive application-owned CSP or `X-Frame-Options` policy can block Studio
39
+ Preview. Do not assume automatic header rewriting; Next.js `withFimo` does not
40
+ provide it. Inspect the served policy and scope any manual adaptation to Preview,
41
+ preserving production protections and unrelated headers. `frame-ancestors`
42
+ permits the Studio parent, not the framed app's preview origin. Never derive
43
+ ancestor sources from a preview-origin variable. For `script-src`, `connect-src`,
44
+ `frame-src`, and `form-action`, use resolved/observed Fimo resources and endpoints
45
+ actually used by the iframe. Studio-parent WebSockets do not belong in app CSP.
46
+
36
47
  ## Matching
37
48
 
38
49
  `source` matches the pathname only, never the query string.
@@ -46,11 +46,8 @@ own tenant URL.
46
46
 
47
47
  ## Hosted preview config
48
48
 
49
- Wrap the existing Next config once so `next dev` accepts Fimo's hosted preview
50
- origins without exposing the active preview provider to the application. If
51
- the application does not set Next's `devIndicators`, the wrapper hides it in
52
- hosted Preview while local `next dev` keeps Next's default. Any explicit
53
- `devIndicators` setting is preserved:
49
+ Keep the generated `FimoProvider` and `withFimo` integration to render Fimo
50
+ Preview in Fimo Studio and enable Edit Mode. Wrap the existing Next config once:
54
51
 
55
52
  ```ts
56
53
  import type { NextConfig } from 'next';
@@ -60,10 +57,16 @@ const nextConfig: NextConfig = {};
60
57
  export default withFimo(nextConfig);
61
58
  ```
62
59
 
63
- Preserve all existing config fields or config-function logic. Do not hardcode a
64
- preview domain in `allowedDevOrigins`; Fimo supplies it to the development
65
- sandbox. The wrapper changes nothing outside `next dev` and is not the
66
- application's Fimo connection.
60
+ Preserve existing config fields and config-function logic. `withFimo` currently
61
+ does not rewrite response headers or adapt application-owned CSP. A restrictive
62
+ policy may need a manual Preview adaptation; inspect actual framing and blocked
63
+ requests, preserve production protections, and verify the result in a browser.
64
+ `frame-ancestors` permits the Studio parent, not the app's preview origin or a
65
+ value derived from a preview-origin variable. `script-src`, `connect-src`,
66
+ `frame-src`, and `form-action` concern resources/endpoints used by the iframe;
67
+ use the resolved connection and observed requests. Never add a Studio-parent
68
+ WebSocket to application CSP. Scope exceptions to Preview and keep unrelated
69
+ security headers unchanged.
67
70
 
68
71
  ## Client dependency
69
72
 
@@ -184,8 +184,9 @@ report the exact failed command and setup requirement.
184
184
  it. What no worker could prove stays unresolved with an owner action.
185
185
  - Keep coordination evidence in the plain-text files
186
186
  `.fimo/migration/migration-plan.md` and
187
- `.fimo/migration/migration-report.md`. Use JSON only for actual Fimo
188
- schema/content payloads that a data-plane command needs to import. Do not
187
+ `.fimo/migration/migration-report.md`. Use JSON for actual Fimo
188
+ schema/content import payloads and the rendered guardrail inventory and
189
+ capture response metadata required by `references/qa.md`. Do not
189
190
  create a target description, worker plan, decision registry, or JSON receipt
190
191
  just to describe the filesystem or agent work.
191
192
  - Do not report completion until the QA gate passes or every failed check is
@@ -378,6 +379,9 @@ writes go through the normal commands against the linked target:
378
379
  - `references/workers/content-execution.md` - data import and code-wiring
379
380
  contracts.
380
381
  - `references/workers/validator.md` - independent fan-in validation.
382
+ - `scripts/check-rendered-guardrails.mjs` evaluates the cited guardrail
383
+ inventory against rendered HTML or a local server and fails closed on empty,
384
+ missing, redirected, or vacuous evidence.
381
385
  - `scripts/apply-decision.mjs` and `scripts/write-migration-report.mjs` replay
382
386
  an older JSON-ledger migration. A new migration writes the plain-text plan
383
387
  and report instead; do not invoke them unless the user asks for that replay.
@@ -99,8 +99,7 @@ Follow the target project's `fimo-code` Next.js reference and render its
99
99
  `FimoProvider` once at the application root. The provider uses an explicit
100
100
  host connection when one exists; otherwise it resolves the linked project and
101
101
  active git branch on the server and passes only the public connection to the
102
- browser. `withFimo` handles hosted preview origins, not the application
103
- connection.
102
+ browser.
104
103
 
105
104
  Do not create or edit `.env` / `.env.local` for a linked project's Fimo
106
105
  connection. Run the project's normal `next dev`, `next build`, and `next start`
@@ -108,31 +107,29 @@ commands, then exercise at least one server read and one client-side data read.
108
107
 
109
108
  ## Preview embedding and response headers
110
109
 
111
- Fimo Preview loads the app in an iframe and drives it over the postMessage
112
- preview bridge, so development/preview responses must let the preview origin
113
- frame the app.
114
-
115
- - `withFimo` consumes `FIMO_PREVIEW_ALLOWED_ORIGINS` (platform-supplied,
116
- comma-separated `**.<domain>` patterns) only to extend `allowedDevOrigins`
117
- during `next dev`. It does not add, remove, or rewrite response headers;
118
- wrapping the config never fixes a framing block by itself.
119
- - When the source `headers()` sends `X-Frame-Options` or a CSP
120
- `frame-ancestors` directive, keep `X-Content-Type-Options`,
121
- `Strict-Transport-Security`, and `Referrer-Policy` unchanged, and translate
122
- the framing block in the migrated config. For a hosted/remote preview, while
123
- `FIMO_PREVIEW_ALLOWED_ORIGINS` is set, omit `X-Frame-Options` and send
124
- `Content-Security-Policy: frame-ancestors 'self' https://*.<domain>` derived
125
- from each `**.<domain>` entry. For local `next dev`, when the platform
126
- variable is absent, omit the framing block only while
127
- `process.env.NODE_ENV !== 'production'`; keep the source framing policy in
128
- production. Never hardcode a preview provider domain.
129
- - Record every translated or dropped header in the runtime report's Hosting
130
- section.
131
-
132
- Without a browser, verify embeddability deterministically: with the variable
133
- set, request a route from the running dev server and assert the response
134
- headers carry no unconditional framing block, then mark visual proof
135
- unavailable in the QA report.
110
+ Keep the generated `FimoProvider` and `withFimo` integration. It supports
111
+ rendering Fimo Preview in Fimo Studio and enabling Edit Mode.
112
+
113
+ The application owns response and security headers; `withFimo` currently does
114
+ not rewrite them or adapt CSP automatically. A restrictive policy may still
115
+ need a manual Preview adaptation. Inspect framing behavior and response headers
116
+ first. Scope changes to Preview, preserve production protections and unrelated
117
+ security headers, and record them in the runtime report's Hosting section.
118
+ When the existing policy sends `X-Frame-Options` or an unconditional
119
+ `frame-ancestors` block, condition or relax that framing control only for the
120
+ verified Preview embedding context; retain it for non-Preview and production
121
+ responses.
122
+
123
+ - `frame-ancestors` controls which Fimo Studio parent may embed the app. The
124
+ incident's manual fix used the current Studio sources `https://fimo.ai` and
125
+ `https://*.fimo.ai`. Verify the Studio parent for the target environment;
126
+ these sources are not a universal resource allowlist. Never derive them from
127
+ a preview-origin variable. The sandbox or hosted preview origin identifies
128
+ the app being framed, not its ancestor.
129
+ - `script-src` controls scripts, `connect-src` API and WebSocket connections,
130
+ `frame-src` frames embedded by the app, and `form-action` form submission
131
+ destinations. Base Fimo sources on the resolved connection and observed
132
+ requests made by the preview iframe, only for resources/endpoints it uses.
136
133
 
137
134
  ## Locales
138
135
 
@@ -104,8 +104,7 @@ items.
104
104
 
105
105
  For linked Next.js targets, the root `FimoProvider` resolves an explicit host
106
106
  connection first, otherwise `.fimo/project.json` plus the active git branch,
107
- and passes only the public connection to the browser. `withFimo` handles
108
- hosted preview origins, not this connection. Run the normal `next dev`,
107
+ and passes only the public connection to the browser. Run the normal `next dev`,
109
108
  `next build`, and `next start` commands without creating a Fimo env file.
110
109
 
111
110
  ## Hosting
@@ -113,18 +112,23 @@ hosted preview origins, not this connection. Run the normal `next dev`,
113
112
  Owned by the runtime lane; verified here read-only.
114
113
 
115
114
  - The target starts locally: the dev server responds without startup errors.
116
- - The target is embeddable in Fimo Preview, which frames the app in an iframe
117
- and drives it over the postMessage preview bridge. Development/preview
118
- responses carry no unconditional `X-Frame-Options` or CSP `frame-ancestors`
119
- block; protective headers (nosniff, HSTS, referrer policy) stay. The
120
- translation goes through `FIMO_PREVIEW_ALLOWED_ORIGINS`; `withFimo` alone
121
- does not solve headers — it only extends `allowedDevOrigins` during
122
- `next dev`.
115
+ - Fimo Preview renders the target in Fimo Studio and Edit Mode works. If either
116
+ is blocked, verify the actual framing behavior and response headers. The
117
+ application owns its security policy; any Preview exception must preserve
118
+ production protections and unrelated security headers.
119
+ - Check CSP sources by purpose: `frame-ancestors` permits the Studio parent;
120
+ the app's preview origin is the framed site. `script-src`, `connect-src`,
121
+ `frame-src`, and `form-action` use resolved/observed Fimo resources and
122
+ endpoints actually used by the iframe. Do not copy ancestor sources into
123
+ resource directives or derive them from a preview-origin variable.
124
+ - `withFimo` does not rewrite response headers. Verify any required manual
125
+ Preview adaptation of an application-owned restrictive policy.
123
126
  - The runtime report covers local startup, preview embedding, build, the
124
127
  resolved Fimo connection, header translations, and integration env-key
125
128
  names, with every claim backed by evidence.
126
129
  - With a browser available, record `browserProof` (rendered route plus console
127
- state) for startup and embedding. Without one, use deterministic HTTP
130
+ state) for startup, Studio embedding, and Edit Mode. Build or HTTP checks alone
131
+ do not prove these work. Without a browser, use deterministic HTTP
128
132
  status/header/process/log checks and mark visual proof explicitly
129
133
  unavailable in the report.
130
134
  - Deployment smoke is explicit owner opt-in; never run deploy or publish as a
@@ -157,12 +161,102 @@ Owned by the runtime lane; verified here read-only.
157
161
  fetched again after hydration. A new client waterfall, repeated full-list
158
162
  read, avoidable sequential request chain, or stale edit fails the responsible
159
163
  migration lane.
160
- - Navigation and footer links point to migrated routes or documented external URLs.
164
+ - Navigation and footer links point to migrated routes or documented external
165
+ URLs. The `links-resolve` rule below checks internal routes; the validator
166
+ reviews external destinations separately.
161
167
  - Missing integration secrets do not block these checks: build, dev, and route
162
168
  render run with the integration inert, and the missing key is a recorded
163
169
  follow-up.
164
170
  - Unsupported app behavior is not hidden behind broken UI.
165
171
 
172
+ ## Rendered guardrails (required)
173
+
174
+ Brand, legal, compliance, and navigation rules are proven on the final rendered
175
+ application, never by grepping the target source. Once copy moves into Fimo the
176
+ strings leave the repository: a source grep for a forbidden phrase passes
177
+ because nothing is there, and a grep for the brand name fails for the same
178
+ reason. Worker reports, manifests, and coverage tables are diagnostics; this
179
+ check is the acceptance evidence.
180
+
181
+ 1. Before the validation wave, the coordinator writes the guardrail inventory to
182
+ `.fimo/migration/guardrails.json` for the deterministic checker. List every
183
+ route the migration must prove and every rule the source, owner, or accepted
184
+ scope imposes. Every rule includes `source`: the source page, file, or owner
185
+ decision that requires it. A rule without a citation is an invention, not a
186
+ recovered project guardrail.
187
+ - `required-text`: copy that must render, such as the brand name or a
188
+ legally required notice.
189
+ - `forbidden-text`: copy that must never render, such as an old brand name,
190
+ placeholder text, or a claim the owner withdrew.
191
+ - `required-link`: a link every page must carry, such as the privacy policy
192
+ or imprint.
193
+ - `links-resolve`: every internal link rendered on the inventoried routes
194
+ points at an inventoried route or an explicitly allowed path prefix.
195
+
196
+ Internal links are resolved against the final document URL and any
197
+ `<base href>`; query and fragment do not change route identity. An `allow`
198
+ prefix exempts a destination family deliberately outside the accepted scope.
199
+
200
+ Scope a rule with `routes` only when it is not global. When the source has
201
+ no rule of a kind (for example no legal page), say so in the migration
202
+ report rather than leaving the inventory thin without explanation.
203
+
204
+ ```json
205
+ {
206
+ "routes": ["/", "/about", "/legal/privacy"],
207
+ "rules": [
208
+ { "id": "brand-name", "kind": "required-text", "text": "<target brand>", "source": "<source page or file>" },
209
+ {
210
+ "id": "no-old-brand",
211
+ "kind": "forbidden-text",
212
+ "text": ["<previous brand>", "Lorem ipsum"],
213
+ "source": "<owner decision>"
214
+ },
215
+ { "id": "footer-privacy", "kind": "required-link", "href": "/legal/privacy", "source": "<source navigation>" },
216
+ { "id": "nav-resolves", "kind": "links-resolve", "allow": ["/blog"], "source": "<source navigation>" }
217
+ ]
218
+ }
219
+ ```
220
+
221
+ 2. The validator observes the rendered application, not files in the
222
+ repository. For a server-rendered target, run the check with `--base-url`
223
+ while the built app serves locally. For a client-rendered target, save each
224
+ hydrated document from the browser pass as `<captures>/index.html` and
225
+ `<captures>/<route>.html` and pass `--captures`. Save a JSON sidecar next to
226
+ each HTML file, such as `index.html.json` or `legal/privacy.html.json`:
227
+
228
+ ```json
229
+ { "status": 200, "url": "http://localhost:3000/legal/privacy", "error": null }
230
+ ```
231
+
232
+ Record the actual final navigation response status and document URL,
233
+ including its trailing slash. Record navigation or capture failures in
234
+ `error`; never infer a successful status from HTML or fill in missing
235
+ evidence. Missing, malformed, non-200, or error metadata fails the route.
236
+ Captures are supplied evidence: the checker cannot authenticate them or
237
+ recognize every error page served with status 200. The browser smoke below
238
+ must still prove representative content and working controls.
239
+
240
+ Count visitor-visible body text and readable attributes (`alt`, `title`,
241
+ `aria-label`, `placeholder`, and `meta` content); script, style, and comment
242
+ strings do not count.
243
+
244
+ ```bash
245
+ node node_modules/fimo/assets/skills/fimo-migration/scripts/check-rendered-guardrails.mjs <target> \
246
+ --base-url http://localhost:3000 --output .fimo/migration/guardrails-report.md
247
+ ```
248
+
249
+ 3. The check fails closed and caps the gate at `draft-only` when the inventory
250
+ or rendered evidence is empty, a route is missing or non-200, a final URL
251
+ does not match the inventoried route, or a rule observes nothing. Nothing
252
+ observed is failed, never passed.
253
+
254
+ 4. Copy the emitted `## Guardrails` block unchanged into the validator's
255
+ worker report and the migration report. Acceptance is `Result: passed` with
256
+ every inventoried route rendered and every rule observed on at least one
257
+ route. Each failure names the route and the phrase or link involved, so the
258
+ repair owner needs no rerun to locate it.
259
+
166
260
  ## Browser smoke (required)
167
261
 
168
262
  Build success and HTTP 200 responses are not sufficient evidence: a page can
@@ -262,6 +356,8 @@ complete | complete-with-unresolved | draft-only
262
356
 
263
357
  ## Content Delivery
264
358
 
359
+ ## Guardrails
360
+
265
361
  ## Timing
266
362
 
267
363
  ## Checks
@@ -279,6 +375,10 @@ locales) with `gate`,
279
375
  coverage must not average away a missing entry or an unuploaded asset. Timing is
280
376
  a separate section copied from the worker reports, so it never dilutes coverage.
281
377
 
378
+ `Guardrails` is the unmodified block emitted by
379
+ `scripts/check-rendered-guardrails.mjs`. A report without it, or with
380
+ `Result: failed`, cannot be `complete` or `complete-with-unresolved`.
381
+
282
382
  Cache freshness is a report check whenever migration changes the content
283
383
  transport or rendering mode. Do not fail a migration for omitted provider cache
284
384
  mechanics alone, but do fail stale Fimo edits caused by the target's migrated
@@ -1,11 +1,13 @@
1
1
  # Migration validator
2
2
 
3
3
  Validation is one independent read-only wave after all writers return. The
4
- coordinator gives every validator the accepted migration scope and deliberate
5
- user-approved differences, but no producer findings, repair reasoning,
6
- transcript, or expected verdict. A validator checks the finished target against
7
- the source within that contract. It does not report an explicitly excluded
8
- route, integration, or control as migration drift.
4
+ coordinator gives every validator the accepted migration scope, deliberate
5
+ user-approved differences, and the guardrail inventory path
6
+ (`references/qa.md`, Rendered guardrails), but no producer findings, repair
7
+ reasoning, transcript, or expected verdict. A validator may add a rule the
8
+ source proves; it never removes or narrows one. A validator checks the
9
+ finished target against the source within that contract. It does not report an
10
+ explicitly excluded route, integration, or control as migration drift.
9
11
 
10
12
  When subagents are available, launch separate workers for build and runtime,
11
13
  Fimo data and content, and rendered browser behavior. Run them concurrently
@@ -13,11 +15,18 @@ after their prerequisites pass. They may inspect overlapping files because none
13
15
  of them writes.
14
16
 
15
17
  Compare the source, content plan, actual `git diff`, real Fimo state, and local
16
- application behavior. A worker report is a claim, not evidence.
18
+ application behavior. A worker report, manifest, or coverage table is a
19
+ diagnostic, not acceptance evidence. A check that observed nothing - zero
20
+ rendered routes, zero collected links, zero matched rules - is failed, not
21
+ passed.
17
22
 
18
23
  Verify:
19
24
 
20
25
  - every source route renders with expected status and representative content;
26
+ - the rendered guardrail inventory passes: brand, legal, compliance, and
27
+ navigation rules are proven on rendered HTML or a running local server with
28
+ `scripts/check-rendered-guardrails.mjs`, never by grepping target source.
29
+ Browser captures include the response metadata required by `references/qa.md`;
21
30
  - schemas, entries, singles, labels, media, forms, and locales exist through
22
31
  CLI read-back;
23
32
  - every planned source item is consumed at its original behavior path, not in
@@ -43,6 +52,13 @@ duration, checks run, counts, failing source items, blocked descendants, and
43
52
  suggested repair ownership. Stop only when a failed prerequisite makes a check
44
53
  meaningless.
45
54
 
55
+ End every validator report with an `Acceptance` section: the exact commands
56
+ another party can rerun (build, local start, the guardrail check with its
57
+ inventory and observation source, CLI read-back) and the expected evidence for
58
+ each - exit status, the unmodified `## Guardrails` block ending in
59
+ `Result: passed`, and the counts observed. A pass reported without its command
60
+ and output is a claim.
61
+
46
62
  The coordinator fans every lane into one finding set before editing. It assigns
47
63
  disjoint repair owners, waits for the whole repair wave, then reruns one central
48
64
  validation wave. It does not restart every worker, repair findings one at a
@@ -76,9 +76,11 @@ other after it. Do not add a metadata format for a small overlap.
76
76
  framework gate.
77
77
  6. Start each code worker only after its own imported records read back as
78
78
  non-empty. A build over empty data proves nothing.
79
- 7. After every writer returns, start one read-only validation wave. When
80
- subagents are available, run build and runtime, Fimo data and content, and
81
- rendered browser checks concurrently after their prerequisites pass.
79
+ 7. Before the validation wave, write the cited rendered-guardrail inventory
80
+ required by `references/qa.md`. After every writer returns, start one
81
+ read-only validation wave. When subagents are available, run build and
82
+ runtime, Fimo data and content, and rendered browser checks concurrently
83
+ after their prerequisites pass.
82
84
 
83
85
  Each prompt names the worker's source paths, exact target ownership, applicable
84
86
  reference above, and dependencies. Each report states status, duration, source