docs: publish Preview 19 dogfood evidence
Export the reviewed allowlisted snapshot from private source commit 05928cebd01b586cf9e9d4b8c8537a7605a6068c. This records the exact candidate, bounded capacity result, stateful migration scratch requirement, authenticated batch identity proof, and immediate live acceptance evidence. AI-Assisted: OpenAI Codex Signed-off-by: Cole Speelman <crspeelman@gmail.com>
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
<?sando go
|
||||
package site
|
||||
|
||||
func App(view AppView)
|
||||
?>
|
||||
<?# SPDX-License-Identifier: AGPL-3.0-only ?>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head><?~ Head(view.Head) ?></head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main">Skip to content</a>
|
||||
<?~ SiteHeader(true, "overview", view.Organization.ID) ?>
|
||||
<main id="main">
|
||||
<section class="app-intro" aria-labelledby="overview-title">
|
||||
<div><p class="eyebrow">Organization overview</p><h1 id="overview-title"><?= view.Organization.Name ?></h1><p>Welcome, <?= view.DisplayName ?>. Last refreshed <?= view.RefreshedAt ?>.</p></div>
|
||||
<form class="logout" method="post" action="/logout/">
|
||||
<input type="hidden" name="csrf_token" value="<?= view.CSRFToken ?>">
|
||||
<button class="secondary" type="submit">Sign out</button>
|
||||
</form>
|
||||
</section>
|
||||
<? if len(view.Organizations) > 1 { ?>
|
||||
<nav class="organization-nav" aria-label="Organizations">
|
||||
<span>Organization:</span>
|
||||
<? for _, organization := range view.Organizations { ?>
|
||||
<? if organization.Selected { ?>
|
||||
<a href="/app/?organization=<?= organization.ID ?>" aria-current="page"><?= organization.Name ?></a>
|
||||
<? } else { ?>
|
||||
<a href="/app/?organization=<?= organization.ID ?>"><?= organization.Name ?></a>
|
||||
<? } ?>
|
||||
<? } ?>
|
||||
</nav>
|
||||
<? } ?>
|
||||
<? if view.PendingBatches > 0 { ?>
|
||||
<aside class="live-status" role="status">
|
||||
<p><strong>Durable evidence is still being indexed.</strong> Accepted batches safely stored: <?= view.PendingBatches ?>. Recent queries may lag by <?= view.ProjectionLag ?>.</p>
|
||||
</aside>
|
||||
<? } ?>
|
||||
<aside class="live-status" data-events-url="<?= view.EventsURL ?>" hidden>
|
||||
<p><strong>New observations are available.</strong> <a href="/app/?organization=<?= view.Organization.ID ?>">Refresh this overview</a>.</p>
|
||||
</aside>
|
||||
<section class="signal-grid" aria-label="Recent telemetry">
|
||||
<? for _, signal := range view.Signals { ?>
|
||||
<article class="signal-card" id="<?= signal.ID ?>">
|
||||
<p class="eyebrow"><?= signal.Name ?></p>
|
||||
<h2>Recent <?= signal.Name ?></h2>
|
||||
<p><?= signal.Description ?></p>
|
||||
<details><summary>Query</summary><pre><code><?= signal.Query ?></code></pre></details>
|
||||
<?~ ResultTable(signal.Table) ?>
|
||||
</article>
|
||||
<? } ?>
|
||||
</section>
|
||||
<section class="section-grid" aria-labelledby="saved-work">
|
||||
<div><p class="eyebrow">Saved work</p><h2 id="saved-work">Queries and dashboards</h2></div>
|
||||
<div class="saved-grid">
|
||||
<section aria-labelledby="saved-queries"><h3 id="saved-queries">Saved queries</h3>
|
||||
<? if len(view.SavedQueries) == 0 { ?><p>No saved queries yet.</p><? } ?>
|
||||
<? for _, item := range view.SavedQueries { ?><article><h4><?= item.Name ?></h4><p><?= item.Description ?></p><pre><code><?= item.Query ?></code></pre></article><? } ?>
|
||||
</section>
|
||||
<section aria-labelledby="dashboards"><h3 id="dashboards">Dashboards</h3>
|
||||
<? if len(view.Dashboards) == 0 { ?><p>No dashboards yet.</p><? } ?>
|
||||
<? for _, item := range view.Dashboards { ?><article><h4><a href="/app/dashboards/<?= item.Slug ?>/?organization=<?= view.Organization.ID ?>"><?= item.Name ?></a></h4><p><?= item.Description ?></p><p><?= item.PanelCount ?> panels</p></article><? } ?>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section-grid" aria-labelledby="incident-work">
|
||||
<div><p class="eyebrow">Incident response</p><h2 id="incident-work">Attention without noise</h2></div>
|
||||
<div><p><?= view.OpenIncidents ?> open incidents are visible in the authorized inbox. Alert rules execute the same bounded saved-query AST used everywhere else.</p><p><a class="button secondary" href="<?= view.IncidentsURL ?>">Open incident inbox</a></p></div>
|
||||
</section>
|
||||
<? if view.CanManage { ?>
|
||||
<section class="section-grid" aria-labelledby="manage-work">
|
||||
<div><p class="eyebrow">Organization workshop</p><h2 id="manage-work">Save a reusable view</h2><p>Assisted controls and typed text enter the same parser and versioned AST. Every form is an ordinary server request; nothing is generated or executed on page load.</p></div>
|
||||
<div class="editor-grid">
|
||||
<form class="editor-card builder-card" method="post" action="/app/queries/builder/">
|
||||
<h3>Build a query</h3>
|
||||
<p>Choose one bounded evidence source, an optional filter, and an optional summary. The saved result remains ordinary reviewable query text.</p>
|
||||
<input type="hidden" name="organization_id" value="<?= view.Organization.ID ?>">
|
||||
<input type="hidden" name="csrf_token" value="<?= view.ManageCSRF ?>">
|
||||
<div class="field-grid">
|
||||
<div><label for="builder-name">Name</label><input id="builder-name" name="name" required maxlength="128"></div>
|
||||
<div><label for="builder-description">Description</label><textarea id="builder-description" name="description" required maxlength="1024"></textarea></div>
|
||||
<div><label for="builder-signal">Evidence</label><select id="builder-signal" name="signal" required><option value="logs">Logs</option><option value="metrics">Metrics</option><option value="traces">Traces</option><option value="deployments">Deployments</option></select></div>
|
||||
<div><label for="builder-window">Lookback</label><select id="builder-window" name="window" required><option value="15m">15 minutes</option><option value="1h" selected>1 hour</option><option value="6h">6 hours</option><option value="24h">24 hours</option><option value="168h">7 days</option></select></div>
|
||||
<div><label for="builder-filter-field">Filter field <span class="optional">(optional)</span></label><select id="builder-filter-field" name="filter_field"><option value="">No filter</option><option value="service">Service</option><option value="project">Project</option><option value="environment">Environment</option><option value="route">HTTP route</option><option value="status">HTTP status</option><option value="duration">Duration</option><option value="name">Name</option><option value="severity">Severity</option><option value="value">Metric value</option><option value="trace_id">Trace ID</option><option value="correlation_id">Correlation ID</option></select></div>
|
||||
<div><label for="builder-filter-operator">Filter comparison</label><select id="builder-filter-operator" name="filter_operator" required><option value="==">equals</option><option value="!=">does not equal</option><option value=">=">at least</option><option value="<=">at most</option><option value=">">greater than</option><option value="<">less than</option></select></div>
|
||||
<div><label for="builder-filter-value">Filter value <span class="optional">(optional)</span></label><input id="builder-filter-value" name="filter_value" maxlength="256"></div>
|
||||
<div><label for="builder-aggregate">Summary</label><select id="builder-aggregate" name="aggregate" required><option value="none">No summary</option><option value="count">Count</option><option value="min">Minimum</option><option value="max">Maximum</option><option value="sum">Sum</option><option value="avg">Average</option><option value="p50">50th percentile</option><option value="p95">95th percentile</option><option value="p99">99th percentile</option></select></div>
|
||||
<div><label for="builder-aggregate-field">Numeric summary field <span class="optional">(not used by count)</span></label><select id="builder-aggregate-field" name="aggregate_field"><option value="">No field</option><option value="value">Metric value</option><option value="duration">Duration</option><option value="status">HTTP status</option></select></div>
|
||||
<div><label for="builder-group">Group by <span class="optional">(optional)</span></label><select id="builder-group" name="group_by"><option value="">No grouping</option><option value="service">Service</option><option value="project">Project</option><option value="environment">Environment</option><option value="route">HTTP route</option><option value="status">HTTP status</option><option value="name">Name</option><option value="severity">Severity</option></select></div>
|
||||
<div><label for="builder-bucket">Time bucket <span class="optional">(optional)</span></label><select id="builder-bucket" name="bucket"><option value="">No time bucket</option><option value="1m">1 minute</option><option value="5m">5 minutes</option><option value="15m">15 minutes</option><option value="1h">1 hour</option></select></div>
|
||||
<div><label for="builder-limit">Maximum rows</label><select id="builder-limit" name="limit" required><option value="10">10</option><option value="20">20</option><option value="50" selected>50</option><option value="100">100</option><option value="250">250</option></select></div>
|
||||
</div>
|
||||
<button type="submit">Build and save query</button>
|
||||
</form>
|
||||
<form class="editor-card" method="post" action="/app/queries/">
|
||||
<h3>Write a query</h3>
|
||||
<input type="hidden" name="organization_id" value="<?= view.Organization.ID ?>">
|
||||
<input type="hidden" name="csrf_token" value="<?= view.ManageCSRF ?>">
|
||||
<label for="query-name">Name</label><input id="query-name" name="name" required maxlength="128">
|
||||
<label for="query-description">Description</label><textarea id="query-description" name="description" required maxlength="1024"></textarea>
|
||||
<label for="query-text">Typed query</label><textarea id="query-text" name="query" required maxlength="16384">logs | window 1h | limit 50</textarea>
|
||||
<button type="submit">Save query</button>
|
||||
</form>
|
||||
<form class="editor-card" method="post" action="/app/dashboards/">
|
||||
<h3>Create a one-panel dashboard</h3>
|
||||
<input type="hidden" name="organization_id" value="<?= view.Organization.ID ?>">
|
||||
<input type="hidden" name="csrf_token" value="<?= view.ManageCSRF ?>">
|
||||
<label for="dashboard-slug">URL slug</label><input id="dashboard-slug" name="slug" required maxlength="63" pattern="[a-z][a-z0-9-]+">
|
||||
<label for="dashboard-name">Name</label><input id="dashboard-name" name="name" required maxlength="128">
|
||||
<label for="dashboard-description">Description</label><textarea id="dashboard-description" name="description" required maxlength="1024"></textarea>
|
||||
<label for="panel-title">Panel title</label><input id="panel-title" name="panel_title" required maxlength="128">
|
||||
<label for="saved-query">Saved query</label>
|
||||
<select id="saved-query" name="saved_query_id" required>
|
||||
<option value="">Choose a saved query</option>
|
||||
<? for _, item := range view.SavedQueries { ?><option value="<?= item.ID ?>"><?= item.Name ?></option><? } ?>
|
||||
</select>
|
||||
<label for="visualization">Presentation</label>
|
||||
<select id="visualization" name="visualization" required><option value="table">Table</option><option value="stat">Single statistic with table</option><option value="timeseries">Time series table</option></select>
|
||||
<? if len(view.SavedQueries) == 0 { ?><button type="submit" disabled>Create dashboard</button><? } else { ?><button type="submit">Create dashboard</button><? } ?>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
<? } ?>
|
||||
</main>
|
||||
<?~ SiteFooter() ?>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user