# Diagnostic reference

Search for the exact code from your checker. Severity below is the registered default; the actual diagnostic includes its location and message.

## syntax.expected

error — the parser expected a different token here

## syntax.notation

error — this notation is not part of the grammar at this position

## notation.conflict

error — these marks contradict each other (e.g. [p, f] or [., ..])

## chord.quality-case-mismatch

error — the root's case sits on one side of the quality axis and the explicit quality on the other (e.g. fmaj7); case carries quality

## chord.rare-quality

warning — dM7 is the diminished-major seventh, an unusual chord — did you mean dm7 (half-diminished)?

## tempo.unsupported-suffix

error — tempo text takes no attachment; put the period in the string (*"Andante.") or the beat unit in the tempo directive

## tempo.placement-needs-text

error — the comma down-mark places tempo words below a sounding part; metronome values remain global above the staff

## hairpin.kind-mismatch

error — a crescendo was closed by a diminuendo marker (or vice versa); both endpoints carry the kind

## spanner.unterminated

warning — a span opened but never closed; a hairpin with nothing to arrive at stays one note wide, where you typed it (close it with a leading < or > , or a dynamic, to say how far it reaches), and a slur or glissando with no note to reach draws nothing

## spanner.stop-without-start

error — a closing span marker with no opening in effect

## slur.adjacent-spans

info — notes are nodes and one slur is one span between endpoint nodes; interior notes stay unmarked (D~ E ~F), while D~ E~ F spells two slurs

## version.header-required

error — from the container swap onward a source must declare its spec version — the same text can mean different music in different versions (<C4>/h)

## syntax.unexpected

error — this token cannot start anything the grammar knows at this position

## syntax.incomplete

error — the source ended (or the line ended) before this construct was finished

## syntax.pitch

error — a pitch is an uppercase letter A–G, an optional accidental, then an optional octave number (Eb, F#5); r is a rest

## syntax.anchor

error — an anchor is a measure label and an offset: m1:0, m2:q, m3:1/2

## version.invalid

error — the header is `scorescript` followed by a version like 0.3

## repeat.invalid-target

error — a measure repeat repeats the previous bar (%) or a labeled earlier bar (%m5); there must be one

## repeat.mixed-content

error — a repeat bar holds nothing else: && (or %) IS the bar's content, so a note beside it would be a second bar's worth of music in one bar

## chord.empty

error — a chord needs at least one pitch between [ and ]

## pitch.invalid

error — this is not a pitch: letters A–G (uppercase — case carries quality, never octave), accidentals b bb # ##, then an optional octave number

## spanner.detached

warning — a connector binds by adjacency: Eb< opens a crescendo on Eb, <D closes it at D; a < floating between spaces binds to the note before it

## duration.invalid

error — this duration is not one the grammar knows (numbers 1 2 4 8 16 32 64 with dots, or N/M)

## duration.dangling

error — a number is a duration when it comes BEFORE a note (4G) and an octave when it is glued AFTER the pitch letter (G4); this one has nothing to attach to, so it adds nothing to the bar

## grid.bar-count

error — a system block's range (m1-10) promises a number of bars; this row has a different count — check the | barlines

## grid.too-many-rows

error — a system block has one row per declared part, in order; this row has no part to belong to

## grid.missing-row

warning — a declared part has no row in this system block, so it is silent here; add a row of rests if that is intended

## duration.nothing-to-complete

error — & takes the value that completes the dotted note before it (q.Eb &G); the note before this one is not dotted

## instrument.unknown

warning — this instrument is not in the catalog (forty entries: flute, clarinet-bb, horn-f, tuba, voice …); it prints as written with a treble clef and no transposition

## grid.unknown-group

error — a group label on its own line names declared parts by instrument (fls, horns); no declared part has this instrument

## grid.filled-rests

info — a blank bar, a short row, or a part with no row in a system block is read as whole-bar rests; write r to make that explicit

## chord.comma-separator

warning — inside a chord a comma separates members ([C E G] is the spelling); an octave down is written with the octave digit ([C3 E G]) — outside chords , still lowers an octave

## syntax.continuation

error — a backslash joins this line to the next, so nothing may follow it on the line; a \ in the middle of a line used to be swallowed in silence, which is the one thing the language forbids

## grid.unbounded-continuation

warning — N31 continues a grid row when its line ends with a barline, and the block's range is what says when the row is finished; a block whose header names no range ({ m1: rather than { m1-3:) cannot say, so the next line is read as another row

## syntax.continuation-twice

warning — a grid row already continues when its line ends with a barline (N31: a barline at the end of a line means what it means at the end of a system), so a backslash after that barline is the same instruction written twice; the backslash is for a line that breaks INSIDE a bar, which a barline cannot say

## syntax.barline-dropped

warning — a repeat barline IS a double bar — thin line, thick line, and the two dots (Gould: a double bar is never written beside a repeat, because the repeat already divides the section) — so a barline written in the same closing slot as a `:|` draws nothing and is dropped; `:||`, `:|||`, `:| ||` and `m2(end-repeat): … ||` all say it twice, and the one spelling is `:|`

## line.unterminated

warning — a bracketed line ([ped..], [8va..], [tr..]) is a printed line with two ends; without its closer ([..ped], [..8va], [..tr]) it runs to the last note of the part

## line.stop-without-start

warning — this closes a bracketed line, but none of that kind is open; a line OPENS with the dots trailing ([ped..]) and CLOSES with them leading ([..ped])

## volta.unclosed

warning — a volta bracket runs to the repeat barline that closes it (:|); with no repeat after it the bracket runs to the end of the part, which is almost never what an ending means

## navigation.ambiguous-abbreviation

info — [DC] and [DS] are two capitals in a bracket, which is a boxed REHEARSAL mark (N11) — write the jump with its periods ([D.C.]) or in lower case ([dc]) and it is a jump

## multirest.invalid-count

error — a multirest counts the bars one printed H-bar stands for, so it counts at least two; a single bar of rest is written r

## repeat.invalid-count

error — &&4 is a RUN of measure repeats — four bars that each repeat the one before — so the count is at least two; one repeated bar is written &&

## lyric.bar-misalign

warning — the | in a lyrics row lines up with the music's barlines, which is what lets the row check itself: a row with a different number of bars, or a bar with more syllables than notes, has slipped against the music it sings

## grid.inside-braced-part

error — a system block's ROWS are the parts, so it belongs to the score, not inside one player's braces; declare the part with no braces (part hn: Horn in F) and write the block beside it

## grid.spine-address

error — a mark on a block head is the SCORE's, stated once outside the rows, so it has to say which bar it stands at — glued to it, like every other adjacency in the language: ||m5, [A]m5, [key G]m9

## grid.spine-part-change

warning — the spine carries what the whole SCORE does at a bar; a clef and an instrument change belong to one player, so they stay in that part's row or its `at` block

## layout.duplicate-break

error — one score point needs at most one system/page cut; a page already begins a system

## layout.break-without-measure

error — a part cut may point to its following range, but a score-wide layout cut must name its measure (`\n29` or `\p46`)

## layout.exact-span-scope

error — only a system has a measure count; write `system-map {96:3}` for exactly three measures beginning at m96, while page-map and multi-map remain point addresses

## layout.invalid-span

error — an exact system span counts the measures on that line, so its count must be at least one

## layout.unknown-measure

error — a layout cut must address a measure declared by the score

## rehearsal.unknown-mode

error — `rehearsal auto` mints a mark at every structural seam (a key, meter or tempo change); `rehearsal manual` is the default, where the marks you write are the marks you get

## exercise.no-sections

warning — an exercise labels its music through its sections, so one with none prints no label and claims no bars — the number would be minted for something invisible

## exercise.reversed-section

error — a section covers a forward span of bars; a backwards range would give the exercise a negative length and put its closing double bar before its label

## shared-line.unknown-reader

error — a reader head names players by the key the roster declares them with, so a key no part carries would hand its music to nobody

## shared-line.too-many-readers

error — naming one key several times in a head addresses successive instances of it, so more namings than declared players leaves a reading with no one to play it

## span.not-found

error — bars written as a repeat borrow a passage by the name it was given, so an unmatched name would leave those bars with no music at all

## span.unknown-interval

error — a repeat moves by a signed interval such as +P4 or -P5, and an unreadable one would silently leave the borrowed bars at pitch

## span.length-mismatch

error — a repeat writes exactly the bars it names, so a target longer or shorter than the passage it borrows is an arithmetic slip that would drop or duplicate music

## shared-line.empty

warning — a line exists to hold the music every reader plays, so one with no measures leaves every part that reads it silent

## shared-line.unknown-interval

error — a reading interval is a quality and a number such as P5 or m3, and an unreadable one would silently leave the reader at unison

## shared-line.reading-conflict

warning — an exercise reading and a part's own reads statement both name the interval a player takes, so when they disagree one of them is a stale edit

## shared-line.overridden

info — a part that writes its own measures keeps them, so a reads statement beside authored music is inert and probably a leftover

## exercise.container-empty

warning — an exercise container that holds no bars still prints its heading and its number, so the page gains a title over silence and the numbering of everything after it shifts

## exercise.empty-reading

warning — a reading exists to move named parts off the section's concert pitch, so one naming no parts changes nothing and hides a typo in a part symbol

## exercise.unknown-reading-part

warning — a reading names parts by the symbol they are declared with, so a symbol no part carries means that instrument silently keeps the section's pitch in its label

## exercise.unknown-interval

error — an interval is written quality-then-number (P5, M2, m3, A4, d5); without one the label cannot say what those parts actually sound

## exercise.unknown-concert-pitch

error — a section sounds at a pitch class such as F, Bb or C#; every part's `(your X)` is derived from it, so an unreadable one would silence the whole label

## exercise.broken-alignment

warning — an exercise's parts must break at the same bars so "line 3" is the same music for every player; a part laid out alone may add breaks its neighbours did not, and a rehearsal where the flute and the trumpet count different lines is the cost

## exercise.empty-systems

error — `systems N` says how many bars go on a line, so N must be at least one — a line carrying no bars describes no page and could never be drawn

## rudiment.empty

warning — a rudiment is a named pattern of strokes, so one with no strokes has nothing to print beside the exercise that plays it

## rudiment.unknown-token

error — a rudiment is written in hands (R, L, and the grace hands lR and rL) and the language's own roll words ((trem), (trem2), (trem3), (z)); anything else would print a pattern no drummer could read

## rudiment.duplicate

warning — a rudiment's name is its address — an exercise titled with it plays it — so two declarations of one name leave the heading quoting whichever was read last

## exercise.overlapping-sections

error — two sections claiming the same bar would stamp two labels on one system and mint two double bars at one score point

## link.file-not-found

error — a referenced exercise is read from the master file at every compile, so the path is resolved against the directory of the file that wrote it; a path that does not open means the consumer would print a hole where the pulled music goes

## link.id-not-found

error — an exercise is referenced by the id its master authored (`exercise =the-scale`), never by position or title — so a master that renames or drops an id says so here instead of silently handing back the wrong exercise

## link.cycle

error — a file cannot pull from a file that pulls from it: the resolution would never finish, and there is no answer to which of the two is the source of truth

## link.part-missing

warning — the pull matches the two rosters by part symbol; a master part the consumer does not carry is dropped, and a consumer part the master does not carry is filled with rests, and both are things the arranger should have decided on purpose

## link.floating-octave

warning — a bare letter takes the octave NEAREST the note before it, and the note before the first bar of a pulled exercise is in the master, not here — so an exercise meant to be linked anchors its opening note with an explicit octave (4Bb4), or the same scale arrives in a register nobody asked for

## link.override-pending

warning — `concert X` on a reference is parsed and reserved but not yet applied: pitch math has one home, the semantic layer, which runs after this splice — so v0 pulls the master's own pitch rather than performing a second, private transposition

## link.master-diagnostics

info — the master was read with diagnostics of its own; they are reported against the master's text, where their line numbers mean something, and counted here so a consumer is never silently built on music its source could not read

## link.no-filesystem

error — a reference names a file, so resolving it needs a place to look; a host that compiles source text with no directory of its own cannot follow one, and says so rather than pretending the exercise was empty

## book.exercise-unanchored

warning — a contents line points at a page, and the page is found from the bar the exercise opens at; an exercise that states no `section` and follows another that states none has no bar of its own, so the book prints its title with no page number rather than a page number that is wrong

## book.contents-without-cover

warning — a contents list is printed on the cover, so asking for one without a cover asks for a page that is never made — either add `cover` or drop `contents`

## lyric.no-music

error — a lyrics row sings the row above it, so it needs a line of music before it in the same part

## version.unsupported

error — this toolchain implements spec versions 0.1, 0.2 and 0.3; a newer header means the source may use constructs it cannot read

## score.no-parts

warning — a score with no parts engraves nothing; add `part name: instrument { … }` or bare measure lines

## metadata.duplicate

error — composer and movement-title name one thing each; a second declaration would silently win

## metadata.empty

error — an empty metadata string prints an empty line on the page; delete the statement instead

## symbol.duplicate-part

error — part symbols address parts from statements and hosts; two parts with one symbol make that address ambiguous

## meter.invalid

error — a meter is beats over a note value (4/4, 6/8) or printed additive groups (3+2+2/8); every group is positive and the beats total at most 64

## beams.invalid

error — a beam grouping is additive groups counted in the meter's own unit (3+3+2), or in a unit named after a slash (3+3+2/8 — the same bar as 6+6+4/16), or one of the words none (every note flags), beat (one group per beat) and standard (this meter goes back to its own grouping)

## beams.does-not-fill-the-bar

warning — a beam grouping fills its bar. Counted in the meter's own unit that means its groups add up to the meter's beats — 3+3+2 under 8/8, but 2+2 under 4/4; name another unit after a slash and the same claim is made in that unit (3+3+2/8 fills a 4/4 bar)

## key.invalid

error — a key is a major or minor name (G, Eb, Am, F#m) or `open` — no signature and no implied tonic

## tempo.invalid

error — a tempo is a positive number of beats per minute

## spell.unknown-mode

error — spelling modes are `spell key` (a bare letter takes the key signature's accidental, and `n` is the natural) and `spell absolute` (a letter is exactly what it says) — absolute is the default, so nothing already written changes meaning

## solfege.unknown-mode

error — solfège modes are `solfege movable` (do is the tonic of the key, read as major) and `solfege fixed` (do is C) — movable is the default

## solfege.no-key

warning — movable do puts do on the key's tonic, so music with no key signature (or `key open`) has no tonic to move to; the syllables are read in C until a key is stated, or write `solfege fixed` to mean C on purpose

## solfege.si-ambiguous

info — in movable do, `si` is RAISED SOL (di ri fi si li) and the leading tone is `ti`; under `solfege fixed`, `si` IS the seventh degree, as the fixed-do cultures say it — both cultures keep their word (Brandon's ruling)

## clef.invalid

error — a clef is treble, bass, alto, tenor, soprano, mezzo-soprano, baritone, percussion, an octave clef (treble-8vb), or a number 1–7 — the seven clefs ordered by where middle C sits

## context.unknown-measure

error — `at mN` changes the context at a bar the score declares; an unknown bar means the change never happens

## context.duplicate

error — one bar takes one meter, one key, one tempo and one clef; a second declaration would silently win

## context.scope

error — meter, key and tempo belong to the score (every part shares them); the clef and the transposition belong to a part

## transpose.invalid

error — a transposition is a diatonic distance and a chromatic one — `transpose -1 -2` for a B-flat instrument, `transpose -5 -9 -1` when an octave comes with it — and `transpose 0` is none, which hands the bar back to concert pitch

## transpose.incomplete

error — one number is only half a transposition: the letters move by the diatonic distance and the sound by the chromatic one, so both are needed — only `transpose 0` stands alone

## measure.overfull

error — the events in this bar sound longer than its meter allows — the bar line cannot move

## measure.incomplete

info — a short bar completes itself with rests in the printed music; the source stays as typed. A pickup bar (m0) stays short on purpose

## measure.noncontiguous

error — bars run m1…mN (or m0 for a pickup) with no gaps; a gap means a bar was renamed or lost

## measure.duplicate-symbol

error — a measure name belongs to one bar; reusing it makes the name useless as an address

## measure.inconsistent-symbol

error — one bar carries one name across every part and voice

## measure.invalid-symbol

error — a stable name is a letter or _ then letters, digits, _ and -; names survive edits, so they may not be arbitrary text

## symbol.duplicate-measure

error — one voice declares each bar once; a second declaration of the same label would silently replace the first

## note.duplicate-symbol

error — a note name addresses one note from lyrics and ties; two notes with one name make that address ambiguous

## note.invalid-symbol

error — a stable name is a letter or _ then letters, digits, _ and -

## voice.mixed-shorthand

error — direct measure lines ARE voice 1; mixing them with explicit voice blocks makes the voice numbering unreadable

## voice.invalid

error — a staff carries voices 1 through 4

## voice.duplicate

error — one voice number, one block; write the bars of a voice in a single block

## repeat.no-previous-bar

error — && repeats the bar before it, so the first bar of a part or voice has nothing to repeat — write the music once, then && it

## repeat.unknown-measure

error — a % repeats a bar this voice declares; naming a bar that does not exist repeats nothing

## repeat.forward

error — a % repeats an EARLIER bar — music cannot copy what has not been written yet

## repeat.meter-mismatch

error — a repeated bar carries the earlier bar's notes; if the meter changed in between, those notes no longer fill the bar

## repeat.named-content

error — named notes and named tuplets have one identity each, and a repeat would need two copies of it

## navigation.unknown-option

error — navigation words are start-repeat, end-repeat-N, ending-N, segno, to-coda, coda, fine and the jumps (jump-dc, jump-ds-al-coda…)

## navigation.duplicate-option

error — a bar states each navigation word once

## navigation.conflict

error — a bar declares at most one repeat count, one ending set, one marker and one jump

## navigation.invalid-repeat-count

error — a repeat plays between 2 and 16 times

## navigation.invalid-ending

error — ending numbers run from 1 to 32

## navigation.missing-segno

error — a D.S. jump needs a segno to jump back to, or the player has nowhere to go

## navigation.missing-coda

error — an al Coda jump needs both a to-coda (where to leave) and a coda (where to land)

## navigation.missing-fine

error — an al Fine jump needs a Fine marker to stop at

## notation.unknown

error — this word is not in the mark vocabulary; quoted text ("con brio") prints any words you like

## notation.duplicate

warning — the same mark is written twice on one node; the second one changes nothing

## notation.run-nothing-to-continue

warning — (sim) continues the articulation already in force, so it needs one: mark the first note ((-)4C) and write (sim) on the next — on its own it continues nothing, and the passage stays plain

## notation.run-not-open

warning — (non) is “non sim.” — it stops a run that (sim) opened; with no run in force the notes here are already plain, so it changes nothing

## chord.duplicate-pitch

error — a chord writes each pitch once; altered unisons (C4 with C#4) are legal, an exact repeat is not

## chord-symbol.invalid-root

error — a chord symbol starts with a root: A–G (case carries quality) with an optional accidental

## chord-symbol.unknown-option

error — the only chord-symbol option is bass-<pitch>, the slash bass

## chord-symbol.conflicting-bass

error — a chord symbol names at most one bass pitch

## chord-symbol.empty-display

error — an explicit chord-symbol spelling replaces the generated one, so it cannot be empty

## tie.pitch-mismatch

error — a tie joins the SAME written pitch; ~ between different pitches is a slur, which is what you want here

## tie.no-common-pitch

error — a tie between chords needs at least one written pitch present in both

## tie.partial-pitch-mismatch

error — a tied chord member must exist in the next chord; a tie that lands on nothing is not engravable

## tie.missing-endpoint

error — a tie needs a pitched note immediately after it to arrive at

## tie.conflicting-scope

error — tie the whole event (tie-next) or single chord members ([Eb~ G]), never both — the two scopes contradict each other

## tie.invalid-endpoint

error — a tie statement names two pitched notes that exist in this part

## tie.double-connector-no-pitch

warning — a trailing ~~ says BOTH things at once — tie forward and open a slur (4C~~ C D ~E) — so its tie half needs the very next node to repeat the written pitch; with no repeat there is nothing to tie and the second ~ quietly spells a second slur instead. Write one ~ for the slur alone, or repeat the pitch to tie

## tie.connector-run-too-long

warning — a node trails one ~ (a tie when the next node repeats the pitch, a slur otherwise) or two (~~ — tie forward AND open a slur); there is deliberately no third form, so every ~ past the second says nothing

## tie.not-adjacent

info — a tie says two notes are ONE SOUND, so it only ever joins ADJACENT notes of the same pitch; X~ … ~X with anything in between is a slur across all of them, however the endpoints are spelled (N34) — if two ties were meant, the pitch has to repeat on the very next note

## range.above-practical

info — the catalog's practical range is the band a DEVELOPING player can be counted on for, and this note is above it; one strong player will have it and a section will not, which is worth knowing now rather than at the first rehearsal — the instrument's full range is stated separately, and this note is still inside it

## range.below-practical

info — the bottom of a range is where tone and intonation go first, and this note is below the band a DEVELOPING player owns; the note is on the instrument — the section playing it will simply be quiet, flat and late

## range.outside-professional

warning — this note is outside the instrument's range as the orchestration literature states it — not merely hard but very likely not there at all for whoever is handed the part; ranges are stated in WRITTEN pitch, so a transposing part is judged by what its player reads and not by what it sounds

## hairpin.unterminated

warning — an inline cresc/dim ends at the next node carrying a dynamic; without one it has no printed length

## transition.stop-without-start

warning — [...] is the last dash of a tempo transition's dashed line, so it needs an earlier [rit..], [rall..] or [accel..] to end; with none open it prints nothing

## transition.overlapping

warning — one tempo transition is in force at a time: a second [rit..]/[accel..] closes the one already running where it stands, exactly as a tempo event would — write [...] where you meant the first to end

## expressive.invalid-symbol

error — a stable identifier names the expression so edits elsewhere keep pointing at it

## expressive.duplicate-symbol

error — each expression in a part carries its own name

## expressive.invalid-placement

error — placement is above, below, or auto

## expressive.unknown-measure

error — an anchor names a bar this part declares

## expressive.invalid-offset

error — an anchor offset is a position inside the bar: 0, a note value (q), or an exact N/M

## dynamic.invalid-mark

error — dynamics are pppp…ffff plus fp, sfz, sf, sfp, fz, rfz and n

## text.invalid-role

error — a text role is tempo, rehearsal, technique, staff, or system — the role decides how it is engraved

## text.empty

error — a text expression prints something; an empty one is invisible

## breath.invalid-symbol

error — a breath is `breath` (comma) or `caesura` (railroad tracks)

## breath.always-above

warning — a breath is drawn above the stave, so `below` cannot move it

## figured-bass.invalid-figures

error — figured bass is a non-empty comma-separated list of figures

## lyric.invalid-target

error — a lyric syllable attaches to a pitched note; rests are not sung

## lyric.invalid-verse

error — lyric verses are numbered from 1

## lyric.invalid-syllabic

error — a syllable is single, begin, middle, or end — this is what draws the hyphens between syllables

## lyric.unknown-option

error — lyric options are extender (the melisma line) and elision

## lyric.duplicate-verse

error — a note carries one syllable per verse; a second one would print on top of the first

## lyric.duplicate-option

error — a lyric states each option once

## lyric.empty

error — an empty syllable prints nothing; delete it instead

## sticking.grace-spelling

error — a grace stroke is written with the language's grace slash (/R L is a flam), because r is already the rest letter and the slot law refuses a second meaning for it

## sticking.pitched-part

error — R and L are hands, and they stand where a note stands only on an unpitched part; on a pitched one the sticking is a mark after the note (4C(R)), which is the side that prints below

## sticking.duplicate

error — a note is struck by one hand, so it carries one sticking; a second would print on top of the first

## sticking.unknown-rudiment

error — an exercise applies a rudiment by naming a declared one, so a name the score's dictionary does not hold says nothing about which hands the notes take

## sticking.pattern-mismatch

info — a rudiment's strokes are laid under the attacks in order and restart when they run out, so a count that is not a whole number of times through leaves the last pass cut short — and a flam or a roll in the pattern wants a grace stroke or the same roll mark in the music

## staff-lines.invalid

error — a staff has one to five lines — five is the standard staff and one is the unpitched percussion line

## span.invalid-kind

error — span kinds are slur, hairpin, pedal, ottava, volta, glissando, trill-line, custom-line and tuplet-bracket

## span.invalid-range

error — a span ends at or after where it starts

## span.unknown-option

error — each span kind has its own options; this one is not among them

## span.conflicting-options

error — these options contradict each other (a hairpin grows or shrinks, never both)

## span.duplicate-option

error — a span states each option once

## span.empty-text

error — a labelled span prints its label, so the label cannot be empty

## volta.empty-text

error — a volta prints its ending numbers and label; an empty label leaves the bracket blank

## tuplet.invalid-ratio

error — a tuplet plays at least 2 notes in the time of 1 or more (3:2, 5:4)

## tuplet.too-few-events

error — a tuplet groups at least two events; one note in the time of another is just a different duration

## tuplet.unknown-option

error — tuplet options are bracket-auto/show/hide and number-ratio/actual/none

## tuplet.conflicting-options

error — a tuplet states its bracket once and its number once

## tuplet.duplicate-symbol

error — a tuplet name addresses one group; two groups with one name make that address ambiguous

## tuplet.invalid-symbol

error — a stable name is a letter or _ then letters, digits, _ and -

## transform.source-has-errors

error — a transform rewrites text it fully understood — the formatter's own contract; fix the errors and the same command will run

## transform.unnamed-rows

error — a grid row belongs to a DECLARED part; rows the parser had to name for itself ("row 2") have no braced form to become, and inventing one would print a name on a staff nobody wrote — declare the parts, or label the rows

## transform.score-spine

error — a block head's spine states a fact about a SCORE POINT — a double bar, a rehearsal mark, a key change — not about a player, which is why it stands outside the rows; part-first has no shared head to carry it, so a score with a spine keeps the block road (`m1-8 { … }`), where the head still exists

## transform.part-statements

error — a grid row holds bars; a transpose, a span, a lyric, a part-level clef or an `at` block that changes more than the clef has no cell to print in, so that part keeps its braced form

## transform.bar-head

error — a grid cell prints its bar's music alone — navigation words (a repeat, an ending, a jump) and a stable bar name live on a labelled measure line, which a row has no room for

## transform.bar-count

error — a grid is a rectangle and a re-woven part is a replacement: every row spans the same bars, and an edited part hands back exactly the bars it was given — adding or removing one is a change to the SCORE

## transform.group-label

error — rows past a group label's parts are those parts' further voices, taken in turn — so a part with more than one voice needs a label that names it ALONE; give it a printed name nothing else answers to

## transform.woven-context

error — a direction written inside another player's bar has a beat, and this part's bar has different notes in it; move it to the bar's head, where every part can read it at the same moment

## transform.part-not-found

error — a part is addressed by its PRINTED name ("Flute 1") or by an instrument key that names only one part; `scorescript parts` lists what this score answers to

## transform.part-ambiguous

error — an instrument key that names several parts cannot pick one of them; the printed name disambiguates it

## transform.not-one-part

error — `part put` takes the file `part get` made — one part — because it re-weaves that part into the score it came from, and a whole score has nothing to weave into

## transform.voices-changed

error — a part's voice rows are its staff layout, not its notes; `part put` replaces bars one for one, so adding or dropping a voice is a change to the SCORE and belongs there

## transform.meter-changed

error — a bar line cannot move for one player: the meter belongs to the score, so a part whose bars are measured differently is describing different music

## transform.context-changed

error — the key and the tempo are the conductor's; a part file CARRIES them so the player can read them, but changing one there would silently rewrite every other part — change it in the score

## import.malformed

error — the file is not well-formed XML, so nothing in it can be trusted to mean what it looks like; the position given is where the document stopped making sense

## import.not-musicxml

error — the importer reads score-partwise MusicXML — the root element every notation program exports by default; score-timewise and other XML dialects are a different grammar

## import.archive

error — a .mxl is a bounded zip container whose META-INF/container.xml names one primary MusicXML score; malformed, ambiguous, encrypted, unsafe, or expansion-heavy archives are refused before importing

## import.size

error — the imported score expands beyond the host's bounded MusicXML limit; reduce or split the source rather than letting one document exhaust the process

## import.encoding

error — MusicXML and every text entry in an .mxl container are UTF-8; replacing invalid bytes would silently change names or notation, so the importer refuses instead

## import.empty

warning — the file parsed but holds no music — no parts, or parts with no measures; an importer that returned an empty score would look like it worked

## import.unsupported

warning — this element has no home in ScoreScript, so it did not come across; it is named rather than dropped in silence, because a file that is quietly smaller than it was is worse than one that says what it lost

## import.lossy

info — this came across, but not exactly as it was written — a spelling the language has no glyph for, a span drawn a different way, a value rounded; the music is there and the notation moved
