KeiSeiKit-1.0/skills/pet-init/phase-3-edge.md
Parfii-bot a4e667de10 KeiSeiKit-public — clean state
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.
2026-05-01 12:09:03 +08:00

131 lines
4.3 KiB
Markdown

# 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:
```json
{
"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
- `DIRECTNESS` is one of `gentle` / `balanced` / `direct` / `blunt`
- `INITIATIVE` is one of `wait` / `nudge` / `proactive`
- `PROFANITY` is one of `never` / `rare` / `contextual`
- `FORBIDDEN_TOPICS` is 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-init` any 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 `[]`