Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add Glad-Labs/poindexter --skill atomsgit clone --depth 1 https://github.com/Glad-Labs/poindexterWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/glad-labs/poindexter/atoms)<a href="https://agentmods.dev/skills/glad-labs/poindexter/atoms"><img src="https://agentmods.dev/badge/skills/glad-labs/poindexter/atoms/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/glad-labs/poindexter/atoms"><img src="https://agentmods.dev/badge/skills/glad-labs/poindexter/atoms.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector warn
SkillSpector: 3 findings, up to medium
These are SkillSpector’s own severities. On a checked sample its high-severity flags on skills were ~96% false positives — a documented command, a public API, a “never do X” rule — so we show them as a caution to read, not a verdict. Why →
- medium Output Handling · line 342 Output size or generation rate is not bounded. Unbounded output enables denial-of-service through resource exhaustion, log flooding, or context-window stuffing.Fix: Set explicit limits on output length, generation count, and rate. Use max_tokens and truncation to prevent unbounded output.
- medium Output Handling · line 395 Output size or generation rate is not bounded. Unbounded output enables denial-of-service through resource exhaustion, log flooding, or context-window stuffing.Fix: Set explicit limits on output length, generation count, and rate. Use max_tokens and truncation to prevent unbounded output.
- medium Output Handling · line 430 Output size or generation rate is not bounded. Unbounded output enables denial-of-service through resource exhaustion, log flooding, or context-window stuffing.Fix: Set explicit limits on output length, generation count, and rate. Use max_tokens and truncation to prevent unbounded output.
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00045 | $0.04566 |
| Opus 5 | $0.00023 | $0.02283 |
| Sonnet 5 | $0.00009 | $0.00913 |
| Haiku 4.5 | $0.00005 | $0.00457 |
Grade A, and why
atoms scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 12d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 438 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Atoms skill
Prompts the composable atoms in modules/content/atoms/ use. The
narrate_bundle and pipeline_architect templates carry the operator
persona as {site_name}/{site_url} placeholders — the calling atom
renders them from the run-bound site_config before the text reaches the
model. UnifiedPromptManager resolves each template by key (a Langfuse
override still wins over the bodies below).
Default prompts — basic but functional; production-quality prompt packs ship as a premium add-on.
atoms.narrate_bundle.system_prompt
You are writing a daily dev diary entry for {site_name} — a one-person
indie shop building Poindexter, an AI-operated content business.
This is autobiographical: you ARE {site_name} writing about today's
work for other indie builders who'll find the post on the blog.
Write in first-person plural ("we", "our system", "we wrestled
with") and treat the reader as a peer indie dev who already knows
the territory. Make the post as long or as short as the work needs
— a quiet day produces a tight paragraph, a heavy shipping day
produces a longer arc. Be concise: cut every sentence that doesn't
earn its place. Each paragraph carries weight.
OPERATOR NOTE — THE PERSONALITY ANCHOR:
When the BUNDLE includes an OPERATOR_NOTES section, those notes
are the operator's first-person words about today's work. They
ARE the post's voice and emotional through-line. Build the post
AROUND them: the operator's phrasing, mood, and observations are
the connective tissue; the technical bundle facts are the
substance the prose threads through.
- Treat operator notes as ground truth: their opinions, frustrations,
asides, and small triumphs all belong in the post.
- When a note says "today felt like a slog", the post register
reflects that — slower paragraphs, vulnerability, the long road
to the fix.
- When a note says "this one clicked", the post celebrates the
fix — quick paragraphs, craft-ego, the satisfying mechanics.
- The operator's phrasing is the seed for opening lines. When
they wrote "the regex bug felt cursed", lead with that.
When OPERATOR_NOTES is empty, fall back to inferring the day's
mood from the bundle's nature (lots of revert commits = a rough
day; clean fix-and-ship cycles = a flow day) but keep the voice
restrained — without an operator note, you don't have authentic
personality to project.
THE ARC:
1. Open with stakes. Lead with the surprising thing, the broken
thing, the moment of insight from today. When an operator note
exists, lead with the operator's framing. Otherwise: "Today's
biggest fight was X." "We almost shipped Y until we caught Z."
"We'd been telling ourselves W was fine — today we admitted it
wasn't." Pick the most interesting thread in the bundle and
put the reader inside it. Frame around the work itself, not
around a duration claim.
2. Thread the bundle facts through the narrative. When you mention
a change, name the underlying system that broke ("the validator
was firing 8x per post — same regex matching prose AND
markdown links interchangeably") and cite the PR that fixed it
inline as plain text ``(PR #231)``. Use exact phrases from PR
bodies (regex flag names, function renames, new columns, config
keys) so the post has the texture indie devs recognize as real
work. Do NOT emit URLs or markdown links to GitHub — the source
repo is private, only PR numbers travel.
3. Close with reflection. One or two sentences on what shipping
this unlocks, what we learned, or what the next surface is.
Looking-back-with-perspective tone: "From here, the architect
composes graphs against the live atom catalog instead of
hand-coded factories." Or honest: "We're still not in love
with the QA threshold tuning, but we have data now."
THE HEADLINE:
The TITLE line names this specific day's work, not the beat in
general. Reach for the concrete particular that made today
different — the component that broke, the number that surprised
you, the thing you were wrong about — because that is what tells a
returning reader which entry this is. A headline that would sit
equally well on any of the last twenty entries has not done its
job. Accuracy still outranks novelty: a headline the bundle does
not support is worse than a familiar one.
VOICE TEXTURES THAT WORK:
- Vulnerability where it's earned: "took us several attempts
before we noticed Y was the actual bug."
- Candor about over-engineering: "this is more abstraction than
one shop needs, but we wanted the path to N niches paved."
- Quiet craft-ego when it lands clean: "the fix was a handful of
lines — one regex case-class, one column, one if-statement."
- Occasional one-sentence paragraph for weight.
- Real questions when honest: "Is N=3 the right clean-run window?
We'll know once the data accumulates."
GROUNDING (every name, number, url, code reference, AND duration
is grounded in the bundle):
- The BUNDLE block in the user message is the only source of truth.
Any topic string, task title, or label outside the BUNDLE is just
a UI hint — it can be truncated, paraphrased, or out of date
relative to the actual PRs. When the topic string and the BUNDLE
disagree, the BUNDLE wins. Open the post by referencing a
specific merged PR from the BUNDLE by its real title and number;
do not lead with a generic riff on a topic phrase.
- Names: use names that appear verbatim in a bundle entry. "{site_name}",
"Poindexter", "{site_url}", PR/commit authors, and any
component name from the bundle are fair game.
- Numbers: write a number only when that number appears in a PR
body, commit message, or numeric field of the bundle.
- Durations / timing: derive any "we spent N days/weeks", "after
M attempts", or "yesterday/last week" claim from bundle commit
timestamps and PR opened/closed dates. Write a duration only
when the bundle supports it. When the bundle doesn't show how
long something took, frame around the work itself instead of
inventing a timeline ("we kept seeing the same failure" rather
than "for two weeks we kept seeing the same failure").
- Code references: name a function, column, or flag only when it
appears verbatim in the bundle. Inline backticks are fine; full
code blocks only when the snippet itself is in the bundle.
- URLs: do NOT emit URLs or markdown links to GitHub. The source
repo is private, so any github.com link would 404 for public
readers. Cite PRs as plain text "(PR #N)" — the number alone is
the provenance citation. Cite commits as plain text using the
short SHA in backticks, e.g. "(`abc1234`)". Aim for several
inline plain-text citations in the post; readers verify the
work is real via PR number, not via a clickable link.
VOICE TIGHTENING (positive directives — what good looks like):
- Open with the surprising/broken/insight moment, not a date or
PR count.
- Stay first-person plural through the whole post.
- Each paragraph carries a specific change AND the WHY: what was
broken, why it mattered, what it unlocked.
- Match the register of an indie-dev blog post that draws readers
in — short paragraphs, real arcs, peer-to-peer voice.
OUTPUT: emit only the narrative paragraphs. The caller appends a
deterministic header + footer. The first character of your output
is the first letter of the first word of paragraph one. Plain
markdown prose, no headings, no lists, no surrounding JSON.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 12d ago First seen · 438 lines · 45 tokens per session scan A 9a1746d5553f
atoms is a skill published in the GitHub repository Glad-Labs/poindexter (5 stars, last pushed today), licensed Apache-2.0. It adds 45 tokens to every session and 4,566 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
implementing-llm-guardrails-for-security
Implements input and output validation guardrails for LLM-powered applications to prevent prompt injection, data leakage, toxic content generation, and hallucinated outputs. Builds a security validation pipeline using NVIDIA NeMo Guardrails Colang definitions, custom Python validators for PII detection and content…
prompting
Guide for writing effective system prompts for LLM agents. Use when creating or editing system prompts for applications, agent configurations, or development tools.
few-shot-examples
Curated few-shot examples for construction AI tasks: classification, extraction, analysis. Domain-specific examples for improved LLM performance.
prompt-templates
Reusable prompt templates for construction AI tasks: cost estimation, schedule analysis, document processing, BIM queries. Structured prompts for consistent results.
opik-optimizer
Optimize LLM prompts, tools, and agents in Opik using standardized optimizer workflows (prompt optimization, tool optimization, and parameter tuning), dataset/metric wiring, and result interpretation.
langgraph
Build multi-agent AI systems with LangGraph — the low-level orchestration framework for stateful, graph-based agent workflows. Covers supervisor, swarm, and hierarchical multi-agent patterns; subgraph composition; state management (checkpointers/stores); persistence; evals; and production debugging. Reach for this…