TRUSS-1: init code commit of truss

This commit is contained in:
Blake Ridgway
2026-07-14 06:50:09 -05:00
commit fdbe23e1d9
8 changed files with 2763 additions and 0 deletions

789
output/index.html Normal file
View File

@@ -0,0 +1,789 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Arcline — TODO</title>
<style>
/* ------------------------------------------------------------------ */
/* Reset & base */
/* ------------------------------------------------------------------ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg: #f4f5f7;
--surface: #ffffff;
--border: #dfe1e6;
--text: #172b4d;
--muted: #6b778c;
--track-it: #0052cc;
--track-os: #36b37e;
--track-both: #6554c0;
--backlog: #dfe1e6;
--inprogress: #ffc400;
--inreview: #00b8d9;
--done: #36b37e;
--card-shadow: 0 1px 3px rgba(9,30,66,0.08);
--card-hover: 0 2px 6px rgba(9,30,66,0.14);
--radius: 8px;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
"Helvetica Neue", Arial, sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.5;
min-height: 100vh;
}
/* ------------------------------------------------------------------ */
/* Header */
/* ------------------------------------------------------------------ */
header {
background: var(--surface);
border-bottom: 1px solid var(--border);
padding: 24px 32px;
}
header h1 {
font-size: 1.5rem;
font-weight: 700;
display: flex;
align-items: center;
gap: 10px;
}
header h1 .logo {
background: linear-gradient(135deg, #0052cc, #6554c0);
color: #fff;
width: 32px; height: 32px;
border-radius: 6px;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 0.8rem;
}
header .subtitle {
color: var(--muted);
margin-top: 4px;
font-size: 0.95rem;
}
/* ------------------------------------------------------------------ */
/* Legend */
/* ------------------------------------------------------------------ */
.legend-bar {
background: var(--surface);
border-bottom: 1px solid var(--border);
padding: 12px 32px;
display: flex;
flex-wrap: wrap;
gap: 16px;
align-items: center;
font-size: 0.85rem;
color: var(--muted);
}
.legend-bar strong { color: var(--text); }
.track-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 3px;
font-size: 0.75rem;
font-weight: 700;
color: #fff;
}
.track-it { background: var(--track-it); }
.track-os { background: var(--track-os); }
.track-both { background: var(--track-both); }
/* ------------------------------------------------------------------ */
/* Legend table */
/* ------------------------------------------------------------------ */
.legend-table-wrap {
padding: 20px 32px 16px;
background: var(--surface);
border-bottom: 1px solid var(--border);
}
.legend-table-wrap h2 {
font-size: 1rem;
margin-bottom: 10px;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.05em;
}
table.legend {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
}
table.legend th {
text-align: left;
padding: 8px 12px;
border-bottom: 2px solid var(--border);
color: var(--muted);
font-weight: 600;
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.04em;
}
table.legend td {
padding: 8px 12px;
border-bottom: 1px solid var(--border);
}
table.legend tr:last-child td { border-bottom: none; }
.status-pill {
display: inline-block;
padding: 2px 10px;
border-radius: 12px;
font-size: 0.75rem;
font-weight: 600;
color: #fff;
}
.status-backlog { background: var(--backlog); color: #42526e; }
.status-inprogress { background: var(--inprogress); color: #172b4d; }
.status-inreview { background: var(--inreview); }
.status-done { background: var(--done); }
/* ------------------------------------------------------------------ */
/* Board */
/* ------------------------------------------------------------------ */
.board {
display: flex;
gap: 20px;
padding: 24px 32px;
overflow-x: auto;
min-height: calc(100vh - 340px);
align-items: flex-start;
}
.column {
flex: 1;
min-width: 280px;
max-width: 380px;
background: #ebecf0;
border-radius: var(--radius);
padding: 12px;
display: flex;
flex-direction: column;
}
.column.done { background: #e3fcef; }
.column-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 4px 8px 8px;
}
.column-header h2 {
font-size: 0.85rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--muted);
}
.column-count {
background: rgba(9,30,66,0.08);
color: var(--muted);
font-size: 0.75rem;
font-weight: 600;
padding: 2px 8px;
border-radius: 10px;
}
/* ------------------------------------------------------------------ */
/* Cards */
/* ------------------------------------------------------------------ */
.card-list {
list-style: none;
display: flex;
flex-direction: column;
gap: 8px;
min-height: 40px;
}
.card {
background: var(--surface);
border-radius: 6px;
padding: 12px 14px;
box-shadow: var(--card-shadow);
cursor: default;
transition: box-shadow 0.15s ease, transform 0.15s ease;
border-left: 3px solid var(--border);
}
.card:hover {
box-shadow: var(--card-hover);
transform: translateY(-1px);
}
.card.checked {
opacity: 0.65;
text-decoration: line-through;
text-decoration-color: var(--muted);
}
.card.track-it { border-left-color: var(--track-it); }
.card.track-os { border-left-color: var(--track-os); }
.card.track-both { border-left-color: var(--track-both); }
.card .card-meta {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 4px;
}
.card .codename {
font-weight: 700;
font-size: 0.9rem;
}
.card .description {
font-size: 0.82rem;
color: var(--muted);
line-height: 1.4;
}
/* ------------------------------------------------------------------ */
/* Notes */
/* ------------------------------------------------------------------ */
.notes {
padding: 20px 32px 32px;
background: var(--surface);
border-top: 1px solid var(--border);
}
.notes h2 {
font-size: 0.95rem;
margin-bottom: 8px;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.notes ul {
list-style: disc inside;
color: var(--muted);
font-size: 0.85rem;
display: flex;
flex-direction: column;
gap: 4px;
}
/* ------------------------------------------------------------------ */
/* Footer */
/* ------------------------------------------------------------------ */
footer {
text-align: center;
padding: 16px;
font-size: 0.78rem;
color: var(--muted);
}
footer a {
color: var(--track-it);
text-decoration: none;
}
/* ------------------------------------------------------------------ */
/* Responsive */
/* ------------------------------------------------------------------ */
@media (max-width: 900px) {
.board { flex-direction: column; padding: 16px; }
.column { max-width: 100%; }
header, .legend-bar, .legend-table-wrap, .notes { padding-left: 16px; padding-right: 16px; }
}
</style>
</head>
<body>
<!-- ================================================================= -->
<!-- Header -->
<!-- ================================================================= -->
<header>
<h1>
<span class="logo"></span>
Arcline — TODO
</h1>
<p class="subtitle">In-house Kanban board for <strong>Arcline IT</strong> (<a href="https://arcline.it">arcline.it</a>) and <strong>The Arcline Project</strong> (<a href="https://arclineproject.org">arclineproject.org</a>).</p>
</header>
<!-- ================================================================= -->
<!-- Legend bar -->
<!-- ================================================================= -->
<div class="legend-bar">
<span><strong>Track:</strong></span>
<span class="track-badge track-it">IT</span> arcline.it
<span class="track-badge track-os">OS</span> arclineproject.org
<span class="track-badge track-both">IT/OS</span> shared
<span style="margin-left:auto">Move cards between sections as they progress: `Backlog → In Progress → In Review → Done`.</span>
</div>
<!-- ================================================================= -->
<!-- Codename Legend table -->
<!-- ================================================================= -->
<div class="legend-table-wrap">
<h2>Codename Legend</h2>
<table class="legend">
<thead>
<tr>
<th>Codename</th>
<th>Initiative</th>
<th>Track</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Keystone</strong></td>
<td>Customer portal + billing overhaul</td>
<td>
<span class="track-badge track-it">IT</span>
</td>
<td>
<span class="status-pill status-inprogress">In Progress</span>
</td>
</tr>
<tr>
<td><strong>Cornerstone</strong></td>
<td>Arcline OS alpha → public ISO release</td>
<td>
<span class="track-badge track-os">OS</span>
</td>
<td>
<span class="status-pill status-inprogress">In Progress</span>
</td>
</tr>
<tr>
<td><strong>Buttress</strong></td>
<td>`arcline-audit` hardening &amp; CVE scan integration</td>
<td>
<span class="track-badge track-os">OS</span>
</td>
<td>
<span class="status-pill status-backlog">Backlog</span>
</td>
</tr>
<tr>
<td><strong>Voussoir</strong></td>
<td>Migration tool (cPanel/Plesk → Arcline)</td>
<td>
<span class="track-badge track-both">IT/OS</span>
</td>
<td>
<span class="status-pill status-backlog">Backlog</span>
</td>
</tr>
<tr>
<td><strong>Springer</strong></td>
<td>Status page + uptime monitoring rollout</td>
<td>
<span class="track-badge track-it">IT</span>
</td>
<td>
<span class="status-pill status-inreview">In Review</span>
</td>
</tr>
<tr>
<td><strong>Rampart</strong></td>
<td>Firewall/nftables default-deny profile pass</td>
<td>
<span class="track-badge track-os">OS</span>
</td>
<td>
<span class="status-pill status-backlog">Backlog</span>
</td>
</tr>
<tr>
<td><strong>Lintel</strong></td>
<td>Docs site (docs.arcline.it) restructure</td>
<td>
<span class="track-badge track-it">IT</span>
</td>
<td>
<span class="status-pill status-backlog">Backlog</span>
</td>
</tr>
<tr>
<td><strong>Plinth</strong></td>
<td>Referral program launch</td>
<td>
<span class="track-badge track-it">IT</span>
</td>
<td>
<span class="status-pill status-backlog">Backlog</span>
</td>
</tr>
<tr>
<td><strong>Abutment</strong></td>
<td>Workstation (KDE) build target</td>
<td>
<span class="track-badge track-os">OS</span>
</td>
<td>
<span class="status-pill status-backlog">Backlog</span>
</td>
</tr>
</tbody>
</table>
</div>
<!-- ================================================================= -->
<!-- Board columns -->
<!-- ================================================================= -->
<div class="board">
<div class="column">
<div class="column-header">
<h2>Backlog</h2>
<span class="column-count">9</span>
</div>
<ul class="card-list">
<li class="card track-os">
<div class="card-meta">
<span class="track-badge track-os">OS</span>
<span class="codename">Buttress</span>
</div>
<p class="description">wire `arcline-audit` into CI for nightly CVE scans</p>
</li>
<li class="card track-os">
<div class="card-meta">
<span class="track-badge track-os">OS</span>
<span class="codename">Rampart</span>
</div>
<p class="description">finalize default-deny nftables ruleset, document opt-in exceptions</p>
</li>
<li class="card track-os">
<div class="card-meta">
<span class="track-badge track-os">OS</span>
<span class="codename">Abutment</span>
</div>
<p class="description">scope KDE Plasma workstation ISO target</p>
</li>
<li class="card track-it">
<div class="card-meta">
<span class="track-badge track-it">IT</span>
<span class="codename">Lintel</span>
</div>
<p class="description">restructure docs.arcline.it into per-tool sections</p>
</li>
<li class="card track-it">
<div class="card-meta">
<span class="track-badge track-it">IT</span>
<span class="codename">Plinth</span>
</div>
<p class="description">build referral program signup + tracking flow</p>
</li>
<li class="card track-both">
<div class="card-meta">
<span class="track-badge track-both">IT/OS</span>
<span class="codename">Voussoir</span>
</div>
<p class="description">spec `arcline-migrate` cPanel import mapping</p>
</li>
<li class="card track-it">
<div class="card-meta">
<span class="track-badge track-it">IT</span>
</div>
<p class="description">Case studies page — draft first 2 client write-ups</p>
</li>
<li class="card track-os">
<div class="card-meta">
<span class="track-badge track-os">OS</span>
</div>
<p class="description">Grafana dashboard pack — ship default node_exporter + Loki dashboards</p>
</li>
<li class="card track-it">
<div class="card-meta">
<span class="track-badge track-it">IT</span>
</div>
<p class="description">Game server plans — add automated backup scheduling to portal</p>
</li>
</ul>
</div>
<div class="column">
<div class="column-header">
<h2>In Progress</h2>
<span class="column-count">4</span>
</div>
<ul class="card-list">
<li class="card track-it">
<div class="card-meta">
<span class="track-badge track-it">IT</span>
<span class="codename">Keystone</span>
</div>
<p class="description">customer portal (`arcline-portal`) SSL + ticketing UI</p>
</li>
<li class="card track-it">
<div class="card-meta">
<span class="track-badge track-it">IT</span>
<span class="codename">Keystone</span>
</div>
<p class="description">Stripe billing (`arcline-billing`) subscription sync</p>
</li>
<li class="card track-os">
<div class="card-meta">
<span class="track-badge track-os">OS</span>
<span class="codename">Cornerstone</span>
</div>
<p class="description">ISO build pipeline (Debian Bookworm base)</p>
</li>
<li class="card track-os">
<div class="card-meta">
<span class="track-badge track-os">OS</span>
<span class="codename">Cornerstone</span>
</div>
<p class="description">btrfs snapshot rollback QA pass</p>
</li>
</ul>
</div>
<div class="column">
<div class="column-header">
<h2>In Review</h2>
<span class="column-count">2</span>
</div>
<ul class="card-list">
<li class="card track-it">
<div class="card-meta">
<span class="track-badge track-it">IT</span>
<span class="codename">Springer</span>
</div>
<p class="description">status page generator (`arcline-status`) — awaiting Blake&#39;s sign-off</p>
</li>
<li class="card track-os">
<div class="card-meta">
<span class="track-badge track-os">OS</span>
</div>
<p class="description">`arcline-dns` — multi-resolver propagation checker — code review open</p>
</li>
</ul>
</div>
<div class="column done">
<div class="column-header">
<h2>Done</h2>
<span class="column-count">4</span>
</div>
<ul class="card-list">
<li class="card track-it checked">
<div class="card-meta">
<span class="track-badge track-it">IT</span>
</div>
<p class="description">Site relaunch — arcline.it copy + pricing page</p>
</li>
<li class="card track-os checked">
<div class="card-meta">
<span class="track-badge track-os">OS</span>
</div>
<p class="description">Site launch — arclineproject.org landing page</p>
</li>
<li class="card track-os checked">
<div class="card-meta">
<span class="track-badge track-os">OS</span>
</div>
<p class="description">Toolchain announcement — 11 Go tools listed publicly</p>
</li>
<li class="card track-it checked">
<div class="card-meta">
<span class="track-badge track-it">IT</span>
</div>
<p class="description">Acquired Saibeo Solutions, onboarded Ed Do as CTO</p>
</li>
</ul>
</div>
</div>
<!-- ================================================================= -->
<!-- Notes -->
<!-- ================================================================= -->
<div class="notes">
<h2>Notes</h2>
<ul>
<li>Keep `[IT]` (arcline.it, revenue-facing) and `[OS]` (arclineproject.org, GPL/open-source)</li>
<li>New codenames go in the legend table before the card is created, not after.</li>
<li>Source repos live on `git.arcline.it` — link commits/PRs in card text once work starts.</li>
</ul>
</div>
<!-- ================================================================= -->
<!-- Footer -->
<!-- ================================================================= -->
<footer>
Built with Python &amp; Jinja2 ·
<a href="https://arcline.it">arcline.it</a> ·
<a href="https://arclineproject.org">arclineproject.org</a>
</footer>
</body>
</html>