From 5585f25605c27f40aae5de26f4be93dfa8259de0 Mon Sep 17 00:00:00 2001
From: rivassec
Date: Fri, 11 Sep 2026 16:32:19 -0700
Subject: [PATCH 1/2] feature: series navigation via Series: frontmatter
Posts sharing a Series: value get an ordered part list (by date)
rendered between the header and TOC. Computed from the published
article set, so a draft member never renders a link and the box hides
itself until a series has 2+ published parts - safe to tag posts whose
siblings are still drafts.
Wired: 'Hiring as an Adversarial System' (trust-decay +
hiring-discovery, box live) and 'Anatomy of a Container Incident'
(cryptominer; box appears when the companion post publishes).
Series links are template-generated structural navigation, invisible
to check_link_graph.py's in-body outbound cap by design.
---
content/cryptominer-in-the-docker-layer.md | 1 +
content/hiring-discovery-layer-broken.md | 1 +
content/static/custom.css | 17 +++++++++++
content/trust-decay-adversarial-hiring.md | 1 +
themes/Flex/templates/article.html | 2 ++
themes/Flex/templates/partial/series_nav.html | 28 +++++++++++++++++++
6 files changed, 50 insertions(+)
create mode 100644 themes/Flex/templates/partial/series_nav.html
diff --git a/content/cryptominer-in-the-docker-layer.md b/content/cryptominer-in-the-docker-layer.md
index d5fa799c..83d85cf3 100644
--- a/content/cryptominer-in-the-docker-layer.md
+++ b/content/cryptominer-in-the-docker-layer.md
@@ -4,6 +4,7 @@ Modified: 2026-09-11 09:00
Author: Oliver Rivas
Category: DevSecOps
Tags: incident-response, devsecops, docker, forensics
+Series: Anatomy of a Container Incident
Slug: cryptominer-in-the-docker-layer
Og_image: images/og/cryptominer-in-the-docker-layer.png
Summary: A runtime detector flagged mining but ps and ss came back clean. The miner lived in the image's overlay2 diff layer, relaunched on every container restart.
diff --git a/content/hiring-discovery-layer-broken.md b/content/hiring-discovery-layer-broken.md
index decbe9e8..1b13be18 100644
--- a/content/hiring-discovery-layer-broken.md
+++ b/content/hiring-discovery-layer-broken.md
@@ -4,6 +4,7 @@ Modified: 2026-07-11
Author: Oliver Rivas
Category: DevSecOps
Tags: careers, devsecops, hiring
+Series: Hiring as an Adversarial System
Slug: hiring-discovery-layer-broken
Og_image: images/og/hiring-discovery-layer-broken.png
Summary: The senior engineering market has a routing failure, not a talent shortage: resumes and funnels index for keywords and discard the signal seniors depend on.
diff --git a/content/static/custom.css b/content/static/custom.css
index 37aae9ab..f94cd148 100644
--- a/content/static/custom.css
+++ b/content/static/custom.css
@@ -912,3 +912,20 @@ main footer a {
.author-bio p { margin: 0; color: var(--fg); line-height: 1.5; }
.author-bio a { color: var(--accent); }
@media (max-width: 600px) { .author-bio { flex-direction: column; text-align: center; } }
+
+/* Series navigation box (partial/series_nav.html): ordered part list shown
+ when a post belongs to a Series: with 2+ published members. */
+.series-nav {
+ max-width: 760px;
+ margin: 20px auto;
+ padding: 14px 22px;
+ background: var(--bg-elev);
+ border: 1px solid var(--border);
+ border-left: 3px solid var(--accent);
+ border-radius: 8px;
+}
+.series-nav-title { margin: 0 0 6px; color: var(--fg); }
+.series-nav ol { margin: 0; padding-left: 22px; }
+.series-nav li { margin: 2px 0; line-height: 1.5; }
+.series-nav a { color: var(--accent); }
+.series-nav [aria-current="page"] { font-weight: 600; color: var(--fg); }
diff --git a/content/trust-decay-adversarial-hiring.md b/content/trust-decay-adversarial-hiring.md
index 70f3d899..04960c57 100644
--- a/content/trust-decay-adversarial-hiring.md
+++ b/content/trust-decay-adversarial-hiring.md
@@ -3,6 +3,7 @@ Date: 2026-05-04
Modified: 2026-06-04
Category: DevSecOps
Tags: careers, devsecops
+Series: Hiring as an Adversarial System
Slug: trust-decay-adversarial-hiring
Og_image: images/og/trust-decay-adversarial-hiring.png
Author: Oliver Rivas
diff --git a/themes/Flex/templates/article.html b/themes/Flex/templates/article.html
index d4b13787..0003e3d6 100644
--- a/themes/Flex/templates/article.html
+++ b/themes/Flex/templates/article.html
@@ -50,6 +50,8 @@
{{ article.title }}
+ {% include "partial/series_nav.html" %}
+
{% if article.toc %}