diff --git a/AGENTS.md b/AGENTS.md
index cc594b3..b9c7e0f 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -238,3 +238,16 @@ site behavior for the next person.
for the full story). Truncate strings in PHP instead, guarded with
`function_exists('mb_substr')` falling back to `substr()`, and pass the
already-truncated value into the template.
+- Same class of bug, different filter: don't use Twig's `|escape('js')` (or
+ the `'js'` arg to `|e`) either — it calls `Twig\Runtime\mb_ord()`
+ (`novaconium/vendor/twig/src/Extension/EscaperExtension.php`), which
+ hard-requires `mbstring` the same way `|slice` does, and fatals
+ identically without it. Hit for real when
+ `novaconium/pages/_layout/code-copy.twig` used it to pass SVG icon
+ markup into an inline `
diff --git a/novaconium/pages/_layout/icons.twig b/novaconium/pages/_layout/icons.twig
index 65f6ef1..8761aa7 100644
--- a/novaconium/pages/_layout/icons.twig
+++ b/novaconium/pages/_layout/icons.twig
@@ -6,9 +6,9 @@
surrounding link/text color, including on :hover, with no extra CSS.
Available: home, git, book, link, sitemap, email, search, rss, tag,
- lock, trash, external_link, menu, back_to_top, sun, moon. Some
- (search, rss, tag) are ahead of the features that will use them (see
- novaconium/ISSUES.md) — added now so those features don't need an
+ lock, trash, external_link, menu, back_to_top, sun, moon, copy, check.
+ Some (search, rss, tag) are ahead of the features that will use them
+ (see novaconium/ISSUES.md) — added now so those features don't need an
icons.twig change later. #}
{% macro home(class) %}
@@ -144,3 +144,16 @@
{% endmacro %}
+
+{% macro copy(class) %}
+
+{% endmacro %}
+
+{% macro check(class) %}
+
+{% endmacro %}
diff --git a/novaconium/pages/_layout/layout.twig b/novaconium/pages/_layout/layout.twig
index 36ec68f..497bae2 100644
--- a/novaconium/pages/_layout/layout.twig
+++ b/novaconium/pages/_layout/layout.twig
@@ -36,5 +36,6 @@
+ {% include '_layout/code-copy.twig' %}