{
  "schemaVersion": 1,
  "statementBudget": 3,
  "layers": {
    "L1": "task-oriented API",
    "L2": "domain facade and builders",
    "L3": "typed DOM, package, and streaming"
  },
  "contracts": {
    "indexes": "zero-based",
    "a1Addresses": "one-based-user-notation",
    "findMissing": "null",
    "getMissing": "throws-localized-domain-error",
    "removeMissing": "false-or-no-op-count-zero",
    "cloneOwnership": "detached-or-imported-by-facade",
    "streamOwnership": "caller-owned-unless-leaveOpen-is-false",
    "pureMutationAsync": false
  },
  "workflows": [
    {"id":"ODT-CREATE-LOAD-SAVE","format":"ODT","tasks":["create","load","save"],"layer":"L1","implementation":["OdfKit/Text/TextDocument.cs"],"tests":["OdfKit.Tests/TextApiUsabilityTests.cs"],"samples":["samples/Sample.cs"],"limitations":"Rendering and physical pagination require an extension backend."},
    {"id":"ODT-TEXT","format":"ODT","tasks":["find-text","replace-text"],"layer":"L1","implementation":["OdfKit/Text/TextDocument.SearchReplace.cs","OdfKit/Text/OdfTextQueryOptions.cs","OdfKit/Text/OdfTextReplaceResult.cs"],"tests":["OdfKit.Tests/TextApiUsabilityTests.cs","OdfKit.Tests/TextHighLevelApiTests.cs"],"samples":["docs/reference/semantic-facades.md"],"limitations":"Search operates on document text semantics and is not a general XML selector."},
    {"id":"ODT-REFERENCES","format":"ODT","tasks":["bookmark","field"],"layer":"L1","implementation":["OdfKit/Text/TextDocument.TaskOperations.cs","OdfKit/Text/TextDocument.InlineFields.cs","OdfKit/Text/TextDocument.FormFields.cs"],"tests":["OdfKit.Tests/TextApiUsabilityTests.cs"],"samples":["docs/reference/templates.md"],"limitations":"Computed field layout requires a rendering application."},
    {"id":"ODT-TEMPLATE","format":"ODT","tasks":["fill-template","replace-image"],"layer":"L1","implementation":["OdfKit/Text/TextDocument.TaskOperations.cs","OdfKit/TemplateBinder.cs","OdfKit/TemplateBinder.Images.cs"],"tests":["OdfKit.Tests/TextApiUsabilityTests.cs","OdfKit.Tests/TemplateBinderScenarioTests.cs"],"samples":["docs/reference/templates.md"],"limitations":"Only typed placeholders and declared template tokens are mutated."},
    {"id":"ODT-APPEND","format":"ODT","tasks":["append-document"],"layer":"L1","implementation":["OdfKit/Text/TextDocument.TaskOperations.cs","OdfKit/Core/OdfDocument.Merging.cs"],"tests":["OdfKit.Tests/TextApiUsabilityTests.cs","OdfKit.Tests/OdfCompletenessRegressionTests.cs"],"samples":["docs/reference/semantic-facades.md"],"limitations":"Unsupported foreign relationships are preserved with merge diagnostics."},
    {"id":"ODT-STREAM","format":"ODT","tasks":["stream-write","stream-read","batch"],"layer":"L3","implementation":["OdfKit/Text/OdtStreamWriter.cs","OdfKit/Text/OdtStreamReader.cs"],"tests":["OdfKit.Tests/OdtStreamWriterFastPathTests.cs"],"samples":["samples/Sample.cs"],"limitations":"Forward-only workflows cannot revisit content already emitted."},
    {"id":"ODS-CREATE-LOAD-SAVE","format":"ODS","tasks":["create","load","save"],"layer":"L1","implementation":["OdfKit/Spreadsheet/SpreadsheetDocument.cs"],"tests":["OdfKit.Tests/SpreadsheetApiUsabilityTests.cs"],"samples":["samples/Sample.cs"],"limitations":"Formula recalculation is delegated unless a supported evaluator is configured."},
    {"id":"ODS-CELL-RANGE","format":"ODS","tasks":["set-value","set-range-values","range-style"],"layer":"L1","implementation":["OdfKit/Spreadsheet/OdfCell.cs","OdfKit/Spreadsheet/OdfTableSheet.RangeDepth.cs","OdfKit/Spreadsheet/SpreadsheetDocument.RangeDepth.cs","OdfKit/Spreadsheet/OdfCellRangeSelection.cs"],"tests":["OdfKit.Tests/SpreadsheetApiUsabilityTests.cs"],"samples":["docs/reference/spreadsheet-data.md"],"limitations":"A1 notation is user-facing and collection indexes remain zero-based."},
    {"id":"ODS-OBJECT-BINDING","format":"ODS","tasks":["import-records","read-records","batch"],"layer":"L2","implementation":["OdfKit/Spreadsheet/OdfTableSheet.ObjectBinding.cs","OdfKit/Spreadsheet/SpreadsheetDocument.ObjectBinding.cs"],"tests":["OdfKit.Tests/SpreadsheetApiUsabilityTests.cs","OdfKit.Tests/SpreadsheetObjectBindingTests.cs"],"samples":["docs/reference/spreadsheet-data.md"],"limitations":"Reflection binding requires public fields or properties and reports conversion diagnostics."},
    {"id":"ODS-STREAM","format":"ODS","tasks":["stream-write","stream-read","object-stream"],"layer":"L3","implementation":["OdfKit/Spreadsheet/OdsStreamWriter.cs","OdfKit/Spreadsheet/OdsStreamReader.cs","OdfKit/Spreadsheet/ObjectDataReader.cs"],"tests":["OdfKit.Tests/OdsStreamWriterFastPathTests.cs","OdfKit.Tests/SpreadsheetObjectBindingTests.cs"],"samples":["samples/Sample.cs"],"limitations":"Streaming adapters are forward-only and document their stream ownership."},
    {"id":"ODP-SLIDES","format":"ODP","tasks":["duplicate-slide","move-slide","remove-slide"],"layer":"L1","implementation":["OdfKit/Presentation/PresentationDocument.Slides.cs"],"tests":["OdfKit.Tests/PresentationApiUsabilityTests.cs"],"samples":["docs/reference/semantic-facades.md"],"limitations":"Slide indexes are zero-based."},
    {"id":"ODP-CONTENT","format":"ODP","tasks":["placeholder","text","image","shape"],"layer":"L1","implementation":["OdfKit/Presentation/OdfSlide.cs","OdfKit/Presentation/OdfSlide.TaskOperations.cs","OdfKit/Presentation/OdfSlide.DrawingObjects.cs"],"tests":["OdfKit.Tests/PresentationApiUsabilityTests.cs","OdfKit.Tests/PresentationHighLevelApiTests.cs"],"samples":["docs/reference/semantic-facades.md"],"limitations":"Pixel-identical rendering depends on fonts and the selected backend."},
    {"id":"ODG-PAGES","format":"ODG","tasks":["page","shape","image"],"layer":"L1","implementation":["OdfKit/Drawing/DrawingDocument.cs","OdfKit/Drawing/OdfDrawPage.Creation.cs"],"tests":["OdfKit.Tests/DrawingApiUsabilityTests.cs"],"samples":["samples/Sample.cs"],"limitations":"Physical rendering is outside the core mutation facade."},
    {"id":"ODG-LAYOUT","format":"ODG","tasks":["connect","align","distribute","group","z-order"],"layer":"L2","implementation":["OdfKit/Drawing/OdfDrawPage.Features.cs","OdfKit/Drawing/OdfDrawPage.Grouping.cs","OdfKit/Drawing/OdfDrawPage.Layout.cs"],"tests":["OdfKit.Tests/DrawingApiUsabilityTests.cs","OdfKit.Tests/DrawingHighLevelApiTests.cs"],"samples":["docs/reference/semantic-facades.md"],"limitations":"Automatic routing and layout use explicit domain options rather than a universal content abstraction."},
    {"id":"STYLE-FACADE","format":"ALL","tasks":["style","deduplicate","inherit","cross-document-import","range-style"],"layer":"L2","implementation":["OdfKit/Styles/OdfStyleEngine.LocalStyles.cs","OdfKit/Core/OdfDocument.Merging.cs","OdfKit/Spreadsheet/OdfCellRangeSelection.cs","OdfKit/DOM/OdfStyleMixinBuilder.cs"],"tests":["OdfKit.Tests/SpreadsheetApiUsabilityTests.cs","OdfKit.Tests/TextHighLevelApiTests.cs","OdfKit.Tests/FormulaAndStylesTest.cs"],"samples":["docs/reference/spreadsheet-data.md","docs/reference/semantic-facades.md"],"limitations":"Unknown vendor style properties remain available through typed DOM or package preservation."},
    {"id":"EXPORT-MANAGED","format":"ALL","tasks":["html","markdown","svg","path","stream","async","cancellation","diagnostics"],"layer":"L2","implementation":["OdfKit/Export/OdfExportReport.cs","OdfKit.Extensions.Html/OdfHtmlExporter.cs","OdfKit.Extensions.Html/OdfMarkdownExporter.cs","OdfKit.Extensions.Html/OdfSvgExporter.cs"],"tests":["OdfKit.Tests/ExportFacadeTests.cs","OdfKit.Tests/ManagedTextExportTests.cs","OdfKit.Tests/ManagedSvgExportTests.cs"],"samples":["docs/reference/exporting.md","samples/Sample.cs"],"limitations":"Managed exporters cover documented semantic subsets and return backend diagnostics for unsupported constructs."},
    {"id":"EXPORT-PDF","format":"ODT","tasks":["pdf","path","stream","async","cancellation","diagnostics"],"layer":"L2","implementation":["OdfKit/Export/OdfExportReport.cs","OdfKit.Extensions.Pdf/OdfPdfExporter.cs"],"tests":["OdfKit.Tests/ExportFacadeTests.cs","OdfKit.Tests/PdfExportTests.cs"],"samples":["docs/reference/exporting.md","samples/Sample.cs"],"limitations":"PDF fidelity depends on the selected rendering backend."},
    {"id":"VERSION-DIAGNOSTICS","format":"ALL","tasks":["version-diagnostics","save"],"layer":"L1","implementation":["OdfKit/Core/OdfDocument.cs"],"tests":["OdfKit.Tests/OdfSaveOptionsVersionTests.cs"],"samples":["docs/migration-high-level-api.md","docs/migration-npoi-independentsoft.md"],"limitations":"Diagnostics report loss risk; OdfKit does not invent downgrade semantics."},
    {"id":"TYPED-DOM-PACKAGE","format":"ALL","tasks":["typed-dom","package","unknown-content"],"layer":"L3","implementation":["OdfKit/DOM/OdfElement.cs","OdfKit/Core/OdfPackage.PublicApi.cs"],"tests":["OdfKit.Tests/TypedDomParityTests.cs"],"samples":["docs/core-quickstart.md"],"limitations":"This escape hatch is intentionally lower level than task and domain facades."}
  ]
}
