docs(#96): draft launch social posts - Twitter thread + LinkedIn#97
docs(#96): draft launch social posts - Twitter thread + LinkedIn#97atlas-apex wants to merge 2 commits into
Conversation
Adds projects/apexyard/launch/social.md with: - 6-tweet Twitter thread (opening hook, 3 gates, results, CTA) each estimated under 280 chars including 23-char URL counting - ~340-word LinkedIn post mirroring the same arc in prose form - Publishing sequence that keys off the blog post going live first Voice matches the launch blog post (me2resh/me2resh.com#56): direct, em-dashes, second person, concrete examples from real hooks (block-unreviewed-merge.sh, require-migration-ticket.sh, validate-pr-create.sh / verify-commit-refs.sh). Drafts only - user publishes manually to Twitter + LinkedIn after the blog post PR merges and the link is live. Closes #96
✅ Deploy Preview for apexyard canceled.
|
atlas-apex
left a comment
There was a problem hiding this comment.
Code Review: PR #97 — CHANGES REQUESTED (via comment; can't request-changes on self-PR)
Commit: 06a963d3f21edbf672199f91f9f71bcd596730a8
Summary
Content-only PR adding projects/apexyard/launch/social.md — a Twitter thread (6 tweets) and a LinkedIn post (~340 words), paired with the launch blog post tracked at me2resh/me2resh.com#56 (PR #57 there). No code, no site/, no CI workflow change.
Checklist Results
- Architecture & Design: N/A (content-only)
- Code Quality: N/A (content-only)
- Testing: N/A (content-only)
- Security: Pass (no secrets, no sensitive data)
- Performance: N/A
- PR Description & Glossary: Pass (4 substantive terms)
- Technical Decisions (AgDR):N/A (no technical decision introduced)
- Content quality: Pass (see detailed checks below)
- CI: Fail — blocking
Detailed content checks
1. Tweet character counts — PASS. Parsed each tweet out of the file and computed Twitter-adjusted length (URLs counted as 23 chars, em-dashes / smart quotes / bullets counted as 1 each):
| Tweet | Actual chars (Twitter rules) | Claimed in file | Over 280? |
|---|---|---|---|
| 1 | 259 | ~260 | no |
| 2 | 261 | ~260 | no |
| 3 | 269 | ~275 | no |
| 4 | 258 | ~275 | no |
| 5 | 238 | ~265 | no |
| 6 | 204 (text 135 + 3 URLs × 23) | ~220 | no |
All six safely under 280. The file's estimates for tweets 5 and 6 are a little high versus the actual length, but that's only extra padding margin — nothing is over the limit. Re-counting in a Twitter composer before posting (per the Testing section) is still the right final check because smart-quote / em-dash substitution in the composer's own counter can shift by 1–3 chars.
2. Voice match with the blog post — PASS. Same crisp tone (prompting doesn't scale, mechanical gates fix that, the rules are in the filesystem). The LinkedIn post compresses the blog's three hero examples (merge gate / migration gate / ticket vocabulary) into three bullets that map 1:1 to the blog's three h2 sections. Tweet 4 reuses the exact anti-pattern example from the blog (Ticket 1: X, blocked by #2) correctly.
3. Factual accuracy — PASS. Cross-checked against the blog post draft:
| Claim | Blog | Social | Match |
|---|---|---|---|
| Role definitions | 19 | 19 (LinkedIn) | yes |
| Slash commands | 33 | 33 (LinkedIn) | yes |
| Shell hooks | 18 | 18 (LinkedIn) | yes |
| AgDRs to date | 47 | 47 (tweet 5) | yes |
| Repos | 5 | 5 (tweet 1, 5, LinkedIn) | yes |
| Merge-gate marker names | <pr>-rex.approved + <pr>-ceo.approved |
same (tweet 2) | yes |
| Migration path examples | prisma/schema.prisma, alembic/versions/* |
same (tweet 3) | yes |
| Blocked merges from half-approval | four | "4 I half-approved" (tweet 5) | yes |
Note: the ops repo's CLAUDE.md still says "17 shell scripts" in the .claude/ layer table — that's drift between the repo's CLAUDE.md and the blog/social (both say 18). Not a social-PR issue; worth a follow-up to reconcile the CLAUDE.md count.
4. URL consistency — PASS. All three canonical URLs match across tweet 6, the LinkedIn post, and the blog post:
- Blog:
https://me2resh.com/blog/apexyard-where-projects-get-forged - Landing:
https://yard.apexscript.com(blog uses trailing slash variant; both resolve) - GitHub:
https://github.com/me2resh/apexyard
5. Publish sequence — PASS. Correct dependency chain: blog PR #57 merges → URL goes live → Twitter thread posts (with live URL) → LinkedIn posts → cross-link reply. Following the sequence literally avoids any broken link. The file's preamble and the Glossary's "Dormant link" definition both call out the 404 risk explicitly.
6. Glossary — PASS. 4 substantive terms (Launch thread, 23-char URL rule, Publish sequence, Dormant link). Each explains something a reader would actually need to know to work with these drafts.
7. Issue references — PASS. me2resh/me2resh.com#56 (tracking issue, OPEN) and me2resh/me2resh.com#57 (blog post PR, OPEN) both exist and are the right references. The apexyard #96 linked by Closes #96 is open with the correct title.
Issues Found — BLOCKING
Two red CI checks. Per .claude/rules/pr-quality.md § "No Red CI Before Merge": Never merge with red CI — even if the failure is pre-existing or unrelated.
B1. markdownlint-cli2 fails with MD032 at line 22. Inside the tweet-2 blockquote, the bullet list follows a narrative line without the required blank blockquote line between them:
> Every `gh pr merge` is blocked unless two files exist on disk:
> - `<pr>-rex.approved` (code review) ← MD032: needs a `>` blank line above
> - `<pr>-ceo.approved` (explicit per-PR nod)Fix: insert > on its own line between the colon line and the first bullet, and another > after the last bullet before the next narrative line. This doesn't change the rendered tweet or its char count (the blockquote syntax is just a Markdown display convenience in the source file).
B2. lychee fails with 404 on https://me2resh.com/blog/apexyard-where-projects-get-forged. This is the dormant blog URL — the PR description acknowledges it will 404 until me2resh/me2resh.com#57 merges. CI doesn't know that, though, and the repo's .lycheeignore only excludes the portfolio's own private GitHub URLs. Pick one of these fixes:
- Add a targeted line to
.lycheeignore:https://me2resh\.com/blog/apexyard-where-projects-get-forged(and remove it once the blog PR merges), or - Add a HTML-comment
<!-- lychee-ignore-next-link -->above each occurrence, or - Wrap the URLs in inline code backticks in the preamble so lychee doesn't classify them as links. The Twitter and LinkedIn blocks would still need one of the other fixes because inside a blockquote the URL remains crawlable.
Per our own rule, we can't merge with lychee red. Whichever fix you prefer, it's a one-line commit on the same branch.
Suggestions (non-blocking)
- S1. The preamble mentions
me2resh/me2resh.com#56(tracking issue) and the publish sequence mentionsme2resh/me2resh.com#57(blog PR). Both are correct, but a reader seeing two numbers may wonder why. One short line — "#56 = tracking issue, #57 = blog PR that closes it" — would remove the ambiguity. Not blocking. - S2. Tweet 5 and tweet 6 are well under their claimed estimates (238 vs ~265, 204 vs ~220). There's ~40 chars of headroom in tweet 6 if you ever want to add a short follow-hook (e.g. "Reply if you fork it and I'll take a look."). Purely optional.
Verdict
CHANGES REQUESTED — content is strong, facts and counts all check out, voice matches the blog. Two CI failures (one markdownlint MD032 line, one dormant URL in lychee) block merge per the "no red CI" rule. Both are small fixes on this branch; after a push, re-invoke the code reviewer and the review can flip to approved.
Reviewed by Rex (Code Reviewer Agent)
Reviewed commit: 06a963d3f21edbf672199f91f9f71bcd596730a8
Two CI fixes Rex flagged: 1. markdownlint MD032 on the tweet 2 blockquote - the list under "unless two files exist on disk:" needs a blank-line buffer inside the blockquote before the list starts. Added `>` empty line; list renders identically, lint passes. 2. lychee 404 on the dormant blog URL https://me2resh.com/blog/apexyard-where-projects-get-forged - the post has not been published yet (depends on me2resh/me2resh.com#57 merging first). Added the exact URL to .lycheeignore with a comment explaining why it's dormant. When the blog post ships, the ignore entry can stay (no harm) or be removed in a follow-up - lychee will start 200-ing it.
atlas-apex
left a comment
There was a problem hiding this comment.
Code Review: PR #97 (re-review after CI fixes)
Commit: 4040970e09a77a58f9c179989ddaa6d83852e49a
Summary
Re-review confirms the two targeted fixes landed cleanly on top of 06a963d, with zero scope creep.
Diff verification (06a963d → 4040970)
Only two files touched:
projects/apexyard/launch/social.md(+1 line) — adds a>blank-line buffer before the bulleted list in Tweet 2's blockquote (line 22). Fixes markdownlint MD032..lycheeignore(+4 lines) — adds the exact dormant blog URLhttps://me2resh.com/blog/apexyard-where-projects-get-forgedwith a comment explaining it becomes live whenme2resh/me2resh.com#57merges. Scoped to the single URL, not a wildcard.
No other files changed. No content drift in social.md beyond the MD032 fix.
CI status (via gh pr checks 97)
| Check | Status |
|---|---|
| Verify Ticket ID | pass |
| lychee | pass |
| markdownlint-cli2 | pass |
| netlify/apexyard/deploy-preview | pass (canceled — content-only, no site/ change) |
All three required content checks now green. Netlify pages/header/redirect rules skipped as expected since this PR is purely under projects/apexyard/launch/.
Checklist Results
- Architecture & Design: N/A (content-only, no code)
- Code Quality: Pass
- Testing: N/A (pure content artefact)
- Security: Pass (no secrets, no auth, no runtime)
- Performance: N/A
- PR Description & Glossary: Pass (4-term glossary covering launch thread, 23-char URL rule, publish sequence, dormant link)
- Technical Decisions (AgDR):N/A (no library/pattern/architecture choices)
Issues Found
None.
Suggestions
None — the fix is minimal and precisely targeted.
Verdict
APPROVED
The two fixes address exactly what CI flagged, nothing more. Content from the prior review (06a963d) stands unchanged and was already approved on substance. Safe to merge once per-PR CEO approval is recorded.
Reviewed by Rex (Code Reviewer Agent)
Reviewed commit: 4040970e09a77a58f9c179989ddaa6d83852e49a
Three count drifts Rex flagged during PR #97 review, all single-token edits: - Line 172: "17 shell scripts" -> 18 (ls .claude/hooks/*.sh excluding _lib-*.sh returns 18 real hook files; _lib-extract-pr.sh is a shared library that several hooks source, not a hook itself). - Line 173: "9 modular rule files" -> 8 (ls .claude/rules/*.md returns 8; the parenthetical already names the correct 8 categories, only the number was stale). - Line 249: "Skills (13 slash commands)" -> 33 (line 175 already said 33, line 249 was a stale reference in the Quick Reference table). README.md was already corrected in #89. This closes the analogous drift in CLAUDE.md before the launch post ships with a direct link to this repo. Closes #98
Three count drifts Rex flagged during PR #97 review, all single-token edits: - Line 172: "17 shell scripts" -> 18 (ls .claude/hooks/*.sh excluding _lib-*.sh returns 18 real hook files; _lib-extract-pr.sh is a shared library that several hooks source, not a hook itself). - Line 173: "9 modular rule files" -> 8 (ls .claude/rules/*.md returns 8; the parenthetical already names the correct 8 categories, only the number was stale). - Line 249: "Skills (13 slash commands)" -> 33 (line 175 already said 33, line 249 was a stale reference in the Quick Reference table). README.md was already corrected in #89. This closes the analogous drift in CLAUDE.md before the launch post ships with a direct link to this repo. Closes #98 Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
|
Closing per CEO decision - launch socials not shipping from this draft. Blog post (me2resh/me2resh.com#57) may ship independently; socials will be re-drafted if/when the need returns. |
Three count drifts Rex flagged during PR me2resh#97 review, all single-token edits: - Line 172: "17 shell scripts" -> 18 (ls .claude/hooks/*.sh excluding _lib-*.sh returns 18 real hook files; _lib-extract-pr.sh is a shared library that several hooks source, not a hook itself). - Line 173: "9 modular rule files" -> 8 (ls .claude/rules/*.md returns 8; the parenthetical already names the correct 8 categories, only the number was stale). - Line 249: "Skills (13 slash commands)" -> 33 (line 175 already said 33, line 249 was a stale reference in the Quick Reference table). README.md was already corrected in me2resh#89. This closes the analogous drift in CLAUDE.md before the launch post ships with a direct link to this repo. Closes me2resh#98 Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Three count drifts Rex flagged during PR me2resh#97 review, all single-token edits: - Line 172: "17 shell scripts" -> 18 (ls .claude/hooks/*.sh excluding _lib-*.sh returns 18 real hook files; _lib-extract-pr.sh is a shared library that several hooks source, not a hook itself). - Line 173: "9 modular rule files" -> 8 (ls .claude/rules/*.md returns 8; the parenthetical already names the correct 8 categories, only the number was stale). - Line 249: "Skills (13 slash commands)" -> 33 (line 175 already said 33, line 249 was a stale reference in the Quick Reference table). README.md was already corrected in me2resh#89. This closes the analogous drift in CLAUDE.md before the launch post ships with a direct link to this repo. Closes me2resh#98 Co-authored-by: me2resh <ahmed.abdelaliem@gmail.com>
Summary
Paired with the launch blog post PR on me2resh.com (#57 there). Drafts for:
Both drafts live at
projects/apexyard/launch/social.mdso they iterate independently from anything else in the repo. Publish sequence documented at the bottom of the file: blog goes live first, then Twitter, then LinkedIn.No runtime effect, no site/ change, no CI implication. Pure content artefact.
Testing
Closes #96
Glossary