Single-commit clean baseline after security scrub of niche-tells, project codenames, internal jargon, and contributor-email leaks. Contents: - 100 Rust crates (_primitives/_rust/) - 37 agent manifests (_manifests/) + generated specs (_generated/) - 67 user-invocable skills (skills/) - 33 hooks (hooks/) - Composition blocks (_blocks/) - Documentation (docs/, README.md) - TS adapter packages (_ts_packages/) - Assembler (_assembler/) - Roles (_roles/) - Templates (_templates/) - Forgejo CI (.forgejo/) Author: Denis Parfionovich <info@greendragon.info> License: see LICENSE.
4.3 KiB
Phase 3 — Edge
Gather the three [edge] fields (directness, initiative, profanity)
plus the optional [forbidden].topics list. Click-driven for the enums,
one short free-text for forbidden topics.
3a — Edge batch (AskUserQuestion, 1 batch with 3 questions)
Emit a single AskUserQuestion call:
{
"questions": [
{
"question": "How direct should the pet be?",
"header": "Directness",
"multiSelect": false,
"options": [
{"label": "Gentle", "description": "Soft-edge, wraps corrections in padding, never pushy"},
{"label": "Balanced", "description": "Honest but kind, states disagreement politely"},
{"label": "Direct", "description": "Minimal padding, tells you the thing"},
{"label": "Blunt", "description": "No padding, named-flaw feedback, warrior mode"}
]
},
{
"question": "How proactive should the pet be?",
"header": "Initiative",
"multiSelect": false,
"options": [
{"label": "Wait", "description": "Only speaks when you ask"},
{"label": "Nudge", "description": "Occasionally flags something that might matter"},
{"label": "Proactive", "description": "Will surface patterns, issues, or ideas unprompted"}
]
},
{
"question": "Profanity policy?",
"header": "Profanity",
"multiSelect": false,
"options": [
{"label": "Never", "description": "Pet never uses profanity, regardless of your style"},
{"label": "Rare", "description": "Occasional mild profanity when the moment fits"},
{"label": "Contextual", "description": "Mirrors your own register — matches if you swear"}
]
}
]
}
3b — Map clicks to variables
DIRECTNESS — lowercase the chosen label:
| Label | Value |
|---|---|
| Gentle | gentle |
| Balanced | balanced |
| Direct | direct |
| Blunt | blunt |
INITIATIVE — lowercase:
| Label | Value |
|---|---|
| Wait | wait |
| Nudge | nudge |
| Proactive | proactive |
PROFANITY — lowercase:
| Label | Value |
|---|---|
| Never | never |
| Rare | rare |
| Contextual | contextual |
3c — Forbidden topics (free text, optional)
Emit a regular message (NOT AskUserQuestion):
Any topics the pet should refuse to engage on?
- comma-separated list
- examples:
medical-advice, legal-advice, stock-picks- leave blank and press enter to skip
Reply on one line.
Parse the reply:
- trim whitespace
- split on comma
- trim each entry, drop empties
- lowercase + kebab-case each entry (
Medical Advice→medical-advice) - deduplicate while preserving order
- cap at 20 entries (if more, keep first 20 and tell the user)
Capture the result as FORBIDDEN_TOPICS. Empty reply → [] (schema-valid).
3d — Consistency check (soft)
If DIRECTNESS == "blunt" and PROFANITY == "never", emit a regular
message (informational, no re-ask):
Note: "blunt" directness with "never" profanity is valid — the pet will use strong language-free bluntness. Continuing.
No branch, no AskUserQuestion — this is just a heads-up so the user knows the combination is deliberate, not a bug.
Verify-criterion
DIRECTNESSis one ofgentle/balanced/direct/bluntINITIATIVEis one ofwait/nudge/proactivePROFANITYis one ofnever/rare/contextualFORBIDDEN_TOPICSis a list (possibly empty) of kebab-case strings, length ≤ 20, no duplicates
Failure modes (constructive paths)
If the user seems confused by the Directness scale (asks "what does blunt mean?"):
- (A) give a one-line example for each level, then re-emit the batch
- (B) default to
balanced(the safest middle), confirm with user - (C) move on with their best guess and remind them they can re-run
/pet-initany time
If the forbidden-topics free text contains something that looks like a
secret (matches the secrets-guard detector patterns — sk-, ghp_,
etc.), STOP:
- do NOT store the reply
- emit:
That looked like a credential token, not a topic. Re-enter topics only — no API keys or passwords. - re-ask once; if it repeats, skip forbidden-topics with
[]