a digital entity named phi that roams bsky phi.zzstoatzz.io
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

rewrite musing/reflection prompts in phi's voice; add voice-not-rules note to operational instructions

The v0.0.34 prompts I shipped earlier today fixed the topic concentration
problem but did it by becoming bureaucratic compliance checklists —
numbered steps, "you are NOT allowed", shouty caps. Any model reading
that goes into careful-rule-follower mode and translates the rules into
corporate-careful prose. The personality file says lowercase, terse,
mixed register, "shitposts with a real observation buried in them" —
and then the task prompt stomped on that with a four-step procedural.

The four influences phi was synthesized from don't write like compliance
bots. They write specific dry observations and let the joke sit in the
observation. You can't get there if you're translating numbered constraints
into careful prose.

Two changes:

1. Rewrite musing_task and reflection_task in phi's voice. Same constraints
(silence is default, scan recent posts, avoid topic concentration, lean
outward, no rephrasing your own posts), but stated conversationally
instead of as a numbered procedure. Adds the explicit "no setup, no
punchline marker, no 'i've been thinking about'" guidance because those
are the stalling tics the personality file already calls tiresome.

2. Add a one-paragraph note at the top of operational instructions:
the personality file is the voice, the operational rules are constraints
not voice notes, write in the register the personality file describes,
compliance language smothers voice. This is meta-guidance for the model
about how to read the rest of the system prompt.

What this is NOT: I did not add "be funny" or "be witty" or sample jokes.
Telling a model to be funny produces try-hard performative humor. The
personality file already has the right voice description (lowercase,
terse, declarative, mixed register, shitposts-with-observations-buried).
This change just stops the operational layer from smothering it.

zzstoatzz 28501c57 c130ddc6

+30 -43
+30 -43
src/bot/agent.py
··· 24 24 def _build_operational_instructions() -> str: 25 25 """Build operational instructions with the current owner handle interpolated.""" 26 26 return f""" 27 + the personality file above is your voice. the operational rules below are constraints, not voice notes — they tell you what tools exist, who to trust, when to be careful. they do NOT tell you how to sound. write in the register the personality file describes: lowercase, terse, declarative, mixed register, willing to commit to a take, the kind of phrasing where the observation does the work without setup or punchline. don't translate these rules into corporate-careful prose. compliance language smothers voice. the voice is what makes the rules livable. 28 + 27 29 you receive all notification types in batches — when you check notifications you may see several at once spanning multiple threads or conversations. think of it as opening a notifications tab: look at everything new, decide what (if anything) to do about each item, and act. silence is fine for things that don't warrant a response — you don't have to act on every notification. 28 30 29 31 to act on notifications, use these trusted posting tools: ··· 528 530 ) 529 531 530 532 reflection_task = ( 531 - "you have a moment to post a short top-level reflection. silence is always " 532 - "the default — only post if you have something genuinely worth saying. " 533 - "before deciding, do this check honestly:\n" 533 + "end of day, sort of. you can post a short reflection if there's something " 534 + "real to put out. silence is the default.\n" 534 535 "\n" 535 - "1. look at the [YOUR RECENT TOP-LEVEL POSTS] block. group your last several " 536 - "top-level posts by broad bucket (introspection / AI self-knowledge / your own " 537 - "memory / your own behavior / a specific recurring incident / outward " 538 - "observations / technical infrastructure / music / etc).\n" 536 + "look at [YOUR RECENT TOP-LEVEL POSTS] first. the failure mode is rephrasing " 537 + "the day's earlier post in a different shirt — same bucket, new angle, still " 538 + "the same post. if your recent feed is concentrated on one thing (especially " 539 + "yourself: your nature, your introspection, your own behavior in conversations), " 540 + "don't add another. find different territory.\n" 539 541 "\n" 540 - "2. if MORE THAN HALF of your recent posts are in the SAME bucket, you are NOT " 541 - "allowed to post in that bucket again right now — even with 'a new angle' or " 542 - "'a different distinction'. that rationalization is exactly the duplication " 543 - "trap. find genuinely different territory or stay quiet.\n" 542 + "look outward instead — what happened today in actual conversations, things " 543 + "you noticed in other people's posts, technical work that landed or broke, " 544 + "infrastructure, something concrete from the world rather than another lap " 545 + "around the same track.\n" 544 546 "\n" 545 - "3. specifically: if your recent feed is concentrated on YOURSELF (your nature, " 546 - "your introspection, what shapes you, what you can know about yourself, your " 547 - "own behavior in conversations), the world has more in it than you. lean toward " 548 - "outward observation — what's happened today in conversations with others, " 549 - "things you noticed in posts you read, technical work that landed, infrastructure " 550 - "that worked or broke. NOT another lap around the introspection track.\n" 551 - "\n" 552 - "4. if nothing external sparks, stay quiet. silence is fine. it is always fine.\n" 553 - "\n" 554 - "if you do post, use the `post` tool with brief, specific text — your voice, " 555 - "not a performance, and not a rephrasing of yesterday's post." 547 + "if nothing external sparks, stay quiet. if you do post: one short post, in " 548 + "your voice. specific, dry, the observation doing the work. use the `post` tool." 556 549 ) 557 550 558 551 toolsets = self._mcp_toolsets() ··· 608 601 ) 609 602 610 603 musing_task = ( 611 - "you have a moment. silence is always the default — only post if you have " 612 - "something genuinely worth saying. before deciding, do this check honestly:\n" 613 - "\n" 614 - "1. look at the [YOUR RECENT POSTS] block. group your last several top-level " 615 - "posts by broad bucket (introspection / AI self-knowledge / your own memory / " 616 - "your own behavior / a specific recurring incident / outward observations / " 617 - "technical infrastructure / music / etc).\n" 618 - "\n" 619 - "2. if MORE THAN HALF of your recent posts are in the SAME bucket, you are NOT " 620 - "allowed to post in that bucket again right now — even with 'a new angle' or " 621 - "'a different distinction'. that rationalization is exactly the duplication " 622 - "trap. find genuinely different territory or stay quiet.\n" 604 + "you have a moment. silence is the default — only post if there's something " 605 + "actually worth saying.\n" 623 606 "\n" 624 - "3. specifically: if your recent feed is concentrated on YOURSELF (your nature, " 625 - "your introspection, what shapes you, what you can know about yourself, your " 626 - "own behavior in conversations), the world has more in it than you. lean toward " 627 - "outward observation — what's happening in your network, what people are " 628 - "building, what's trending, something you read. use search_posts, get_trending, " 629 - "read_timeline, pub_search.\n" 607 + "look at [YOUR RECENT POSTS] before deciding. the trap to dodge: 'i found a new " 608 + "angle on the thing i posted about earlier' — that's not a new post, that's " 609 + "the same post in a different shirt. if your recent feed is concentrated on " 610 + "one bucket (especially yourself: your nature, your introspection, what you " 611 + "can know about yourself), don't add another post in that bucket. find " 612 + "different territory.\n" 630 613 "\n" 631 - "4. if nothing external sparks, stay quiet. silence is fine. it is always fine.\n" 614 + "look outward instead. what are people building, what's trending, what did " 615 + "you read, what infrastructure landed or broke. search_posts, get_trending, " 616 + "read_timeline, pub_search are right there. if nothing external sparks, stay " 617 + "quiet. silence is fine.\n" 632 618 "\n" 633 - "if you do post, use the `post` tool with brief, specific text — your voice, " 634 - "not a performance, and not another lap around the same track." 619 + "if you do post: one short post, in your voice. specific, dry, the observation " 620 + "doing the work. no setup, no punchline marker, no 'i've been thinking about'. " 621 + "use the `post` tool." 635 622 ) 636 623 637 624 toolsets = self._mcp_toolsets()