From 38581cd4cc9d8faa42b86125c44763a498c18e76 Mon Sep 17 00:00:00 2001
From: Eddie Knight
Date: Tue, 22 Sep 2026 10:12:28 -0500
Subject: [PATCH 1/2] fix: repair the catalog references upstream left dangling
The 2026 remap (#38) and publications import (#39) landed with four
references to records that no longer exist, so main does not build --
`jekyll build` aborts in catalog_pages.rb's validate!.
osv-openvex was split into `openvex` (project) and `osv-schema`
(publication), leaving three referrers behind:
- guac and protobom dropped it from `compatible_with`. No information
lost: both new records already declare `compatible_with: [guac,
protobom]`, and related records render the union of both directions,
so the pages are unchanged.
- osv-record's `extends` edge is dropped. Re-authoring it against the
split records is relationship-mapping work and belongs with #42, not
with unbreaking the build; the pinned comment above the record says so
and the open question is unchanged.
gemara-whitepaper was deleted while a reference to it was added. Restored
into orbit.yml rather than uncategorized.yml, where it used to sit: #38
placed gemara itself in ORBIT, which confirms the placement the holding
pen's header had flagged as likely but unconfirmed.
Separately, #38 added malicious-packages and package-analysis without a
`url`, and about.md rendered `` for them, failing htmlproofer.
Added both urls, and guarded the two loops so a record without a url
renders no link at all -- the same `{% if %}` guard the project and
publication layouts already use.
`make test` passes. The CI that enforces this lands separately, on top.
Signed-off-by: Eddie Knight
---
data/definitions/publications.yml | 24 ++++++++-----------
data/working-groups/orbit.yml | 8 +++++++
.../securing-software-repositories.yml | 2 ++
.../working-groups/supply-chain-integrity.yml | 2 +-
data/working-groups/uncategorized.yml | 2 +-
theme/pages/about.md | 4 ++--
6 files changed, 24 insertions(+), 18 deletions(-)
diff --git a/data/definitions/publications.yml b/data/definitions/publications.yml
index 615a6c5..5d0a2fd 100644
--- a/data/definitions/publications.yml
+++ b/data/definitions/publications.yml
@@ -26,17 +26,20 @@
kind: publication
# UNRESOLVED — is OSV one publication or two?
#
-# This record and the `osv-openvex` record in
-# data/working-groups/vulnerability-disclosures.yml (also `kind: publication`
-# since the 2026 consolidation) share the same url
-# (https://ossf.github.io/osv-schema/), joined by the `osv-record extends
-# osv-openvex` edge below.
+# This record and the `osv-schema` record in
+# data/working-groups/vulnerability-disclosures.yml (also `kind: publication`)
+# share the same url (https://ossf.github.io/osv-schema/).
#
# The pair looks like it was imported without anyone deciding what OSV is here.
-# Now that both are publications, the likely resolution is merging them into
-# one record (or giving them distinct urls and a real distinction). Left as-is
+# Both being publications, the likely resolution is merging them into one
+# record (or giving them distinct urls and a real distinction). Left as-is
# deliberately — this is a question for the OSV folks, not a cleanup.
#
+# This record carried an `extends` edge pointing at `osv-openvex` until that
+# record was split into `openvex` and `osv-schema`. The edge is dropped here
+# rather than guessed at — re-authoring it is relationship-mapping work, not
+# part of unbreaking the build.
+#
# The `description` below is also truncated mid-sentence; it arrived that way and
# renders that way on /artifacts/osv-record/. Rewrite it when the above is settled.
- id: osv-record
@@ -48,13 +51,6 @@
GHSA, PyPA, Go vuln DB) and consumed by vuln scanners and SCA tools. Distinct from the
`osv-schema` project, which is the authoring effort defining the f…
kind: publication
- relationships:
- - kind: extends
- target: osv-openvex
- status: confirmed
- note: >-
- The artifact (the record format itself) is the concrete instance of what the OSV Schema
- project specifies.
- id: sarif
name: SARIF
aliases: [Static Analysis Results Interchange Format]
diff --git a/data/working-groups/orbit.yml b/data/working-groups/orbit.yml
index a475c80..9b6c0e1 100644
--- a/data/working-groups/orbit.yml
+++ b/data/working-groups/orbit.yml
@@ -64,6 +64,14 @@ projects:
note: >-
Standardizes how risk and control evidence are expressed so posture can be assessed
automatically and compared across projects.
+- id: gemara-whitepaper
+ name: Gemara Whitepaper
+ url: https://openssf.org/wp-content/uploads/2026/03/04_OpenSSF_Gemara-Project_Whitepaper.pdf
+ description: >-
+ "Gemara: A Governance, Risk, and Compliance Engineering Model for Automated Risk Assessment" —
+ the whitepaper defining Gemara's layered model of governance, risk, and compliance activities
+ and how they interoperate.
+ kind: publication
- id: minder
name: Minder
url: https://github.com/mindersec/minder
diff --git a/data/working-groups/securing-software-repositories.yml b/data/working-groups/securing-software-repositories.yml
index e5ec207..ba5db72 100644
--- a/data/working-groups/securing-software-repositories.yml
+++ b/data/working-groups/securing-software-repositories.yml
@@ -26,12 +26,14 @@ working_group:
projects:
- id: malicious-packages
name: Malicious Packages
+ url: https://github.com/ossf/malicious-packages
openssf_url: https://openssf.org/projects/malicious-packages/
description: >-
An open source database of reports of malicious packages publshed on open source package repositories.
kind: project
- id: package-analysis
name: Package Analysis
+ url: https://github.com/ossf/package-analysis
openssf_url: https://openssf.org/projects/package-analysis/
description: >-
Dynamically and statically analyzes packages from open source package registries to detect
diff --git a/data/working-groups/supply-chain-integrity.yml b/data/working-groups/supply-chain-integrity.yml
index 40bbba2..7f2a5d7 100644
--- a/data/working-groups/supply-chain-integrity.yml
+++ b/data/working-groups/supply-chain-integrity.yml
@@ -131,7 +131,7 @@ projects:
note: >-
Joins vulnerability data to the dependency graph to reveal the blast radius of a newly
disclosed flaw.
- compatible_with: [protobom, osv-openvex]
+ compatible_with: [protobom]
- id: slsa
name: SLSA
url: https://slsa.dev/
diff --git a/data/working-groups/uncategorized.yml b/data/working-groups/uncategorized.yml
index 7fff9ba..02bb914 100644
--- a/data/working-groups/uncategorized.yml
+++ b/data/working-groups/uncategorized.yml
@@ -116,7 +116,7 @@ projects:
note: >-
Generates and translates SBOMs in standard formats so the component inventory travels
with the artefact.
- compatible_with: [guac, osv-openvex]
+ compatible_with: [guac]
- id: sbomit
name: SBOMit
url: https://sbomit.dev/
diff --git a/theme/pages/about.md b/theme/pages/about.md
index 99b2bf0..1adaa9a 100644
--- a/theme/pages/about.md
+++ b/theme/pages/about.md
@@ -45,13 +45,13 @@ problem page surfaces the personas who care.
### Projects
{% for project in site.data.catalog.projects %}
-- **[{{ project.name }}]({{ '/projects/' | append: project.id | append: '/' | relative_url }})** — project site ↗
+- **[{{ project.name }}]({{ '/projects/' | append: project.id | append: '/' | relative_url }})**{% if project.url %} — project site ↗{% endif %}
{% endfor %}
### Publications
{% for pub in site.data.catalog.publications %}
-- **[{{ pub.name }}]({{ '/publications/' | append: pub.id | append: '/' | relative_url }})** — read it ↗
+- **[{{ pub.name }}]({{ '/publications/' | append: pub.id | append: '/' | relative_url }})**{% if pub.url %} — read it ↗{% endif %}
{% endfor %}
## How to use this site
From 303870115b82a7493288be32a099bcc58bd6cae6 Mon Sep 17 00:00:00 2001
From: Eddie Knight
Date: Fri, 28 Aug 2026 08:39:39 -0500
Subject: [PATCH 2/2] data: map publications to personas, problems, and project
relationships
Publications rendered persona/problem sections and relationship edges
identically to projects since the 4P's reorg, but most of the data feeding
those sections was missing. This fills the gaps:
- needs-review produces/consumes/implements edges touching sbom, vex,
osv-record, in-toto-attestation, and osps-baseline, authored on the
declaring records (bomctl, protobom, sbomit, GUAC, Zarf, Minder,
Package Analysis, OpenVEX)
- curator-drafted persona and problem mappings for the six externally-owned
specs in data/definitions/publications.yml
- a derived 'Published by' list on /publications/security-insights/, built
from each record's own insights: link rather than authored edges, so the
fact stays stated in one place
Rebased off d84d647 onto the post-remap catalog, which moved three things:
- bomctl, protobom, and sbomit left security-tooling.yml when #38 deleted
it; their sbom and in-toto-attestation edges move with them into
uncategorized.yml.
- the osv-openvex record was split by #39 into openvex (project) and
osv-schema (publication). Its `implements: vex` edge is authored on
openvex, whose note already named OpenVEX. Its six persona notes were
written for the combined record: three name one side and are assigned
accordingly, three described both and are split into a record-specific
note each, staying close to the original wording.
- osv-record's `extends` edge is authored here against osv-schema, the
record that replaced its former target.
Five edges from the original branch are gone with their declaring records:
#38 removed in-toto, slsa-github-generator, and slsa-verifier from the
catalog entirely, so there is nowhere left to author them. slsa-provenance
still has two incoming edges and is not orphaned.
`vex` was the only record in definitions/publications.yml without a
`kind:`, so relationships-section.html routed it to /projects/vex/ and
htmlproofer failed. Latent until this branch authored the first edge
pointing at it; fixed here because nothing before this needed it.
Build and link check pass.
Signed-off-by: Eddie Knight
---
data/definitions/publications.yml | 159 +++++++++++++++++-
data/working-groups/orbit.yml | 7 +
.../securing-software-repositories.yml | 7 +
.../working-groups/supply-chain-integrity.yml | 16 ++
data/working-groups/uncategorized.yml | 34 ++++
.../vulnerability-disclosures.yml | 44 +++++
theme/_layouts/publication.html | 22 +++
7 files changed, 284 insertions(+), 5 deletions(-)
diff --git a/data/definitions/publications.yml b/data/definitions/publications.yml
index 5d0a2fd..35411ae 100644
--- a/data/definitions/publications.yml
+++ b/data/definitions/publications.yml
@@ -15,6 +15,11 @@
# WHO PRODUCES/CONSUMES WHAT IS NOT AUTHORED HERE. A project declares its own
# `produces:` / `consumes:` edges in its `relationships:` list, pointing at a
# publication id. The publication pages reverse-derive from that.
+#
+# Persona / problem mappings ARE authored here, same shape as on a project.
+# Since these specs have no OpenSSF maintainer to confirm them, the mappings
+# are curator judgments about how each role uses the format — corrections
+# welcome by PR.
- id: in-toto-attestation
name: in-toto Attestation
@@ -24,6 +29,27 @@
in. Defines the predicate/statement structure and signature wrapper used by every conforming
attestation.
kind: publication
+ personas:
+ - id: security
+ note: >-
+ Verifies attestation signatures and predicates to confirm supply-chain steps ran as
+ claimed before trusting an artifact.
+ - id: devops
+ note: >-
+ Configures build and pipeline steps to emit signed in-toto attestations so each step's
+ actions are independently verifiable.
+ - id: package-manager
+ note: >-
+ Verifies incoming attestations at publish time and surfaces their provenance claims
+ to package consumers.
+ problems:
+ - id: build-provenance
+ note: >-
+ The signed envelope that carries build and supply-chain evidence from producer to verifier.
+ - id: artifact-signing
+ note: >-
+ Wraps supply-chain statements in a signature layer so tampering with the claim invalidates
+ it.
# UNRESOLVED — is OSV one publication or two?
#
# This record and the `osv-schema` record in
@@ -35,13 +61,12 @@
# record (or giving them distinct urls and a real distinction). Left as-is
# deliberately — this is a question for the OSV folks, not a cleanup.
#
-# This record carried an `extends` edge pointing at `osv-openvex` until that
-# record was split into `openvex` and `osv-schema`. The edge is dropped here
-# rather than guessed at — re-authoring it is relationship-mapping work, not
-# part of unbreaking the build.
+# The `extends` edge below pointed at `osv-openvex` until that record was split
+# into `openvex` and `osv-schema`; it is authored against `osv-schema` here and
+# left needs-review until OSV maintainers confirm the target.
#
# The `description` below is also truncated mid-sentence; it arrived that way and
-# renders that way on /artifacts/osv-record/. Rewrite it when the above is settled.
+# renders that way on /publications/osv-record/. Rewrite it when the above is settled.
- id: osv-record
name: OSV Record (vulnerability record format)
aliases: [OSV Record]
@@ -51,6 +76,36 @@
GHSA, PyPA, Go vuln DB) and consumed by vuln scanners and SCA tools. Distinct from the
`osv-schema` project, which is the authoring effort defining the f…
kind: publication
+ relationships:
+ - kind: extends
+ target: osv-schema
+ status: needs-review
+ note: >-
+ The artifact (the record format itself) is the concrete instance of what the OSV Schema
+ project specifies. Authored against `osv-schema`, which replaced `osv-openvex` in the
+ split; OSV maintainers, please confirm the target — or tell us these are one record.
+ personas:
+ - id: developer
+ note: >-
+ Checks dependencies against OSV-format advisories (osv.dev, GHSA, PyPA) to catch known-vulnerable
+ versions before shipping.
+ - id: security
+ note: >-
+ Feeds OSV records into scanners and triage so findings share one schema across every
+ ecosystem.
+ - id: devops
+ note: >-
+ Fails or flags builds when dependency scans match OSV records, keeping known-vulnerable
+ versions out of releases.
+ problems:
+ - id: vulnerability-management
+ note: >-
+ Gives every ecosystem's advisories one machine-readable schema, so a single scan covers
+ them all.
+ - id: dependency-visibility
+ note: >-
+ Identifies affected package versions precisely, so dependency inventories can be matched
+ against known vulnerabilities.
- id: sarif
name: SARIF
aliases: [Static Analysis Results Interchange Format]
@@ -60,6 +115,23 @@
by code-scanning UIs (e.g. GitHub Code Scanning) and produced by linters, scanners, and
policy tools such as Scorecard.
kind: publication
+ personas:
+ - id: developer
+ note: >-
+ Reads scanner findings as SARIF in the editor or code-scanning UI instead of parsing
+ each tool's bespoke output.
+ - id: security
+ note: >-
+ Aggregates results from multiple scanners into one SARIF-based triage pipeline.
+ - id: devops
+ note: >-
+ Wires static-analysis tools into CI once, uploading SARIF wherever the code-scanning
+ platform expects it.
+ problems:
+ - id: vulnerability-management
+ note: >-
+ Normalizes static-analysis findings into one format, so triage doesn't depend on which
+ tool found the issue.
- id: sbom
name: Software Bill of Materials
aliases: [SBOM]
@@ -69,6 +141,40 @@
authoritative formats exist (CycloneDX, SPDX); this record models the SBOM concept itself
rather than any single format.
kind: publication
+ personas:
+ - id: developer
+ note: >-
+ Publishes an SBOM with each release so consumers can see exactly which components are
+ inside.
+ - id: ospo
+ note: >-
+ Requires SBOMs across the portfolio to track the components and licenses in software
+ the organization ships and consumes.
+ - id: security
+ note: >-
+ Queries SBOMs to scope exposure within hours of a new CVE instead of auditing each application
+ by hand.
+ - id: devops
+ note: >-
+ Generates SBOMs automatically in the build pipeline so every artifact ships with its
+ component inventory.
+ - id: executive
+ note: >-
+ Meets regulatory and customer demands (e.g. EO 14028, the Cyber Resilience Act) for
+ component transparency.
+ problems:
+ - id: dependency-visibility
+ note: >-
+ The machine-readable component inventory that every downstream dependency question starts
+ from.
+ - id: vulnerability-management
+ note: >-
+ Lets known-vulnerability data be matched against a precise component list instead of
+ guesswork.
+ - id: policy-compliance
+ note: >-
+ Satisfies the component-transparency requirements that regulation and procurement increasingly
+ mandate.
- id: slsa-provenance
name: SLSA Provenance
url: https://slsa.dev/spec/v1.0/provenance
@@ -77,6 +183,27 @@
build platform identity, source revision, build parameters, and the resulting artifact
digest.
kind: publication
+ personas:
+ - id: security
+ note: >-
+ Verifies provenance against expected source, builder, and parameters to detect tampering
+ between build and deployment.
+ - id: devops
+ note: >-
+ Configures build platforms to emit signed provenance for every artifact the pipeline
+ produces.
+ - id: package-manager
+ note: >-
+ Verifies and displays build provenance for published packages so consumers can check
+ who built what, from where.
+ problems:
+ - id: build-provenance
+ note: >-
+ The attestation format that records how, where, and from what an artifact was built.
+ - id: artifact-signing
+ note: >-
+ Binds the build record cryptographically to the artifact digest so provenance can't
+ be swapped or forged.
- id: vex
name: Vulnerability Exploitability eXchange
aliases: [VEX]
@@ -85,6 +212,7 @@
A machine-readable statement asserting whether a known vulnerability affects a given software
artifact (and under what conditions). Pairs with SBOM and OSV records to reduce false-positive
vuln signals.
+ kind: publication
- id: openssf-education
name: OpenSSF Education Courses
aliases: [OSSF-EDU]
@@ -308,3 +436,24 @@
Mamber case studies demonstrating the value they have recieving in
deploying OpenSSF projects and practices.
kind: publication
+ personas:
+ - id: developer
+ note: >-
+ Issues VEX statements for their releases so users aren't paged about vulnerabilities
+ that don't actually affect the product.
+ - id: security
+ note: >-
+ Consumes VEX to suppress non-exploitable findings and focus remediation on the vulnerabilities
+ that matter.
+ - id: devops
+ note: >-
+ Gates pipelines on exploitability rather than raw CVE counts, cutting false-positive
+ build failures.
+ problems:
+ - id: vulnerability-management
+ note: >-
+ States whether a vulnerability is actually exploitable in a given product, separating
+ real risk from noise.
+ - id: dependency-visibility
+ note: >-
+ Pairs with SBOMs to turn a raw component list into an actionable picture of exposure.
diff --git a/data/working-groups/orbit.yml b/data/working-groups/orbit.yml
index 9b6c0e1..82b47a6 100644
--- a/data/working-groups/orbit.yml
+++ b/data/working-groups/orbit.yml
@@ -81,6 +81,13 @@ projects:
A software-supply-chain security platform that continuously verifies secure practices
and enforces standardized policies across repositories and artefacts.
kind: project
+ relationships:
+ - kind: consumes
+ target: osps-baseline
+ status: needs-review
+ note: >-
+ Baseline requirements can be enforced as Minder policy profiles across an organization's
+ repositories.
personas:
- id: developer
note: >-
diff --git a/data/working-groups/securing-software-repositories.yml b/data/working-groups/securing-software-repositories.yml
index ba5db72..e52b6e9 100644
--- a/data/working-groups/securing-software-repositories.yml
+++ b/data/working-groups/securing-software-repositories.yml
@@ -39,6 +39,13 @@ projects:
Dynamically and statically analyzes packages from open source package registries to detect
malicious behavior such as credential exfiltration and backdoors.
kind: project
+ relationships:
+ - kind: produces
+ target: osv-record
+ status: needs-review
+ note: >-
+ Detections feed the malicious-packages dataset, which publishes its advisories in OSV
+ format.
- id: rstuf
name: Repository Service for TUF (RSTUF)
url: https://repository-service-tuf.readthedocs.io/
diff --git a/data/working-groups/supply-chain-integrity.yml b/data/working-groups/supply-chain-integrity.yml
index 7f2a5d7..e07133d 100644
--- a/data/working-groups/supply-chain-integrity.yml
+++ b/data/working-groups/supply-chain-integrity.yml
@@ -97,6 +97,16 @@ projects:
- kind: consumes
target: slsa-provenance
status: confirmed
+ - kind: consumes
+ target: osv-record
+ status: needs-review
+ note: >-
+ Ingests OSV vulnerability data to link known vulnerabilities into the artifact graph.
+ - kind: consumes
+ target: vex
+ status: needs-review
+ note: >-
+ Ingests VEX statements so exploitability status can be queried alongside composition.
personas:
- id: developer
note: >-
@@ -194,3 +204,9 @@ projects:
Enables continuous software delivery onto air-gapped, disconnected, or otherwise constrained
systems by bundling applications and their dependencies into portable packages.
kind: project
+ relationships:
+ - kind: produces
+ target: sbom
+ status: needs-review
+ note: >-
+ Generates SBOMs for the images and components it bundles into air-gapped packages.
diff --git a/data/working-groups/uncategorized.yml b/data/working-groups/uncategorized.yml
index 02bb914..c2a8fc9 100644
--- a/data/working-groups/uncategorized.yml
+++ b/data/working-groups/uncategorized.yml
@@ -36,6 +36,17 @@ projects:
Format-agnostic Software Bill of Materials tooling that bridges the gap between SBOM generation
and SBOM analysis — fetching, merging, and manipulating SBOMs across SPDX and CycloneDX.
kind: project
+ relationships:
+ - kind: consumes
+ target: sbom
+ status: needs-review
+ note: >-
+ Fetches and merges existing SPDX and CycloneDX documents from registries and repositories.
+ - kind: produces
+ target: sbom
+ status: needs-review
+ note: >-
+ Emits the merged, translated, or otherwise manipulated SBOMs it assembles.
personas:
- id: developer
note: >-
@@ -86,6 +97,18 @@ projects:
A shared library and toolset for generating, translating, and consuming Software Bills
of Materials in standard formats such as SPDX and CycloneDX.
kind: project
+ relationships:
+ - kind: produces
+ target: sbom
+ status: needs-review
+ note: >-
+ Generates and translates SBOM documents in SPDX and CycloneDX formats.
+ - kind: consumes
+ target: sbom
+ status: needs-review
+ note: >-
+ Reads standard-format SBOMs into its protobuf representation for other tooling to work
+ with.
personas:
- id: developer
note: >-
@@ -126,6 +149,17 @@ projects:
Bills of Materials, cryptographically validating the steps performed across the software
supply chain.
kind: project
+ relationships:
+ - kind: consumes
+ target: in-toto-attestation
+ status: needs-review
+ note: >-
+ Embeds in-toto and Witness attestations into the SBOMs it processes.
+ - kind: produces
+ target: sbom
+ status: needs-review
+ note: >-
+ Outputs SBOMs carrying embedded attestations for each supply-chain step.
personas:
- id: developer
note: >-
diff --git a/data/working-groups/vulnerability-disclosures.yml b/data/working-groups/vulnerability-disclosures.yml
index df009d8..ff40175 100644
--- a/data/working-groups/vulnerability-disclosures.yml
+++ b/data/working-groups/vulnerability-disclosures.yml
@@ -72,6 +72,29 @@ projects:
description: >-
An implementation of the Vulnerability Exploitability Exchange (VEX for short) that is designed to be minimal, compliant, interoperable, and embeddable.
kind: project
+ relationships:
+ - kind: implements
+ target: vex
+ status: needs-review
+ note: >-
+ OpenVEX is a concrete, minimal implementation of the CISA VEX concept.
+ personas:
+ - id: developer
+ note: >-
+ Generates OpenVEX documents to explicitly inform users that their project is not affected
+ by a specific vulnerability found in a dependency.
+ - id: security
+ note: >-
+ Adopts OpenVEX to standardize exploitability statements and coordinate incident response
+ and analysis.
+ - id: devops
+ note: >-
+ Automates the ingestion of OpenVEX statements in the pipeline to prevent false positive
+ vulnerability alerts from breaking builds.
+ - id: executive
+ note: >-
+ Reviews documented exploitability statements to understand which disclosed vulnerabilities
+ actually carry post-release risk.
problems:
- id: vulnerability-management
note: >-
@@ -85,6 +108,27 @@ projects:
description: >-
A standard interchange format for describing vulnerabilities in open source packages.
kind: publication
+ personas:
+ - id: ospo
+ note: >-
+ Adopts the OSV schema to standardize how vulnerability information is ingested and tracked
+ across all enterprise open source usage.
+ - id: security
+ note: >-
+ Adopts the OSV Schema to standardize vulnerability reporting and coordinate incident
+ response and analysis.
+ - id: devops
+ note: >-
+ Automates the ingestion of OSV data in the pipeline so dependency scans report against
+ one machine-readable schema.
+ - id: package-manager
+ note: >-
+ Serves OSV-formatted advisories directly from the registry to ensure package consumers
+ receive actionable, machine-readable vulnerability updates.
+ - id: executive
+ note: >-
+ Reviews standardized vulnerability data formats to clearly understand post-release risk
+ during procurement and auditing.
problems:
- id: vulnerability-management
note: >-
diff --git a/theme/_layouts/publication.html b/theme/_layouts/publication.html
index 70a7226..af87fb2 100644
--- a/theme/_layouts/publication.html
+++ b/theme/_layouts/publication.html
@@ -38,4 +38,26 @@
+{%- comment -%}
+ security-insights only: which records publish a Security Insights file is
+ already stated once, by each record's own `insights:` link — so the list is
+ derived from that field, never authored as produces-edges (which would be a
+ second place to state the fact).
+{%- endcomment -%}
+{%- if publication.id == "security-insights" -%}
+{%- assign pool = site.data.catalog.projects | concat: site.data.catalog.publications -%}
+
+{%- endif -%}
+
{% include record-detail.html record=publication base="publications" %}