Data Model: Rehome & Complete Writing-Comms Doctrine

The "entities" of this doctrine mission are the artifacts, their target paths, the profile contract fields, the routing signals, and the DRG nodes/edges. Source content lives on ref pr-2918 at the OLD src/doctrine/<type>/built-in/ paths.

1. Artifact inventory & path map (30 files)

#Old path (pr-2918)New path (packs/built-in/)Reconciliation
1agent_profiles/built-in/analyst-annie.agent.yamlagent_profiles/analyst-annie.agent.yaml+canonical-verbs, +doctrine-layers
2agent_profiles/built-in/comms-cleo.agent.yamlagent_profiles/comms-cleo.agent.yamlrole→communicator; +canonical-verbs, +doctrine-layers
3agent_profiles/built-in/diagram-daisy.agent.yamlagent_profiles/diagram-daisy.agent.yamlrole→diagram-author; +canonical-verbs,+output-artifacts,+doctrine-layers; strip 031 ban; trim tool matrix
4agent_profiles/built-in/lexical-larry.agent.yamlagent_profiles/lexical-larry.agent.yaml+canonical-verbs,+doctrine-layers; glossary-authority boundary vs curator-carla
5agent_profiles/built-in/minutes-maker-mahad.agent.yamlagent_profiles/minutes-maker-mahad.agent.yaml+canonical-verbs,+doctrine-layers; scope enforcement claims
6agent_profiles/built-in/scribe-sally.agent.yamlagent_profiles/scribe-sally.agent.yaml+canonical-verbs,+output-artifacts,+mode-defaults,+doctrine-layers
7agent_profiles/built-in/synthesizer-sam.agent.yamlagent_profiles/synthesizer-sam.agent.yamlrole→synthesizer; +canonical-verbs
8directives/built-in/047-audience-oriented-writing.directive.yamldirectives/047-audience-oriented-writing.directive.yamlrepoint references to writing-audience-catalog
9directives/built-in/048-version-governance.directive.yamldirectives/048-version-governance.directive.yaml+cross-ref boundary to DIRECTIVE_018
10directives/built-in/049-agent-declaration-and-self-introduction.directive.yamldirectives/049-…​.directive.yamlnarrow "must"→"should" (advisory)
11directives/built-in/050-credential-handling-discipline.directive.yamldirectives/050-…​.directive.yamlre-anchor on injection/pre-redaction/least-privilege
12styleguides/built-in/professional-communications.styleguide.yamlstyleguides/professional-communications.styleguide.yamlrelocate
13styleguides/built-in/meeting-minutes-format.styleguide.yamlstyleguides/meeting-minutes-format.styleguide.yamlrelocate
14procedures/built-in/glossary-maintenance-workflow.procedure.yamlprocedures/glossary-maintenance-workflow.procedure.yamlrelocate (well-behaved composer — keep)
15procedures/built-in/meeting-minutes-pipeline.procedure.yamlprocedures/meeting-minutes-pipeline.procedure.yamlstate trust boundaries; scope enforcement
16tactics/built-in/communication/writing-audience-catalog.tactic.yamltactics/communication/writing-audience-catalog.tactic.yamlkeep type: asset
17-26assets/audiences/built-in/{5 personas}.md (+ .asset.yaml)assets/audiences/{persona}.md (+ .asset.yaml)invert nesting
27assets/audiences/built-in/README.mdassets/audiences/README.mdinvert nesting
28agent_profiles/built-in/README.mdagent_profiles/README.md (merge into existing)list 25 ids
29agent_profiles/README.md (package)(package README)list 25 ids
30tests/doctrine/test_shipped_profiles.pytests/doctrine/test_shipped_profiles.py+7 ids (see gates)

(16 schema-checkable YAML artifacts + 5 assets×2 sidecar pairs + 3 READMEs + 1 test = the 30-file surface.)

2. Agent-profile contract fields (shipped-profiles gate)

Each non-sentinel profile MUST declare non-empty: roles (≥1), purpose, name, specialization.primary_focus, collaboration.canonical-verbs, collaboration.output-artifacts, mode-defaults (+ each mode's use-case), context-sources.doctrine-layers, directive-references; schema-valid; no scalar role:.

Profilecanonical-verbsoutput-artifactsmode-defaultsdoctrine-layersroles[0] change
analyst-annieADDokokADD— (analyst, non-canonical)
comms-cleoADDokokADDcurator→communicator
diagram-daisyADDADDokADDdesigner→diagram-author
lexical-larryADDokokADD— (semantic-analyst)
minutes-maker-mahadADDokokADD— (documentarian)
scribe-sallyADDADDADDADD— (documentarian)
synthesizer-samADDokokokcurator→synthesizer

16 field additions total. canonical-verbs must be domain-specific (not generic design/curate/classify verbs) so they don't re-open a routing collision.

3. Routing signals & collisions

Router precedence: profile_hint → canonical-verb→roles[0] candidate set → domain-keyword filter → priority tiebreaker (higher wins). Only roles[0] participates.

Bucket (bare verb, no context)Candidates before fixWinner beforeWinner after fix
DESIGNER (design/mockup/prototype/wireframe)designer-dagmar@50, diagram-daisy@60diagram-daisy ❌designer-dagmar ✅ (daisy leaves bucket)
CURATOR (curate/classify/organize/tag/validate/verify)curator-carla@40, doctrine-daphne@48, comms-cleo@55, synthesizer-sam@50comms-cleo ❌doctrine-daphne/curator-carla ✅

Non-collisions (no change): analyst-annie@60 (analyst non-canonical), lexical-larry, minutes-maker-mahad, scribe-sally. The "researcher" bucket does not collide (researcher is a secondary role on cleo/sam).

4. DRG node/edge model

directive:DIRECTIVE_047 (id form DIRECTIVE_NNN), others use the slug id.

requires, suggests, specializes_from, scope. (delegates_to, in_tension_with, reconciles_tension, rejects, applies, refines do NOT confer context reachability.)

requires/suggests edge (assets are reached via the tactic's type: asset reference; profiles are seeded as profile-channel roots and additionally wire out via context-sources.directives).

  • Node (uniform): {urn: <kind>:<id>, kind: <kind>, label: <Name>}. Directives use
  • Edge: {source, target, relation[, when, reason]}. Reachability-conferring relations:
  • Edge sources (frontmatter → generated):
  • profile → directive/tactic: context-sources.directives (→requires), tactic-references (→requires)
  • directive/procedure/tactic → X: top-level references: [{type,id,when?}]
  • styleguide → X: references: [<path str>] (→suggests)
  • Orphan = a node with no inbound reachability edge. Every new artifact needs ≥1 inbound

5. Pinned-count entities (gates)

Gate literalFileFromTo
EXPECTED_PROFILE_COUNTtest_pack_relocation_doctor_gate.py1825
(node_count, edge_count) tupletest_pack_relocation_doctor_gate.py(324, 892)recompute post-regenerate
EXPECTED_PROFILE_IDStest_shipped_profiles.py18 ids+7 ids
EXPECTED_GLOSSARY_TERM_COUNTtest_pack_relocation_doctor_gate.py108108 (unchanged)
reachability frozensetsdrg/test_reachability.pyrecompute empirically; unchanged unless charter-activated