Repository navigation
2.0.0 - living feature docs, documentation obligations, and a smaller core
OSpec 2.0.0 replaces generated per-change knowledge documents with a living documentation layer — human-owned feature docs with declared code: scopes, a one-row-per-feature catalogue, a section-level locator, and a documentation-obligation engine that tells the AI exactly which section each change owes — and removes the plugin system, ospec batch, and a batch of dead library surface.
Breaking changes
- Plugin system removed. The stitch and checkpoint built-ins,
ospec plugins, and the third-party extension mechanism are gone.ospec updatestrips plugin configuration from.skillrcand managed guidance into an auditable.ospec/plugin-migration.json;.ospec/plugins/is user data and is never touched. Older 1.x CLIs that fetch the plugin registry from this repository now receive 404. - Archived changes no longer generate knowledge documents. Nothing is written under
docs/project/changes/; archiving writes the index entry, updatesdocs/project/feature-catalog.mdrows, and maintains an idempotentospec:last-changetraceability comment. Render any archive on demand withospec changes show <archive>. Projects with legacy generated documents migrate with the four-phase, gatedospec docs migrate. feature-index.mdis replaced byfeature-catalog.md. The prose blocks stop being generated; the catalogue carries one row per declared feature.- CLI surface:
ospec batch(withstats/export/import) is removed, and the always-failing 1.9 tombstonesospec execute orchestrate,ospec workflow simulate, andospec loop watchare deleted outright. - Library surface: 25 package-root exports are removed (including
BatchOperations,CachingLayer,FeatureUpdater,HookSystem,IndexRegenerator,PerformanceMonitor,SkillUpdateEngine,StatePersistence,VerificationSystem,WorkflowEngine,AgentCliRunnerService,BatchCommand,StringUtils,DateUtilsand their singletons), 15 type exports leave the package root, 16 deepdist/**import paths are deleted (including the wholedist/advancedsubtree), and 29 members are removed from modules that still ship — most notablyTemplateEngine's eightgenerate*Templatemethods andTaskGraphExecutionService.launchAndRun/orchestrate/runReview. Importing the package as a library no longer auto-executes the CLI. - Task graphs from before contract 1.8.6: a task without
parallelizableis treated as serial, and serial-task mutual exclusion is now actually enforced — an unmarkedIN_PROGRESStask defers other ready tasks (scheduling.deferredreasonserial_task_running:<id>). Addparallelizable: trueto genuinely independent tasks or regenerate the graph. - Index ordering switches from locale-dependent
localeCompareto fixed codepoint order: the firstospec index buildafter upgrading re-sorts the index once, and collaborators stop producing byte-different indexes across locales. - Verification evidence accepts negative exit codes and records
timedOut/signal/infraFailureas independent fields.
Migration
npm install -g @clawplays/ospec-cli@2.0.0- In each project:
ospec update— refreshes assets, repairs legacy footprints, strips plugin configuration with an audit record, and reports legacy generated documents without touching them. ospec index build— applies the one-time codepoint re-sort.- When ready,
ospec docs migrate --planstarts the guided migration from generated documents to feature docs; nothing is deleted until phase 3 verifies every document is mapped or explicitly marked historical.
New
- Living feature docs: declare a feature section with
<!-- ospec:feature <slug> code:<paths> -->inside human-owned docs;docs/project/feature-catalog.mdcarries one row per declared feature (slug, one line,doc#section, status, last-change archive). ospec docs locate --feature <slug> | --affects <path>: resolves the ONE section that describes a behavior — path, heading, and line range — through thecode:declarations, longest prefix first, so an agent reads one section instead of a document.- Documentation-obligation engine:
ospec docs obligations --applyderives per-change_typeobligations at planning time with the resolvedpath#sectionalready filled in (a fix checks the section for the pre-fix wrong behaviour; a refactor verifies it and can recordverified_unchangedviaospec docs confirm). Whenfeatures:is empty, obligations fall back to resolvingaffectsthrough thecode:declarations..skillrcdocs_contract.mode: warn|strictdecides whether an unmet required obligation warns or blocks archiving; the default iswarnfor this release cycle. ospec docs audit: read-only drift detection — lists feature sections whosecode:paths changed since the archive named by theirospec:last-changecomment.ospec changes show <archive>: renders an archived change (summary, affects, file list, verification commands, evidence links) from the index and archive directory; fuzzy name matching offers candidates.ospec docs migrate: four-phase migration for pre-2.0 projects — plan (inventory + draft skeletons), rewrite (AI work, the engine never writes prose), verify (refuses to proceed while any legacy document is unmapped), finalize (deletes only after printing and recording the list).ospec index gc: lists index entries whose archive no longer exists and cleans them on confirmation.- Controller batch protocol:
ospec loop step --batch-filesettles a whole action batch in one round trip (controller round trips drop from 7 to 2 per cycle), and structured worker reports validate at completion time. - Forward-compatible config: a
.skillrcdeclaring a schema version this CLI does not know has its unknownworkflowkeys tolerated, preserved through save round-trips, and warned about once — while a known-version config still fails loud on typos.
Improved
ospec archive --checkandospec execute statusare truly read-only: they no longer take the task-graph mutation lease or rewrite state;--repairrestores the old reconciling behaviour explicitly, and goal-progress coordination diagnostics are still reported read-only.- Command output is budgeted: prose output over the cap spills the complete text to
artifacts/spill/and references it inline; machine output (--json/--brief) is never truncated — over the cap it is replaced by one valid JSON envelope withospecOutputSpill: true. ospec updatemigrates legacy plugin configuration safely, repairs older project footprints, refreshes managed skills and archive layout, and points atospec docs migratewhen it finds legacy generated documents — it never migrates or deletes them itself.- Serial-task scheduling is enforced correctly under concurrency, state files use compare-and-swap and atomic writes, and repeated repair findings stop instead of cycling.
Fixed
- Verification and review-evidence validation always derives from the bytes actually read — the caching layer that could return a stale PASS after a file changed mid-validation was removed entirely.
ospec index querymatches project documents, not only archived changes.- A damaged
.skillrcfails loud with recovery steps everywhere (25 call sites no longer silently fall back to the classic layout), and checklist gates handle CRLF content instead of failing open. --help,-h, and a leadinghelpprint help and never act: previously 11 subcommands swallowed them as positional arguments, andospec goal helpreally created 18 files.- Unreadable archives keep their index entries and warn instead of being silently dropped, and
runGitno longer truncates large git evidence at 1MB.
Docs
- READMEs in all four languages present the 2.0 documentation layer; usage pages list the new
docs,changes show, andindex gccommands; every reference to removed features (plugin system,ospec batch, generated knowledge documents, tombstone commands) is gone from the shipped docs and protocol assets.
Upgrade
npm install -g @clawplays/ospec-cli@2.0.0
ospec updateFull Changelog: 1.9.10...2.0.0