Skip to content

v0.2.0

Latest

Choose a tag to compare

@dvalnn dvalnn released this 13 Nov 18:31
d49c4b7

The second stable release. Seats hand structured data on as typed reply fields, and the classics pack becomes blocks:
a review sizes itself to the change, and build_then_review builds a request and fixes what its review upholds.

Install or upgrade

curl -fsSL https://raw.githubusercontent.com/dvalnn/maestro/next/install.sh | sh

To pin this release, put MAESTRO_VERSION=v0.2.0 before sh. Manual steps are in
INSTALL.md.

Upgrade notes

  • Install maestro and the classics pack together, and rebuild your own packs. A pack built for v0.1.0 asks for
    SDK ^0.1.0, which this release does not satisfy, so it is refused with a message naming the pack. The classics
    bundle imports @maestro/host-repo-sdk/yaml, which a v0.1.0 binary does not embed. The IR is now 1.2: this
    release reads 1.0 to 1.2, and an older maestro refuses IR this one writes. The install command replaces the
    classics pack; a hand install must extract classics-*.tar.gz again.
  • Finish or discard v0.1.0 classics.panel_review concerts before upgrading. A resume runs the recorded graph,
    whose code node calls survivorsOf, which the pack no longer exports.
  • Give the four new classics profiles a runtime. classics/tester, classics/deep-lens, classics/top-lens and
    classics/cross-lens each need profiles.classics/<name>.runtime; the starter config in INSTALL.md lists all ten.
  • panel_review's and build_then_repair's agents moved. A seat key names the innermost composition holding the
    seat: rebind the review's seats as seats.classics/panel/<seat>, not classics/panel_review/<seat>, and the builder
    as classics/build/builder (classics/test_first/builder under classics.build.testFirst), not
    classics/build_then_repair/builder; pre-flight refuses the old keys. The review's nodes sit under panel/, as in
    panel/consolidator, and the builder is build/build, so a --node, a MAESTRO_STUB_OUTPUTS directory or a script
    naming the old ids must follow.
  • Classics' review contracts are typed reply fields, not files. The lens replies findings, the skeptic rulings
    and the consolidator verdict; findings.json, verdicts.json and verdict.json are gone, and the consolidator, a
    work seat that no longer approves or rejects, writes no review.md. Findings is a bare list of Finding
    { id, where, issue, cites }, with no clean or blocking: every finding rejects its lens. Verdicts is renamed
    Rulings. Verdict is { criteria, upholds }, each criterion { id, met, evidence, shownBy }, each upheld finding
    named <lens>/<id>, with no approved or blocking. A shadowed consolidator profile drops its approve/reject and
    review.md lines.
  • panel is a subcomposition, and round, survivorsOf, upheld and rulingLine are gone. Build it with
    use(panel, { change, spec, session?, earlier?, names?, brief? }, { params }), its params lenses, skeptics,
    consolidate, grounds and checks; it needs a session when consolidate is false. It ends in a Tally,
    { lane, session, upheld }, with delivered and the review rendered from the verdict beside it. A lens alone is a
    lens call, its skeptic challenge; read held findings with heldOf and tallyOf.
  • classics.panel_review ends in that Tally and settles rejected (exit 3) while a finding is upheld, the upheld
    findings its rejection outputs. A script that read its verdict.json reads upheld and review instead.
  • The scout's answer.md output is gone: read its answers reply field, one entry per question, each grounded,
    or unsure with what is missing.
  • A file attachment mounts at /in/<name>.<ext>, <ext> its source's extension, and its earlier copy at
    /in/previous/<name>.<ext>; a directory and a source without an extension mount as before. A task, hint or check
    that names /in/<name> for a file must add the extension.
  • The classics profiles/writing/ directory and the writing attachment are gone. Each classics seat carries its
    guidance in instructions, which now takes a list of files; builder and tester share profiles/testing.md. A
    profile's skills field stays refused, now with the fix to move its guidance into instructions. The pack's
    skills/ holds the text those instructions are written from, and no profile reads it. A shadow copied from
    v0.1.0's profiles/ keeps its own writing attachment; copy the pack's profiles/ again to shadow it.
  • A used composition's params sit under the pack that declares it. classics.<composition>.<param> now reaches
    that composition under any root, a bare .maestro file included, where it used to be ignored. A -c key that
    reaches no composition the concert uses, matched by <pack>.<composition>, is refused as CFG.unreached (exit 2);
    the same key from a file or preset is ignored, its value still schema-checked.
  • A pack is refused when one of its compositions declares another pack's id. A bare file may still re-export one.

Added

  • Typed reply fields. reply: { <name>: <type> } on seat(name, opts) or on a call declares fields of the agent's
    envelope beside its report. The host checks each against its type, with the envelope's correction turns, and each
    valid field is an output of its name; the agent writes no file for it. A field holding an artifact, or named after an
    envelope key, an agent port or a declared output, is a build error. The stub harness gives each field the placeholder
    of its type, or the JSON in <field>.json under MAESTRO_STUB_OUTPUTS.
  • relay on a seat call, { <name>: ref }, inlines each value in the task under ## <name>: a string as it is, a
    Markdown output as its text, any other typed value as YAML, a multi-line string as a block. A relay named after an
    attachment or an agent port, or holding any other artifact, is a build error: attach it instead. yamlOf from
    @maestro/host-repo-sdk/yaml renders a value the same way.
  • ls --json gives each instance's typed outputs as .outputs, beside .reports: the reply fields an agent
    returned and a code node's values, without opening the lane. The host also stages an agent's fields in
    staged/outputs.yaml, and the inspector shows a settled agent's one-line summary.
  • Sightings. An agent's report may list sightings, each { path, text, cites }: a defect outside its task's
    scope, kept with the report. A classics lens reports such a defect as a sighting, never a finding.
  • changeset(v, { since }) keeps only the patches after since, an earlier version of the same lane. Such a
    changeset serves apply and attachments inside a concert, not cs show or cs apply.
  • A composition's pack option names the pack whose config keys reach it.
  • classics.build_then_review builds the request, repairs it until the checks pass, reviews it by tiered_review
    and fixes what the review upholds, up to maxFixes rounds, leaving a patch series. It settles rejected, the series
    kept, while the last review upholds a finding:
    maestro perform classics.build_then_review --request "<what to build>" -c classics.build.testFirst=true.
  • classics.review_change reviews a revision range or a change by tiered_review: --request, and exactly one of
    --revs and --change.
  • tiered_review counts the changed lines of the changeset and seats one tier's lenses: lens for small, to 200
    lines, deep-lens for medium, to 800, top-lens for large, to 2000, and top-lens with cross-lens, a second
    model, above. classics.tiered_review.floor sets the lowest tier. Each lens rules on the checklist sections the
    changed paths call for.
  • build, test_first and the tester seat. build delivers a spec with one builder, or, under
    classics.build.testFirst, through test_first: a tester on classics/tester pins a few firm tests at the spec's
    public seam and replies a map (TestMap), each pin with what its test misses, and a builder extends its lane to
    pass them, replying the tests it overrules, with why, in overrules.
  • fix_until_clean, a loop of repair_until_green and tiered_review: while the Tally upholds a finding, a
    builder fixes it in its session and the round runs again, up to maxFixes times. It takes the ports lane,
    session, spec and brief, and the params maxFixes, checks and grounds.
  • The review moves challenge, fix and tally, exported for compositions built on the pack, with the types
    Finding, Upheld, Tally, Brief, TestMap, Overrule, Overrules and Answers. @maestro/classics/code
    exports the code-node functions alone, so a composition re-exports them in one line.
  • repair_until_green takes a fix param: a target.checks name run before each check and recheck, such as a
    formatter, so a miss a script can fix costs no repair round.
  • Classics recipes: fix ladder, lens fusion, ruling vote, audit sweep and plan review, in
    packs/classics/src/recipes.ts to copy from; the pack does not export them.

Changed

  • An agent's task holds what it must read: its text, then each relay, then its attachments, the graph's then the
    profile's, as a one-level tree with each file at the path it mounts and its size. The frame no longer lists the
    attachments, and pretty-prints each JSON schema of its ## Reply section.
  • classics.build_then_repair builds through build, so classics.build.testFirst puts tests first there too.
  • A review that no lens delivered is rejected, in every entry and in panel, with the reason "no lens delivered a
    review".
  • A classics finding must cite a guideline the lens received: a checklist item, an attached doc or one of the
    repo's own standards. A nit cites none, so it is no finding; the skeptic and the consolidator rule one that cites none
    as not holding.
  • The panel's lenses rule on the checklist sections tiered_review uses: correctness on correctness, design and
    smells, spec on spec, tests on tests.
  • A later review round's lenses rule first on each finding the earlier round upheld, given as the earlier port, so
    rounds converge on what was upheld.
  • The review is rendered from the consolidator's verdict as ## Upheld, ## Not met and ## Met. A criterion
    ruled not met is upheld as consolidator/<id> for the fix, unless an upheld finding it names in shownBy already
    shows it, so no failure counts twice.

Fixed

  • A config key for a classics composition is no longer ignored under a root from another pack or a bare file.
  • A consolidator that forgot review.md no longer loses its verdict: it writes no file now.
  • A lens skipped because an input it reads failed, a relay included, no longer passes for a clean review: a review
    holds its findings only once every input its lenses read is in.
  • A lens name the panel has no task for fails the review.
  • INSTALL.md and the maestro skill follow this release: config keys may change between releases, a used
    composition keeps its keys under a bare file, and a pack may ship a skills/ directory.