Reports

Every conversion result exposes output and a ConversionReport. Treat the report as a migration work list, not as optional logging.

<?php

$status = $result->status();
$complete = $result->isComplete();
$lossless = $result->isLossless();
$exact = $result->isExact();
$counts = $result->report->countsByKindAndConstruct();
Issue kind Meaning Status
unsupported No supported target representation exists. Blocked
lossy Output exists but source information was discarded. Review
approximated Output preserves intent through a different construct. Tracked

isComplete() excludes unsupported mappings. isLossless() also excludes lossy mappings. isExact() requires an empty report.

Project results aggregate all file reports and keep parser, effective reference, and project-reference problems separate. Review those diagnostics even when conversion itself is exact.

Compare real outcomes

With Composer's autoloader loaded, this script converts four bounded examples:

<?php

use Alto\Rst\Convert\ConversionOptions;
use Alto\Rst\Convert\RstToMarkdown;
use Alto\Rst\Rst;
use Alto\Rst\Source\Source;

$inputs = [
    'Heading' => "Guide\n=====\n",
    'Command' => 'Run :command:`composer install`.',
    'Math' => 'Compute :math:`x^2`.',
    'Project' => ".. toctree::\n\n    guide/page\n",
];
$rst = Rst::symfony();

foreach ($inputs as $name => $input) {
    $source = Source::fromString($input);
    $parsed = $rst->parse($input);
    $result = new RstToMarkdown()->convert(
        $parsed->document(),
        $source,
        $rst->profile(),
        ConversionOptions::symfony(),
        $parsed->references(),
    );
    printf("%s: %s; complete=%s; lossless=%s; exact=%s\n",
        $name,
        $result->status()->value,
        $result->isComplete() ? 'yes' : 'no',
        $result->isLossless() ? 'yes' : 'no',
        $result->isExact() ? 'yes' : 'no',
    );
}

The output is:

Heading: exact; complete=yes; lossless=yes; exact=yes
Command: tracked; complete=yes; lossless=yes; exact=no
Math: review; complete=yes; lossless=no; exact=no
Project: blocked; complete=no; lossless=no; exact=no

The math role loses mathematical semantics even though code text survives. The toctree needs project context; use Project conversion with a project map instead of accepting a placeholder as a successful migration.