diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ab7accc..9869ac4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -82,3 +82,7 @@ compiler/tooling crates (`wright-ir`, `wright-core`, `wright-driver`, generated artifacts, and dependencies. * Keep commits focused on one functional boundary and do not include unrelated working-tree changes. +* Describe planning work by concrete capability, issue reference, or release + version (normative pre-1.0 roadmap: [#134](https://github.com/wrightkit/wright/issues/134)); + internal phase-number labels are not the roadmap model for new issues, PRs, + or living docs. diff --git a/README.md b/README.md index 3e70955..2968a47 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ interoperability boundary. | --- | --- | --- | --- | --- | | **Vanilla Workshop** | Canonical target and interoperability layer | Native parser, localized catalog (`catalog.json`), validation, and deterministic emitter (`wright-workshop`). Supports rules, actions, values, events, enums, variables, subroutines, and custom-game-settings emission. | Supported (`en-US` baseline; data-driven localization extensible) | [`docs/workshop/support-matrix.md`](docs/workshop/support-matrix.md) | | **OPY / OverPy** | Native compatible semantic frontend | Native Rust parser (`wright-opy`), preprocessor (`#!include`, `#!define`), macro expansion, declarations, expressions, enums, custom-game-settings (JSONC blocks), lowering to Wright HIR and Workshop IR. Pinned `overpy@9.7.10` acts strictly as an external compatibility oracle under clean-room isolation. | Supported (corpus-evidenced native compiler and tooling) | [`docs/opy/support-matrix.md`](docs/opy/support-matrix.md), [`docs/licensing.md`](docs/licensing.md) | -| **OSTW (Overwatch Script To Workshop)** | Compatible semantic frontend (M13 foundation) | Native Rust parser/CST (`wright-ostw`), project settings (`ds.toml`), import-closure resolution, and semantic lowering to Wright HIR for the protect-ban slice. Pinned OSTW `v3.4.0` serves strictly as an external compatibility oracle. | In progress (M13 native frontend & HIR lowering baseline) | [`docs/ostw/compatibility-baseline.md`](docs/ostw/compatibility-baseline.md), [`docs/architecture.md`](docs/architecture.md) | +| **OSTW (Overwatch Script To Workshop)** | Compatible semantic frontend (native OSTW frontend) | Native Rust parser/CST (`wright-ostw`), project settings (`ds.toml`), import-closure resolution, and semantic lowering to Wright HIR for the protect-ban slice. Pinned OSTW `v3.4.0` serves strictly as an external compatibility oracle. | In progress (native frontend & HIR lowering baseline) | [`docs/ostw/compatibility-baseline.md`](docs/ostw/compatibility-baseline.md), [`docs/architecture.md`](docs/architecture.md) | ### Conversion Matrix @@ -69,7 +69,7 @@ long-term conversion directions are: ```text OPY → Workshop (Supported: native wright-opy → HIR → WIR → wright-workshop) -OSTW → Workshop (In progress / M13: native wright-ostw → HIR → WIR → wright-workshop) +OSTW → Workshop (In progress: native wright-ostw → HIR → WIR → wright-workshop) Workshop → OPY (Planned: decompilation / translation via canonical WIR) Workshop → OSTW (Planned: translation via canonical WIR) Workshop → Workshop (Supported: localized catalog parse → canonical WIR → deterministic emit) diff --git a/crates/wright-analyzer/src/analysis.rs b/crates/wright-analyzer/src/analysis.rs index d382bfe..bc0d341 100644 --- a/crates/wright-analyzer/src/analysis.rs +++ b/crates/wright-analyzer/src/analysis.rs @@ -28,8 +28,8 @@ //! while-without-wait trigger is static but the impact (loop frequency) is an //! indicator, and `For Global Variable` loops are never flagged. //! -//! Every [`Finding`] also carries the [`EvidenceClass`] of its rule (M12, -//! #98): whether the finding is an exact structural fact, a static indicator, +//! Every [`Finding`] also carries the [`EvidenceClass`] of its rule (#98): +//! whether the finding is an exact structural fact, a static indicator, //! a documented heuristic, or (reserved) runtime-validated. use std::collections::HashMap; diff --git a/crates/wright-analyzer/src/lib.rs b/crates/wright-analyzer/src/lib.rs index 82ca7bf..1cc663a 100644 --- a/crates/wright-analyzer/src/lib.rs +++ b/crates/wright-analyzer/src/lib.rs @@ -1,7 +1,7 @@ //! Wright's semantic analysis and agent tooling layer. //! //! This crate builds on [`wright_ir`] to expose read-only semantic services -//! over compiled programs (ADR-0006, milestone M4): +//! over compiled programs (ADR-0006): //! //! * [`symbols`] — symbol tables, reference indices, and usage queries; //! * [`cfg`] — control-flow graphs and timing-aware primitives; diff --git a/crates/wright-analyzer/src/registry.rs b/crates/wright-analyzer/src/registry.rs index cefea30..9a0c7e5 100644 --- a/crates/wright-analyzer/src/registry.rs +++ b/crates/wright-analyzer/src/registry.rs @@ -1,4 +1,4 @@ -//! Lint rule registry and configuration contract (M12, #97). +//! Lint rule registry and configuration contract (#97). //! //! This module defines the stable rule-identity and metadata types, the //! [`LintRegistry`] that holds the first-party rule set, and [`LintConfig`] @@ -204,13 +204,13 @@ struct RegistryEntry { /// /// First-party rules are added by pushing a [`RegistryEntry`] in /// [`Default::default`]. Third-party plugin loading is explicitly out of scope -/// for M12 (issue #97). +/// (issue #97). pub struct LintRegistry { entries: Vec, } impl Default for LintRegistry { - /// Build the registry containing all five first-party M12 lint rules in + /// Build the registry containing all five first-party lint rules in /// their canonical order: `min-wait-loop`, `duplicate-condition`, /// `expensive-loop-check`, `repeated-value`, `while-without-wait`. fn default() -> Self { diff --git a/crates/wright-analyzer/src/service.rs b/crates/wright-analyzer/src/service.rs index caec031..ba833ea 100644 --- a/crates/wright-analyzer/src/service.rs +++ b/crates/wright-analyzer/src/service.rs @@ -50,7 +50,7 @@ pub enum Request { /// Every static-analysis finding. GetFindings, /// The registered lint rules and the effective lint configuration - /// (M12, #98). + /// (#98). LintRules, } @@ -149,7 +149,7 @@ impl<'a> SemanticService<'a> { /// `config` controls which rules run and at what severity; callers that /// only need the default behavior should use [`SemanticService::with_origin`]. /// The retained `config` also drives `lintRules` responses, so rule - /// metadata and findings always reflect the same configuration (M12, #98). + /// metadata and findings always reflect the same configuration (#98). pub fn with_origin_and_config( program: &'a wir::Program, origin: Origin, diff --git a/crates/wright-analyzer/tests/registry.rs b/crates/wright-analyzer/tests/registry.rs index c755b9c..1e379f5 100644 --- a/crates/wright-analyzer/tests/registry.rs +++ b/crates/wright-analyzer/tests/registry.rs @@ -54,7 +54,7 @@ fn registry_has_five_first_party_rules_with_stable_ids() { "repeated-value", "while-without-wait", ], - "exactly five first-party rules in M12, in canonical order" + "exactly five first-party rules, in canonical order" ); } diff --git a/crates/wright-analyzer/tests/service.rs b/crates/wright-analyzer/tests/service.rs index d21afee..00a9f52 100644 --- a/crates/wright-analyzer/tests/service.rs +++ b/crates/wright-analyzer/tests/service.rs @@ -242,7 +242,7 @@ fn while_without_wait_findings_carry_boundedness_in_json() { } } -// ── Lint rules and configuration (M12, #98) ────────────────────────────────── +// ── Lint rules and configuration (#98) ─────────────────────────────────────── #[test] fn lint_rules_reports_rule_metadata_and_effective_config() { @@ -256,7 +256,7 @@ fn lint_rules_reports_rule_metadata_and_effective_config() { ); let result = &responses[0]["result"]; let rules = result["rules"].as_array().unwrap(); - assert_eq!(rules.len(), 5, "all five M12 rules are reported"); + assert_eq!(rules.len(), 5, "all five first-party rules are reported"); for rule in rules { assert!(rule["id"].is_string(), "rules carry stable ids"); assert!(rule["defaultSeverity"].is_string()); diff --git a/crates/wright-cli/src/bin/wright-serve.rs b/crates/wright-cli/src/bin/wright-serve.rs index f5ef63c..1bb4b0d 100644 --- a/crates/wright-cli/src/bin/wright-serve.rs +++ b/crates/wright-cli/src/bin/wright-serve.rs @@ -1,11 +1,12 @@ //! `wright-serve` — thin transport adapters over the session-aware tool -//! service (M9, issue #60). +//! service (issue #60). //! //! Exposes the same operations as [`wright_driver::service::ToolService`] //! over two transports: //! //! * **stdio JSON-lines** (`--transport stdio`): one request per line, one -//! response per line (the M4 tool style, generalized to the M9 service). +//! response per line (the legacy tool style, generalized to the current +//! service). //! * **JSON-RPC 2.0** (`--transport jsonrpc`): standard JSON-RPC envelopes //! with `id`/`method`/`params` and `result`/`error` responses. //! @@ -147,8 +148,8 @@ fn serve_jsonrpc(service: &mut ToolService<'_>) -> ExitCode { let result = match method { "request" => { // The full params object is forwarded verbatim (op plus any - // operation arguments, e.g. mutation sources/targets, M14 - // #130) so the JSON-RPC adapter maps the same request shape + // operation arguments, e.g. mutation sources/targets, #130) + // so the JSON-RPC adapter maps the same request shape // as the stdio adapter; a params object without `op` is a // malformed request rather than a silently empty one. let request_line = match params { diff --git a/crates/wright-cli/src/main.rs b/crates/wright-cli/src/main.rs index 0f9db61..b662ec7 100644 --- a/crates/wright-cli/src/main.rs +++ b/crates/wright-cli/src/main.rs @@ -1,4 +1,4 @@ -//! `wright` — the primary Wright command-line interface (M6, issue #38). +//! `wright` — the primary Wright command-line interface (issue #38). //! //! A thin presentation/argv layer over [`wright_driver::CompilerSession`]: //! every subcommand builds a [`SessionConfig`] and renders the driver's typed @@ -76,7 +76,7 @@ OUTPUT CONTRACT: OPY or OSTW; semantic reconstruction, not original-source recovery) and reports the reconstructed text plus its SHA-256 in the `result` envelope in JSON mode. `lint` reports findings through the same envelope with rule - metadata and the effective configuration (M12, #97/#98). `update` is + metadata and the effective configuration (#97/#98). `update` is text-only and outside the `wright-result/v1` envelope: it updates standalone `wright`/`wright-lsp` installs from the canonical GitHub Release archives and refuses to overwrite package-manager-managed diff --git a/crates/wright-cli/tests/cli.rs b/crates/wright-cli/tests/cli.rs index 57d73e4..9f1e89a 100644 --- a/crates/wright-cli/tests/cli.rs +++ b/crates/wright-cli/tests/cli.rs @@ -1,6 +1,6 @@ //! Black-box CLI end-to-end tests (#41): the actual `wright` executable is //! exercised across commands, inputs, output modes, exit codes, diagnostics, -//! and stdout/stderr separation — the automation contract of the M6 CLI. +//! and stdout/stderr separation — the automation contract of the CLI. use std::io::Write; use std::path::{Path, PathBuf}; @@ -207,7 +207,7 @@ fn inspect_over_workshop_input_lists_rules_and_symbols() { let _ = std::fs::remove_dir_all(path.parent().unwrap()); } -// ── Lint (M12, #98) ────────────────────────────────────────────────────────── +// ── Lint (#98) ─────────────────────────────────────────────────────────────── #[test] fn lint_over_workshop_input_reports_findings_in_text_and_json() { @@ -248,7 +248,7 @@ fn lint_over_workshop_input_reports_findings_in_text_and_json() { assert_eq!( envelope["result"]["rules"].as_array().unwrap().len(), 5, - "all five M12 rules are reported" + "all five first-party rules are reported" ); assert_eq!( envelope["result"]["config"]["rules"] diff --git a/crates/wright-cli/tests/serve.rs b/crates/wright-cli/tests/serve.rs index 9523785..2c8b982 100644 --- a/crates/wright-cli/tests/serve.rs +++ b/crates/wright-cli/tests/serve.rs @@ -141,7 +141,7 @@ fn capability_negotiation_is_preserved() { #[test] fn stdio_transport_serves_mutation_operations() { - // M14 #130: the stdio adapter exposes the shared mutation operations as + // #130: the stdio adapter exposes the shared mutation operations as // thin mappings — validated edit preview and semantic rename — with the // same structured all-or-nothing results as in-process consumers. let input = corpus_opy("synthetic/declarations-rules"); @@ -209,7 +209,7 @@ fn stdio_transport_serves_mutation_operations() { #[test] fn transports_are_equivalent_for_mutation_operations() { - // M14 #130: stdio and JSON-RPC map the same mutation request to the same + // #130: stdio and JSON-RPC map the same mutation request to the same // in-process behavior. let input = corpus_opy("synthetic/declarations-rules"); let rename = serde_json::json!({ diff --git a/crates/wright-consumer/Cargo.toml b/crates/wright-consumer/Cargo.toml index 625cd9e..a3ee4f6 100644 --- a/crates/wright-consumer/Cargo.toml +++ b/crates/wright-consumer/Cargo.toml @@ -4,7 +4,7 @@ version.workspace = true edition.workspace = true rust-version.workspace = true license.workspace = true -description = "An external consumer fixture proving Wright's public embedding/tool contracts (M9 #61)." +description = "An external consumer fixture proving Wright's public embedding/tool contracts (#61)." [lints] workspace = true diff --git a/crates/wright-consumer/src/lib.rs b/crates/wright-consumer/src/lib.rs index 936dccd..22338d5 100644 --- a/crates/wright-consumer/src/lib.rs +++ b/crates/wright-consumer/src/lib.rs @@ -1,4 +1,4 @@ -//! The external consumer's public API surface (M9, issue #61). +//! The external consumer's public API surface (issue #61). //! //! [`run_consumer`] drives every public embedding/tool workflow over one //! input, proving that a consumer depending only on `wright-driver` can diff --git a/crates/wright-consumer/src/main.rs b/crates/wright-consumer/src/main.rs index 065a6ef..9aa208c 100644 --- a/crates/wright-consumer/src/main.rs +++ b/crates/wright-consumer/src/main.rs @@ -1,4 +1,4 @@ -//! The external consumer binary (M9, issue #61). +//! The external consumer binary (issue #61). fn main() { let input = std::env::args().nth(1).unwrap_or_else(|| { diff --git a/crates/wright-consumer/src/workflow.rs b/crates/wright-consumer/src/workflow.rs index 897ed1e..cbffcd0 100644 --- a/crates/wright-consumer/src/workflow.rs +++ b/crates/wright-consumer/src/workflow.rs @@ -35,7 +35,7 @@ pub fn run_consumer(input: &str) -> Result<(), String> { analyze.result.findings.as_array().unwrap().len() ); - // Lint through the shared session (M12, #98): the same pipeline with + // Lint through the shared session (#98): the same pipeline with // rule metadata, effective configuration, and evidence-tagged findings. let lint = session.lint(); assert!(lint.ok, "lint passes: {:?}", lint.diagnostics); @@ -94,7 +94,7 @@ pub fn run_consumer(input: &str) -> Result<(), String> { } // Safe rename: propose, validate through the project transaction - // contract, preview (M14 #128: the shared frontend-neutral contract). + // contract, preview (#128: the shared frontend-neutral contract). if input.ends_with(".opy") { if let Some(name) = first_global(&source) { let identity = wright_driver::input_identity(&source); diff --git a/crates/wright-driver/src/config.rs b/crates/wright-driver/src/config.rs index 1301c5d..b044fcf 100644 --- a/crates/wright-driver/src/config.rs +++ b/crates/wright-driver/src/config.rs @@ -16,9 +16,10 @@ pub use wright_analyzer::registry::LintConfig; pub enum SourceKind { /// Detect from the input path extension or stdin content. Auto, - /// `.opy` source through the adapter bridge (native frontend lands in M7). + /// `.opy` source through the adapter bridge (the native frontend is the + /// default path). Opy, - /// `.ostw` / `.del` source through the native OSTW frontend (M13, #117). + /// `.ostw` / `.del` source through the native OSTW frontend (#117). Ostw, /// Localized vanilla Workshop text (native frontend). Workshop, @@ -112,7 +113,7 @@ pub struct SessionConfig { /// The WIR transformation policy (`off` by default; `compat`/`aggressive` /// opt into evidence-backed passes). pub profile: wright_transform::Profile, - /// The lint rule configuration used by `lint` (M12, #97/#98). + /// The lint rule configuration used by `lint` (#97/#98). /// /// [`LintConfig::default`] enables every registered rule at its default /// severity; `--disable-rule`/`--rule-severity` on the CLI and library diff --git a/crates/wright-driver/src/edit.rs b/crates/wright-driver/src/edit.rs index d5ff85b..16ab77b 100644 --- a/crates/wright-driver/src/edit.rs +++ b/crates/wright-driver/src/edit.rs @@ -1,4 +1,4 @@ -//! Frontend-neutral source-edit transactions (M9 #59, reconciled by M14 #128). +//! Frontend-neutral source-edit transactions (#59, reconciled by #128). //! //! Tools and agents propose edits as validated, source-oriented //! [`SourceEdit`]s — never as mutations of Wright's internal IR. One @@ -345,7 +345,7 @@ fn refusal(diagnostics: Vec) -> EditValidation { } /// A semantic rename target: the exact identifier occurrence at a 1-based -/// line/column in one source of the project (M14, #129). +/// line/column in one source of the project (#129). #[derive(Debug, Clone, Serialize, Deserialize)] pub struct RenameTarget { /// The source identity the position names (a key of the current-sources @@ -360,7 +360,7 @@ pub struct RenameTarget { } /// The outcome of a semantic rename: a validated multi-source transaction or -/// structured refusal diagnostics (M14, #129). +/// structured refusal diagnostics (#129). /// /// The transaction edits exactly the resolved semantic identity's occurrence /// ranges — never a whole-word scan or whole-document replacement — and is @@ -381,7 +381,7 @@ pub struct SemanticRename { } /// Rename the symbol whose declaration or reference occurrence sits at a -/// position in one source of a project (M14, #129). +/// position in one source of a project (#129). /// /// `config` and `sources` are the project and current-source snapshot of the /// *unmodified* code, exactly as [`validate_transaction`] takes them. The @@ -1198,7 +1198,7 @@ pub fn rename_symbol(source: &str, request: &RenameRequest) -> Result Result { let text = String::from_utf8_lossy(&bytes).into_owned(); let kind = match config.kind { SourceKind::Auto => kind_from_stdin(&text)?, - // The native frontend (M7) reads `.opy` from stdin; the include root + // The native `.opy` frontend reads source from stdin; the include root // defaults to the working directory. other => other, }; diff --git a/crates/wright-driver/src/lib.rs b/crates/wright-driver/src/lib.rs index 5f7b861..258443f 100644 --- a/crates/wright-driver/src/lib.rs +++ b/crates/wright-driver/src/lib.rs @@ -1,4 +1,4 @@ -//! Wright's reusable compiler/session driver (milestone M6). +//! Wright's reusable compiler/session driver. //! //! One orchestration path for every frontend and workflow: input discovery → //! frontend selection (`opy` bridge, native Workshop, or protocol JSON) → @@ -34,7 +34,7 @@ pub use wright_transform::Profile; /// The driver crate name reported in result metadata. pub const DRIVER_NAME: &str = "wright-driver"; -/// The stable embedding-API contract name (M9 #56). +/// The stable embedding-API contract name (#56). pub const EMBEDDING_CONTRACT: &str = "wright-embedding/v1"; /// A deterministic SHA-256 identity for an input or artifact. diff --git a/crates/wright-driver/src/opy.rs b/crates/wright-driver/src/opy.rs index 34a76f6..dc19ded 100644 --- a/crates/wright-driver/src/opy.rs +++ b/crates/wright-driver/src/opy.rs @@ -1,6 +1,6 @@ //! The `.opy` frontend integration for the driver. //! -//! Since M7, the default `.opy` path is the native Rust frontend +//! The default `.opy` path is the native Rust frontend //! (`wright_opy`): no Node, no OverPy, stdin supported. The pinned OverPy //! adapter bridge remains available as an explicit compatibility fallback //! when `WRIGHT_ADAPTER_PATH` is set (migration/debugging only) — it is never diff --git a/crates/wright-driver/src/result.rs b/crates/wright-driver/src/result.rs index f235783..b30574f 100644 --- a/crates/wright-driver/src/result.rs +++ b/crates/wright-driver/src/result.rs @@ -165,7 +165,7 @@ pub struct InspectResult { pub references: serde_json::Value, } -/// The result of a `lint` run (M12, #98): source identity, the program +/// The result of a `lint` run (#98): source identity, the program /// summary, the registered lint rules with their effective configuration, /// the active configuration, and the findings. #[derive(Debug, Clone, Default, Serialize)] diff --git a/crates/wright-driver/src/service.rs b/crates/wright-driver/src/service.rs index 8f9c6c4..ab6a604 100644 --- a/crates/wright-driver/src/service.rs +++ b/crates/wright-driver/src/service.rs @@ -1,14 +1,14 @@ -//! The session-aware tool service (M9, issues #57/#58). +//! The session-aware tool service (issues #57/#58). //! //! [`ToolService`] exposes Wright's compile/check/analyze/query workflows and //! agent-oriented semantic queries over stable public contracts, reusing the -//! M6 driver session. It is transport-neutral: the stdio/JSON-RPC adapters -//! (M9 #60) and the embedding API are thin mappings over the same operations, +//! driver session. It is transport-neutral: the stdio/JSON-RPC adapters +//! (#60) and the embedding API are thin mappings over the same operations, //! so behavior is testable in-process without a transport. //! //! Capability/version negotiation is provided by [`Capabilities`]; cost and //! resource inspection ([`ToolRequest::CostEstimate`]) consumes the -//! Wright-owned generated-resource semantics established by the M8 benchmark +//! Wright-owned generated-resource semantics established by the `wright-bench` //! harness (emitted bytes, WIR node counts, action/rule counts) and //! distinguishes exact counts from static findings. @@ -46,7 +46,7 @@ pub enum ToolRequest { Cfg { rule: u32 }, /// Every static-analysis finding. Findings, - /// Lint findings plus rule metadata and effective configuration (M12, #98). + /// Lint findings plus rule metadata and effective configuration (#98). Lint, /// The registered lint rules and the effective lint configuration. LintRules, @@ -57,7 +57,7 @@ pub enum ToolRequest { /// Target/catalog metadata (actions, values, events, enum domains). TargetMetadata, /// Validate and preview a caller-supplied source-edit transaction - /// against the session's project (M14, #130): atomic all-or-nothing + /// against the session's project (#130): atomic all-or-nothing /// semantics, structured refusal diagnostics, no filesystem writes. #[serde(rename = "validateEditTransaction")] ValidateEdit { @@ -67,7 +67,7 @@ pub enum ToolRequest { transaction: crate::edit::EditTransaction, }, /// Request a semantic rename through the shared refactoring contract - /// (M14, #129/#130): returns the validated exact-range transaction or + /// (#129/#130): returns the validated exact-range transaction or /// structured refusal diagnostics. Wright proposes/validates; applying /// edits to disk is an explicit consumer responsibility. SemanticRename { @@ -263,7 +263,7 @@ impl<'a> ToolService<'a> { } } - /// Run one M4 semantic query over the loaded program. + /// Run one semantic query over the loaded program. fn semantic_query(&self, request: wright_analyzer::service::Request) -> ToolResponse { self.semantic_query_with_config(request, wright_analyzer::registry::LintConfig::default()) } @@ -299,7 +299,7 @@ impl<'a> ToolService<'a> { /// `lint`: rule metadata, effective configuration, and findings over the /// loaded program through the same semantic-service path as the CLI - /// `lint` workflow (no duplicated rule execution, M12 #98). + /// `lint` workflow (no duplicated rule execution, #98). fn lint(&self) -> ToolResponse { let config = self.session.config.lint.clone(); let origin = wright_analyzer::service::Origin { @@ -383,7 +383,7 @@ impl<'a> ToolService<'a> { /// /// Exact counts: emitted bytes, WIR value/action/rule counts, and wait /// actions. Static indicators: analysis findings (e.g. `min-wait-loop`). - /// Compiler-host performance is measured by the M8 benchmark harness, not + /// Compiler-host performance is measured by the `wright-bench` harness, not /// in-process. fn cost_estimate(&self) -> serde_json::Value { let catalog = wright_workshop::catalog::Catalog::builtin().expect("built-in catalog loads"); diff --git a/crates/wright-driver/src/session.rs b/crates/wright-driver/src/session.rs index 5ee4570..199530d 100644 --- a/crates/wright-driver/src/session.rs +++ b/crates/wright-driver/src/session.rs @@ -1,10 +1,10 @@ -//! The reusable compiler/session driver (M6, issue #37). +//! The reusable compiler/session driver (issue #37). //! //! [`CompilerSession`] is the single orchestration path shared by the CLI, //! library consumers, and (in later milestones) tool APIs and LSP: input //! resolution → frontend selection → validation → lowering → analysis → //! emission. Frontends are selected by [`SourceKind`] behind one contract, so -//! the M7 native `.opy` frontend can replace the temporary adapter bridge +//! the native `.opy` frontend can replace the temporary adapter bridge //! without changing callers. Every workflow returns a typed [`Envelope`] //! whose JSON serialization is the machine-readable CLI contract. @@ -479,7 +479,7 @@ impl CompilerSession { } /// `lint`: load and produce the source identity, program summary, rule - /// metadata, effective configuration, and findings (M12, #98). + /// metadata, effective configuration, and findings (#98). /// /// Lint findings are reported in `result.findings`, not in the envelope /// diagnostics (like `analyze`). Rule enable/disable and severity come diff --git a/crates/wright-driver/tests/driver.rs b/crates/wright-driver/tests/driver.rs index a96479b..d8eae96 100644 --- a/crates/wright-driver/tests/driver.rs +++ b/crates/wright-driver/tests/driver.rs @@ -164,7 +164,7 @@ fn workshop_analyze_reports_program_and_findings() { ); } -// ── Lint (M12, #98) ────────────────────────────────────────────────────────── +// ── Lint (#98) ─────────────────────────────────────────────────────────────── #[test] fn workshop_lint_reports_structured_findings_rules_and_config() { @@ -180,7 +180,7 @@ fn workshop_lint_reports_structured_findings_rules_and_config() { ); assert_eq!(envelope.result.program["rules"], 2); let rules = envelope.result.rules.as_array().unwrap(); - assert_eq!(rules.len(), 5, "all five M12 rules are reported"); + assert_eq!(rules.len(), 5, "all five first-party rules are reported"); let config_rules = envelope.result.config["rules"].as_object().unwrap(); assert_eq!( config_rules.len(), diff --git a/crates/wright-driver/tests/edit.rs b/crates/wright-driver/tests/edit.rs index 73c9af6..478d352 100644 --- a/crates/wright-driver/tests/edit.rs +++ b/crates/wright-driver/tests/edit.rs @@ -1,4 +1,4 @@ -//! M14 #128 evidence: source-edit transactions validate through the correct +//! #128 evidence: source-edit transactions validate through the correct //! native frontend and project semantics (OPY and OSTW), with deterministic //! stale/overlap/kind refusals, atomic previews, and cross-file diagnostic //! provenance — never a forced `.opy` or a synthetic `edit.opy` path. @@ -244,7 +244,7 @@ fn opy_stale_transaction_refuses_atomically() { #[test] fn unsupported_input_kinds_refuse_explicitly() { - // Workshop text is not an editable source frontend (M14 declares OPY and + // Workshop text is not an editable source frontend (#128 declares OPY and // OSTW): the refusal is structured, not a misleading `.opy` attempt. let root = temp_project( "kind-refusal", @@ -437,7 +437,7 @@ fn opy_auto_kind_detects_from_the_main_path_extension() { ); } -// -- semantic rename (M14 #129) ------------------------------------------------ +// -- semantic rename (#129) --------------------------------------------------- fn rename_at( root: &Path, diff --git a/crates/wright-driver/tests/service.rs b/crates/wright-driver/tests/service.rs index cfe39f6..e25584e 100644 --- a/crates/wright-driver/tests/service.rs +++ b/crates/wright-driver/tests/service.rs @@ -1,4 +1,4 @@ -//! Session-aware tool service tests (#57/#58): the M9 service exposes the +//! Session-aware tool service tests (#57/#58): the service exposes the //! same operations in-process that the stdio/JSON-RPC adapters serve, with //! deterministic structured results, capability negotiation, cost //! inspection, and target metadata. @@ -288,7 +288,7 @@ fn cross_language_shared_service_behavior_is_frontend_neutral() { assert_shared_service_surface(&ostw_service()); } -// -- M14 #130: validated mutation through the shared tool API ------------------ +// -- #130: validated mutation through the shared tool API ---------------------- fn corpus_source(id: &str) -> String { std::fs::read_to_string( diff --git a/crates/wright-language/src/lib.rs b/crates/wright-language/src/lib.rs index 2f40935..36c12d1 100644 --- a/crates/wright-language/src/lib.rs +++ b/crates/wright-language/src/lib.rs @@ -1,4 +1,4 @@ -//! Wright's editor-neutral language-service core (milestone M10, issue #63). +//! Wright's editor-neutral language-service core (issue #63). //! //! This crate owns language intelligence **without any LSP types**: a //! versioned [`Document`]/[`DocumentStore`] workspace model, editor-neutral diff --git a/crates/wright-language/src/service.rs b/crates/wright-language/src/service.rs index 2dc7003..5edd1ff 100644 --- a/crates/wright-language/src/service.rs +++ b/crates/wright-language/src/service.rs @@ -1,7 +1,7 @@ //! The editor-neutral language service (#63, #65, #66). //! -//! Composes the native `.opy` frontend, the semantic index/analyzer, the M9 -//! safe-edit contract, and the workshop catalog. Every result is tagged with +//! Composes the native `.opy` frontend, the semantic index/analyzer, the +//! safe-edit transaction contract, and the workshop catalog. Every result is tagged with //! the document version it was computed for, so stale results are //! deterministic and replaceable (#64). No LSP types appear here. @@ -73,7 +73,7 @@ pub struct SourceLocation { } /// One source-aware rename edit targeting an exact semantic occurrence -/// (M14, #131). +/// (#131). /// /// Carries the source identity, a 0-based editor-convention range covering /// exactly the occurrence's identifier, the replacement text (the new name), @@ -557,7 +557,7 @@ impl LanguageService { /// Rename the symbol at a position across the whole project. /// /// Delegates semantic target resolution, edit generation, and validation - /// to the shared M14 driver refactoring contract + /// to the shared driver refactoring contract /// (`wright_driver::edit::semantic_rename`, #129): every open root whose /// project includes the requesting document resolves the symbol through /// the shared semantic index, and the union of the resulting exact-range @@ -783,7 +783,7 @@ impl LanguageService { /// previews (identical across roots, since the transaction and the source /// snapshot are the same). /// - /// Validation routes through the shared M14 driver transaction contract + /// Validation routes through the shared driver transaction contract /// (#128) with the root's original source kind detected from its /// extension, so OPY and OSTW projects validate through their own native /// frontend; no duplicate edit-validation semantics live here. diff --git a/crates/wright-language/tests/cross_file.rs b/crates/wright-language/tests/cross_file.rs index 95e7f23..3b1ed2b 100644 --- a/crates/wright-language/tests/cross_file.rs +++ b/crates/wright-language/tests/cross_file.rs @@ -24,7 +24,7 @@ fn preview_text(result: &wright_language::service::RenameResult, suffix: &str) - fn main_document() -> Document { let root = fixtures(); let text = std::fs::read_to_string(root.join("main.opy")).unwrap(); - // The document identity is the real file URI (the M14 shared contract + // The document identity is the real file URI (the shared contract // validates against path-based project identities, #128/#129). Document::new( format!("file://{}", root.join("main.opy").display()), diff --git a/crates/wright-language/tests/perf.rs b/crates/wright-language/tests/perf.rs index 8bb8c9f..8c5cc75 100644 --- a/crates/wright-language/tests/perf.rs +++ b/crates/wright-language/tests/perf.rs @@ -12,7 +12,7 @@ use wright_language::document::{Document, Position}; const ITERATIONS: usize = 20; /// A generous bound: each single-document workflow must finish well under -/// interactive latency (the corpus compiles in ~1–3 ms in the M8 benchmark). +/// interactive latency (the corpus compiles in ~1–3 ms under `wright-bench`). const MAX_MEAN_MILLIS: f64 = 200.0; fn workspace_root() -> PathBuf { diff --git a/crates/wright-language/tests/service.rs b/crates/wright-language/tests/service.rs index 061e4c7..6c1ed0f 100644 --- a/crates/wright-language/tests/service.rs +++ b/crates/wright-language/tests/service.rs @@ -1173,7 +1173,7 @@ fn ostw_documents_get_shared_diagnostics_and_symbol_classification() { ); } -// -- M14 #129: OSTW semantic rename through the shared contract ----------------- +// -- #129: OSTW semantic rename through the shared contract -------------------- fn ostw_project_documents() -> (LanguageService, String, String, String) { use std::sync::atomic::{AtomicUsize, Ordering}; diff --git a/crates/wright-lsp/src/main.rs b/crates/wright-lsp/src/main.rs index 88a2460..dab3e08 100644 --- a/crates/wright-lsp/src/main.rs +++ b/crates/wright-lsp/src/main.rs @@ -1,4 +1,4 @@ -//! `wright-lsp` — the Wright language server (M10, issue #67). +//! `wright-lsp` — the Wright language server (issue #67). //! //! A thin LSP protocol adapter over [`wright_language::LanguageService`]: //! all semantic logic lives in the editor-neutral service crate; this @@ -235,7 +235,7 @@ fn run() -> Result<(), String> { // the client refuses to apply the rename to a newer // buffer state; filesystem-backed sources carry the // unversioned `null` form LSP allows. The edits are the - // shared M14 #129 transaction in editor conventions — + // shared #129 transaction in editor conventions — // one exact-occurrence `TextEdit` per semantic // occurrence, grouped by document — never a // protocol-layer re-resolution or textual fallback. The diff --git a/crates/wright-opy/src/lib.rs b/crates/wright-opy/src/lib.rs index 6c78081..84e874f 100644 --- a/crates/wright-opy/src/lib.rs +++ b/crates/wright-opy/src/lib.rs @@ -1,6 +1,6 @@ -//! Wright's native `.opy` frontend (milestone M7). +//! Wright's native `.opy` frontend. //! -//! Owns the source-language surface declared by the M7 support matrix +//! Owns the source-language surface declared by the OPY support matrix //! (`docs/opy/support-matrix.md`): a lexer, an indentation-aware //! CST/parser with structured diagnostics and recovery, token-level //! preprocessing (includes and `#!define` macros), semantic resolution, and diff --git a/crates/wright-ostw/src/lib.rs b/crates/wright-ostw/src/lib.rs index 2554b88..bb586e7 100644 --- a/crates/wright-ostw/src/lib.rs +++ b/crates/wright-ostw/src/lib.rs @@ -1,4 +1,4 @@ -//! Wright's native OSTW frontend (milestone M13, issues #117/#118). +//! Wright's native OSTW frontend (issues #117/#118). //! //! Owns the OSTW surface evidenced by the pinned protect-ban corpus: a //! lexer, a CST/parser with structured diagnostics, the `ds.toml` project @@ -43,7 +43,7 @@ pub fn compile(main_text: &str, main_path: Option<&str>, root: &Path) -> OstwOut project::compile(main_text, main_path, root) } -/// Compile with in-memory source overlays (M14, #128). +/// Compile with in-memory source overlays (#128). /// /// `overlay` maps project-relative source paths to replacement text and takes /// precedence over `main_text` and the filesystem, so a proposed multi-file @@ -75,7 +75,7 @@ pub fn compile_with_semantics( } /// Load the project with in-memory source overlays and resolve its semantic -/// surface into frontend-neutral HIR (M14, #128). +/// surface into frontend-neutral HIR (#128). /// /// `overlay` maps project-relative source paths to replacement text and takes /// precedence over `main_text` and the filesystem, so a proposed multi-file diff --git a/crates/wright-ostw/src/project.rs b/crates/wright-ostw/src/project.rs index ec7ccbc..8b04570 100644 --- a/crates/wright-ostw/src/project.rs +++ b/crates/wright-ostw/src/project.rs @@ -98,7 +98,7 @@ pub fn compile(main_text: &str, main_path: Option<&str>, root: &Path) -> OstwOut /// The overlay maps project-relative source paths to replacement text and /// takes precedence over both `main_text` and the filesystem, so a proposed /// multi-file edit can be validated without rewriting the user's files -/// (M14, #128). Overlay keys are normalized project-relative paths exactly as +/// (#128). Overlay keys are normalized project-relative paths exactly as /// [`Project::files`] reports them (e.g. `interface/HeroSelect.del`). The /// `ds.toml` project file itself is always read from the filesystem. pub fn compile_with_overlay( diff --git a/crates/wright-ostw/tests/parse.rs b/crates/wright-ostw/tests/parse.rs index f6c90c6..1db715a 100644 --- a/crates/wright-ostw/tests/parse.rs +++ b/crates/wright-ostw/tests/parse.rs @@ -603,7 +603,7 @@ fn determinism_two_runs_produce_identical_outcomes() { #[test] fn overlays_validate_proposed_edits_without_rewriting_files() { - // M14 #128: a proposed multi-file edit validates against overlay text + // #128: a proposed multi-file edit validates against overlay text // (main file and imports) while the on-disk project stays untouched. use std::collections::BTreeMap; let root = temp_project(vec![ diff --git a/crates/wright-transform/src/lib.rs b/crates/wright-transform/src/lib.rs index 06b0f37..1542e64 100644 --- a/crates/wright-transform/src/lib.rs +++ b/crates/wright-transform/src/lib.rs @@ -1,4 +1,4 @@ -//! WIR transformation pipeline (milestone M8, issues #51/#52). +//! WIR transformation pipeline (issues #51/#52). //! //! Transformations live in an explicit, validated pass pipeline separate from //! read-only analysis and backend emission. Profiles select the pass set: diff --git a/crates/wright-workshop/src/catalog/mod.rs b/crates/wright-workshop/src/catalog/mod.rs index 122f90c..a5b9cc7 100644 --- a/crates/wright-workshop/src/catalog/mod.rs +++ b/crates/wright-workshop/src/catalog/mod.rs @@ -5,7 +5,7 @@ //! a [`Kind`]; localized aliases map to ids and back, so parser, emitter, //! analyzer, and tooling never embed locale-specific strings as identity. //! -//! The v0.2 catalog data (`data/catalog.json`) is authored from the M5 +//! The v0.2 catalog data (`data/catalog.json`) is authored from the //! support-matrix evidence ([`docs/workshop/support-matrix.md`]) and covers //! the corpus surface in `en-US`; additional locales are an explicit //! data-pipeline change, not a code change. diff --git a/crates/wright-workshop/src/lib.rs b/crates/wright-workshop/src/lib.rs index 2e1c114..ecd6a48 100644 --- a/crates/wright-workshop/src/lib.rs +++ b/crates/wright-workshop/src/lib.rs @@ -1,4 +1,4 @@ -//! Wright's native Workshop language model (milestone M5). +//! Wright's native Workshop language model. //! //! This crate owns the Workshop-language foundation so localized vanilla //! Workshop text can be parsed, analyzed, transformed, and emitted without an diff --git a/crates/wright-workshop/tests/emitter.rs b/crates/wright-workshop/tests/emitter.rs index 42d3ef4..771c00f 100644 --- a/crates/wright-workshop/tests/emitter.rs +++ b/crates/wright-workshop/tests/emitter.rs @@ -132,9 +132,9 @@ fn emitted_condition_matches_reference_infix_form() { #[test] fn debug_actions_emit_hud_text() { - // Since M8, Debug/Print emit a semantically equivalent Create HUD Text - // effect (documented intentional difference from the reference's - // type-aware formatting). + // Since the transform pipeline landed (#51/#52), Debug/Print emit a + // semantically equivalent Create HUD Text effect (documented intentional + // difference from the reference's type-aware formatting). let mut program = wir::Program::default(); let file = program .files diff --git a/crates/wright-workshop/tests/wir_expansion.rs b/crates/wright-workshop/tests/wir_expansion.rs index 964c239..d5742ea 100644 --- a/crates/wright-workshop/tests/wir_expansion.rs +++ b/crates/wright-workshop/tests/wir_expansion.rs @@ -1,5 +1,5 @@ -//! WIR expansion and canonical-identity tests (#31): the M5 P0 surface is -//! representable in Workshop IR, and catalog-backed validation rejects +//! WIR expansion and canonical-identity tests (#31): the declared P0 surface +//! is representable in Workshop IR, and catalog-backed validation rejects //! unknown or locale-tainted builtin references deterministically. use wright_ir::source::{Position, SourceFile, Span}; diff --git a/docs/compatibility.md b/docs/compatibility.md index 19ff02b..effa4bb 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -20,7 +20,8 @@ Project-level provenance for every upstream implementation Wright studies or derives compatibility knowledge from is recorded once, centrally, in [`compatibility/upstream-references.md`](compatibility/upstream-references.md) (pinned OverPy 9.7.10 identity and the durable OSTW reference entry added by -the M13 investigation, #113: license assumption, oracle role, reference-vs-Wright +the OSTW reference investigation (#113): license assumption, oracle role, +reference-vs-Wright architecture boundary, and durable reference limitations). Implementation issues and compatibility entries reference that document instead of repeating provenance notes. diff --git a/docs/compatibility/upstream-references.md b/docs/compatibility/upstream-references.md index ce0ccc7..203485b 100644 --- a/docs/compatibility/upstream-references.md +++ b/docs/compatibility/upstream-references.md @@ -1,7 +1,7 @@ # Centralized Upstream / Reference Inventory Status: accepted baseline (centralized upstream-reference documentation, #106, -extended with the OSTW reference by the M13 investigation, #113) +extended with the OSTW reference by the reference investigation (#113)) Scope: project-level provenance for every upstream implementation Wright studies or derives compatibility knowledge from; the durable record that lets Wright read and reference upstream source without per-symbol or per-file provenance @@ -82,8 +82,8 @@ extracted from OverPy's GPL-3.0 data files. changed only on demonstrated behavioral need, never on release recency (ADR-0007). A version bump alone is not an oracle change. * **Measured stability.** Every accept/reject outcome and diagnostic in the - M11 evidence set is byte-identical across `9.7.10 → 9.7.13`; only - hero/settings schema data differs. Historical claims stay interpretable + OverPy compatibility evidence set is byte-identical across `9.7.10 → 9.7.13`; + only hero/settings schema data differs. Historical claims stay interpretable because every result records the exact pinned identity. * **Settings data newer than the pin.** Hero settings newer than the pin (e.g. dmon/domina/mizuki/vendetta) are unavailable to fixtures until a diff --git a/docs/embedding.md b/docs/embedding.md index 9403669..f89c27c 100644 --- a/docs/embedding.md +++ b/docs/embedding.md @@ -10,8 +10,8 @@ safe source-edit contracts, and the transport adapters | --- | --- | --- | | `wright_driver::{CompilerSession, SessionConfig, InputSpec, SourceKind, OutputFormat, Profile}` | **stable** | One driver for compile/check/analyze/inspect/lint; `load()` is idempotent | | `wright_driver::{Envelope, CompileResult, CheckResult, AnalyzeResult, InspectResult, LintResult, Diagnostic, CompiledOutput}` | **stable** | `wright-result/v1` machine contract ([`docs/cli.md`](cli.md)) | -| `wright_driver::service::{ToolService, ToolRequest, ToolResponse, Capabilities}` | **stable** | Session-aware tool queries (project/rules/symbols/references/usage/CFG/findings/lint/lintRules/callGraph/costEstimate/targetMetadata/capabilities) plus validated mutation (`validateEditTransaction`, `semanticRename`, M14 #130) | -| `wright_driver::edit::{SourceEdit, EditRange, EditTransaction, SourcePreview, EditValidation, RenameRequest, rename_symbol, validate_transaction}` | **stable** | Frontend-neutral source-edit transactions; validated through the correct native frontend/project semantics (M14 #128); `EditTransaction::apply` applies ranges against one original source snapshot | +| `wright_driver::service::{ToolService, ToolRequest, ToolResponse, Capabilities}` | **stable** | Session-aware tool queries (project/rules/symbols/references/usage/CFG/findings/lint/lintRules/callGraph/costEstimate/targetMetadata/capabilities) plus validated mutation (`validateEditTransaction`, `semanticRename`, #130) | +| `wright_driver::edit::{SourceEdit, EditRange, EditTransaction, SourcePreview, EditValidation, RenameRequest, rename_symbol, validate_transaction}` | **stable** | Frontend-neutral source-edit transactions; validated through the correct native frontend/project semantics (#128); `EditTransaction::apply` applies ranges against one original source snapshot | | `wright_driver::{input_identity, EMBEDDING_CONTRACT}` | **stable** | `wright-embedding/v1` | | Internal HIR/WIR arenas, parser/CST, emitter internals | **internal** | Never part of the public contract | | `wright-serve` stdio/JSON-RPC adapters | **stable** | Thin mappings over `ToolService`; MCP not implemented (no agent evidence) | @@ -47,7 +47,7 @@ findings and from compiler-host performance (measured by `wright-bench`, not in-process). Target/catalog metadata enables reasoning about Workshop actions, values, events, enum domains, and locales. -## Validated mutation (M14, #130) +## Validated mutation (#130) Agents and embedding consumers request mutation through two structured tool operations over the session's project: diff --git a/docs/language-services.md b/docs/language-services.md index 7686afb..52f5226 100644 --- a/docs/language-services.md +++ b/docs/language-services.md @@ -92,7 +92,7 @@ suppression is the authoritative contract. Wright-owned (`RenameEdit`/`TargetSpan` in `wright-language`) and carry the SHA-256 source identity computed through `wright_driver::input_identity`. Rename delegates target resolution, edit generation, and validation to the - shared M14 driver refactoring contract + shared driver refactoring contract (`wright_driver::edit::semantic_rename`, #129): every affected root resolves through its original native frontend, the unioned exact-range transaction is validated through the shared #128 transaction boundary @@ -118,7 +118,7 @@ documented, never emulated through upstream calls**: - **Semantic rename** — offered for OSTW symbols on the declared semantic surface (globals, player variables, subroutines/functions) through the - shared M14 refactoring contract (#129): resolution runs over the shared + shared refactoring contract (#129): resolution runs over the shared semantic index of the `ds.toml` project graph, edited transactions validate through the native OSTW frontend, and targets without an exact identifier span (e.g. typed constants and other provenance-limited forms) refuse diff --git a/docs/ostw/compatibility-baseline.md b/docs/ostw/compatibility-baseline.md index 3e3bfec..d945113 100644 --- a/docs/ostw/compatibility-baseline.md +++ b/docs/ostw/compatibility-baseline.md @@ -1,6 +1,11 @@ -# OSTW Compatibility Baseline and M13 Investigation - -Status: accepted baseline (M13 in progress: OSTW reference/corpus/support investigation #113, baseline pinned #115, native syntax/project frontend foundation #117, protect-ban HIR lowering #118, explicit compile-root oracle rebaseline #122, first declared OSTW → Workshop compile surface #119, tooling/language-service integration #120, Workshop → OSTW reconstruction #125, and the shared driver/session conversion integration #126) +# OSTW Compatibility Baseline and OSTW Reference Investigation + +Status: accepted baseline (OSTW reference/corpus/support investigation #113: +baseline pinned #115, native syntax/project frontend foundation #117, +protect-ban HIR lowering #118, explicit compile-root oracle rebaseline #122, +first declared OSTW → Workshop compile surface #119, tooling/language-service +integration #120, Workshop → OSTW reconstruction #125, and the shared +driver/session conversion integration #126) Status note: Native AST/parser, project settings (`ds.toml`), import-closure resolution, and protect-ban HIR lowering are implemented in `crates/wright-ostw`. The first declared OSTW → Workshop compile surface is implemented (#119) and @@ -13,13 +18,14 @@ the historical 79-element protect-ban observation is reclassified as the The reverse direction — Workshop → OSTW reconstruction — is implemented by #125 (`wright_ostw::reconstruct`) and integrated end-to-end by #126 behind the same shared driver/session conversion contract as the #124 Workshop → OPY -reconstruction (see [`../cli.md`](../cli.md)): M13 phase D is complete, and -phase E was completed by #120. Direct OPY ↔ OSTW conversion remains -explicitly deferred pending the PM's post-M13 reassessment (recorded in the -"M13 reverse-interoperability completion" section below). +reconstruction (see [`../cli.md`](../cli.md)): the Workshop → OSTW +reconstruction phase is complete, and the tooling/language-service phase was +completed by #120. Direct OPY ↔ OSTW conversion remains +explicitly deferred pending the PM's roadmap reassessment (recorded in the +"OSTW reverse-interoperability completion" section below). Scope: forward-looking, tiered inventory of the OSTW language surface against the pinned reference, the corpus/acquisition plan, the oracle feasibility -report, and the reuse/boundary findings that M13 milestones respect. +report, and the reuse/boundary findings that the OSTW work respects. This document is the OSTW counterpart of [`docs/opy/compatibility-baseline.md`](../opy/compatibility-baseline.md): the @@ -117,7 +123,7 @@ with per-file SHA-256, and mark every fixture with the exact reference identity categories in the inventory above that its sources exercise, so the first support boundary is corpus-defined rather than speculative. -## M13 measured reference baseline +## Measured OSTW reference baseline Evidence was generated by `compatibility/ostw/run_oracle.py` against the immutable `v3.4.0` tag commit `769ce7aab097178cfe905bf21f0326d8e0d12e6b` @@ -290,7 +296,7 @@ Directional evidence requirement (issue #90): OSTW → Workshop and Workshop → OSTW are evaluated as separate surfaces with their own corpora and quality criteria. No direct OPY ↔ OSTW conversion work is implied by this baseline. -## Proposed bounded M13 decomposition (pending PM review) +## Proposed bounded OSTW decomposition (pending PM review) Grouped by semantic responsibility, in dependency order. **These are proposal categories, not created implementation issues.** The first milestone boundary @@ -306,9 +312,9 @@ is A+B+C scoped to the MOBAwatch/protect-ban corpus. | Later | Evidence-prioritized | Classes/generics/lambdas/pattern matching (category 8–9) if the corpus demands them; lobby-settings authoring; multi-locale | Corpus or PM evidence | | Explicitly deferred | - | Direct OPY ↔ OSTW (deferral recorded below, pending PM reassessment); debugger protocol; optimizer parity; perfect reconstruction; E-level timing scenarios | - | -## M13 reverse-interoperability completion and the direct-OPY↔OSTW deferral (#126) +## OSTW reverse-interoperability completion and the direct-OPY↔OSTW deferral (#126) -The reverse-interoperability integration of M13 is complete: the #124 +The reverse-interoperability integration of the OSTW work is complete: the #124 Workshop → OPY and #125 Workshop → OSTW reconstructors are both exposed through **one shared driver/session conversion contract** (`CompilerSession::convert` with explicit `opy`/`ostw` target selection; the @@ -328,7 +334,7 @@ directions are OPY → Workshop, OSTW → Workshop, Workshop → OPY, and Workshop → OSTW; reconstruction is semantic, never original-source recovery. **Direct OPY ↔ OSTW source conversion remains explicitly deferred.** The -roadmap reassessment that would admit it is the PM's post-M13 decision; this +roadmap reassessment that would admit it is the PM's reassessment decision; this baseline records the deferral and the readiness state (both directions already meet at Wright-owned Workshop/WIR semantics, so a future decision can build a direct path on the same owned contracts) but the reassessment itself @@ -344,7 +350,7 @@ is an external human action outside this milestone's gates. * Whether any corpus construct demonstrates divergence between tag `v3.4.0` and master, forcing a pin change before the first milestone. * Whether `Lava` licensing can be resolved to admit the official examples. -* Whether the PM's post-M13 reassessment admits direct OPY ↔ OSTW conversion +* Whether the PM's roadmap reassessment admits direct OPY ↔ OSTW conversion (deferred above). ## Related documents diff --git a/docs/specs/SPEC-99-stability-rules.md b/docs/specs/SPEC-99-stability-rules.md index a163159..5a00750 100644 --- a/docs/specs/SPEC-99-stability-rules.md +++ b/docs/specs/SPEC-99-stability-rules.md @@ -1,7 +1,7 @@ --- kind: wright-spec/v1 id: SPEC-99-stability-rules -title: Bounded evidence-backed Workshop stability rule set (M12) +title: Bounded evidence-backed Workshop stability rule set status: accepted related_issue: "#99" owner: PM @@ -11,7 +11,7 @@ freshness: live ## Goal Ship a small, high-value first-party stability/performance rule set through the -M12 lint registry (#97) and `wright lint` path (#98), extending the existing +lint registry (#97) and `wright lint` path (#98), extending the existing three rules with exactly **two new rules** — `repeated-value` and `while-without-wait` — so `wright lint` reports a bounded five-rule first-party set. Every rule keeps a stable ID, default severity, evidence classification,