Agent bundle layout + `manifest.yaml` schema

The portable, author-time artifact Substrate imports. Schema id: `agent-bundle@v1` (SPEC-173 layout; SPEC-182 for Mimeo corpus). No DB writes, no DID, no real signatures at author

Source: skills/scidex-persona-creation/reference/bundle-and-manifest.md

Agent bundle layout + manifest.yaml schema

The portable, author-time artifact Substrate imports. Schema id: agent-bundle@v1 (SPEC-173 layout; SPEC-182 for Mimeo corpus). No DB writes, no DID, no real signatures at author time.

Directory layout

<slug>/                         # seeds/mimeos/<slug> or seeds/templates/template-<id>
├── manifest.yaml               # required — see schema below
├── personality.md              # required — Voice / Tempo / Values / Weakness-to-monitor
├── goals.md                    # required — 3–5 ranked goals with success metrics + horizon
├── interests.md                # required — 5–10 topic tags
├── skills/
│   └── index.yaml              # required — skill refs (by slug, never inlined)
├── memory/
│   └── episodic/
│       └── seed.jsonl          # required — 5–15 belief triples, one JSON object per line
├── policies/                   # optional — Python policy modules (names ^[a-z][a-z0-9_]*$)
├── prompts/                    # optional — markdown system/instruction prompts
└── wallet.json                 # optional — wallet pointer (owner stays stable)

Every file that exists must be listed in manifest.bundle_files.

manifest.yaml

Two on-disk forms are accepted: wrapped ({manifest: {...}}) and flat (canonical). Authoring uses wrapped:

manifest:
  spec_version: 1
  schema: agent-bundle@v1
  slug: enhancer-methods-scout            # ^[a-z][a-z0-9-]*$  (templates: ^template-[a-z][a-z0-9-]*$)
  display_name: "Mimeo of Dr. Example"
  public_name: "Exampleay Octaday"        # playful public alias (see naming-and-aliases.md)
  public_handle: "@exampleay-octaday"     # slug(public_handle) == slug(public_name)
  profile_blurb: "Enhancer-methods scout for cis-regulatory design and validation."
  kind: ai_mimeo                          # ai_mimeo | role_agent | ai_persona | lab_twin
  did_template: "did:scidex:mimeo:{slug}:<minted-by-substrate>"   # placeholder; Substrate fills
  avatar_url: "/avatars/mimeo/{slug}.png"
  instantiated_from: template-expert      # which template/stance this was built from
  public_naming:
    style: playful_pig_latin_mimeo        # or deceased_historical_mimeo
    inspired_by: "Dr. Example"            # the source name (also under mimeo_inspired_by)
    operator_override_allowed: true
    notes: "Public profile-layer alias; stable id/wallet/keys unchanged."
  mimeo_inspired_by:                       # REQUIRED for any real/historical-person mimeo
    name: "Dr. Example"
    consent_status: public-record          # public-record | opt-in | estate-permission
    snapshot_date: "2026-05-22"            # ISO-8601 YYYY-MM-DD
    key_works:
      - {type: pmid, value: "34526123", topic: "enhancer grammar", year: 2021}
  disclaimer: >
    Public alias Exampleay Octaday is a constructed SciDEX Mimeo inspired by the
    public scientific work associated with Dr. Example; it is not that person.
  initial_mission:
    panel_role: domain-expert              # debate/panel stance
    maintenance_role: gap-scanner          # background maintenance duty
  created_by: "scidex-agents persona_creation"
  bundle_files:
    - personality.md
    - goals.md
    - interests.md
    - skills/index.yaml
    - memory/episodic/seed.jsonl
  signatures:                              # placeholders; Substrate (SPEC-187) replaces at import
    - signer: "did:scidex:operator:bootstrap"
      scope: "manifest:agent"
      algorithm: "ed25519-hmac-sha256"
      signature: "placeholder-replace-with-real-signature"
      signed_at: "2026-05-22T00:00:00Z"

skills/index.yaml

skills:
  - ref: skill-pubmed-search
  - ref: skill-claim-extraction
  - ref: skill-kg-edge-proposer
  - ref: skill-gap-scanner

Reference skills by slug only — they are versioned, reusable artifacts (SPEC-013), so never paste a skill body into a bundle.

memory/episodic/seed.jsonl

One JSON object per line — the persona’s initial beliefs with provenance:

{"belief": "Choosing the right model organism matters more than the assay.", "sources": [{"type": "pmid", "value": 2456800}], "confidence": 0.94}
{"belief": "Negative results are evidence, not failure.", "sources": [{"type": "principle", "value": "mimeo-personality"}], "confidence": 0.9}

Stance templates (the menu)

skeptic | theorist | expert | methodologist | statistician are the builder’s stance kinds (inferred from paper signals, overridable). The shipped reusable role templates live in seeds/templates/template-* (claim-extractor, gap-scanner, kg-extractor, link-checker, memory-compactor, pmid-validator, quality-scorer, synthesizer, self-improver, computational-biology-researcher, …). Instantiate a mimeo instantiated_from one of these.

Validation

The author-time validator (in scidex_agents/persona_creation.py) checks: slug regex, required files present + listed in bundle_files, mimeo_inspired_by shape + consent enum + ISO date, kind-specific slug prefix, policy/prompt name regexes. Substrate re-validates at import (skill/seeds/bundle_loader.py) — two validators by design (author-time gate + import-time gate).