Skip to content

Replace Olofofo with Pepeye and simplify skill workflows - #24

Merged
mosobande merged 7 commits into
orifrom
feature/pepeye-workflow-learning
Aug 23, 2026
Merged

Replace Olofofo with Pepeye and simplify skill workflows#24
mosobande merged 7 commits into
orifrom
feature/pepeye-workflow-learning

Conversation

@mosobande

@mosobande mosobande commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Summary

This branch updates the Quantipixels (QP) skills portfolio and replaces the retired Olofofo workflow with Pepeye.

  • Adds Pepeye as a provider-neutral task lifecycle controller with playbooks, leaf-owner routing, phase checkpoints, proof convergence, safe pause and pickup, and bounded learning.
  • Adds Seda Sigidi for evidence-grounded agent identity and configuration integration.
  • Simplifies Alaga, Pepeye, Atunwo, Atona, and Ayewo-igba-ise by removing duplicate workflow representations and moving branch-specific procedure to direct references.
  • Reconciles the plugin manifest, README, Alarina routing, architecture records, and Changesets.
  • Updates HTML Artifact behavior and preserves the existing provider and release ownership boundaries.

Why

The portfolio needs one provider-neutral lifecycle owner, clearer specialist boundaries, and shorter skill instructions that retain authority, state, proof, recovery, and reporting contracts. The Olofofo replacement also removes stale activation and cross-session workflow surfaces.

Verification

  • python3 -m unittest discover -s skills/engineering/seda-pr/scripts -p 'test_*.py' — 20 tests passed.
  • python3 -m unittest discover -s skills/engineering/wo-pr/scripts -p 'test_*.py' — 35 tests passed.
  • npx changeset status passed with the existing release metadata.
  • git diff --check passed.
  • Portfolio structure checks passed for manifest paths, local Markdown links, frontmatter, and skill identifiers.

Review focus

  • Pepeye and Seda Sigidi activation, authority, lifecycle, recovery, and handoff boundaries.
  • Olofofo-to-Pepeye migration and registry consistency.
  • Preservation of specialist ownership and proof contracts after instruction compression.
  • Provider safety, exact candidate identity, and release-state behavior.

The base-to-head diff against ori contains 37 files with 613 insertions and 420 deletions. No issue-closing effect is intended.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

Olúwaṣèyí Ṣóbandé added 3 commits August 20, 2026 11:42
- Add provider-neutral playbooks, proof, pause, pickup, and learning
- Retire Olofofo and update portfolio, routing, and ADRs
- Strengthen skill validation, PR synchronization, and HTML portability
…w-learning

# Conflicts:
#	skills/engineering/ko-skill/SKILL.md
@mosobande
mosobande requested a review from atunwo August 22, 2026 22:25

@atunwo atunwo Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Alátùńwò AI review · 📄 Diff-only

Reviewed from the pull request diff only (no surrounding files).

This PR replaces Olofofo with the Pepeye lifecycle-controller skill, adds Seda Sigidi, and updates related workflow guidance.

  • Blocker: Pepeye's default lifecycle-ledger path permits path traversal through an unconstrained task ID.


State writes require separate authority. Explicit invocation, baseline activation, or task mutation authority does not imply lifecycle-state authority.

Use a user-approved destination. When the user requests the QP default, use `~/.qp/pepeye/tasks/<task-id>.md`, where `<task-id>` is a stable, non-secret task identifier. Create no global index, queue, daemon, or scheduler.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKERPath traversal in the default ledger location. <task-id> is only described as “stable” and “non-secret”, so a value such as ../../some-file can escape ~/.qp/pepeye/tasks/ and cause an authorized lifecycle-state write to overwrite an unintended user file. Generate the ID internally as a safe slug/UUID, or reject absolute paths, separators, ./.. segments, and resolve-and-verify that the final path remains beneath the tasks directory before writing.

@atunwo
atunwo Bot removed the request for review from atunwo August 22, 2026 22:26

@mosobande mosobande left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review findings for PR #24. The P1 items affect activation/terminal-state authority or mutation behavior and should be treated as merge blockers; the P2 items affect evidence-grounding and release metadata.

@@ -0,0 +1,3 @@
interface:
display_name: "Pepeye"
short_description: "Drive a portable task lifecycle through QP skills"

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 — enforce the explicit-activation boundary. pepeye says it activates only through explicit invocation or an authorized project/global baseline, but this metadata does not disable implicit invocation. Because Pepeye becomes the sticky task-wide controller once selected, add policy.allow_implicit_invocation: false here (as seda-pr does). An authorized baseline can still explicitly invoke it.

Comment thread skills/experimental/pepeye/SKILL.md Outdated

## 1. Activate sticky mode

Activate on explicit invocation or through an authorized project or global instruction baseline. Once active, remain the task-wide controller until the task is `complete`, the user opts out, or the task reaches a verified `paused` state.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 — sticky-mode exit conditions disagree with the terminal-state contract. This says control remains active only until complete, user opt-out, or paused, while section 8 also defines unresolved and stopped as terminal states and says to stop controlling after the terminal state is recorded. A refused authority/safety stop can therefore be terminal and still not satisfy this activation rule. Define sticky mode as lasting until any terminal state (complete | paused | unresolved | stopped) is recorded, and mirror that in the portable activation payload.


```markdown
<!-- qp:pepeye:start -->
Use `pepeye` as the task-wide lifecycle controller when it is available. Let it select a QP-native playbook, direct exact-current leaf owners through phase checkpoints, converge proof, support safe pause or pickup, and run the final learning pass. Keep Pepeye active until the task completes, the user opts out, or it records a safe pause. Specialists retain their outcomes, procedures, safety rules, and authority gates. Use only context and capabilities the host already exposes; do not require a provider-specific mode, model, transcript path, agent API, hook, daemon, adapter, scheduler, or shared runtime. Explicit invocation remains the fallback when automatic activation is unavailable.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 — keep portable activation consistent with Pepeye's full terminal-state model. This payload repeats the narrower complete / opt-out / safe pause exit rule, omitting terminal unresolved and stopped. Please align this with the four terminal states so a safety stop, refused authority, or unresolved dependency cannot leave the controller notionally active.

# Fẹ̀mí Sínú Sigidi

Give one AI agent a durable soul: identity, values, boundaries, and voice grounded in evidence about its human. Own discovery, authoring, integration, and proof for one loaded configuration; the caller owns tool choice, credentials, installation, activation, publication, and any Git or provider operation.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 — naming-only requests currently imply a configuration mutation. The description routes requests such as “name my agent” here and excludes installation/activation, but the workflow owns integration into a loaded config, applies a minimal diff, and reads back the changed file. For an auto-loaded config, that write is installation/activation-bearing. Please split the contract into a non-mutating name/draft path and an explicit integrate path requiring target read/write authority, or keep integration with a separate owning installer.

@@ -0,0 +1,120 @@
# Soul Template

Fill this template with evidence about one human and the agent that serves him. Every trait needs one source: his words, observed behavior, or his confirmation. Never invent traits to fill gaps.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 — do not infer the human's gender. The template repeatedly hard-codes him, he, and his, despite requiring every durable trait to be evidence-grounded. Use neutral the human / they / their, or collect pronouns explicitly before using them.

"qp-skills": patch
---

Remove duplicate workflow representations and reference-owned procedure from `atona`, `atunwo`, `ayewo-igba-ise`, `pepeye`, and `seda-sigidi` without changing their outcomes, authority, state, proof, or reporting contracts.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 — release metadata mischaracterizes seda-sigidi. This changeset describes seda-sigidi only as behavior-preserving workflow compression, but this PR introduces it as a new public skill. Add it to the major changeset or create a dedicated changeset that announces the new capability and its authority boundary.

@mosobande
mosobande requested a review from atunwo August 23, 2026 11:01
- Remove explicit-invocation requirements from PR workflow guidance
- Enable implicit invocation for seda-pr and wo-pr
@mosobande
mosobande requested review from atunwo and removed request for atunwo August 23, 2026 11:38

@atunwo atunwo Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Alátùńwò AI review · 📄 Diff-only

Reviewed from the pull request diff only (no surrounding files).

This PR replaces Olofofo with Pepeye, adds Seda Sigidi, compresses several skill workflows, and expands HTML artifact localization.

  • Blocker: implicit Wò PR activation can turn a passive monitoring request into unauthorized branch/provider writes.
  • Warning: carousel template interpolation mishandles literal $ sequences in localized or supplied labels.
  • Verification was limited to the supplied diff because the workspace contained no repository checkout or tests.

short_description: "Keep PRs and MRs ready through CI and feedback"
policy:
allow_implicit_invocation: false
allow_implicit_invocation: true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKERImplicit activation breaks the mutation-authority boundary. wo-pr matches passive requests such as “monitor,” “watch,” or “keep an eye on,” but its workflow may fix code, commit, push, and perform provider writes by default. With implicit invocation enabled, a read-only monitoring request can therefore trigger mutations without the user explicitly selecting that workflow. Keep allow_implicit_invocation: false, or introduce an implicit read-only mode that requires explicit authorization before every branch or provider mutation.

const interactiveSelector = "a, button, input, select, textarea, summary, [contenteditable='true']";

const format = (template, values) => Object.entries(values).reduce(
(text, [key, value]) => text.replaceAll(`{${key}}`, value),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNTemplate interpolation does not preserve replacement values literally. Passing value as the string replacement makes replaceAll interpret $&, $` , $', and similar replacement patterns. An item label such as R&D $& will produce an incorrect live announcement instead of its literal accessible name. Use a replacement callback, for example text.replaceAll({${key}}, () => String(value)), and add coverage for labels containing $ replacement sequences.

@mosobande
mosobande requested review from atunwo and removed request for atunwo August 23, 2026 11:56
@mosobande
mosobande merged commit 12ffad9 into ori Aug 23, 2026
4 checks passed
@github-actions github-actions Bot mentioned this pull request Aug 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant