Profile reference

A profile is a YAML file. This page lists its fields. How to import and activate a profile is described in Profiles.

Top level

FieldTypeDefaultMeaning
nametextrequiredDisplay name.
slugtextrequiredIdentifier, only a-z, 0-9, _ and -. Also the file name in specs/_profiles/.
artifact_typeslistemptyThe artifact types, see below.
link_typeslistemptyThe allowed link types, see below.
statuseslist[draft, review, approved, obsolete]The statuses specs can have.
workflowsmapall offApproval and signature rules.
traceabilitymapsee belowTrace chain and gap severities.
classificationsmapemptyFree dimensions for the classifications field.
storagemanaged or sidecarmanagedWho owns the spec files. See Managed and sidecar profiles.
frontmatter_formatce, or the name of an adapterceFormat of the frontmatter in the spec files. See Example: a proprietary format.
sourcemapnoneLocation of foreign specs.

Artifact types

artifact_types:
  - id: URS
    label: "User Requirements Specification"
    folder: urs
    id_pattern: "URS-{rand}"
    required_fields: [id, title, status, acceptance_criteria]
    optional_fields: [rationale, classifications, anchors, links]
FieldMeaning
idShort name of the type, unique.
labelDisplay name.
folderFolder under specs/ for new files, unique.
id_patternPattern for new IDs with exactly one placeholder: {rand} (random, safe for several writers) or {seq:04d} (counter, padded to the given width). When reading existing IDs the width is ignored.
required_fieldsFrontmatter fields every spec of this type must have.
optional_fieldsFurther fields shown in the Fields tab. Must not repeat a required field.
templateSections for generated drafts, see below.

Templates for generated drafts

A template defines the sections the AI fills when it writes a draft. Tracemoor renders the body from them in the given order and checks them before the draft is stored.

    template:
      - name: functional_purpose
        label: "Functional Purpose"
        kind: text
        required: true
        constraints:
          must_contain_any: [must, shall]
      - name: inputs
        label: "Inputs"
        kind: struct_list
        fields:
          - { name: name, required: true }
          - { name: type }
      - name: acceptance_criteria
        label: "Acceptance Criteria"
        kind: list
        required: true
        constraints:
          deny_phrases: ["internal state"]
FieldMeaning
nameKey of the section. Unique within the type.
labelHeading in the body.
kindtext (one paragraph), list (list of lines) or struct_list (table with the columns in fields).
requiredThe draft is rejected when the section is empty.
fieldsColumns of a struct_list. Only allowed there, and required there.
constraints.must_contain_anyAt least one of these words must appear.
constraints.deny_phrasesNone of these phrases may appear.
link_types:
  - id: satisfies
    inverse: satisfied_by
    source_types: [FS]
    target_types: [URS]
  - id: satisfied_by
    inverse: satisfies
FieldMeaning
idName of the link type, unique.
inverseThe link type of the opposite direction. Must exist.
source_typesTypes that may have this link. Empty: all.
target_typesTypes the link may point to. Empty: all.

source_types and target_types limit the choices in the Links tab. They are not checked when files are read.

Workflows

workflows:
  approval_required: true
  esignature: true
  esignature_method: password
  suspect_links: true
  brave_mode_required_for:
    - status_change_to_approved
    - esignature
FieldMeaning
approval_requiredApproval is part of the workflow.
esignatureapproved and rejected need an electronic signature.
esignature_methodDefault signature method. The method in Project Settings › Signing takes precedence. See Signatures.
suspect_linksTrack suspect anchors and links.
brave_mode_required_forActions the AI may perform only in Brave mode. status_change_to_<status> must name a status from statuses.

Traceability

traceability:
  required_chain: [URS, FS, TC]
  gap_severity:
    no_implementation: error
    no_test: warning
    suspect: warning
FieldMeaning
required_chainThe types a requirement passes through, in order. Each must be a declared type.
gap_severityerror, warning or info for a requirement without implementation, without test, or with suspect anchors. Defaults: error, warning, warning.

Classifications

classifications:
  layer:
    values: [presentation, business, persistence, integration]
  safety_classification:
    values: [A, B, C]

Each key is a dimension with its allowed values. The order is kept.

Source of foreign specs

source:
  include: [requirements, specifications]
  exclude: [attachments]
FieldMeaning
rootFolder of the specs. Usually left out and set per machine as Spec source folder in the project settings, so that no absolute path is shared. Relative paths are resolved from the exploration.
includeSubfolders to read. Empty: everything. If none of them exists, the whole folder is read.
excludeSubfolders to skip.

include and exclude must be relative and must not contain ... Tracemoor 's own folders (_profiles, _overlays, _drafts) always stay under specs/ of the exploration.

Example: a proprietary format

Tracemoor reads spec files in another format through a frontmatter adapter in its code. frontmatter_format: pandora is such an adapter. It was written for one team's Obsidian vault with its own frontmatter and shows what an adapter maps:

Field in the foreign formatBecomes in Tracemoor
keyID
titletitle
type: requirements / specifications / robottype REQ / SPEC / RTC
requirements: [...]satisfies links
[[…]] links in the bodyreferences links
further fieldsclassifications

The profile that uses it declares exactly these three types and storage: sidecar, so the foreign files stay unchanged. A different proprietary format needs its own adapter, which is a code change.

Validation

Tracemoor rejects a profile on import and on load, listing every problem, when:

  1. name is empty or slug contains other characters than a-z, 0-9, _, -.
  2. Two artifact types share an id or a folder, or one of them is empty.
  3. An id_pattern does not contain exactly one {rand} or {seq:NNNd}.
  4. A field is both required and optional.
  5. A template repeats a section name, a struct_list has no fields, or another kind has fields.
  6. Two link types share an id, or an inverse names an unknown link type.
  7. statuses is empty, or brave_mode_required_for names an unknown status.
  8. required_chain names an undeclared type.
  9. A source.include or source.exclude entry is absolute or contains ...

An invalid override in specs/_profiles/ does not fall back to the shipped profile. The error is shown instead.