MultiPost packs + marketing CRO gates + warm-up + PhasedGrowth + incident/canary controls.
Growth day without burning young accounts.
#!/usr/bin/env python3
"""Growth Day Agent
Hybrids: MultiPost packs + Corey marketing skills context + warm_up pipeline
+ incident L1/L2/L3 map + shadowban canary stub + PhasedGrowth caps
"""
from __future__ import annotations
import json, os, random, time
from dataclasses import dataclass, asdict
from datetime import datetime, timezone
from pathlib import Path
from typing import Literal
Verdict = Literal["PASS", "FAIL", "INCONCLUSIVE"]
@dataclass
class Result:
name: str
verdict: Verdict
detail: str
evidence: dict
def account_age_days() -> int:
return int(os.environ.get("ACCOUNT_AGE_DAYS", "30"))
def phased_caps(age: int) -> dict:
# PhasedGrowth-style soft caps for young accounts
if age < 7:
return {"likes": 8, "comments": 2, "follows": 3, "posts": 1}
if age < 21:
return {"likes": 20, "comments": 6, "follows": 8, "posts": 2}
return {"likes": 40, "comments": 12, "follows": 15, "posts": 3}
def multipost_pack(caption_core: str) -> Result:
pack = {
"x": caption_core[:240],
"linkedin": caption_core + "\n\n#buildinpublic",
"instagram": caption_core + "\n.\n.\n#makers",
"tiktok": caption_core,
"youtube_short": caption_core[:100],
}
path = Path(os.environ.get("OUT_DIR", ".")) / "multipost_pack.json"
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(pack, indent=2))
return Result("multipost-pack", "PASS", str(path), {"platforms": list(pack)})
def corey_style_cro_check(landing_blurb: str) -> Result:
# Stand-in for coreyhaines marketingskills /cro thoughts
needs = ["benefit", "proof", "cta"]
missing = [n for n in needs if n not in landing_blurb.lower()]
if missing:
return Result("corey-cro", "FAIL", f"FIX missing: {missing}", {"verdict": "FIX"})
return Result("corey-cro", "PASS", "SHIP blurb structure", {"verdict": "SHIP"})
def warm_up_plan(caps: dict) -> Result:
steps = [
{"action": "open_home", "dwell_s": random.randint(12, 25)},
{"action": "scroll_feed", "count": 3, "pause_s": "poisson"},
{"action": "like", "max": min(5, caps["likes"] // 4)},
{"action": "stop_if", "signals": ["checkpoint", "shadowban", "429"]},
]
return Result("warm_up", "PASS", "plan ready", {"steps": steps, "caps": caps})
def incident_map(code: int) -> Result:
# 301→L1 reduce · 308→L2 re-export cookies · 310→L3 halt 48h
table = {
301: ("L1", "reduce volume 50% for 24h"),
308: ("L2", "re-export cookies / refresh session"),
310: ("L3", "halt 48h quarantine — no ban-loop retries"),
}
if code not in table:
return Result("incident", "PASS", "no incident", {"code": code})
level, action = table[code]
verdict: Verdict = "FAIL" if level == "L3" else "PASS"
return Result("incident", verdict, f"{level}: {action}", {"code": code, "level": level})
def shadowban_canary(tag_chrono_empty: bool) -> Result:
if tag_chrono_empty:
return Result("shadowban-canary", "FAIL", "L3 candidate — empty tag chrono", {"halt_hours": 48})
return Result("shadowban-canary", "PASS", "canary ok", {})
def main():
age = account_age_days()
caps = phased_caps(age)
blurb = os.environ.get("LANDING_BLURB", "benefit: save hours. proof: 1k teams. cta: start free.")
core = os.environ.get("CAPTION_CORE", "Ship quieter tools. Louder outcomes.")
incident = int(os.environ.get("INCIDENT_CODE", "0"))
canary_empty = os.environ.get("CANARY_EMPTY", "0") == "1"
results = [
multipost_pack(core),
corey_style_cro_check(blurb),
warm_up_plan(caps),
incident_map(incident),
shadowban_canary(canary_empty),
]
fails = [r for r in results if r.verdict == "FAIL"]
inc = [r for r in results if r.verdict == "INCONCLUSIVE"]
status = "FAIL" if fails else ("INCONCLUSIVE" if inc else "PASS")
report = {
"status": status,
"all_pass": status == "PASS",
"account_age_days": age,
"phased_caps": caps,
"ts": datetime.now(timezone.utc).isoformat(),
"results": [asdict(r) for r in results],
}
print(json.dumps(report, indent=2))
Path(os.environ.get("REPORT", "growth_report.json")).write_text(json.dumps(report, indent=2))
raise SystemExit(0 if report["all_pass"] else 2)
if __name__ == "__main__":
main()export ACCOUNT_AGE_DAYS=12 export CAPTION_CORE="Quiet tools. Loud results." export LANDING_BLURB="benefit: ship faster. proof: 200 teams. cta: try free." # export INCIDENT_CODE=308 # export CANARY_EMPTY=1 python3 /var/www/manager.addict.best/agents/growth/growth_agent.py