Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
ec78a0f
feat(MAX-534): add memory marketplace optimization pack
Apr 19, 2026
c9d207a
MAX-542: add orchestrator course outline proof pack (#7)
maxtechera Apr 26, 2026
fc6bf96
MAX-565: add /orchestrator course outline and preview lesson (#9)
maxtechera Apr 26, 2026
720c56c
content(MAX-569): add orchestrator OSS reel package (#10)
maxtechera Apr 26, 2026
f85c9a1
feat(MAX-548): add orchestrator reel series package (#11)
maxtechera Apr 26, 2026
7bca7b8
MAX-545: add OSS tools demo-first funnel package (#12)
maxtechera Apr 26, 2026
e540262
Add MAX-549 ship reel package schema and proofs (#14)
maxtechera Apr 26, 2026
3af273b
content: add MAX-561 claude-plugins social package (#18)
maxtechera Apr 26, 2026
b826e15
MAX-564: add /memory course outline package (#19)
maxtechera Apr 26, 2026
9697364
feat(MAX-570): add /ship OSS demo-first content bundle (#20)
maxtechera Apr 26, 2026
b35d877
MAX-511: build 7-day Instagram story engagement pack (#22)
maxtechera Apr 26, 2026
479ba62
MAX-554: add Ship launch proof pack (#24)
maxtechera Apr 26, 2026
b5b29be
feat: add MAX-527 ship launch content package (#25)
maxtechera Apr 26, 2026
dd6ddae
chore(MAX-531): optimize GitHub repo presentation (#26)
maxtechera Apr 26, 2026
9eb65a9
content: add MAX-530 launch asset pack (#28)
maxtechera Apr 26, 2026
6381abc
MAX-594: add YouTube Short placement artifacts
maxtechera May 9, 2026
7c29df6
MAX-542: Align course outline to requested modules
maxtechera May 9, 2026
eeb82a9
MAX-669: X Thread
maxtechera May 9, 2026
ddb4f7c
MAX-542: add course waterfall build
maxtechera May 9, 2026
5dc86f7
MAX-668 IG carousel assets
maxtechera May 9, 2026
a5b008a
MAX-670 LinkedIn placement
maxtechera May 9, 2026
bec0f00
Enforce inline media proof-pack comments
maxtechera May 9, 2026
c9dcf7f
Resolve MAX-534 README conflict
May 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
23 changes: 22 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
# /orchestrator

[![GitHub stars](https://img.shields.io/github/stars/maxtechera/orchestrator?style=flat&label=GitHub%20stars)](https://github.com/maxtechera/orchestrator/stargazers)
[![Proof-driven workflow](https://img.shields.io/badge/proof--driven-verified%20delivery-2563eb)](https://github.com/maxtechera/orchestrator/blob/main/README.md#orchestrator)
[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
[![Version](https://img.shields.io/badge/version-1.0.0-green.svg)](CHANGELOG.md)

**Expert orchestrator of agentic teams. The ticket contract defines work. The verification harness rules completion.**
**Verified AI-agent workflow orchestrator for Claude Code. Dispatch workers, run independent checks, ship only what passes.**

Claude Code:
```
Expand Down Expand Up @@ -51,6 +53,25 @@ git clone https://github.com/maxtechera/orchestrator.git ~/.claude/skills/orches

That's it. Run `/orchestrator sweep` to get started. If no board is connected, the orchestrator will prompt you to run `/orchestrator setup`. See [Your First Ticket](#your-first-ticket) below for a copy-paste template.

## Learn `/orchestrator`

Want the full operating system behind reliable agent teams?

- **Course:** [`/orchestrator` course outline](docs/course-outline.md)
- **Free lesson workbook:** [The context-limit wall and why single-agent workflows break](docs/sample-lessons/module-1-lesson-1-context-limit-wall.md)
- **Paid course CTA:** **Aprendé a orquestar equipos de agentes → curso `/orchestrator` ($197)**

The free OSS skill helps you run the workflow. The paid course teaches you how to design the contracts, memory, reliability layers, and production patterns behind it.

### Marketplace packaging playbooks

If you are preparing a companion skill or repo for Claude Code marketplace submission, use these proof-first packaging docs:

- [Memory marketplace optimization package](docs/memory-marketplace-package.md)
- [MAX-534 proof pack](artifacts/MAX-534/proof-pack.md)

The memory package includes the final GitHub description, topic set, social preview card, manifest verification checklist, and install steps to copy into the target repo README before submitting.

---

## What people use it for
Expand Down
15 changes: 15 additions & 0 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,3 +217,18 @@ Works with any issue tracker. Run `/orchestrator setup` to connect:
- The system fails visibly, not silently
- Finishing beats starting
- You define the boundaries. The harness operates inside them.

## Proof-pack comment hook

Before posting proof-pack comments on markdown-rendering surfaces such as Linear, GitHub, Slack, Discord, or Notion, fail closed on media formatting.

Reject the comment and rewrite it if any of the following are true:
- local image paths like `/data/workspace/artifacts/...png` appear without a sibling markdown embed `![](...)`
- MP4 proof is named but not uploaded as an attachment or public link
- the comment relies on filesystem paths as the primary proof surface

Required behavior:
1. Upload image proof first
2. Inline the uploaded image URL with markdown
3. Upload MP4 proof and include the public attachment link in the same proof pack
4. Only then post the final proof comment
27 changes: 27 additions & 0 deletions WORKFLOW.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,33 @@ Agent CANNOT self-transition to Done without all 5 elements:
- State transition without artifact
- Checklist tick without evidence
- Status comment without proof delta
- File path references without embedded media on surfaces that support rendering

### Media embedding (cross-surface rule)

When posting proof or evidence to any surface that renders markdown (Linear, GitHub, Slack, Discord, Notion), embed media inline. Do not just paste filesystem paths.

- **Images**: upload to the surface's file storage, then inline with `![caption](url)`
- **Video / MP4**: upload as an attachment and include a link in the proof pack
- **Filesystem paths** are fallback only, and count as zero-credit proof when a renderable surface is available

Surface specifics:
- **Linear**: upload via the Linear API or CLI attachment flow and use the returned public URL in `![](...)`
- **GitHub**: attach to the PR or issue and use the resulting public attachment URL
- **Slack / Discord / Notion**: attach the media and reference it inline where supported

If embedding fails, say so explicitly in the comment and attach via the surface attachment system. Never fall back silently to raw paths.

### Pre-comment hook (required before proof-pack comments)

Before posting any proof-pack or verification comment, run this fail-closed lint:

1. Scan the comment body for `/data/workspace/artifacts/*.png`, `.jpg`, `.jpeg`, `.gif`, or `.webp`
2. For every local image path found, require a sibling markdown embed `![](...)` or `![alt](...)` that points to a public attachment URL for that same proof item
3. Reject the comment if it references local media paths without an inline embed
4. For MP4 references, require an uploaded attachment or public link in the same proof pack comment

If the hook fails, do not post the comment. Upload the media first, rewrite the proof pack, then post.

### Domain Verification Checklists

Expand Down
Binary file added artifacts/MAX-511/final_mp4_attachment.mp4
Binary file not shown.
90 changes: 90 additions & 0 deletions artifacts/MAX-511/generate_assets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
from pathlib import Path
from PIL import Image, ImageDraw, ImageFont
import textwrap

OUT = Path(__file__).resolve().parent
W, H = 1080, 1920
BG = (7, 17, 31)
CARD = (17, 38, 64)
ACCENT = (135, 247, 198)
MUTED = (164, 182, 201)
WHITE = (244, 247, 251)
PINK = (255, 139, 214)

slides = [
("Día 1", "Dolor + conversación", [
"Tu contenido no falla por falta de ideas.",
"Falla por falta de sistema diario.",
"Poll: ¿Tus stories venden o solo mantienen presencia?",
"CTA: respóndeme STORIES"
]),
("Día 2", "Framework + newsletter", [
"Hook + prueba + pregunta + CTA.",
"No necesitas diseño complejo.",
"Necesitas una secuencia repetible.",
"CTA: entra a la newsletter"
]),
("Día 3", "Prueba social + workshop", [
"Una story bien armada suma conversaciones.",
"Más replies = más intención.",
"Question: ideas, consistencia o convertir.",
"CTA: workshop waitlist"
]),
("Día 4", "Behind the scenes + replies", [
"Qué fricción siente la audiencia.",
"Qué micro-prueba mostrar.",
"Qué acción mínima pedir.",
"CTA: responde y te mando plantilla"
]),
("Día 5", "Plantilla + office hours", [
"Hook listo para usar.",
"Prueba con insight o resultado.",
"Pregunta para activar respuesta.",
"CTA: súmate a office hours"
]),
("Día 6", "Segmentación", [
"Stories para separar curiosidad e intención.",
"Poll: ¿más ideas o más conversión?",
"Ideas → newsletter.",
"Conversión → DM"
]),
("Día 7", "Cierre + conversión", [
"Las stories son un canal diario de demanda.",
"Generan taps, replies y conversiones.",
"Repite la secuencia con intención.",
"CTA: únete al workshop"
])
]

font_paths = [
"/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
]
for p in font_paths:
if not Path(p).exists():
raise SystemExit(f"Missing font: {p}")

bold = ImageFont.truetype(font_paths[0], 88)
sub = ImageFont.truetype(font_paths[0], 44)
body = ImageFont.truetype(font_paths[1], 46)
small = ImageFont.truetype(font_paths[1], 34)

for i, (day, title, bullets) in enumerate(slides, start=1):
img = Image.new("RGB", (W, H), BG)
draw = ImageDraw.Draw(img)
draw.rounded_rectangle((60, 70, W - 60, H - 70), radius=48, fill=CARD)
draw.text((110, 130), "MAX-511", font=small, fill=ACCENT)
draw.text((110, 190), day, font=bold, fill=WHITE)
draw.text((110, 310), title, font=sub, fill=PINK)
draw.text((110, 410), "Stories pack para newsletter + workshop", font=small, fill=MUTED)

y = 520
for bullet in bullets:
lines = textwrap.wrap(bullet, width=28)
draw.rounded_rectangle((105, y - 18, W - 105, y + 90 + 52 * (len(lines)-1)), radius=28, fill=(13,27,46))
draw.text((140, y), "•", font=sub, fill=ACCENT)
draw.text((190, y), "\n".join(lines), font=body, fill=WHITE, spacing=10)
y += 170 + 46 * (len(lines)-1)

draw.text((110, H - 210), "max-techera | sistema de stories manual y repetible", font=small, fill=MUTED)
img.save(OUT / f"slide-{i:02d}.png")
46 changes: 46 additions & 0 deletions artifacts/MAX-511/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"ticket_id": "MAX-511",
"content_type": "content_asset",
"target_repo": "maxtechera/orchestrator",
"target_system": "mailerlite",
"brand": "max-techera",
"locale": "es",
"placements": {
"instagram_stories": {
"asset": "artifacts/MAX-511/story-pack.md",
"tracking_sheet": "artifacts/MAX-511/tracking-sheet.csv",
"days": 7,
"frames_per_day": "3-5",
"audience_intent": [
"newsletter",
"workshop",
"office_hours",
"reply_prompt"
],
"cta_map": [
{"day": 1, "cta": "Responder DM con STORIES", "interaction": "poll + dm"},
{"day": 2, "cta": "Newsletter", "interaction": "educational frame"},
{"day": 3, "cta": "Workshop waitlist", "interaction": "question sticker"},
{"day": 4, "cta": "Reply prompt", "interaction": "question sticker"},
{"day": 5, "cta": "Office hours", "interaction": "template value stack"},
{"day": 6, "cta": "Newsletter o DM", "interaction": "poll segmentation"},
{"day": 7, "cta": "Workshop", "interaction": "dm or link cta"}
]
},
"mailerlite_supporting_asset": {
"purpose": "newsletter growth and workshop intent collection",
"copy_angle": "Historias diarias que generan replies, taps y conversiones sin depender solo del feed"
}
},
"proof": {
"preview_urls": [
"artifacts/MAX-511/preview.html"
],
"screenshots": {
"rendered_html_preview_screenshot": "artifacts/MAX-511/rendered_html_preview_screenshot.png"
},
"final_mp4_attachment": "artifacts/MAX-511/final_mp4_attachment.mp4",
"linear_attached_visual_proof": "artifacts/MAX-511/rendered_html_preview_screenshot.png",
"pr_url": "https://github.com/maxtechera/orchestrator/pull/22"
}
}
Loading
Loading