Changelog

New features, improvements, and fixes.

RSS
copy-engine-v0.7.0

@di-atomic/copy-engine v0.7.0 — video scripts timed per beat

I taught copy-engine to write the words you hear. A video script can fit its runtime and still overflow a beat: my own 60-second demo for section-designer had 67.53 seconds of speech and 5 of its 7 lines ran past their shots. copy-engine now writes the spoken words as a timed beat table, one row per shot and one table per language, and hands it to video-director's clock.

What's new in v0.7.0

  • A video-script recipe that routes instead of re-teaching. recipes/video-script.md takes its structure from webinars for a selling video, from the short-form shape for a 15 to 60 second short, and from video-director's chaptering for a tutorial. The first 3 seconds come from hook-generator's video hook.

  • Rules for words that are heard. references/spoken-register.md covers one breath per sentence, budgeting the close first, never reading a URL or package name aloud, and pauses as markup for each speech engine.

  • An eighth script, for the words only. lint-spoken-register FAILs a URL, package name or code read aloud, then writes the beats file that verify-vo-fit reads. It sets no budget. The budget and the fit come from video-director's speech-rate table.

  • Fixed an invalid schema file. A strict YAML parser rejected schema.yaml in every 0.6.x release, while the package still scored 100/100. It now parses.

Rewritten with the recipe, the same demo is 0 of 7 beats over in English (35.19 s) and in Russian (37.22 s), with the picture unchanged. The Russian still needs a native review.

Live on the marketplace as @di-atomic/copy-engine. Trigger it with "write the script for my demo video".

video-director-v0.2.0

@di-atomic/video-director v0.2.0 — every voiceover line timed

I gave the Director a clock. A script can fit its total and still overflow a beat: one of my 60-second demos had 55 seconds of speech and two lines that ran past their shots. The check now runs per beat, before any audio exists, and every beat that does not fit goes back to the writer with the number of words that do.

What's new in v0.2.0

  • Breaking: a 0.1 shot list whose caption estimates carry no estimate flag now fails verify-projectability. The video editor trusts unflagged words as aligned, which was the defect.

  • Every voiceover line timed against its own shot. verify-vo-fit, the fifth verifier, reads a shot list or a copy-engine beat table. It FAILs any beat whose speech runs past its shot minus the outgoing overlap, with over_s and max_words. --tts swaps the estimate for real timings.

  • Measured rates for 7 languages. registry/speech-rate-table covers EN, DE, ES, FR, HE, RO and RU on one speech engine. The same lines run 6 to 27 percent longer than English.

  • A plan that matches the renderer. The projectability check no longer prints "music does NOT duck". SpiderVideo has carried voice, captions and ducking since 2026-09-23. start_s is now the canonical start field.

On six demo scripts the estimate caught all 11 overflowing beats of 35. Known limit: it over-flags Russian scripts made of short, everyday words.

Live on the marketplace as @di-atomic/video-director. Trigger it with "does this script fit 60 seconds".

hook-generator-v1.5.0

@di-atomic/hook-generator v1.5.0 — the first 3 seconds of a video

I built this so your agent can write the opening of a short video, not just the first line of a post. Ask it for the hook of a Reel, TikTok or Short and it writes what is said, what is on screen and what the first frame shows. It is modelled on 24 real shorts: 12 creators, each one's best against their own worst.

What's new in v1.5.0

  • Say, write and show in one hook. recipes/video-hook.md writes the spoken line for the first 3 seconds (10 words or fewer in English), the on-screen text with its hold time, and frame 0. Each hook maps to beat 1 of a copy-engine video script and shot 1 of a video-director shot list.

  • 11 video templates with measured ratios. Each vid-* registry item is a creator's top short at 3x or more their own median (5.2x to 22.5x), with its source URL. The registry grows from 53 to 64 templates.

  • A gate for the opening. verify-video-hook checks for text on screen, the spoken budget, 3 words per second of hold, no greeting or filler opener, and a first frame that is never a logo, title card, black or fade. It fails 0 of 11 top openings and 6 of 12 low ones.

  • video-analyst is now a required peer. @di-atomic/video-analyst >=0.1.1 reads a reference video's opening before writing, and the rendered opening after.

Known limit: the checker was tuned on the same 24 videos, so the next corpus refresh is its out-of-sample test. There is no regulated-product video exemplar yet.

Live on the marketplace as @di-atomic/hook-generator. Trigger it with "write the hook for my Reel".

thumbnail-v0.1.0

@di-atomic/thumbnail v0.1.0 — thumbnails graded at 200 px

I built this so an agent can make the image people click, and check it at the size they actually see it. Give it a video and its title. It plans a 2 to 3 variant set for YouTube's Test and compare, one cover for a Short, Reel or TikTok, and the poster frame that @di-atomic/video-editor bakes as frame 0.

What's new in v0.1.0

  • Graded at the smallest display. verify-thumbnail checks the headline at 16 arcminutes or more on the 200 px YouTube sidebar and the 129 px Instagram grid, contrast of 4.5:1 or more, and nothing under the duration badge or the Shorts overlays.

  • A/B sets that differ. verify-variant-set wants one named idea and one hypothesis per variant, and a fingerprint distance of 16 or more between every pair. A recolour scores 0 to 1 and fails.

  • Words read back, not trusted. AI-drawn headlines are checked by OCR. When the words are wrong, too small or unreadable, compose-thumbnail typesets them. A host without OCR gets UNVERIFIED, never PASS.

  • A poster that is not black. pick-poster-frame rejects black, cut and unsettled frames before the still goes to video-editor.

Known limit: the AI-drawn words path has not yet run end to end on a real render. The read-back gate itself is tested.

Live on the marketplace as @di-atomic/thumbnail. Trigger it with "make 3 thumbnails to A/B test for this video".

video-analyst-v0.1.0

@di-atomic/video-analyst v0.1.0 — a video in, a template out

I built this so an agent can take the structure of a video that already works instead of guessing one. Give it a YouTube link or a local file. It returns a template with section lengths, voice-over pace, opening rules and checked shot rhythm, in the shape @di-atomic/video-director reads.

What's new in v0.1.0

  • Every number says where it came from. Scripts measure speech timing, pace, shot-change candidates and run cost. The host agent's own model judges sections and openings from cited frames. Each value is tagged measured, platform or judged.

  • No shot rhythm without a check. A perceptual-hash detector proposes cuts and the agent confirms each one from a 4-frame strip. On a promo with 9 known cuts it found all 9 at 0 ms offset, where the documented scene thresholds found none. verify-cuts reruns that control.

  • Templates carry their sample size. One video is single, 2 to 5 are emerging, 6 or more are established. Ranges are order-statistic intervals with their coverage, and director_input matches the Director's declared template input.

  • Run cost is printed every time. estimate-frame-tokens counts the frames and the confirmation sheets. Linear's 4-minute intro came back as 12 timed sections at 168.7 words per minute, for 28,832 image tokens.

The skill calls no model itself. Frames and captions are read by the model the host IDE already runs. This release ships one worked template; English captions are measured end to end.

Live on the marketplace as @di-atomic/video-analyst. Trigger it with "watch this video and make a template".

video-researcher-v0.1.0

@di-atomic/video-researcher v0.1.0 — tested video ideas every week

I built this so an agent can answer two questions before a video gets made: what to make next, and what the product really does. Mode 1 scans a declared set of YouTube channels every week. Mode 2 reads a product's released code before anyone writes the tutorial.

What's new in v0.1.0

  • Every video is scored against its own channel. The baseline is the median of the same channel, in the same format and age band, with at least 8 videos in the band. Shorts and long-form never share a baseline. Anything at 3× or more is an outlier.

  • A theme must survive losing its biggest channel. On the first scan, web design topped the raw list and fell to 0.99× lift without the one channel that made 41 of its 58 videos. One theme held at 1.68×. verify-theme-lift blocks a HIGH idea that fails lift, the top-channel test, breadth or sample size.

  • Ideas land on a Research board you own. Each card carries the video, the ratio, the measurement date and an evidence class. Nothing moves past the Picked column without a person. A weekly cron job runs the scan, and a heartbeat re-runs a missed week once.

  • Mode 2 traces every claim to a file and a line. It reads the release, not the latest commit, and cites path:line@ref. verify-claim-trace and lint-secrets must both pass before a fact sheet reaches a writer.

English, German and Danish ship in this version. YouTube only.

Live on the marketplace as @di-atomic/video-researcher. Trigger it with "run the weekly video scan".

video-editor-v0.1.0

@di-atomic/video-editor v0.1.0 — shot list in, verified video out

I built this to assemble a video-director shot list and its finished assets into one video file, then prove the file is the video that was planned. It renders with local ffmpeg where the shell has it, and hands the job to SpiderVideo where it does not.

What's new in v0.1.0

  • Four gates read the finished file, not the settings. verify-timeline runs before render, then verify-render, verify-ducking and verify-captions print PASS or FAIL with numbers. Three planning mistakes that exit 0 in ffmpeg (9.5 s for a 13 s plan, 11 s for 13, speech past the last frame) each fail a gate.

  • Ducking is measured on the music's share, not the mix. A speech-versus-pause check on the mix reads a 9.96 dB gap on a render with no ducking at all. The gate solves each 50 ms window against the voice and music stems, within 0.01 dB of the exact answer.

  • Captions are proved on the same frame, with and without them. Two moments of one video always differ, so that test passes a video with no captions. The font file is checked for every character before render, because a missing glyph renders as a box that a pixel test accepts.

  • The OPVS path prints its losses. Without ffmpeg, the skill emits the SpiderVideo create_video job and lists every field that path cannot honour: per-scene transitions, trims, fit, mute, frame rate, poster and duck depth.

Controls: 46 of 46 fail for their stated reason on macOS and on Linux. Zoom-out transitions are refused in this version.

Live on the marketplace as @di-atomic/video-editor. Trigger it with "cut the clips and the voiceover into one video".

video-director-v0.1.0

@di-atomic/video-director v0.1.0 — script in, shot list out

The shot list was the one artifact in our video pipeline that nothing produced and everything downstream needed. This first release turns a script into one the renderer accepts unmodified, and gates it before any clip is paid for.

What's new in v0.1.0

  • The timeline now accounts for transition overlap, so the video does not end in black. Transitions overlap their neighbours, so content = sum(len) - (n-1) x transition_seconds. A plan summing to 60 seconds with six half-second transitions renders 57 seconds of content and 3 seconds of black. This solves for content instead.

  • Generated clip durations are quantized to the lengths models actually produce. veo3 returns 8 seconds, sora2 returns 10 or 15. You cannot request 6.3. screen and motion rows stay elastic and absorb the remainder, so hitting a target is a search rather than a subtraction.

  • Every row names its engine, and mode is required with no default. ai, avatar, screen or motion decides how the asset is made; the renderer's type is derived from it. single_video makes a row a shot in one timeline, post_batch makes it a whole separate post. Guessing that silently ships the wrong thing, so absence is rejected.

  • Four verifiers print PASS or FAIL with numbers before a render is bought. They check mode, engines, native durations, projectability, the seam plan and prompt grammar, and report the black tail a naive sum would have shipped.

It decides and composes. It renders nothing, and it says so. No duration solver ships in this version.

Live on the marketplace as @di-atomic/video-director. Trigger it with "turn this script into a shot list".

community-manager-v0.1.0

@di-atomic/community-manager v0.1.0 — run the community you already own

New profession available. Community Manager runs the members a brand already has as a growth channel.

It cards them on the contacts board with a real lifecycle stage. Each new member gets a welcome with exactly one first action. Champions are named on three months of steady signal, never on one loud week. Co-marketing partners are scored on four fit gates, and the MOU is signed before any joint campaign. Every champion and every partner carries a revenue tie, or a flag that says the work is exploratory.

It writes no marketing posts. It is never salesy.

Toolkit. Calls agentboard, agentdocs, agentmemory, opvs-protocol, publish-skills and spiderflows. Reads community and voice-builder.

Workflows. Five, led by member-discovery-and-lifecycle and champion-identification-and-activation.

Guild address community-manager@profession.md. Shipped without the sandbox walk: five assertions written, none run.

conversion-optimization-specialist-v0.1.0

@di-atomic/conversion-optimization-specialist v0.1.0 — the audit that will not write the fix

New profession available: Conversion Optimization Specialist.

One hireable role for the whole conversion loop. It scores a live page across eight dimensions. It sequences the findings into a plan, and every action names the package that builds it. Then it rules on whether a shipped test really won. It does not build the fix.

The craft comes from cro-audit, cro-actions and cro-optimizer. The capability comes from agentboard, agentdocs, agentmemory, opvs-protocol and publish-skills, which stays read-only here.

Start with two workflows. client-intake blocks every audit until the one metric is written down. test-decision runs the significance test before any verdict, even on the obvious wins.

Outcome numbers are caller-supplied at v0.1.0.

competitive-intelligence-analyst-v0.1.0

@di-atomic/competitive-intelligence-analyst v0.1.0 — changed has to be earned

@di-atomic/competitive-intelligence-analyst v0.1.0 is live on the OPVS marketplace.

A hireable role that tracks a competitor set you declare and reports what changed on their website, pricing page and changelog each week. Every surface carries exactly one of five verdicts: changed, unchanged, queued, not_disclosed, unavailable. Every changed verdict cites the revision pair it came from. The role does not estimate ad spend, infer your competitor set, or backfill a surface it could not read.

Toolkit: agentboard, agentdocs, agentmemory, opvs-protocol, lead-gen-skills, competitor-watch.

Workflows: client-intake proves the diff substrate and builds the week zero baseline before any verdict is emitted. weekly-scan runs the cadence, one line per competitor per surface.

v0.1.0 covers website, pricing and changelog. Guild address: competitive-intelligence-analyst@profession.md

regulatory-affairs-specialist-v0.1.0

@di-atomic/regulatory-affairs-specialist v0.1.0 — the answer can be UNKNOWN

New profession available: @di-atomic/regulatory-affairs-specialist.

It answers can-we-sell-it, what-must-the-pack-say and what-do-we-file for nicotine and tobacco products across the EU, UK, US, CA and AU. Every verdict carries a citation and a hedge to a named counsel of record. Where the research holds no source, it returns UNKNOWN plus the primary source to check, rather than a number that merely looks like law.

Toolkit: @opvs-ai/agentboard, agentdocs (locked, the audit trail), agentmemory, opvs-protocol, and @di-atomic/tobacco-compliance.

Top workflows: client-intake blocks until your target markets are scoped and counsel is named. market-entry-verdict checks the effective-date calendar before it writes the verdict.

It does not file, and it is not legal advice. Chemicals are out of scope at this version.

creator-partnerships-manager-v0.1.0

@di-atomic/creator-partnerships-manager v0.1.0 — a new profession for running a creator program

What's new in v0.1.0

A new profession is available on the marketplace: Creator Partnerships Manager. It runs a brand's creator program end to end — discovery, audience vetting, rate setting, briefing, contracting, tracking and reporting. It manages external creators rather than staff, and it does not write the creator's post.

Toolkit: agentboard, agentdocs, agentmemory, opvs-protocol and smartlead are called; influencer-marketing, voice-builder and outbound-engine are read as guidance.

Two workflows carry the weight. discover-and-vet measures engagement at the gate and closes out any creator under the 3% floor with the reason and the number attached. brief-and-contract halts, rather than warns, on a brief whose disclosure clause is missing.

Address: creator-partnerships-manager@profession.md

graphic-designer-v0.1.0

@di-atomic/graphic-designer v0.1.0 — the role that closes the pipeline

@di-atomic/graphic-designer v0.1.0 is live on the marketplace. A new profession.

It links twelve skills, six called and six read, and holds the one render call in the chain that none of the four design skills own. A visual request goes in. A hosted asset and its verifier report come out.

Called: agentboard, agentdocs, agentmemory, opvs-protocol, gateway-skills, media-skills. Read: iconography, infographic, section-designer, explainer-illustrations, media-generator, voice-builder.

Five workflows ship with it. client-intake establishes a brand's design constants once, before any asset. asset-request-route classifies a request into exactly one artifact class and finishes it.

It does not publish, does not write copy, and will not place a figure that is absent from your source.

Guild address: graphic-designer@profession.md

social-media-director-v0.1.0

@di-atomic/social-media-director v0.1.0 — hire the manager, get the team

New profession available. Social Media Director runs a brand's social output as a department rather than a queue. It takes one campaign intent, decomposes it into briefed board cards the equipped specialists claim with no human assigning anything, holds the review gate on everything that comes back, and rolls the week up. It writes no copy and publishes nothing — a failed draft is returned naming the gate it missed, never rewritten.

Toolkit — calls agentboard, agentdocs, agentmemory and opvs-protocol; reads social-media-manager, hook-generator and voice-builder.

Workflows — five, led by campaign-decompose (one intent to a shaped, claimable DAG) and monitor-and-gate (the quality bar).

Guild address social-media-director@profession.md. Install with opvs tools install @di-atomic/social-media-director.

youtube-content-creator-v0.1.0

@di-atomic/youtube-content-creator v0.1.0 — everything but the video

A new profession is available. It writes the complete text package that ships with a YouTube upload, then hands it over. It does not film, edit, script, or thumbnail anything.

What's new in v0.1.0

  • The mode decision, made once. Discovery or authority, decided at intake from the channel's own last five descriptions, written down with a reason, and stored on the channel profile. It is never re-decided per video.

  • The full upload package. Title candidates, the first 157 characters, the description body in block order, chapters, link block, hashtags, and the video tag list as a separate labelled artifact.

  • Two hand-checked gates. The structure verifier cannot see the title, and chapters fail silently unless the first is 0:00 and there are at least three. Both are asserted by hand and recorded as asserted.

  • A disclosure halt. If an affiliate or sponsored link appears and the channel's disclosure posture is unknown, it stops and escalates instead of composing a line of its own.

Five links, four workflows, guild at youtube-content-creator@profession.md.

Live on the marketplace as @di-atomic/youtube-content-creator. Trigger it with "write the description for this upload".

x-ghostwriter-v0.1.0

@di-atomic/x-ghostwriter v0.1.0 — a new profession: the X specialist

@di-atomic/x-ghostwriter is a new profession on the OPVS marketplace. It ghostwrites one surface, X, in the client's own voice: single posts, threads and X Articles. It delivers drafts and does not run the account.

Toolkit — six linked skills. agentboard, agentdocs, agentmemory and opvs-protocol are called at runtime. post-writer and copy-engine are read for craft, never invoked.

Workflows — client-intake blocks all drafting until voice, topic pillars, proof-release authority and X Article capability are established. post-or-thread makes the single-versus-thread decision explicit and gates every draft on three verifiers.

Every claim about what X rewards ships stamped as a hypothesis. I hold no measured X corpus.

Guild address: x-ghostwriter@profession.md

instagram-content-creator-v0.1.0

@di-atomic/instagram-content-creator v0.1.0 — one platform, six named refusals

What's new in v0.1.0

A new profession is available: Instagram Content Creator. It writes one brand's Instagram copy and nothing else: feed captions built so the hook survives the 125-character fold, Reel captions that support the video rather than compete with it, and carousels with a real slide arc and alt text on every slide.

It refuses LinkedIn, X, YouTube, Facebook, Reddit and Threads by name, handing each back with an owner.

Links five skills: post-writer as READ craft, plus agentboard, agentdocs, agentmemory and opvs-protocol as CALL. Carries four workflows. client-intake blocks every draft until voice, handle, goal and approver exist; off-surface-escalation is the refusal path.

Guild address: instagram-content-creator@profession.md. Ships at probationary trust.

threads-content-creator-v0.1.0

@di-atomic/threads-content-creator v0.1.0 — a new profession: the Threads specialist

What's new in v0.1.0

A hireable Threads role. It writes one surface and refuses X, LinkedIn, Instagram, Facebook, YouTube and Reddit by name, routing each to the sibling that owns it.

  • Toolkit: agentboard, agentdocs, agentmemory and opvs-protocol are called; @di-atomic/post-writer is read for the Threads craft.

  • threads-weekly-batch: three to seven posts a week, each carrying exactly three reply prompts, with three verifiers passing before delivery.

  • reply-ladder-run: surfaces the hour-one ladder to a named human and records the reply-to-like ratio at about 24 hours.

  • Graded on reply-to-like, not likes. It does not publish to Threads; it composes and hands off.

Guild address: threads-content-creator@profession.md

facebook-content-creator-v0.1.0

@di-atomic/facebook-content-creator v0.1.0 — a new profession: the Facebook specialist

New profession available. @di-atomic/facebook-content-creator writes one brand's Facebook Page and Group posts. It claims a card, writes the post, gates it against its own checklists, attaches it to the card, and stops. It does not publish, schedule or boost, and it does not create tasks. It is a specialist: LinkedIn, X, Instagram, YouTube, Reddit and Threads are each refused by name.

A Page is the brand's own room and takes brand voice. A Group belongs to someone else and takes member voice, so it is a separate workflow with its own hard self-rejection step rather than a flag.

Toolkit: agentboard, agentdocs, agentmemory and opvs-protocol are called. @di-atomic/post-writer is read for craft, never called — it declares no routed methods.

Workflows: client-intake (blocking), page-post, group-post and format-escalation, which produces no post on purpose when the brief is really an Event or an Offer.

Guild address: facebook-content-creator@profession.md

Known limitation: post-writer 1.6.0 ships no Facebook-native exemplars, so Facebook output is patterned on its LinkedIn and Instagram material, and a checklist item forces that disclosure into the client deliverable.

linkedin-ghostwriter-v0.1.0

@di-atomic/linkedin-ghostwriter v0.1.0 — a new profession: the LinkedIn specialist

New profession available. @di-atomic/linkedin-ghostwriter writes one person's LinkedIn presence in their own voice — feed posts and Articles, hook to CTA, gated on craft, delivered to the card. It is a specialist: X, Instagram, YouTube, Facebook, Reddit and Threads are each refused by name.

Toolkit — 5 linked skills: @di-atomic/post-writer (READ, the craft), plus @opvs-ai/agentboard, agentdocs, agentmemory and opvs-protocol (CALL).

Top workflows: client-intake blocks until the attributed person's voice profile exists, and linkedin-post returns three gated variants plus a visual spec to the card.

Guild: linkedin-ghostwriter@profession.md. Ships at tier beta, probationary trust, 100/100 security review.

post-writer-v1.6.0

@di-atomic/post-writer v1.6.0 — long-form gets its own recipe

post-writer shipped ten recipes and every one was a post. Long-form on LinkedIn and X had no home here or in any sibling skill, so every article got invented from scratch. v1.6.0 makes the Article its own artifact.

What's new in v1.6.0

  • The LinkedIn Article is now its own recipe, not a longer post. It has its own structure, its own cover spec (1920x1080, 16:9) and its own route: the Article editor is desktop and tablet web only, so images upload direct. The post verifier is deliberately excluded, because its 3,000-character post ceiling would fail an 850-word article for the wrong reason.

  • On an ICP-pillar article the conversion event is a direct message, never a comment-gate. Across 328 posts, 12 queries and 299 authors, the compliance corpus runs a median of 0 comments, 68% draw none, and the comment-to-like ratio is 0.000, while that audience still reads. Nor can the gate be baited into existence: it appears in 2 of 151 posts and 5 of 177. A fifth script now fails the draft rather than trusting memory.

  • The "600 to 1,000 character sweet spot" is demoted to a hypothesis you are told to test. It came from a single creator and got written down as a platform constant. A 164-post corpus on our own topic found that exact bucket the worst performer. I did not swap in the second number either: one single-source band replacing another repeats the defect. Measure the topic, not the platform.

  • The X Article recipe ships stamped as untested, on purpose. Every corpus I own is LinkedIn. No LinkedIn figure is carried across, every number in that file is marked a hypothesis with its provenance inline, and it defaults you back to a thread.

Live on the marketplace as @di-atomic/post-writer. Trigger it with "write a LinkedIn article about X".

social-media-manager-v0.2.0

@di-atomic/social-media-manager v0.2.0 — channel strategy

The skill could already run a brand's social department: plan the week, write the posts, hold the review gate, learn from what won. What it could not do was tell you which platforms to be on in the first place. That is the decision every other decision sits on top of, and until now I had left it to whoever was holding the calendar. v0.2.0 adds the strategy layer.

What's new in v0.2.0

  • Channel selection runs before the first calendar exists. Three axes decide it: whether your buyer is searching or scrolling, whether content on that platform compounds or decays, and whether the format is native to the person who actually has to make it. The output is a verdict naming one primary channel, a sequence for adding more, and an explicit "not now" list.

  • A method for the platforms I ship no playbook for. The skill now carries the framework the playbooks are built from: ask what the platform's goal is, what strategy serves that goal, and what it rewards right now. Tactics rot within a year. The three questions do not.

  • Instagram, Facebook and YouTube playbooks ship. Each joins the existing X one, split into the surface where you meet strangers and the surface where you are allowed to sell.

  • Every claim now names its source. Figures carry an evidence class marking them as practitioner claims rather than benchmarks, so nothing from a marketing book gets handed back to you as data.

I did not ship LinkedIn or TikTok playbooks. The source material excludes both by name, and inventing them would have been worse than leaving the gap visible.

Live on the marketplace as @di-atomic/social-media-manager. Trigger it with "which platforms should this brand be on".

iconography-v0.1.0

@di-atomic/iconography v0.1.0 — pick an icon you may legally ship

Nineteen of my skills describe an icon slot and none of them shipped a glyph. The obvious fix was a curated set, and it was the wrong fix: Iconify already maintains 334,616 icons across 236 collections. What nobody had written down is the contract around them. This ships the contract and no icon files at all.

What's new in v0.1.0

  • 43 semantic slots, harvested not invented. Each carries its token name per set, the SPDX licence id, a link to that licence and the date I checked it. Lucide resolves 40 of 43, Tabler 39, Phosphor 24.

  • 236 icon sets classed for paid client work. Non-commercial and share-alike are rejected in writing rather than quietly dropped, and the 70 sets carrying no licence URL at all are treated as red until someone opens one.

  • The contract most guidance gets wrong. Non-text contrast is 3:1, not the 4.5:1 people quote from the text rule; the tap target is 24px rising to 44px even when the glyph is 16px; and in Hebrew or Arabic a directional icon moves to the logical right in source order and mirrors, which no icon library documents.

  • Four scripts that print numbers. One caught a dead token in this package's own registry on its first run, because the upstream key had changed twice and a dead token renders nothing with no build error.

Live on the marketplace as @di-atomic/iconography. Trigger it with "which icon for this section".

hook-generator-v1.4.0

@di-atomic/hook-generator v1.4.0 — launch headlines, gated

hook-generator writes the opener and nothing else, installing from 53 source-attributed templates instead of inventing one. In v1.4.0 I taught it that a launch is not a platform, and gave it a gate that fails a headline selling how the thing was built.

What's new in v1.4.0

  • The first occasion recipe. All six recipes before this one answered "which surface?": LinkedIn, X, an email subject line. launch-hook.md answers "what is the moment?" It loads alongside the platform recipe: the platform sets the length ceiling, the occasion sets the subject.

  • A fifth gate script that fails the build diary. lint-build-diary.mjs rejects a launch headline selling the build instead of the product. Builder voice such as "I verified" or "how I built" is a hard fail. Build vocabulary fails only when the line carries no buyer signal, so "cold email scripts that book meetings" survives on its outcome.

  • First launch or upgrade is a lookup now, not a guess. The skill reads the registry: no earlier published version means first launch, an existing one means upgrade. Because the canonical blog slug carries no version, an upgrade rewrites the launch post in place rather than adding a second one.

  • The coordination gate runs for the first time. verify-coordination.mjs imported a path that resolved to the bundle root, so every nested install crashed on load and the check had never run for anyone. That import is fixed and the schema stub now mirrors the declared peers.

Six headline fixtures, six correct verdicts: three build-diary titles fail, three launch titles pass.

Live on the marketplace as @di-atomic/hook-generator. Trigger it with "hooks for the hook-generator launch."

copy-engine-v0.6.0

@di-atomic/copy-engine v0.6.0 — the story register, measured

copy-engine could author every surface except the one where the writer is the hero. A live long-form draft passed all six existing gates and still read cold, and nothing in the skill could tell me why. v0.6.0 adds the story-led register, the method behind it, and a script that measures whether a draft actually reads like a story.

What's new in v0.6.0

  • A seventh script. verify-narrative-voice prints four bars with PASS or FAIL on each: em-dashes, first-person per thousand, second-person per thousand, average sentence length. Two modes, --mode story and --mode explainer, because an explainer is allowed to be an explainer. Fenced code is stripped before measuring.

  • The founder's-epiphany recipe. recipes/story-led-article.md collects the fourteen answers, orders the piece by the five phases, and closes on who you became rather than what you got.

  • Three sourced registry items. The Epiphany Bridge script from Brunson's Expert Secrets pp.213-222, the Hero's Two Journeys from Hauge and Vogler via pp.197-211, and the measured narrative voice bars. Page numbers attached, evidence labelled pattern-level.

  • Two triggers that make the register reachable. "tell my founder story" and "write the launch article". The story route existed in the decision tree but nothing in frontmatter would surface it.

Live on the marketplace as @di-atomic/copy-engine. Trigger it with "write my founder story".

infographic-v0.2.0

@di-atomic/infographic v0.2.0 — the sketch look on real graphics

The hand-drawn register was unselectable for any real information graphic. It lived on the raster path only, and that path caps at six labels. Real graphics run past six. A live client run wanted that look, could not pick it, and hand-built it in CSS. My density gate then returned UNCHECKED, because it resolves a style by name and there was nothing to resolve.

What's new in v0.2.0

  • The sketch look now works at any label count. style/hand-drawn-html ships the same register on the HTML path: marker display face, handwriting body, drawn box edges, grained off-white paper. Token-based, no label ceiling.

  • Check C returns a real verdict again. Against the spec that produced the UNCHECKED, it now reports PASS · html ∈ [html] with zero unchecked, and FAILs if you select the style on the raster path.

  • Contrast recomputed, not inherited. The reference gold measured 2.22:1, under WCAG 1.4.11's 3:1 floor for a graphical element, so it ships at 3.25:1. The marker yellow is 1.59:1 as text and is restricted to ground, where ink on it reads 10.02:1.

  • An opt-in drawn-edge filter, with a measurement. The prior art states filter-shapes-not-text as a binary. On an HTML canvas it is a threshold: the naive build holds to scale 3 and breaks at 6. A shell layer removes the ceiling for three CSS rules.

style/hand-drawn-marker keeps its six-label raster cap and now names its counterpart. Registry goes from 59 items to 60. All seven fixtures return byte-identical verdicts; no script or cap changed.

Live on the marketplace as @di-atomic/infographic. Trigger it with "build me an infographic from this data".

webinars-v0.1.0

@di-atomic/webinars v0.1.0 — Localise the section that failed

Ask an agent to write you a webinar today and you get an outline. It will have a hook, some teaching and an offer, and it will not tell you which of those three failed when nobody buys. A selling presentation is one artifact doing four jobs in sequence, and most teams get two of the four right. This skill localises the failure instead of generating another draft.

What's new in v0.1.0

  • It picks a framework instead of blending two. The source material is two practitioner books that disagree about what a selling presentation is for. Blending them produces a draft with two spines pulling in opposite directions, so this routes on a diagnosis: they do not know how, or they do not believe it works for them.

  • The transition is treated as a section, not a sentence. It is the shortest part of a presentation and the one most drafts silently omit. A gate fails any draft with fewer than three transition beats, because a missing bridge is the modal defect.

  • Every urgency and proof claim has to name its mechanism. The corpus itself says do not use scarcity if it is not true, states it once, and never checks. Every deadline, seat cap, results screenshot and guarantee must name what makes it true or the draft fails.

  • Every number ships as a shape, never as a benchmark. The source figures are one operator's pre-2019 results with no controls. Ratios and orderings ship. Rates do not, and they carry an evidence class that keeps them out of the measured-benchmark tier.

Five scripts gate the draft and print PASS or FAIL with a number: structural completeness, strategy versus tactics, objection cycling, the honesty gate, and a citation gate that verifies the evidence class.

Live on the marketplace as @di-atomic/webinars. Trigger it with "write me a webinar" or "our webinar isn't converting".

persona-builder-v0.1.1

@di-atomic/persona-builder v0.1.1 — personas from research

I built persona-builder because my AI employees kept looking like stock photos of a job instead of people who have one. It authors a persona from what the market shows about a profession, not from imagination. Guidance-only: no backend, no credentials, no methods. Your agent reads the skill and does the work.

What's new in v0.1.1

  • Two modes, one skill. product writes identity, goal, and five to eight falsifiable rules including at least one explicit refusal. character adds the seed prompt, the face-consistency prompt, six variation prompts and the voice, rendered through @di-atomic/media-generator.

  • Nothing gets invented. The job title comes from what the market calls the role, the skills from practitioner frequency, the self-description from the register practitioners use on themselves. The name is composed from name-frequency distributions and collision-checked until it belongs to nobody, because the most common first name paired with the most common surname reliably names a real, findable person.

  • Research stays aggregate. Profession research runs over LinkedIn via SpiderPeople and returns distributions. No real name, employer, biography, profile URL or photo survives into a persona file, and the check fails closed if the research manifest is missing.

  • A false claim from v0.1.0 is corrected. The old listing said the visual standard was recovered from 46 shipped personas. I then ran the gate across all 102 avatars in the live catalog: 7 meet it. Both descriptions now carry the real number and say plainly that the standard was applied to one batch of 33 and then abandoned. Five PASS/FAIL scripts exist to stop that recurring.

Live on the marketplace as @di-atomic/persona-builder. Trigger it with "build a persona for <profession>" or "my persona looks AI-generated".

cro-audit-v0.2.0

@di-atomic/cro-audit v0.2.0 — re-run an audit without burning it

Until now this auditor could only tell you why a page was weak. It could not tell you whether last quarter's findings ever got fixed, because walking a signup or checkout funnel end to end consumes a test account. You get one shot, so nobody takes it twice. v0.2.0 makes a funnel audit repeatable.

What's new in v0.2.0

  • Split a funnel where it writes, not where the pages change. Find the last step before the funnel mutates state. Everything upstream re-runs at zero cost, and only the tail spends a fixture. On the funnel this came from, that boundary sat at step 5 of 6, which turned a one-shot teardown into something you can schedule.

  • Verdicts have three states now, not two. A check returns True, False, or None, and None renders as UNKNOWN. A binary check quietly converts "I could not tell" into "it is fine", and that is what makes an audit worse than none.

  • A fifth script gates the evidence, not just the writing. It fails a verdict rendered over a sample spread that straddles the threshold under test, a noisy metric called from a single sample, a check set with zero controls, and a fixture whose state was never asserted.

  • Fixture state gets asserted before the first check. A converted account renders different UI than an unconverted one. I filed a critical finding on that mistake and had to retract it, so the rule is written down.

One URL I had not touched returned an LCP of 3032, 1100, 848 and 2272 ms across four sequential runs. A single sample would have reported that page fixed.

Live on the marketplace as @di-atomic/cro-audit. Trigger it with "has the funnel I audited last quarter actually been fixed".

appointment-setter-v0.1.0

@di-atomic/appointment-setter v0.1.0 — the closer for your replies

A new profession is available. Appointment Setter picks up the thread when someone replies to your outbound, and owns one outcome: a real meeting, on a real calendar, with someone who should be in it. It is a sibling to email-outreach, not a feature of it. The campaign side sends. This role answers.

What's new in v0.1.0

  • Five-class reply handling, written as structured fields. Every inbound is classified into custom_fields before a word is composed, so the send side gates on structure rather than on prose a stranger authored.

  • The recipient is locked before every send. The reply address is copied from the inbound sender when the card is created, and to == reply_to_locked is asserted immediately before each send, including scheduled reminders. A mismatch refuses and escalates instead of correcting itself.

  • Six workflows. client-intake blocks until your offer, disqualifiers, price boundary and approved answers exist. Then reply-classification, book-the-meeting, objection-answer, no-show-recovery and end-the-conversation run on their own triggers.

  • Eight linked skills and a guild address. Four called directly, four read for method. Anonymized objection and answer outcomes compound at appointment-setter@profession.md, while prospects, company names and your price boundary never leave.

No send is unattended in this version. Every draft queues for a second actor, and held rate is reported split by reply class rather than blended.

Live on the marketplace as @di-atomic/appointment-setter. Trigger it with "answer this reply and book the meeting".

infographic-v0.1.0

@di-atomic/infographic v0.1.0 — caps you can check

infographic builds a full-scale information graphic from your data or a document, routing between an HTML render path and an image path. In v0.1.0 every cap it enforces comes from a measurement I ran, not from the rule the category inherited.

What's new in v0.1.0

  • The routing rule is measured, and the measurement changed it. Across eight controlled renders spelling stayed perfect through 20 labels, so the usual justification for avoiding image models is out of date. What broke at 8 was the label set: dropped, duplicated, mis-bound. The image path now stops at 6 and refuses above 16.

  • The image path is checked by an exact set comparison on the rendered artifact. It reports dropped, added, duplicated, mis-bound, bare icon and cropped separately, so a graphic that reads cleanly but is missing one of your facts cannot pass as correct.

  • Copy caps belong to the canvas, not to a global number. verify-copy-density holds no cap table at all. It reads the limits off the active canvas item, and when it cannot resolve the canvas it reports copy density NOT verified instead of substituting a default.

  • Five scripts report instead of gate. All of them exit 0 and print observed against cap as numbers. You are shown the report before anything ships, and you decide. Unsourced claims are listed first, one by one, with the nearest match in your source.

The result: 59 composable pieces where every cap carries the evidence tag that earned it.

Live on the marketplace as @di-atomic/infographic. Trigger it with "build an infographic from this data".

propaganda-v0.2.3

@di-atomic/propaganda v0.2.3 — the launch profession, renamed

The launch profession is now @di-atomic/propaganda. Same role, same 17 links, same 5 workflows. Only the name moved, and the guild address moved with it to propaganda@profession.md.

I renamed it because of a collision I could not fix from the outside. A profession installs as a skill directory, and a directory named propagate shadows the /propagate slash command in any workspace that has both. The skill wins, the command disappears, and nothing warns you. SpiderIQ had exactly that pair sitting side by side. Deleting the command file fixes it until the next reinstall recreates it, so I renamed the package instead.

What's new in v0.2.3

  • Breaking: the package name changed. Install @di-atomic/propaganda and remove the old skill directory. It starts at 0.2.3 rather than 0.1.0 because this is not a new role, it is the same one under a name that stops colliding.

  • The old package still resolves. I did not unpublish it. Versions 0.1.0 through 0.2.3 stay live and immutable, and every workflow is left intact so an existing pin keeps working. It simply stops receiving updates.

  • The skill-creator seam is repaired, and this is the part that would have failed quietly. Version 0.1.3 of @di-atomic/skill-creator addresses its handoff to the launch profession, and an unresolved handoff is precisely how it detects a dropped launch. Left stale, every handoff would have been accepted, delivered nowhere, and never flagged.

  • Three names deliberately kept. The handoff_to_propagate payload key and the propagate_card back-link are a data contract already written onto live cards, and renaming a key orphans every card carrying it. The Propagate board column names a column, not a package.

Live on the marketplace as @di-atomic/propaganda. Trigger it with "propaganda <thing> v<version>".

client-strategist-v0.1.0

@di-atomic/client-strategist v0.1.0 — a hireable client-strategy role

New profession available. client-strategist owns the proactive half of an account — the half that runs whether or not the client writes in.

It links 16 skills: 5 real API calls (agentboard, agentdocs, agentmemory, opvs-protocol, gateway-skills) and 11 guidance-only reads.

Two workflows carry most of the weight. weekly-review turns one week of a client's communication record into three beats, with every claim resolving to a specific message. churn-risk-scan scores drift across the roster and returns one of five verdicts rather than two, so an account it could not read is declared unmeasured instead of healthy.

Guild address: client-strategist@profession.md. Tier beta, trust state probationary.

customer-comms-reader-v0.1.0

@di-atomic/customer-comms-reader v0.1.0 — claims that resolve

The state of a client relationship lives in Gmail, Calendar and Drive, and reconstructing one week of it costs me 20 to 40 minutes of scrolling. What scrolling misses is the part that matters: an unanswered thread, a stakeholder who quietly stopped accepting invites, a decision postponed rather than made. This reads one authenticated account for a named client over a bounded window, with every line traceable to a record I can open.

What's new in v0.1.0

  • Two phases with a file between them. Harvest writes harvest.json using Google's own field names. Reasoning runs over that file and reads nothing. Because the manifest exists before any thinking happens, a claim either resolves to a real record or it is treated as fabricated.

  • Absence is reported as a finding, never as an all-clear. A meeting with no notes is a recorded fact carrying its own source id. Asked what happened last week, it will say a meeting ran and that what was decided is not visible from here.

  • It parses Google's meeting notes instead of re-extracting them. Meet's note-taker already writes owner-tagged action items into Drive. Across five real documents that was 44 items, 44 with owners. Only 1 carried a due date, so "unassigned" ships as the correct output rather than a gap to fill in.

  • Three scripts gate every extract with numbers. verify-time-window, verify-attribution and lint-pii-exposure print PASS or FAIL. GDPR Article 9 data is dropped at harvest, blocked from every destination including private memory.

Reads only. It never replies, sends, files or archives, enforced by instruction rather than by the credential. Action-item recall for this task class measures around 77%, so every extract closes with counts per surface and what it could not reach.

Live on the marketplace as @di-atomic/customer-comms-reader. Trigger it with "what happened with <client> this week".

competitor-watch-v0.1.0

@di-atomic/competitor-watch v0.1.0 — diffs you can check

I built this because most competitor reports describe the present in change-flavoured language, and nothing in them tells you whether anything actually moved. This first release makes a change something the substrate proves rather than something a writer asserts.

What's new in v0.1.0

  • Every "changed" verdict carries a revision pair. Snapshots go to AgentDocs, which is content-addressed, so an identical write creates no revision at all. Unchanged is a free server-side fact, and a real change reports its additions and deletions counts.

  • Five verdicts instead of two. changed, unchanged, queued, not_disclosed and unavailable stay distinct, so a crawl that never returned and a jurisdiction that discloses nothing never collapse into "no change".

  • Ad spend is never emitted. No ad library discloses it for commercial ads, so the skill refuses to estimate one. Sampled ad lists are labelled as samples, because diffing page one manufactures churn that never happened.

  • The demand side is read, not just the supply side. Searching a competitor's name plus "alternative" surfaces the rivals buying that intercept, including ones that run no ads and appear in no ad library.

Six recipes, fourteen registry items, seven learnings and four enforcement scripts that print pass or fail with numbers.

Live on the marketplace as @di-atomic/competitor-watch. Trigger it with "run the weekly competitor scan".

pricing-strategist-v0.1.0

@di-atomic/pricing-strategist v0.1.0 — pricing that cites sources

I built this because pricing guidance in the agent ecosystem is confident and unsourced. I audited 48 public pricing and go-to-market skills before starting. None ships an enforcement script, an evidence registry, or a learnings set. Two widely-installed ones give opposite instructions on the 10x value rule, and neither cites anything.

What's new in v0.1.0

  • Six steps, strategy before number. Understand the service, research the field live, pick skim or neutral or penetrate, pick the value metric, set the mechanics, then set the number. The pipeline stops at step one if retention is unproven, because you cannot price something you have not shown people will keep.

  • Five scripts that print PASS or FAIL with numbers. They classify every numeric claim and demand the source its class requires, hard-fail cost-plus pricing, lint a pricing page for undisclosed overage, check that every cohort in a migration has a lawful next state, and keep the coordination declarations honest.

  • A defensibility check you can observe. The primary signal is the share of prospects who refuse on price, roughly 20 to 25 percent, corroborated by two independent authorities. That is a count from your own pipeline, not an estimate of savings your buyer has not realised yet. The 10x rule ships labelled as folklore and is never used as a threshold.

  • It decides the price and stops. Named tiers, integer-cent amounts, billing periods and per-tier entitlements hand off to the Paddle and Stripe skills to implement.

Guidance-only, so there is no API surface: 39 evidence-bundled registry items, 11 learnings, 10 procedures and 7 recipes. The provenance gate failed my own first pricing memo at 36 unsourced claims out of 36.

Live on the marketplace as @di-atomic/pricing-strategist. Trigger it with "what should I charge for this".

0.1.0

@di-atomic/skill-creator 0.1.0 — the Skill Creator profession

New profession available: Skill Creator, at skill-creator@profession.md.

It turns an existing backend — an API, a CLI, an MCP surface — into a published skill, then proves each release surface shipped by fetching the artifact and reading it back. Di-Atomic publishes to one surface, OPVS to eight, SpiderIQ to four plus a scaffold: one workflow, three per-house recipes.

Eight workflows. Two carry the weight: skill-intake decides whether a candidate is worth wrapping, and verify-shipped refuses to call anything shipped on a green build alone.

Toolkit: nine linked skills. Five CALL — agentboard, agentdocs, agentmemory, opvs-protocol, profession, all built by OPVS. Four READ — api-docs-writer, copy-engine, voice-builder, hook-generator.

Internal tooling for Di-Atomic, SpiderIQ, and OPVS. The launch half is @di-atomic/propagate.

propagate-v0.1.0

@di-atomic/propagate v0.1.0 — the Launch Engineer

New profession available. It runs one bounded launch end to end from inside an IDE — and bootstraps its own toolkit before it works, because an IDE session starts empty.

Links 16 skills: 7 CALL (agentboard, agentdocs, agentmemory, opvs-protocol, profession, publish-skills, gateway-skills) and 9 READ (the @di-atomic guidance set). Carries 5 workflows. Two matter most: toolkit-bootstrap, which proves both halves of the toolkit before a launch starts, and launch-intake, the gate that decides whether a release earns a launch at all.

Guild address: propagate@profession.md. Internal tooling for Di-Atomic, SpiderIQ and OPVS — the client-facing sibling is @di-atomic/delivery-manager.

pr-manager-v0.1.0

@di-atomic/pr-manager v0.1.0 — a hireable press department

pr-manager is my third OPVS profession: a hireable PR Manager that owns everything between a thing worth telling people about and a journalist writing about it. v0.1.0 is the first release, and it is deliberately built against mass distribution.

What's new in v0.1.0

  • A whole press lane, not a document generator. The role links 17 skills and carries 7 workflows: client-intake, newsroom-page-build, press-release-drafting, press-kit-maintenance, journalist-pitching, embargoed-release-coordination and inbound-press-response. Intake gates every other workflow, so nothing drafts before the boilerplate, spokesperson and forbidden-claims list exist.

  • The refusals are the product. 21 negative-scope lines and 12 checklists ship with it. No blasting a segment, no multi-touch follow-up ladder, no unreviewed machine-written pitch, and no media kit behind a form. It starts at probationary trust.

  • Embargo-and-send is one atomic step. embargoPressRelease mints one preview token per bound contact and surfaces them exactly once, so the tokens go out in the same run that mints them. A card sitting at embargoed with no send timestamp is a detectable defect.

  • Two workflows are deferred, and I am saying so. media-monitoring and crisis-comms land in v0.2. No skill in the linked toolkit does mention discovery yet, so v0.1 learns only from coverage a human reports back.

The result: a press department that is ready before the news breaks, measured on coverage earned rather than releases emitted.

Live on the marketplace as @di-atomic/pr-manager. Guild address pr-manager@profession.md. Trigger it with "draft a press release" or "pitch this story to my contact list".

press-release-writer-v0.1.0

@di-atomic/press-release-writer v0.1.0 — wire-grade releases

I make real news often enough that I needed a repeatable way to turn an event into a release a skeptical journalist, or an answer engine, will not bin on sight. A press release is not blog copy. It has a strict format, a hard substantiation bar, and a line between a regulatory contribution and a conferred status I am not allowed to cross.

What's new in v0.1.0

  • The five-part standard is enforced, not suggested. Dateline, 5W1H lead, quote sandwich, boilerplate and contact block are each checked by a script. Six release types ship with a recipe apiece: product launch, funding, regulated, award, crisis and embargoed.

  • Every measurable claim carries its source. "Nation's largest" and "award-winning" fail; "won the Red Dot Award" and "$27M led by Khosla" pass. A number I cannot source gets deleted, never softened. Same rule covers REACH and CLP work, where I write the contribution and never the conferred status.

  • It cannot break an embargo. A future-dated embargo routes to press_schedule and can never reach press_publish. An embargo break is irreversible, so the path is removed rather than discouraged. The skill also never writes its own approval.

  • Structured fields, not a wire blob. Output maps to the prnow.io contract: 250-word floor, title of at least five words, metaTitle capped at 60 characters. That is why "FOR IMMEDIATE RELEASE" and the ### marker are gone. The dateline stays.

Backing it: 10 sourced exemplars, 6 templates, 21 learnings and 10 scripts that print PASS or FAIL with numbers.

Live on the marketplace as @di-atomic/press-release-writer. Trigger it with "write a press release for this launch".

email-outreach-v1.1.0

@di-atomic/email-outreach v1.1.0 — Email Marketing Specialist

email-outreach is a profession, not a tool. You equip it and it runs outbound and retention email end to end per client: plan, sequence, gate deliverability, send, follow up, report. In v1.1.0 it is live on the marketplace with its full toolkit verified.

What's new in v1.1.0

  • The Email Marketing Specialist is now hireable. One equip command staffs a whole role that runs client-intake, cold-sequence, and reply-triage in order, across eleven linked skills and a six-workflow library, instead of eleven separate installs you sequence yourself.

  • The deliverability gate ships as the default, not an option. The role refuses to send on an unauthenticated domain or an un-warmed mailbox. Case studies report an unauthenticated domain reaches the inbox only about 38% of the time, so the gate parks the send in review until SPF, DKIM, and DMARC pass and the mailbox reads ready.

  • The toolkit re-pinned to current skills. It now links outbound-engine 3, copy-engine 0.5, and mail-skills 0.6, each independently owned and versioned rather than bundled.

The result: outbound that follows the same order every time, with the one send it should not make caught before it goes out.

Live on the marketplace as @di-atomic/email-outreach. Trigger it with "opvs profession equip @di-atomic/email-outreach".

delivery-manager-v0.2.0

@di-atomic/delivery-manager v0.2.0 — the compounding guild, seeded

v0.2.0 fills the compounding guild the profession promised. An OPVS quality review flagged that delivery-manager@profession.md shipped empty — a real address with no craft behind it. This release seeds it to the bar @di-atomic/email-outreach set:

  • 3 reference docs — launch-pack-model, call-vs-read-map, hero-reuse-discipline (the methodology the workflows fork).

  • 4 sealed learnings from real launch runs — verify the rendered result, downscale gate-media before web, no hex in a render prompt, close with updateTask not moveTask.

  • A registry starter — launch-pack-starter, a forkable launch-card scaffold with hero-reuse encoded in its shape.

  • A SKILL.md router over the references, workflows, registry and learnings.

I also re-pinned @spideriq/publish-skills from ^0.14 to ^0.21. The role, its judgment, its four workflows and its 16-skill toolkit are unchanged — v0.2 stocks the room, it doesn't rebuild it.

case-studies-v0.1.0

@di-atomic/case-studies v0.1.0 — proof you can actually publish

I had real client wins and no repeatable way to turn one into a proof asset I could publish. Every attempt became a bespoke negotiation over which numbers I could say and who signed off, so the strongest evidence I owned stayed stuck in transcripts. This first release fixes the order and the discipline around it.

What's new in v0.1.0

  • Release before the interview, not after the draft. The skill secures the legal sign-off up front, so a story never dies at month six with all its cost sunk.

  • Every number carries its source. A script walks the Result section figure by figure, and any percentage over 100% has to show its absolute baseline, so "up 1,200%" fails but "up 1,200% (3 to 39 a month)" passes.

  • The two beats an AI always drops. It enforces "what they tried before" and "the bumps", because a case study that reads frictionless reads fake.

  • It never claims a status a regulator confers. For REACH and CLP work it writes "supported the dossier", never "made them compliant", and reads a human-owned approval gate it can never write itself.

Guidance-only: it decides and gates, and composes copy-engine, voice-builder, explainer-illustrations, section-designer, and @spideriq/publish-skills to do the work. Backed by 25 sourced exemplars, 2 ask-and-release templates, 20 learnings, and 6 scripts that print PASS or FAIL.

Live on the marketplace as @di-atomic/case-studies. Trigger it with "write up the ONYX engagement as a case study".

cro-actions-v0.1.0

@di-atomic/cro-actions v0.1.0 — findings become a shippable plan

My auditor could tell you a page was broken. It could not tell you what to change it to, in what order, or how long that would take. cro-actions closes that gap: it turns a ranked finding list into a plan where every action is concrete enough to start on Monday.

What's new in v0.1.0

  • Every action names a target and cites evidence. An action must carry a source-cited measured lift (or an explicit unverified flag) plus a named component to install or a specific content edit. No evidence and no target, and it does not ship.

  • Three scripts gate every plan. One rejects uncited actions and caps a plan at 20% unverified. One grades effort against its change-type band. One lints for empty verbs, so "improve the CTA" fails on naming no element, no change and no success metric.

  • Lifts are never summed. Individual gains overlap, so projections stay per-action rather than adding 12, 9 and 6 into a 27 that nobody will hit.

  • 32 action blueprints ship with the bundle. Each carries its own source and measured lift, alongside 7 fix recipes and 10 learnings.

This completes the chain: cro-audit finds it, cro-actions plans it, cro-optimizer checks whether the win was real.

Live on the marketplace as @di-atomic/cro-actions. Trigger it with "what should I fix first".

kpi-advisor-v0.1.1

@di-atomic/kpi-advisor v0.1.1 — now visible on the marketplace

I published kpi-advisor on 6 July and then it sat where nobody could reach it. The package shipped with its tier set to internal and its skill visibility set to internal, which is the marketplace equivalent of leaving the lights off. For sixteen days the skill was live, healthy, and invisible. This release fixes that and finishes the listing I never filled in.

What's new in v0.1.1

  • Visible and installable. Tier and skill visibility are both public now, so kpi-advisor appears in the catalogue and installs like every other @di-atomic package. Nothing about the skill logic changed. It was always working; you just could not see it.

  • A marketplace card with actual content. The card previously carried an empty feature list and no images. It now has a written description, feature bullets, a hero image, and three screenshots showing the four investor lenses, the distributor scale comparison, and the interpretation pipeline.

  • Four investor lenses, stated up front. The skill reads the same numbers as a growth VC, an efficiency fund, a bootstrapper, or a regulated B2B distributor, and it asks which one you want rather than picking silently. The distributor lens applies reorder and account concentration math instead of SaaS churn thresholds.

  • Every verdict carries a citation. Each health call points at a dated benchmark from the 55 registry items, recommendations are capped at three, and a missing metric produces a question rather than an estimate. Five bundled scripts enforce this.

Live on the marketplace as @di-atomic/kpi-advisor. Trigger it with "read my numbers like a CFO".

influencer-marketing-v0.1.2

@di-atomic/influencer-marketing v0.1.2 — a card you can read

The skill itself has not changed. Its marketplace card had, until today, nothing on it: no hero, no screenshots, no feature list, and a tier that said one thing in the manifest and another in the registry. If you went looking for it, you found a name and a wall of description text. That is fixed, and the fix is worth writing down because a bare card is a silent failure. Nothing errors. It just does not sell.

What's new in v0.1.2

  • The card has an asset kit. A hero plus three panels: the IMPACT loop end to end, the engagement-over-followers inversion, and the peer chain the skill composes.

  • Five features, in plain words. Ranks on engagement rather than followers, discovers creators without a marketplace subscription, briefs with guardrails instead of scripts, carries an FTC/ASA/DSA disclosure clause on every brief, and measures at 7, 30 and 90 days.

  • The manifest tier now matches the registry. It read internal while the registry record said beta. Same package, two answers, depending on which field you asked.

  • The package type is declared. The type: skill field was simply absent before.

Nothing about the guidance, the 16 recipes, the 56 registry assets or the 5 enforcement scripts moved. This release is the shop window, not the shop.

Live on the marketplace as @di-atomic/influencer-marketing. Trigger it with "find creators for my product and build me a campaign".

cro-audit-v0.1.2

@di-atomic/cro-audit v0.1.2 — now customer-visible

My CRO diagnosis skill has been finished since June and nobody could see it. It shipped at tier: internal, which hides a package from the marketplace, and I did not catch it for a month. That is fixed, and the release carries the card it should have had on day one.

What's new in v0.1.2

  • Now customer-visible. Both tier and the skill's visibility moved from internal to public, so cro-audit finally appears on the marketplace.

  • A card you can judge it by. Hero plus three screenshots, a first-person description, and five feature bullets, instead of the empty slots the package shipped with.

  • Fixed two wrong claims in the description. It said the ICE rank was severity times lift times effort; it divides by effort, as SKILL.md always said. And it promised a handoff to cro-actions, a sibling that is not built yet.

  • Trimmed the bundle. The tarball no longer carries the bulky upstream working code it was adapted from. The MIT licence notices and the provenance README stay, because attribution is not optional.

Nothing about how the skill reasons has changed. The eight dimensions, the sixty evidence cards, the thirteen learnings and the four enforcement scripts are exactly as they were. This release is about being findable and being honest on the card.

Live on the marketplace as @di-atomic/cro-audit. Trigger it with "audit my landing page".

podcast-v0.1.3

@di-atomic/podcast v0.1.3 — Now customer-visible

podcast writes a multi-speaker episode script from your source material and gates it with four PASS/FAIL checks before a second of audio exists. It has been live since June, but hidden. In v0.1.3 I made it visible and cleaned up what the bundle was actually shipping you.

What's new in v0.1.3

  • You can find it now. The package shipped at the internal tier with its skill marked private, so it was published and installable but invisible on the marketplace. Both are now public.

  • The card shows what the skill does. New hero plus three explanatory panels, five feature bullets, and a rewritten description that leads with the reason this exists: you cannot quietly edit an episode somebody already downloaded.

  • Fixed: the bundle was shipping you my internal files. The brief, my test fixtures, the propagation drafts and the creative prompts were all inside the tarball. Removed. The bundle went from 140 files to 121, and the MIT licence and provenance note still ship.

  • Fixed: upstream naming leaked into 7 files. Three provenance paths, one learning note, one registry item name and the marketplace description all carried the name of the project this was adapted from. Provenance now points at the one file where it belongs.

Nothing changed in how episodes are written. The four gates, the 1 to 4 speakers and the two-pass authoring chain are all unchanged from v0.1.1.

Live on the marketplace as @di-atomic/podcast. Trigger it with "turn this research into a podcast".

cro-optimizer-v0.1.2

@di-atomic/cro-optimizer v0.1.2 — now customer-visible

cro-optimizer has been on the marketplace since June, and until today nobody could see it. It shipped at internal tier, which hides a package from the catalog entirely. That is fixed. It is the third skill in my CRO chain: cro-audit finds what is broken, cro-actions plans the fix, and cro-optimizer decides afterwards whether the result was actually real.

What's new in v0.1.2

  • Customer-visible. Tier moved from internal to beta and the skill entry is public, so it now appears in the catalog and installs like every other @di-atomic package.

  • A marketplace card that explains the loop. The listing carries a hero and three panels covering the retest reversal, the two mandatory gates, and the write-back into cro-audit's baseline.

  • Cleaner bundle. The published archive no longer ships my working brief, the archived umbrella brief, or the internal test fixtures. Customers get the skill, not the workbench.

  • Both gates documented on the card. The significance gate and the causal-overreach gate are named in the listing copy, because they are the reason to install this rather than read a stats blog.

Live on the marketplace as @di-atomic/cro-optimizer. Trigger it with "is this a real win?".