mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
feat(marketing): HoM feature-spotlight X drafts + brand-voice charter (v0.18.0 B)
The Head of Marketing now markets features, not just releases: a default-off x_feature_spotlight loop periodically spawns the HoM to investigate what shipped (CHANGELOG, feature flags, docs/map, KB) and draft ONE held marketing post via propose_feature_spotlight, reviewed in the X post queue. - New x_feature source (distinct from x_post, fixing panel mislabeling) + a panel Feature-spotlight branch. - brand_voice column on company_goals (migration 061, single head) as the CEO-editable voice source, surfaced in Settings and injected into the HoM briefing; a VOICE GUIDE baseline in head-marketing.md. - propose_feature_spotlight verb (HoM-only), mirroring propose_roadmap. Gated by x_feature_spotlight_enabled (default off; flag-off dormancy proven). Also fixed two real bugs found mid-build: company_goals API schemas dropped brand_voice on GET/PUT; the live charter UI is goals-tab.tsx, not the unmounted company-goals-card.tsx. Full suite green (2935); migration single-head verified.
This commit is contained in:
@@ -71,6 +71,26 @@ describe("XPostQueue", () => {
|
||||
expect(screen.getByDisplayValue("RoboCo v0.17.0 just shipped!")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("renders a feature-spotlight draft with its own label and badge", async () => {
|
||||
listPosts.mockResolvedValueOnce([
|
||||
{
|
||||
task_id: "x-3",
|
||||
source: "x_feature",
|
||||
title: "X feature spotlight: playbooks",
|
||||
status: "pending",
|
||||
body: "Did you know RoboCo curates playbooks from real task runs?",
|
||||
char_count: 60,
|
||||
feature: { slug: "playbooks", title: "Playbook curation" },
|
||||
},
|
||||
] as XPost[]);
|
||||
|
||||
render(withQueryClient(<XPostQueue />));
|
||||
|
||||
expect(await screen.findByText("Feature spotlight")).toBeInTheDocument();
|
||||
expect(screen.queryByText("Mention reply")).not.toBeInTheDocument();
|
||||
expect(screen.getByText(/Playbook curation/)).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("disables only the row being approved, not every row's Approve", async () => {
|
||||
render(withQueryClient(<XPostQueue />));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user